When cls_cursor_init() is given a NULL target, it can skip an expensive step comparing the rule against the target for every table and every rule in the classifier. collect_rule_loose() and other callers could take advantage of this optimization, except that they actually pass in a rule that matches everything instead of a NULL rule (e.g. for "ovs-ofctl dump-flows <bridge>" without specifying a matching rule).
This optimizes that case. Signed-off-by: Ben Pfaff <b...@nicira.com> --- lib/classifier.c | 9 ++++++++- lib/classifier.h | 2 ++ 2 files changed, 10 insertions(+), 1 deletions(-) diff --git a/lib/classifier.c b/lib/classifier.c index a482666..50c36dc 100644 --- a/lib/classifier.c +++ b/lib/classifier.c @@ -107,6 +107,13 @@ cls_rule_format(const struct cls_rule *rule, struct ds *s) { match_format(&rule->match, s, rule->priority); } + +/* Returns true if 'rule' matches every packet, false otherwise. */ +bool +cls_rule_is_catchall(const struct cls_rule *rule) +{ + return flow_wildcards_is_catchall(&rule->match.wc); +} /* Initializes 'cls' as a classifier that initially contains no classification * rules. */ @@ -375,7 +382,7 @@ cls_cursor_init(struct cls_cursor *cursor, const struct classifier *cls, const struct cls_rule *target) { cursor->cls = cls; - cursor->target = target; + cursor->target = target && !cls_rule_is_catchall(target) ? target : NULL; } /* Returns the first matching cls_rule in 'cursor''s iteration, or a null diff --git a/lib/classifier.h b/lib/classifier.h index 74f9211..34e4bdb 100644 --- a/lib/classifier.h +++ b/lib/classifier.h @@ -78,6 +78,8 @@ uint32_t cls_rule_hash(const struct cls_rule *, uint32_t basis); void cls_rule_format(const struct cls_rule *, struct ds *); +bool cls_rule_is_catchall(const struct cls_rule *); + bool cls_rule_is_loose_match(const struct cls_rule *rule, const struct match *criteria); -- 1.7.2.5 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev