diff options
Diffstat (limited to 'include/net/gre.h')
| -rw-r--r-- | include/net/gre.h | 86 | 
1 files changed, 86 insertions, 0 deletions
diff --git a/include/net/gre.h b/include/net/gre.h index 82665474bcb..b5318201874 100644 --- a/include/net/gre.h +++ b/include/net/gre.h @@ -2,17 +2,103 @@  #define __LINUX_GRE_H  #include <linux/skbuff.h> +#include <net/ip_tunnels.h>  #define GREPROTO_CISCO		0  #define GREPROTO_PPTP		1  #define GREPROTO_MAX		2 +#define GRE_IP_PROTO_MAX	2  struct gre_protocol {  	int  (*handler)(struct sk_buff *skb);  	void (*err_handler)(struct sk_buff *skb, u32 info);  }; +struct gre_base_hdr { +	__be16 flags; +	__be16 protocol; +}; +#define GRE_HEADER_SECTION 4 +  int gre_add_protocol(const struct gre_protocol *proto, u8 version);  int gre_del_protocol(const struct gre_protocol *proto, u8 version); +struct gre_cisco_protocol { +	int (*handler)(struct sk_buff *skb, const struct tnl_ptk_info *tpi); +	int (*err_handler)(struct sk_buff *skb, u32 info, +			   const struct tnl_ptk_info *tpi); +	u8 priority; +}; + +int gre_cisco_register(struct gre_cisco_protocol *proto); +int gre_cisco_unregister(struct gre_cisco_protocol *proto); + +void gre_build_header(struct sk_buff *skb, const struct tnl_ptk_info *tpi, +		      int hdr_len); + +static inline struct sk_buff *gre_handle_offloads(struct sk_buff *skb, +						  bool csum) +{ +	return iptunnel_handle_offloads(skb, csum, +					csum ? SKB_GSO_GRE_CSUM : SKB_GSO_GRE); +} + + +static inline int ip_gre_calc_hlen(__be16 o_flags) +{ +	int addend = 4; + +	if (o_flags&TUNNEL_CSUM) +		addend += 4; +	if (o_flags&TUNNEL_KEY) +		addend += 4; +	if (o_flags&TUNNEL_SEQ) +		addend += 4; +	return addend; +} + +static inline __be16 gre_flags_to_tnl_flags(__be16 flags) +{ +	__be16 tflags = 0; + +	if (flags & GRE_CSUM) +		tflags |= TUNNEL_CSUM; +	if (flags & GRE_ROUTING) +		tflags |= TUNNEL_ROUTING; +	if (flags & GRE_KEY) +		tflags |= TUNNEL_KEY; +	if (flags & GRE_SEQ) +		tflags |= TUNNEL_SEQ; +	if (flags & GRE_STRICT) +		tflags |= TUNNEL_STRICT; +	if (flags & GRE_REC) +		tflags |= TUNNEL_REC; +	if (flags & GRE_VERSION) +		tflags |= TUNNEL_VERSION; + +	return tflags; +} + +static inline __be16 tnl_flags_to_gre_flags(__be16 tflags) +{ +	__be16 flags = 0; + +	if (tflags & TUNNEL_CSUM) +		flags |= GRE_CSUM; +	if (tflags & TUNNEL_ROUTING) +		flags |= GRE_ROUTING; +	if (tflags & TUNNEL_KEY) +		flags |= GRE_KEY; +	if (tflags & TUNNEL_SEQ) +		flags |= GRE_SEQ; +	if (tflags & TUNNEL_STRICT) +		flags |= GRE_STRICT; +	if (tflags & TUNNEL_REC) +		flags |= GRE_REC; +	if (tflags & TUNNEL_VERSION) +		flags |= GRE_VERSION; + +	return flags; +} +  #endif  | 
