|
|
@@ -587,7 +587,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;
|
|
|
@@ -598,6 +598,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);
|
|
|
|
|
|
@@ -632,6 +633,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);
|