flow_dissector: Support IPv6 fragment header
authorTom Herbert <tom@herbertland.com>
Tue, 1 Sep 2015 16:24:29 +0000 (09:24 -0700)
committerDavid S. Miller <davem@davemloft.net>
Tue, 1 Sep 2015 22:06:22 +0000 (15:06 -0700)
Parse NEXTHDR_FRAGMENT. When seen account for it in the fragment bits of
key_control. Also, check if first fragment should be parsed.

Signed-off-by: Tom Herbert <tom@herbertland.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/flow_dissector.c

index 7536a46..907de2f 100644 (file)
@@ -409,6 +409,31 @@ ip_proto_again:
 
                goto ip_proto_again;
        }
+       case NEXTHDR_FRAGMENT: {
+               struct frag_hdr _fh, *fh;
+
+               if (proto != htons(ETH_P_IPV6))
+                       break;
+
+               fh = __skb_header_pointer(skb, nhoff, sizeof(_fh),
+                                         data, hlen, &_fh);
+
+               if (!fh)
+                       goto out_bad;
+
+               key_control->is_fragment = 1;
+
+               nhoff += sizeof(_fh);
+
+               if (!(fh->frag_off & htons(IP6_OFFSET))) {
+                       key_control->first_frag = 1;
+                       if (flags & FLOW_DISSECTOR_F_PARSE_1ST_FRAG) {
+                               ip_proto = fh->nexthdr;
+                               goto ip_proto_again;
+                       }
+               }
+               goto out_good;
+       }
        case IPPROTO_IPIP:
                proto = htons(ETH_P_IP);
                goto ip;