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 12 struct gre_protocol { 13 int (*handler)(struct sk_buff *skb); 14 void (*err_handler)(struct sk_buff *skb, u32 info); 15 }; 16 17 struct gre_base_hdr { 18 __be16 flags; 19 __be16 protocol; 20 }; 21 #define GRE_HEADER_SECTION 4 22 23 int gre_add_protocol(const struct gre_protocol *proto, u8 version); 24 int gre_del_protocol(const struct gre_protocol *proto, u8 version); 25 26 struct 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 33 int gre_cisco_register(struct gre_cisco_protocol *proto); 34 int gre_cisco_unregister(struct gre_cisco_protocol *proto); 35 36 int gre_offload_init(void); 37 void gre_offload_exit(void); 38 39 void gre_build_header(struct sk_buff *skb, const struct tnl_ptk_info *tpi, 40 int hdr_len); 41 42 static inline struct sk_buff *gre_handle_offloads(struct sk_buff *skb, 43 bool gre_csum) 44 { 45 return iptunnel_handle_offloads(skb, gre_csum, SKB_GSO_GRE); 46 } 47 48 49 static inline int ip_gre_calc_hlen(__be16 o_flags) 50 { 51 int addend = 4; 52 53 if (o_flags&TUNNEL_CSUM) 54 addend += 4; 55 if (o_flags&TUNNEL_KEY) 56 addend += 4; 57 if (o_flags&TUNNEL_SEQ) 58 addend += 4; 59 return addend; 60 } 61 62 static inline __be16 gre_flags_to_tnl_flags(__be16 flags) 63 { 64 __be16 tflags = 0; 65 66 if (flags & GRE_CSUM) 67 tflags |= TUNNEL_CSUM; 68 if (flags & GRE_ROUTING) 69 tflags |= TUNNEL_ROUTING; 70 if (flags & GRE_KEY) 71 tflags |= TUNNEL_KEY; 72 if (flags & GRE_SEQ) 73 tflags |= TUNNEL_SEQ; 74 if (flags & GRE_STRICT) 75 tflags |= TUNNEL_STRICT; 76 if (flags & GRE_REC) 77 tflags |= TUNNEL_REC; 78 if (flags & GRE_VERSION) 79 tflags |= TUNNEL_VERSION; 80 81 return tflags; 82 } 83 84 static inline __be16 tnl_flags_to_gre_flags(__be16 tflags) 85 { 86 __be16 flags = 0; 87 88 if (tflags & TUNNEL_CSUM) 89 flags |= GRE_CSUM; 90 if (tflags & TUNNEL_ROUTING) 91 flags |= GRE_ROUTING; 92 if (tflags & TUNNEL_KEY) 93 flags |= GRE_KEY; 94 if (tflags & TUNNEL_SEQ) 95 flags |= GRE_SEQ; 96 if (tflags & TUNNEL_STRICT) 97 flags |= GRE_STRICT; 98 if (tflags & TUNNEL_REC) 99 flags |= GRE_REC; 100 if (tflags & TUNNEL_VERSION) 101 flags |= GRE_VERSION; 102 103 return flags; 104 } 105 106 #endif 107