|
@@ -135,11 +135,12 @@ static int is_ineligible(struct sk_buff *skb)
|
|
|
int ptr = (u8 *)(ipv6_hdr(skb) + 1) - skb->data;
|
|
|
int len = skb->len - ptr;
|
|
|
__u8 nexthdr = ipv6_hdr(skb)->nexthdr;
|
|
|
+ __be16 frag_off;
|
|
|
|
|
|
if (len < 0)
|
|
|
return 1;
|
|
|
|
|
|
- ptr = ipv6_skip_exthdr(skb, ptr, &nexthdr);
|
|
|
+ ptr = ipv6_skip_exthdr(skb, ptr, &nexthdr, &frag_off);
|
|
|
if (ptr < 0)
|
|
|
return 0;
|
|
|
if (nexthdr == IPPROTO_ICMPV6) {
|
|
@@ -596,6 +597,7 @@ static void icmpv6_notify(struct sk_buff *skb, u8 type, u8 code, __be32 info)
|
|
|
int inner_offset;
|
|
|
int hash;
|
|
|
u8 nexthdr;
|
|
|
+ __be16 frag_off;
|
|
|
|
|
|
if (!pskb_may_pull(skb, sizeof(struct ipv6hdr)))
|
|
|
return;
|
|
@@ -603,7 +605,8 @@ static void icmpv6_notify(struct sk_buff *skb, u8 type, u8 code, __be32 info)
|
|
|
nexthdr = ((struct ipv6hdr *)skb->data)->nexthdr;
|
|
|
if (ipv6_ext_hdr(nexthdr)) {
|
|
|
/* now skip over extension headers */
|
|
|
- inner_offset = ipv6_skip_exthdr(skb, sizeof(struct ipv6hdr), &nexthdr);
|
|
|
+ inner_offset = ipv6_skip_exthdr(skb, sizeof(struct ipv6hdr),
|
|
|
+ &nexthdr, &frag_off);
|
|
|
if (inner_offset<0)
|
|
|
return;
|
|
|
} else {
|