Merge branch 'master' of ssh://git.onelab.eu/git/sliver-openvswitch
[sliver-openvswitch.git] / lib / classifier.h
index 341c344..fdc3af7 100644 (file)
@@ -41,15 +41,18 @@ extern "C" {
 struct classifier {
     int n_rules;                /* Total number of rules. */
     struct hmap tables;         /* Contains "struct cls_table"s.  */
+    struct list tables_priority; /* Tables in descending priority order */
 };
 
 /* A set of rules that all have the same fields wildcarded. */
 struct cls_table {
     struct hmap_node hmap_node; /* Within struct classifier 'tables' hmap. */
+    struct list list_node;      /* Within classifier 'tables_priority_list' */
     struct hmap rules;          /* Contains "struct cls_rule"s. */
-    struct flow_wildcards wc;   /* Wildcards for fields. */
+    struct minimask mask;       /* Wildcards for fields. */
     int n_table_rules;          /* Number of rules, including duplicates. */
-    bool is_catchall;           /* True if this table wildcards every field. */
+    unsigned int max_priority;  /* Max priority of any rule in the table. */
+    unsigned int max_count;     /* Count of max_priority rules. */
 };
 
 /* Returns true if 'table' is a "catch-all" table that will match every
@@ -57,19 +60,21 @@ struct cls_table {
 static inline bool
 cls_table_is_catchall(const struct cls_table *table)
 {
-    return table->is_catchall;
+    return minimask_is_catchall(&table->mask);
 }
 
-/* A rule in a "struct classifier" */
+/* A rule in a "struct classifier". */
 struct cls_rule {
     struct hmap_node hmap_node; /* Within struct cls_table 'rules'. */
     struct list list;           /* List of identical, lower-priority rules. */
-    struct match match;         /* Matching rule. */
+    struct minimatch match;     /* Matching rule. */
     unsigned int priority;      /* Larger numbers are higher priorities. */
 };
 
-void cls_rule_init(struct cls_rule *,
-                   const struct match *, unsigned int priority);
+void cls_rule_init(struct cls_rule *, const struct match *,
+                   unsigned int priority);
+void cls_rule_init_from_minimatch(struct cls_rule *, const struct minimatch *,
+                                  unsigned int priority);
 void cls_rule_clone(struct cls_rule *, const struct cls_rule *);
 void cls_rule_destroy(struct cls_rule *);
 
@@ -78,8 +83,10 @@ 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);
+                             const struct minimatch *criteria);
 
 void classifier_init(struct classifier *);
 void classifier_destroy(struct classifier *);
@@ -89,7 +96,8 @@ void classifier_insert(struct classifier *, struct cls_rule *);
 struct cls_rule *classifier_replace(struct classifier *, struct cls_rule *);
 void classifier_remove(struct classifier *, struct cls_rule *);
 struct cls_rule *classifier_lookup(const struct classifier *,
-                                   const struct flow *);
+                                   const struct flow *,
+                                   struct flow_wildcards *);
 bool classifier_rule_overlaps(const struct classifier *,
                               const struct cls_rule *);