at v3.12 2.2 kB view raw
1#ifndef __LINUX_GRE_H 2#define __LINUX_GRE_H 3 4#include <linux/skbuff.h> 5#include <net/ip_tunnels.h> 6 7#define GREPROTO_CISCO 0 8#define GREPROTO_PPTP 1 9#define GREPROTO_MAX 2 10#define GRE_IP_PROTO_MAX 2 11 12struct gre_protocol { 13 int (*handler)(struct sk_buff *skb); 14 void (*err_handler)(struct sk_buff *skb, u32 info); 15}; 16 17struct gre_base_hdr { 18 __be16 flags; 19 __be16 protocol; 20}; 21#define GRE_HEADER_SECTION 4 22 23int gre_add_protocol(const struct gre_protocol *proto, u8 version); 24int gre_del_protocol(const struct gre_protocol *proto, u8 version); 25 26struct gre_cisco_protocol { 27 int (*handler)(struct sk_buff *skb, const struct tnl_ptk_info *tpi); 28 int (*err_handler)(struct sk_buff *skb, u32 info, 29 const struct tnl_ptk_info *tpi); 30 u8 priority; 31}; 32 33int gre_cisco_register(struct gre_cisco_protocol *proto); 34int gre_cisco_unregister(struct gre_cisco_protocol *proto); 35 36int gre_offload_init(void); 37void gre_offload_exit(void); 38 39void gre_build_header(struct sk_buff *skb, const struct tnl_ptk_info *tpi, 40 int hdr_len); 41struct sk_buff *gre_handle_offloads(struct sk_buff *skb, bool gre_csum); 42 43static inline int ip_gre_calc_hlen(__be16 o_flags) 44{ 45 int addend = 4; 46 47 if (o_flags&TUNNEL_CSUM) 48 addend += 4; 49 if (o_flags&TUNNEL_KEY) 50 addend += 4; 51 if (o_flags&TUNNEL_SEQ) 52 addend += 4; 53 return addend; 54} 55 56static inline __be16 gre_flags_to_tnl_flags(__be16 flags) 57{ 58 __be16 tflags = 0; 59 60 if (flags & GRE_CSUM) 61 tflags |= TUNNEL_CSUM; 62 if (flags & GRE_ROUTING) 63 tflags |= TUNNEL_ROUTING; 64 if (flags & GRE_KEY) 65 tflags |= TUNNEL_KEY; 66 if (flags & GRE_SEQ) 67 tflags |= TUNNEL_SEQ; 68 if (flags & GRE_STRICT) 69 tflags |= TUNNEL_STRICT; 70 if (flags & GRE_REC) 71 tflags |= TUNNEL_REC; 72 if (flags & GRE_VERSION) 73 tflags |= TUNNEL_VERSION; 74 75 return tflags; 76} 77 78static inline __be16 tnl_flags_to_gre_flags(__be16 tflags) 79{ 80 __be16 flags = 0; 81 82 if (tflags & TUNNEL_CSUM) 83 flags |= GRE_CSUM; 84 if (tflags & TUNNEL_ROUTING) 85 flags |= GRE_ROUTING; 86 if (tflags & TUNNEL_KEY) 87 flags |= GRE_KEY; 88 if (tflags & TUNNEL_SEQ) 89 flags |= GRE_SEQ; 90 if (tflags & TUNNEL_STRICT) 91 flags |= GRE_STRICT; 92 if (tflags & TUNNEL_REC) 93 flags |= GRE_REC; 94 if (tflags & TUNNEL_VERSION) 95 flags |= GRE_VERSION; 96 97 return flags; 98} 99 100#endif