flow_dissector: Check for IP fragmentation even if not using IPv4 address
authorAlexander Duyck <aduyck@mirantis.com>
Wed, 24 Feb 2016 17:29:38 +0000 (09:29 -0800)
committerDavid S. Miller <davem@davemloft.net>
Wed, 24 Feb 2016 18:58:04 +0000 (13:58 -0500)
This patch corrects the logic for the IPv4 parsing so that it is consistent
with how we handle IPv6.  Specifically if we do not have the flow key
indicating we want the addresses we still may need to take a look at the IP
fragmentation bits and to see if we should stop after we have recognized
the L3 header.

Fixes: 807e165dc44f ("flow_dissector: Add control/reporting of fragmentation")
Signed-off-by: Alexander Duyck <aduyck@mirantis.com>
Acked-by: Tom Herbert <tom@herbertland.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/flow_dissector.c

index 12e7003320107dbb2b86f4fa1cfd20a8d59e8ed5..1f88f8280280b989392c03723d95fd34b3b49b8c 100644 (file)
@@ -178,15 +178,16 @@ ip:
 
                ip_proto = iph->protocol;
 
-               if (!dissector_uses_key(flow_dissector,
-                                       FLOW_DISSECTOR_KEY_IPV4_ADDRS))
-                       break;
+               if (dissector_uses_key(flow_dissector,
+                                      FLOW_DISSECTOR_KEY_IPV4_ADDRS)) {
+                       key_addrs = skb_flow_dissector_target(flow_dissector,
+                                                             FLOW_DISSECTOR_KEY_IPV4_ADDRS,
+                                                             target_container);
 
-               key_addrs = skb_flow_dissector_target(flow_dissector,
-                             FLOW_DISSECTOR_KEY_IPV4_ADDRS, target_container);
-               memcpy(&key_addrs->v4addrs, &iph->saddr,
-                      sizeof(key_addrs->v4addrs));
-               key_control->addr_type = FLOW_DISSECTOR_KEY_IPV4_ADDRS;
+                       memcpy(&key_addrs->v4addrs, &iph->saddr,
+                              sizeof(key_addrs->v4addrs));
+                       key_control->addr_type = FLOW_DISSECTOR_KEY_IPV4_ADDRS;
+               }
 
                if (ip_is_fragment(iph)) {
                        key_control->flags |= FLOW_DIS_IS_FRAGMENT;