The is_gratuitous_arp() function is occasionally called when
processing the "normal" action.  The previous code only disabled
wildcarding the dl_type field when the function was called, but
since it runs occasionally, it could lead to inconsistencies in the
facet table.  This commit causes the dl_type to never be wildcarded
when the "normal" action is used.

Signed-off-by: Justin Pettit <jpet...@nicira.com>
---
 ofproto/ofproto-dpif.c |    5 ++++-
 1 files changed, 4 insertions(+), 1 deletions(-)

diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
index 8df2679..ace8ba7 100644
--- a/ofproto/ofproto-dpif.c
+++ b/ofproto/ofproto-dpif.c
@@ -7531,7 +7531,6 @@ update_mirror_stats(struct ofproto_dpif *ofproto, 
mirror_mask_t mirrors,
 static bool
 is_gratuitous_arp(const struct flow *flow, struct flow_wildcards *wc)
 {
-    memset(&wc->masks.dl_type, 0xff, sizeof wc->masks.dl_type);
     if (flow->dl_type != htons(ETH_TYPE_ARP)) {
         return false;
     }
@@ -7707,6 +7706,10 @@ xlate_normal(struct xlate_ctx *ctx)
 
     ctx->xout->has_normal = true;
 
+    /* Check the dl_type, since we may check for gratuituous ARP. */
+    memset(&ctx->xout->wc.masks.dl_type, 0xff,
+           sizeof ctx->xout->wc.masks.dl_type);
+
     memset(&ctx->xout->wc.masks.dl_src, 0xff,
            sizeof ctx->xout->wc.masks.dl_src);
     memset(&ctx->xout->wc.masks.dl_dst, 0xff,
-- 
1.7.5.4

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to