[ovs-dev] [generic tci mask 3/8] flow: New function flow_wildcards_is_exact().

Ben Pfaff blp at nicira.com
Wed Nov 10 23:37:58 UTC 2010


---
 lib/classifier.c        |    2 +-
 lib/flow.c              |    8 ++++++++
 lib/flow.h              |    2 ++
 tests/test-classifier.c |    3 ++-
 4 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/lib/classifier.c b/lib/classifier.c
index 4bf354e..811283f 100644
--- a/lib/classifier.c
+++ b/lib/classifier.c
@@ -478,7 +478,7 @@ classifier_find_rule_exactly(const struct classifier *cls,
     }
 
     head = find_equal(table, &target->flow, flow_hash(&target->flow, 0));
-    if (!target->wc.wildcards) {
+    if (flow_wildcards_is_exact(&target->wc)) {
         return head;
     }
     FOR_EACH_RULE_IN_LIST (rule, head) {
diff --git a/lib/flow.c b/lib/flow.c
index b562389..082a1df 100644
--- a/lib/flow.c
+++ b/lib/flow.c
@@ -417,6 +417,14 @@ flow_wildcards_init_exact(struct flow_wildcards *wc)
     memset(wc->reg_masks, 0xff, sizeof wc->reg_masks);
 }
 
+/* Returns true if 'wc' is exact-match, false if 'wc' wildcards any bits or
+ * fields. */
+bool
+flow_wildcards_is_exact(const struct flow_wildcards *wc)
+{
+    return !wc->wildcards;
+}
+
 static inline uint32_t
 combine_nw_bits(uint32_t wb1, uint32_t wb2, int shift)
 {
diff --git a/lib/flow.h b/lib/flow.h
index f17c98c..1099f9f 100644
--- a/lib/flow.h
+++ b/lib/flow.h
@@ -148,6 +148,8 @@ ovs_be32 flow_nw_bits_to_mask(uint32_t wildcards, int shift);
 void flow_wildcards_init(struct flow_wildcards *, uint32_t wildcards);
 void flow_wildcards_init_exact(struct flow_wildcards *);
 
+bool flow_wildcards_is_exact(const struct flow_wildcards *);
+
 bool flow_wildcards_set_nw_src_mask(struct flow_wildcards *, ovs_be32);
 bool flow_wildcards_set_nw_dst_mask(struct flow_wildcards *, ovs_be32);
 void flow_wildcards_set_reg_mask(struct flow_wildcards *,
diff --git a/tests/test-classifier.c b/tests/test-classifier.c
index 581b6ef..3049810 100644
--- a/tests/test-classifier.c
+++ b/tests/test-classifier.c
@@ -136,7 +136,8 @@ tcls_insert(struct tcls *tcls, const struct test_rule *rule)
 {
     size_t i;
 
-    assert(rule->cls_rule.wc.wildcards || rule->cls_rule.priority == UINT_MAX);
+    assert(!flow_wildcards_is_exact(&rule->cls_rule.wc)
+           || rule->cls_rule.priority == UINT_MAX);
     for (i = 0; i < tcls->n_rules; i++) {
         const struct cls_rule *pos = &tcls->rules[i]->cls_rule;
         if (cls_rule_equal(pos, &rule->cls_rule)) {
-- 
1.7.1





More information about the dev mailing list