classifier: Introduce macros for iterating exact-match flows.
authorBen Pfaff <blp@nicira.com>
Thu, 7 Oct 2010 17:36:02 +0000 (10:36 -0700)
committerBen Pfaff <blp@nicira.com>
Thu, 7 Oct 2010 17:36:02 +0000 (10:36 -0700)
This special case of iterating through flows is easier and presumably
faster to implement using a macro.

lib/classifier.c
lib/classifier.h
ofproto/ofproto.c

index e0c57ebe47e58d1161c545dab7f644b099c1b8f0..8d711a150a40017ad1a3205f50b010880fc54f73 100644 (file)
@@ -461,7 +461,10 @@ classifier_for_each_match(const struct classifier *cls,
  * it must not delete (or move) any other rules in 'cls' that are in the same
  * table as the argument rule.  Two rules are in the same table if their
  * cls_rule structs have the same table_idx; as a special case, a rule with
- * wildcards and an exact-match rule will never be in the same table. */
+ * wildcards and an exact-match rule will never be in the same table.
+ *
+ * If 'include' is CLS_INC_EXACT then CLASSIFIER_FOR_EACH_EXACT_RULE(_SAFE) is
+ * probably easier to use. */
 void
 classifier_for_each(const struct classifier *cls, int include,
                     void (*callback)(struct cls_rule *, void *aux),
index f522f0e5aa9034323b2f692e704448cf51f16072..13eb0510b95293a1174461577da90b8ae33d35e6 100644 (file)
@@ -168,4 +168,10 @@ struct cls_rule *classifier_find_rule_exactly(const struct classifier *,
                                               uint32_t wildcards,
                                               unsigned int priority);
 
+#define CLASSIFIER_FOR_EACH_EXACT_RULE(RULE, MEMBER, CLS) \
+        HMAP_FOR_EACH (RULE, MEMBER.node.hmap, &(CLS)->exact_table)
+
+#define CLASSIFIER_FOR_EACH_EXACT_RULE_SAFE(RULE, NEXT, CLS) \
+        HMAP_FOR_EACH_SAFE (RULE, NEXT, MEMBER.node.hmap, &(CLS)->exact_table)
+
 #endif /* classifier.h */
index cc90f91ce8bb0e3f7d9706463b2e6b05162c60b5..d7f65680b0dc68f239bb7b58e2345f37fd4811c0 100644 (file)
@@ -3062,17 +3062,6 @@ handle_desc_stats_request(struct ofproto *p, struct ofconn *ofconn,
     return 0;
 }
 
-static void
-count_subrules(struct cls_rule *cls_rule, void *n_subrules_)
-{
-    struct rule *rule = rule_from_cls_rule(cls_rule);
-    int *n_subrules = n_subrules_;
-
-    if (rule->super) {
-        (*n_subrules)++;
-    }
-}
-
 static int
 handle_table_stats_request(struct ofproto *p, struct ofconn *ofconn,
                            struct ofp_stats_request *request)
@@ -3081,12 +3070,17 @@ handle_table_stats_request(struct ofproto *p, struct ofconn *ofconn,
     struct ofpbuf *msg;
     struct odp_stats dpstats;
     int n_exact, n_subrules, n_wild;
+    struct rule *rule;
 
     msg = start_stats_reply(request, sizeof *ots * 2);
 
     /* Count rules of various kinds. */
     n_subrules = 0;
-    classifier_for_each(&p->cls, CLS_INC_EXACT, count_subrules, &n_subrules);
+    CLASSIFIER_FOR_EACH_EXACT_RULE (rule, cr, &p->cls) {
+        if (rule->super) {
+            n_subrules++;
+        }
+    }
     n_exact = classifier_count_exact(&p->cls) - n_subrules;
     n_wild = classifier_count(&p->cls) - classifier_count_exact(&p->cls);