From 3ad6619bf3f7e1fc879bb74285f0379ac473243f Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Thu, 7 Oct 2010 10:36:02 -0700 Subject: [PATCH] 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. --- lib/classifier.c | 5 ++++- lib/classifier.h | 7 +++++++ ofproto/ofproto.c | 18 ++++++------------ 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/lib/classifier.c b/lib/classifier.c index 378faf8e0..8e5c1a657 100644 --- a/lib/classifier.c +++ b/lib/classifier.c @@ -465,7 +465,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 f522f0e5a..e9fa736e0 100644 --- a/lib/classifier.h +++ b/lib/classifier.h @@ -168,4 +168,11 @@ struct cls_rule *classifier_find_rule_exactly(const struct classifier *, uint32_t wildcards, unsigned int priority); +#define CLASSIFIER_FOR_EACH_EXACT_RULE(RULE, STRUCT, MEMBER, CLS) \ + HMAP_FOR_EACH (RULE, STRUCT, MEMBER.node.hmap, &(CLS)->exact_table) + +#define CLASSIFIER_FOR_EACH_EXACT_RULE_SAFE(RULE, NEXT, STRUCT, MEMBER, CLS) \ + HMAP_FOR_EACH_SAFE (RULE, NEXT, STRUCT, MEMBER.node.hmap, \ + &(CLS)->exact_table) + #endif /* classifier.h */ diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c index 750c50b04..d46d99f54 100644 --- a/ofproto/ofproto.c +++ b/ofproto/ofproto.c @@ -3026,17 +3026,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) @@ -3045,12 +3034,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, struct 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); -- 2.43.0