It turns out that eth_addr_equal_except() computed the exact
opposite of what it purported to.  It returned true if the two
arguments where *not* equal.  This is extremely confusing, so this
patch changes it.

Signed-off-by: Ethan Jackson <[email protected]>
---
 lib/classifier.c        |    8 ++++----
 lib/packets.h           |   12 ++++++------
 tests/test-classifier.c |    8 ++++----
 3 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/lib/classifier.c b/lib/classifier.c
index 327a8b2..d19840c 100644
--- a/lib/classifier.c
+++ b/lib/classifier.c
@@ -1204,10 +1204,10 @@ flow_equal_except(const struct flow *a, const struct 
flow *b,
             && (wc & FWW_DL_TYPE || a->dl_type == b->dl_type)
             && !((a->tp_src ^ b->tp_src) & wildcards->tp_src_mask)
             && !((a->tp_dst ^ b->tp_dst) & wildcards->tp_dst_mask)
-            && !eth_addr_equal_except(a->dl_src, b->dl_src,
-                    wildcards->dl_src_mask)
-            && !eth_addr_equal_except(a->dl_dst, b->dl_dst,
-                    wildcards->dl_dst_mask)
+            && eth_addr_equal_except(a->dl_src, b->dl_src,
+                                     wildcards->dl_src_mask)
+            && eth_addr_equal_except(a->dl_dst, b->dl_dst,
+                                     wildcards->dl_dst_mask)
             && (wc & FWW_NW_PROTO || a->nw_proto == b->nw_proto)
             && (wc & FWW_NW_TTL || a->nw_ttl == b->nw_ttl)
             && (wc & FWW_NW_DSCP || !((a->nw_tos ^ b->nw_tos) & IP_DSCP_MASK))
diff --git a/lib/packets.h b/lib/packets.h
index 00c2b75..afe4b6b 100644
--- a/lib/packets.h
+++ b/lib/packets.h
@@ -84,12 +84,12 @@ static inline bool eth_addr_equal_except(const uint8_t 
a[ETH_ADDR_LEN],
                                     const uint8_t b[ETH_ADDR_LEN],
                                     const uint8_t mask[ETH_ADDR_LEN])
 {
-    return (((a[0] ^ b[0]) & mask[0])
-            || ((a[1] ^ b[1]) & mask[1])
-            || ((a[2] ^ b[2]) & mask[2])
-            || ((a[3] ^ b[3]) & mask[3])
-            || ((a[4] ^ b[4]) & mask[4])
-            || ((a[5] ^ b[5]) & mask[5]));
+    return !(((a[0] ^ b[0]) & mask[0])
+             || ((a[1] ^ b[1]) & mask[1])
+             || ((a[2] ^ b[2]) & mask[2])
+             || ((a[3] ^ b[3]) & mask[3])
+             || ((a[4] ^ b[4]) & mask[4])
+             || ((a[5] ^ b[5]) & mask[5]));
 }
 static inline uint64_t eth_addr_to_uint64(const uint8_t ea[ETH_ADDR_LEN])
 {
diff --git a/tests/test-classifier.c b/tests/test-classifier.c
index 7403159..25f6edb 100644
--- a/tests/test-classifier.c
+++ b/tests/test-classifier.c
@@ -203,11 +203,11 @@ match(const struct cls_rule *wild, const struct flow 
*fixed)
         } else if (f_idx == CLS_F_IDX_TP_DST) {
             eq = !((fixed->tp_dst ^ wild->flow.tp_dst) & wild->wc.tp_dst_mask);
         } else if (f_idx == CLS_F_IDX_DL_SRC) {
-            eq = !eth_addr_equal_except(fixed->dl_src, wild->flow.dl_src,
-                                        wild->wc.dl_src_mask);
+            eq = eth_addr_equal_except(fixed->dl_src, wild->flow.dl_src,
+                                       wild->wc.dl_src_mask);
         } else if (f_idx == CLS_F_IDX_DL_DST) {
-            eq = !eth_addr_equal_except(fixed->dl_dst, wild->flow.dl_dst,
-                                        wild->wc.dl_dst_mask);
+            eq = eth_addr_equal_except(fixed->dl_dst, wild->flow.dl_dst,
+                                       wild->wc.dl_dst_mask);
         } else if (f_idx == CLS_F_IDX_VLAN_TCI) {
             eq = !((fixed->vlan_tci ^ wild->flow.vlan_tci)
                    & wild->wc.vlan_tci_mask);
-- 
1.7.10.2

_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev

Reply via email to