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:
@@ -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),
|
||||
|
@@ -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 */
|
||||
|
@@ -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);
|
||||
|
||||
|
Reference in New Issue
Block a user