at v3.14 103 lines 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 36void gre_build_header(struct sk_buff *skb, const struct tnl_ptk_info *tpi, 37 int hdr_len); 38 39static 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 46static 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 59static 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 81static 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