diff options
Diffstat (limited to 'net/ipv6/udp_offload.c')
| -rw-r--r-- | net/ipv6/udp_offload.c | 11 | 
1 files changed, 8 insertions, 3 deletions
diff --git a/net/ipv6/udp_offload.c b/net/ipv6/udp_offload.c index 60559511bd9..0ae3d98f83e 100644 --- a/net/ipv6/udp_offload.c +++ b/net/ipv6/udp_offload.c @@ -63,7 +63,11 @@ static struct sk_buff *udp6_ufo_fragment(struct sk_buff *skb,  		if (unlikely(type & ~(SKB_GSO_UDP |  				      SKB_GSO_DODGY |  				      SKB_GSO_UDP_TUNNEL | +				      SKB_GSO_UDP_TUNNEL_CSUM |  				      SKB_GSO_GRE | +				      SKB_GSO_GRE_CSUM | +				      SKB_GSO_IPIP | +				      SKB_GSO_SIT |  				      SKB_GSO_MPLS) ||  			     !(type & (SKB_GSO_UDP))))  			goto out; @@ -74,7 +78,8 @@ static struct sk_buff *udp6_ufo_fragment(struct sk_buff *skb,  		goto out;  	} -	if (skb->encapsulation && skb_shinfo(skb)->gso_type & SKB_GSO_UDP_TUNNEL) +	if (skb->encapsulation && skb_shinfo(skb)->gso_type & +	    (SKB_GSO_UDP_TUNNEL|SKB_GSO_UDP_TUNNEL_CSUM))  		segs = skb_udp_tunnel_segment(skb, features);  	else {  		/* Do software UFO. Complete and fill in the UDP checksum as HW cannot @@ -88,7 +93,7 @@ static struct sk_buff *udp6_ufo_fragment(struct sk_buff *skb,  		/* Check if there is enough headroom to insert fragment header. */  		tnl_hlen = skb_tnl_header_len(skb); -		if (skb_headroom(skb) < (tnl_hlen + frag_hdr_sz)) { +		if (skb->mac_header < (tnl_hlen + frag_hdr_sz)) {  			if (gso_pskb_expand_head(skb, tnl_hlen + frag_hdr_sz))  				goto out;  		} @@ -111,7 +116,7 @@ static struct sk_buff *udp6_ufo_fragment(struct sk_buff *skb,  		fptr = (struct frag_hdr *)(skb_network_header(skb) + unfrag_ip6hlen);  		fptr->nexthdr = nexthdr;  		fptr->reserved = 0; -		ipv6_select_ident(fptr, (struct rt6_info *)skb_dst(skb)); +		fptr->identification = skb_shinfo(skb)->ip6_frag_id;  		/* Fragment the skb. ipv6 header and the remaining fields of the  		 * fragment header are updated in ipv6_gso_segment()  | 
