From 0104aba86e4de01790ee0f1ffb96a1193fa3e04d Mon Sep 17 00:00:00 2001 From: Ethan Jackson Date: Thu, 22 Mar 2012 16:04:45 -0700 Subject: [PATCH] ofproto-dpif: Fix CONTROLLER actions for LLC frames. 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 --- ofproto/ofproto-dpif.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c index 86b56567..f2b93396 100644 --- a/ofproto/ofproto-dpif.c +++ b/ofproto/ofproto-dpif.c @@ -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); -- 2.30.2