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 void gre_build_header(struct sk_buff *skb, const struct tnl_ptk_info *tpi, 37 int hdr_len); 38 39 static inline struct sk_buff *gre_handle_offloads(struct sk_buff *skb, 40 bool gre_csum) 41 { 42 return iptunnel_handle_offloads(skb, gre_csum, SKB_GSO_GRE); 43 } 44 45 46 static inline int ip_gre_calc_hlen(__be16 o_flags) 47 { 48 int addend = 4; 49 50 if (o_flags&TUNNEL_CSUM) 51 addend += 4; 52 if (o_flags&TUNNEL_KEY) 53 addend += 4; 54 if (o_flags&TUNNEL_SEQ) 55 addend += 4; 56 return addend; 57 } 58 59 static inline __be16 gre_flags_to_tnl_flags(__be16 flags) 60 { 61 __be16 tflags = 0; 62 63 if (flags & GRE_CSUM) 64 tflags |= TUNNEL_CSUM; 65 if (flags & GRE_ROUTING) 66 tflags |= TUNNEL_ROUTING; 67 if (flags & GRE_KEY) 68 tflags |= TUNNEL_KEY; 69 if (flags & GRE_SEQ) 70 tflags |= TUNNEL_SEQ; 71 if (flags & GRE_STRICT) 72 tflags |= TUNNEL_STRICT; 73 if (flags & GRE_REC) 74 tflags |= TUNNEL_REC; 75 if (flags & GRE_VERSION) 76 tflags |= TUNNEL_VERSION; 77 78 return tflags; 79 } 80 81 static inline __be16 tnl_flags_to_gre_flags(__be16 tflags) 82 { 83 __be16 flags = 0; 84 85 if (tflags & TUNNEL_CSUM) 86 flags |= GRE_CSUM; 87 if (tflags & TUNNEL_ROUTING) 88 flags |= GRE_ROUTING; 89 if (tflags & TUNNEL_KEY) 90 flags |= GRE_KEY; 91 if (tflags & TUNNEL_SEQ) 92 flags |= GRE_SEQ; 93 if (tflags & TUNNEL_STRICT) 94 flags |= GRE_STRICT; 95 if (tflags & TUNNEL_REC) 96 flags |= GRE_REC; 97 if (tflags & TUNNEL_VERSION) 98 flags |= GRE_VERSION; 99 100 return flags; 101 } 102 103 #endif 104