diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/linux/ip.h | 5 | ||||
| -rw-r--r-- | include/linux/ipv6.h | 5 | ||||
| -rw-r--r-- | include/linux/netdevice.h | 6 | ||||
| -rw-r--r-- | include/linux/skbuff.h | 95 | ||||
| -rw-r--r-- | include/linux/tcp.h | 10 | ||||
| -rw-r--r-- | include/linux/udp.h | 5 | 
6 files changed, 125 insertions, 1 deletions
diff --git a/include/linux/ip.h b/include/linux/ip.h index 58b82a22a52..492bc651353 100644 --- a/include/linux/ip.h +++ b/include/linux/ip.h @@ -25,6 +25,11 @@ static inline struct iphdr *ip_hdr(const struct sk_buff *skb)  	return (struct iphdr *)skb_network_header(skb);  } +static inline struct iphdr *inner_ip_hdr(const struct sk_buff *skb) +{ +	return (struct iphdr *)skb_inner_network_header(skb); +} +  static inline struct iphdr *ipip_hdr(const struct sk_buff *skb)  {  	return (struct iphdr *)skb_transport_header(skb); diff --git a/include/linux/ipv6.h b/include/linux/ipv6.h index 12729e966dc..faed1e357dd 100644 --- a/include/linux/ipv6.h +++ b/include/linux/ipv6.h @@ -67,6 +67,11 @@ static inline struct ipv6hdr *ipv6_hdr(const struct sk_buff *skb)  	return (struct ipv6hdr *)skb_network_header(skb);  } +static inline struct ipv6hdr *inner_ipv6_hdr(const struct sk_buff *skb) +{ +	return (struct ipv6hdr *)skb_inner_network_header(skb); +} +  static inline struct ipv6hdr *ipipv6_hdr(const struct sk_buff *skb)  {  	return (struct ipv6hdr *)skb_transport_header(skb); diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 18c5dc98f6d..c6a14d4d139 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -1063,6 +1063,12 @@ struct net_device {  	netdev_features_t	wanted_features;  	/* mask of features inheritable by VLAN devices */  	netdev_features_t	vlan_features; +	/* mask of features inherited by encapsulating devices +	 * This field indicates what encapsulation offloads +	 * the hardware is capable of doing, and drivers will +	 * need to set them appropriately. +	 */ +	netdev_features_t	hw_enc_features;  	/* Interface index. Unique device identifier	*/  	int			ifindex; diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index f2af494330a..320e976d5ab 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h @@ -376,6 +376,8 @@ typedef unsigned char *sk_buff_data_t;   *	@mark: Generic packet mark   *	@dropcount: total number of sk_receive_queue overflows   *	@vlan_tci: vlan tag control information + *	@inner_transport_header: Inner transport layer header (encapsulation) + *	@inner_network_header: Network layer header (encapsulation)   *	@transport_header: Transport layer header   *	@network_header: Network layer header   *	@mac_header: Link layer header @@ -471,7 +473,13 @@ struct sk_buff {  	__u8			wifi_acked:1;  	__u8			no_fcs:1;  	__u8			head_frag:1; -	/* 8/10 bit hole (depending on ndisc_nodetype presence) */ +	/* Encapsulation protocol and NIC drivers should use +	 * this flag to indicate to each other if the skb contains +	 * encapsulated packet or not and maybe use the inner packet +	 * headers if needed +	 */ +	__u8			encapsulation:1; +	/* 7/9 bit hole (depending on ndisc_nodetype presence) */  	kmemcheck_bitfield_end(flags2);  #ifdef CONFIG_NET_DMA @@ -486,6 +494,8 @@ struct sk_buff {  		__u32		avail_size;  	}; +	sk_buff_data_t		inner_transport_header; +	sk_buff_data_t		inner_network_header;  	sk_buff_data_t		transport_header;  	sk_buff_data_t		network_header;  	sk_buff_data_t		mac_header; @@ -1435,12 +1445,53 @@ static inline void skb_reserve(struct sk_buff *skb, int len)  	skb->tail += len;  } +static inline void skb_reset_inner_headers(struct sk_buff *skb) +{ +	skb->inner_network_header = skb->network_header; +	skb->inner_transport_header = skb->transport_header; +} +  static inline void skb_reset_mac_len(struct sk_buff *skb)  {  	skb->mac_len = skb->network_header - skb->mac_header;  }  #ifdef NET_SKBUFF_DATA_USES_OFFSET +static inline unsigned char *skb_inner_transport_header(const struct sk_buff +							*skb) +{ +	return skb->head + skb->inner_transport_header; +} + +static inline void skb_reset_inner_transport_header(struct sk_buff *skb) +{ +	skb->inner_transport_header = skb->data - skb->head; +} + +static inline void skb_set_inner_transport_header(struct sk_buff *skb, +						   const int offset) +{ +	skb_reset_inner_transport_header(skb); +	skb->inner_transport_header += offset; +} + +static inline unsigned char *skb_inner_network_header(const struct sk_buff *skb) +{ +	return skb->head + skb->inner_network_header; +} + +static inline void skb_reset_inner_network_header(struct sk_buff *skb) +{ +	skb->inner_network_header = skb->data - skb->head; +} + +static inline void skb_set_inner_network_header(struct sk_buff *skb, +						const int offset) +{ +	skb_reset_inner_network_header(skb); +	skb->inner_network_header += offset; +} +  static inline unsigned char *skb_transport_header(const struct sk_buff *skb)  {  	return skb->head + skb->transport_header; @@ -1496,6 +1547,38 @@ static inline void skb_set_mac_header(struct sk_buff *skb, const int offset)  }  #else /* NET_SKBUFF_DATA_USES_OFFSET */ +static inline unsigned char *skb_inner_transport_header(const struct sk_buff +							*skb) +{ +	return skb->inner_transport_header; +} + +static inline void skb_reset_inner_transport_header(struct sk_buff *skb) +{ +	skb->inner_transport_header = skb->data; +} + +static inline void skb_set_inner_transport_header(struct sk_buff *skb, +						   const int offset) +{ +	skb->inner_transport_header = skb->data + offset; +} + +static inline unsigned char *skb_inner_network_header(const struct sk_buff *skb) +{ +	return skb->inner_network_header; +} + +static inline void skb_reset_inner_network_header(struct sk_buff *skb) +{ +	skb->inner_network_header = skb->data; +} + +static inline void skb_set_inner_network_header(struct sk_buff *skb, +						const int offset) +{ +	skb->inner_network_header = skb->data + offset; +}  static inline unsigned char *skb_transport_header(const struct sk_buff *skb)  { @@ -1574,11 +1657,21 @@ static inline u32 skb_network_header_len(const struct sk_buff *skb)  	return skb->transport_header - skb->network_header;  } +static inline u32 skb_inner_network_header_len(const struct sk_buff *skb) +{ +	return skb->inner_transport_header - skb->inner_network_header; +} +  static inline int skb_network_offset(const struct sk_buff *skb)  {  	return skb_network_header(skb) - skb->data;  } +static inline int skb_inner_network_offset(const struct sk_buff *skb) +{ +	return skb_inner_network_header(skb) - skb->data; +} +  static inline int pskb_network_may_pull(struct sk_buff *skb, unsigned int len)  {  	return pskb_may_pull(skb, skb_network_offset(skb) + len); diff --git a/include/linux/tcp.h b/include/linux/tcp.h index 60b7aac15e0..4e1d2283e3c 100644 --- a/include/linux/tcp.h +++ b/include/linux/tcp.h @@ -35,6 +35,16 @@ static inline unsigned int tcp_hdrlen(const struct sk_buff *skb)  	return tcp_hdr(skb)->doff * 4;  } +static inline struct tcphdr *inner_tcp_hdr(const struct sk_buff *skb) +{ +	return (struct tcphdr *)skb_inner_transport_header(skb); +} + +static inline unsigned int inner_tcp_hdrlen(const struct sk_buff *skb) +{ +	return inner_tcp_hdr(skb)->doff * 4; +} +  static inline unsigned int tcp_optlen(const struct sk_buff *skb)  {  	return (tcp_hdr(skb)->doff - 5) * 4; diff --git a/include/linux/udp.h b/include/linux/udp.h index 0b67d779352..9d81de123c9 100644 --- a/include/linux/udp.h +++ b/include/linux/udp.h @@ -27,6 +27,11 @@ static inline struct udphdr *udp_hdr(const struct sk_buff *skb)  	return (struct udphdr *)skb_transport_header(skb);  } +static inline struct udphdr *inner_udp_hdr(const struct sk_buff *skb) +{ +	return (struct udphdr *)skb_inner_transport_header(skb); +} +  #define UDP_HTABLE_SIZE_MIN		(CONFIG_BASE_SMALL ? 128 : 256)  static inline int udp_hashfn(struct net *net, unsigned num, unsigned mask)  |