From: Ben Pfaff Date: Thu, 7 Oct 2010 17:36:02 +0000 (-0700) Subject: classifier: Introduce macros for iterating exact-match flows. X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=35950f0cfa75821e4db5fc767b5a1671c40c6b1a;p=openvswitch classifier: Introduce macros for iterating exact-match flows. This special case of iterating through flows is easier and presumably faster to implement using a macro. --- diff --git a/lib/classifier.c b/lib/classifier.c index e0c57ebe..8d711a15 100644 --- a/lib/classifier.c +++ b/lib/classifier.c @@ -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), diff --git a/lib/classifier.h b/lib/classifier.h index f522f0e5..13eb0510 100644 --- a/lib/classifier.h +++ b/lib/classifier.h @@ -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 */ diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c index cc90f91c..d7f65680 100644 --- a/ofproto/ofproto.c +++ b/ofproto/ofproto.c @@ -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);