odp-util: Print in_port in decimal in format_odp_flow_key().
[openvswitch] / lib / classifier.h
index 126d1498acd918622185bc39d7f48ed413cd4a26..c555efe825ae3d8e75ecd2d5ce9cae4a26d43f83 100644 (file)
 #include "flow.h"
 #include "hmap.h"
 #include "list.h"
+#include "openflow/nicira-ext.h"
 #include "openflow/openflow.h"
 
 /* Number of bytes of fields in a rule. */
-#define CLS_N_BYTES 31
+#define CLS_N_BYTES 37
 
 /* Fields in a rule.
  *
  * performance (see above).  To adjust the ordering, change the order of the
  * lines. */
 #define CLS_FIELDS                                          \
-    /*                           flow_t       all-caps */   \
+    /*                           struct flow  all-caps */   \
     /*        wildcard bit(s)    member name  name     */   \
     /*        -----------------  -----------  -------- */   \
     CLS_FIELD(OFPFW_IN_PORT,     in_port,     IN_PORT)      \
+    CLS_FIELD(NXFW_TUN_ID,       tun_id,      TUN_ID)       \
     CLS_FIELD(OFPFW_DL_VLAN,     dl_vlan,     DL_VLAN)      \
     CLS_FIELD(OFPFW_DL_VLAN_PCP, dl_vlan_pcp, DL_VLAN_PCP)  \
     CLS_FIELD(OFPFW_DL_SRC,      dl_src,      DL_SRC)       \
@@ -84,7 +86,7 @@ enum {
 
 /* Field information. */
 struct cls_field {
-    int ofs;                    /* Offset in flow_t. */
+    int ofs;                    /* Offset in struct flow. */
     int len;                    /* Length in bytes. */
     uint32_t wildcards;         /* OFPFW_* bit or bits for this field. */
     const char *name;           /* Name (for debugging). */
@@ -102,7 +104,7 @@ struct classifier {
 struct cls_bucket {
     struct hmap_node hmap_node; /* Within struct classifier 'tables'. */
     struct list rules;          /* In order from highest to lowest priority. */
-    flow_t fixed;               /* Values for fixed fields. */
+    struct flow fixed;          /* Values for fixed fields. */
 };
 
 /* A flow classification rule.
@@ -115,16 +117,17 @@ struct cls_rule {
         struct list list;       /* Within struct cls_bucket 'rules'. */
         struct hmap_node hmap;  /* Within struct classifier 'exact_table'. */
     } node;
-    flow_t flow;                /* All field values. */
+    struct flow flow;           /* All field values. */
     struct flow_wildcards wc;   /* Wildcards for fields. */
     unsigned int priority;      /* Larger numbers are higher priorities. */
     unsigned int table_idx;     /* Index into struct classifier 'tables'. */
 };
 
-void cls_rule_from_flow(struct cls_rule *, const flow_t *, uint32_t wildcards,
-                        unsigned int priority);
-void cls_rule_from_match(struct cls_rule *, const struct ofp_match *,
-                         unsigned int priority);
+void cls_rule_from_flow(const struct flow *, uint32_t wildcards,
+                        unsigned int priority, struct cls_rule *);
+void cls_rule_from_match(const struct ofp_match *, unsigned int priority,
+                         bool tun_id_from_cookie, uint64_t cookie,
+                         struct cls_rule *);
 char *cls_rule_to_string(const struct cls_rule *);
 void cls_rule_print(const struct cls_rule *);
 void cls_rule_moved(struct classifier *,
@@ -140,12 +143,13 @@ int classifier_count_exact(const struct classifier *);
 struct cls_rule *classifier_insert(struct classifier *, struct cls_rule *);
 void classifier_insert_exact(struct classifier *, struct cls_rule *);
 void classifier_remove(struct classifier *, struct cls_rule *);
-struct cls_rule *classifier_lookup(const struct classifier *, const flow_t *);
+struct cls_rule *classifier_lookup(const struct classifier *,
+                                   const struct flow *);
 struct cls_rule *classifier_lookup_wild(const struct classifier *,
-                                        const flow_t *);
+                                        const struct flow *);
 struct cls_rule *classifier_lookup_exact(const struct classifier *,
-                                         const flow_t *);
-bool classifier_rule_overlaps(const struct classifier *, const flow_t *, 
+                                         const struct flow *);
+bool classifier_rule_overlaps(const struct classifier *, const struct flow *,
                               uint32_t wildcards, unsigned int priority);
 
 typedef void cls_cb_func(struct cls_rule *, void *aux);
@@ -161,8 +165,14 @@ void classifier_for_each_match(const struct classifier *,
                                const struct cls_rule *,
                                int include, cls_cb_func *, void *aux);
 struct cls_rule *classifier_find_rule_exactly(const struct classifier *,
-                                              const flow_t *target,
+                                              const struct flow *target,
                                               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, MEMBER, CLS) \
+        HMAP_FOR_EACH_SAFE (RULE, NEXT, MEMBER.node.hmap, &(CLS)->exact_table)
+
 #endif /* classifier.h */