diff options
Diffstat (limited to 'net/ipv6/ip6_output.c')
| -rw-r--r-- | net/ipv6/ip6_output.c | 4 | 
1 files changed, 3 insertions, 1 deletions
| diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index edbd12067170..e51f3c648b09 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c @@ -601,7 +601,7 @@ int ip6_fragment(struct net *net, struct sock *sk, struct sk_buff *skb,  				inet6_sk(skb->sk) : NULL;  	struct ipv6hdr *tmp_hdr;  	struct frag_hdr *fh; -	unsigned int mtu, hlen, left, len; +	unsigned int mtu, hlen, left, len, nexthdr_offset;  	int hroom, troom;  	__be32 frag_id;  	int ptr, offset = 0, err = 0; @@ -612,6 +612,7 @@ int ip6_fragment(struct net *net, struct sock *sk, struct sk_buff *skb,  		goto fail;  	hlen = err;  	nexthdr = *prevhdr; +	nexthdr_offset = prevhdr - skb_network_header(skb);  	mtu = ip6_skb_dst_mtu(skb); @@ -646,6 +647,7 @@ int ip6_fragment(struct net *net, struct sock *sk, struct sk_buff *skb,  	    (err = skb_checksum_help(skb)))  		goto fail; +	prevhdr = skb_network_header(skb) + nexthdr_offset;  	hroom = LL_RESERVED_SPACE(rt->dst.dev);  	if (skb_has_frag_list(skb)) {  		unsigned int first_len = skb_pagelen(skb); |