ofproto-dpif: Fix CONTROLLER actions for LLC frames.
authorEthan Jackson <ethan@nicira.com>
Thu, 22 Mar 2012 23:04:45 +0000 (16:04 -0700)
committerEthan Jackson <ethan@nicira.com>
Thu, 22 Mar 2012 23:15:28 +0000 (16:15 -0700)
The CONTROLLER action assumed that all Ethernet frames stored their
Ethernet Type in the two bytes succeeding the source and
destination addresses.  This turns out not to be true for 802.2 LLC
frames, potentially causing an assertion failure.  This patch
solves the issue by skipping the assertion in this case.

Bug #10349.
Signed-off-by: Ethan Jackson <ethan@nicira.com>
ofproto/ofproto-dpif.c

index 86b56567cfb972cdaa40397f0f7178d96c8359e7..f2b933963952be5c151ec088d51c4491c797ee88 100644 (file)
@@ -4507,7 +4507,13 @@ execute_controller_action(struct action_xlate_ctx *ctx, int len,
 
         eth_pop_vlan(packet);
         eh = packet->l2;
-        assert(eh->eth_type == ctx->flow.dl_type);
+
+        /* If the Ethernet type is less than ETH_TYPE_MIN, it's likely an 802.2
+         * LLC frame.  Calculating the Ethernet type of these frames is more
+         * trouble than seems appropriate for a simple assertion. */
+        assert(ntohs(eh->eth_type) < ETH_TYPE_MIN
+               || eh->eth_type == ctx->flow.dl_type);
+
         memcpy(eh->eth_src, ctx->flow.dl_src, sizeof eh->eth_src);
         memcpy(eh->eth_dst, ctx->flow.dl_dst, sizeof eh->eth_dst);