2
0
mirror of https://github.com/openvswitch/ovs synced 2025-10-19 14:37:21 +00:00

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.
This commit is contained in:
Ben Pfaff
2010-10-07 10:36:02 -07:00
parent da89bf9eb7
commit 35950f0cfa
3 changed files with 16 additions and 13 deletions

View 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),

View 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 */

View 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);