* 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),
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 */
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)
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);