mirror of
https://github.com/openvswitch/ovs
synced 2025-08-31 06:15:47 +00:00
classifier: Optimize iteration with a catch-all target rule.
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 <blp@nicira.com>
This commit is contained in:
@@ -111,6 +111,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. */
|
||||
@@ -399,7 +406,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
|
||||
|
Reference in New Issue
Block a user