Add connection tracking mark support.
[cascardo/ovs.git] / ofproto / ofproto-dpif.c
index 2b731d1..689b4eb 100644 (file)
@@ -1269,6 +1269,7 @@ check_##NAME(struct dpif_backer *backer)                                    \
 
 CHECK_FEATURE(ct_state)
 CHECK_FEATURE(ct_zone)
+CHECK_FEATURE(ct_mark)
 
 #undef CHECK_FEATURE
 #undef CHECK_FEATURE__
@@ -1287,6 +1288,7 @@ check_support(struct dpif_backer *backer)
 
     backer->support.odp.ct_state = check_ct_state(backer);
     backer->support.odp.ct_zone = check_ct_zone(backer);
+    backer->support.odp.ct_mark = check_ct_mark(backer);
 }
 
 static int
@@ -4008,16 +4010,19 @@ static enum ofperr
 rule_check(struct rule *rule)
 {
     uint16_t ct_state, ct_zone;
+    uint32_t ct_mark;
 
     ct_state = MINIFLOW_GET_U16(rule->cr.match.flow, ct_state);
     ct_zone = MINIFLOW_GET_U16(rule->cr.match.flow, ct_zone);
+    ct_mark = MINIFLOW_GET_U32(rule->cr.match.flow, ct_mark);
 
-    if (ct_state || ct_zone) {
+    if (ct_state || ct_zone || ct_mark) {
         struct ofproto_dpif *ofproto = ofproto_dpif_cast(rule->ofproto);
         const struct odp_support *support = &ofproto_dpif_get_support(ofproto)->odp;
 
         if ((ct_state && !support->ct_state)
-            || (ct_zone && !support->ct_zone)) {
+            || (ct_zone && !support->ct_zone)
+            || (ct_mark && !support->ct_mark)) {
             return OFPERR_OFPBMC_BAD_FIELD;
         }
         if (ct_state & CS_UNSUPPORTED_MASK) {