net: Simplify GRE case in flow_dissector
authorTom Herbert <tom@herbertland.com>
Thu, 4 Jun 2015 16:16:36 +0000 (09:16 -0700)
committerDavid S. Miller <davem@davemloft.net>
Thu, 4 Jun 2015 22:44:30 +0000 (15:44 -0700)
Do break when we see routing flag or a non-zero version number in GRE
header.

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

index 1f2d89300b1afd3d2319f10035e74ba35038d816..7f699169dc9265bd6281bcbca4174f42fa3b3b83 100644 (file)
@@ -308,30 +308,30 @@ flow_label:
                 * Only look inside GRE if version zero and no
                 * routing
                 */
-               if (!(hdr->flags & (GRE_VERSION|GRE_ROUTING))) {
-                       proto = hdr->proto;
+               if (hdr->flags & (GRE_VERSION | GRE_ROUTING))
+                       break;
+
+               proto = hdr->proto;
+               nhoff += 4;
+               if (hdr->flags & GRE_CSUM)
                        nhoff += 4;
-                       if (hdr->flags & GRE_CSUM)
-                               nhoff += 4;
-                       if (hdr->flags & GRE_KEY)
-                               nhoff += 4;
-                       if (hdr->flags & GRE_SEQ)
-                               nhoff += 4;
-                       if (proto == htons(ETH_P_TEB)) {
-                               const struct ethhdr *eth;
-                               struct ethhdr _eth;
-
-                               eth = __skb_header_pointer(skb, nhoff,
-                                                          sizeof(_eth),
-                                                          data, hlen, &_eth);
-                               if (!eth)
-                                       return false;
-                               proto = eth->h_proto;
-                               nhoff += sizeof(*eth);
-                       }
-                       goto again;
+               if (hdr->flags & GRE_KEY)
+                       nhoff += 4;
+               if (hdr->flags & GRE_SEQ)
+                       nhoff += 4;
+               if (proto == htons(ETH_P_TEB)) {
+                       const struct ethhdr *eth;
+                       struct ethhdr _eth;
+
+                       eth = __skb_header_pointer(skb, nhoff,
+                                                  sizeof(_eth),
+                                                  data, hlen, &_eth);
+                       if (!eth)
+                               return false;
+                       proto = eth->h_proto;
+                       nhoff += sizeof(*eth);
                }
-               break;
+               goto again;
        }
        case IPPROTO_IPIP:
                proto = htons(ETH_P_IP);