| 
									
										
										
										
											2010-08-21 23:05:39 -07:00
										 |  |  | #ifndef __LINUX_GRE_H
 | 
					
						
							|  |  |  | #define __LINUX_GRE_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <linux/skbuff.h>
 | 
					
						
							| 
									
										
										
										
											2013-03-25 14:49:35 +00:00
										 |  |  | #include <net/ip_tunnels.h>
 | 
					
						
							| 
									
										
										
										
											2010-08-21 23:05:39 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | #define GREPROTO_CISCO		0
 | 
					
						
							|  |  |  | #define GREPROTO_PPTP		1
 | 
					
						
							|  |  |  | #define GREPROTO_MAX		2
 | 
					
						
							| 
									
										
										
										
											2013-06-17 17:49:38 -07:00
										 |  |  | #define GRE_IP_PROTO_MAX	2
 | 
					
						
							| 
									
										
										
										
											2010-08-21 23:05:39 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | struct gre_protocol { | 
					
						
							|  |  |  | 	int  (*handler)(struct sk_buff *skb); | 
					
						
							|  |  |  | 	void (*err_handler)(struct sk_buff *skb, u32 info); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-25 14:49:35 +00:00
										 |  |  | struct gre_base_hdr { | 
					
						
							|  |  |  | 	__be16 flags; | 
					
						
							|  |  |  | 	__be16 protocol; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | #define GRE_HEADER_SECTION 4
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-21 23:05:39 -07:00
										 |  |  | int gre_add_protocol(const struct gre_protocol *proto, u8 version); | 
					
						
							|  |  |  | int gre_del_protocol(const struct gre_protocol *proto, u8 version); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-17 17:49:38 -07:00
										 |  |  | 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); | 
					
						
							| 
									
										
										
										
											2013-07-01 19:24:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-17 17:49:45 -07:00
										 |  |  | void gre_build_header(struct sk_buff *skb, const struct tnl_ptk_info *tpi, | 
					
						
							|  |  |  | 		      int hdr_len); | 
					
						
							| 
									
										
										
										
											2013-10-19 11:42:55 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | static inline struct sk_buff *gre_handle_offloads(struct sk_buff *skb, | 
					
						
							| 
									
										
										
										
											2014-06-04 17:20:23 -07:00
										 |  |  | 						  bool csum) | 
					
						
							| 
									
										
										
										
											2013-10-19 11:42:55 -07:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2014-06-04 17:20:23 -07:00
										 |  |  | 	return iptunnel_handle_offloads(skb, csum, | 
					
						
							|  |  |  | 					csum ? SKB_GSO_GRE_CSUM : SKB_GSO_GRE); | 
					
						
							| 
									
										
										
										
											2013-10-19 11:42:55 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-17 17:49:38 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 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; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-25 14:49:35 +00:00
										 |  |  | 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; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-21 23:05:39 -07:00
										 |  |  | #endif
 |