diff options
Diffstat (limited to 'net/ipv4/af_inet.c')
| -rw-r--r-- | net/ipv4/af_inet.c | 15 | 
1 files changed, 9 insertions, 6 deletions
diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c index c929d9c1c4b..c61b3bb87a1 100644 --- a/net/ipv4/af_inet.c +++ b/net/ipv4/af_inet.c @@ -111,10 +111,10 @@  #include <net/sock.h>  #include <net/raw.h>  #include <net/icmp.h> -#include <net/ipip.h>  #include <net/inet_common.h>  #include <net/xfrm.h>  #include <net/net_namespace.h> +#include <net/secure_seq.h>  #ifdef CONFIG_IP_MROUTE  #include <linux/mroute.h>  #endif @@ -263,8 +263,10 @@ void build_ehash_secret(void)  		get_random_bytes(&rnd, sizeof(rnd));  	} while (rnd == 0); -	if (cmpxchg(&inet_ehash_secret, 0, rnd) == 0) +	if (cmpxchg(&inet_ehash_secret, 0, rnd) == 0) {  		get_random_bytes(&ipv6_hash_secret, sizeof(ipv6_hash_secret)); +		net_secret_init(); +	}  }  EXPORT_SYMBOL(build_ehash_secret); @@ -1283,9 +1285,7 @@ static struct sk_buff *inet_gso_segment(struct sk_buff *skb,  	int ihl;  	int id;  	unsigned int offset = 0; - -	if (!(features & NETIF_F_V4_CSUM)) -		features &= ~NETIF_F_SG; +	bool tunnel;  	if (unlikely(skb_shinfo(skb)->gso_type &  		     ~(SKB_GSO_TCPV4 | @@ -1293,6 +1293,7 @@ static struct sk_buff *inet_gso_segment(struct sk_buff *skb,  		       SKB_GSO_DODGY |  		       SKB_GSO_TCP_ECN |  		       SKB_GSO_GRE | +		       SKB_GSO_UDP_TUNNEL |  		       0)))  		goto out; @@ -1307,6 +1308,8 @@ static struct sk_buff *inet_gso_segment(struct sk_buff *skb,  	if (unlikely(!pskb_may_pull(skb, ihl)))  		goto out; +	tunnel = !!skb->encapsulation; +  	__skb_pull(skb, ihl);  	skb_reset_transport_header(skb);  	iph = ip_hdr(skb); @@ -1326,7 +1329,7 @@ static struct sk_buff *inet_gso_segment(struct sk_buff *skb,  	skb = segs;  	do {  		iph = ip_hdr(skb); -		if (proto == IPPROTO_UDP) { +		if (!tunnel && proto == IPPROTO_UDP) {  			iph->id = htons(id);  			iph->frag_off = htons(offset >> 3);  			if (skb->next != NULL)  |