ofproto-dpif: Shortcut common case in rule_check().
authorJoe Stringer <joestringer@nicira.com>
Wed, 11 Nov 2015 19:39:51 +0000 (11:39 -0800)
committerJoe Stringer <joestringer@nicira.com>
Tue, 1 Dec 2015 23:29:01 +0000 (15:29 -0800)
Typically the datapath will support all available features, so check
that first before attempting to retrieve various values out of a
minimask as the latter doesn't need to be checked if all fields are
supported.

ct_state is an exception, because support for the bits in this field is
not binary; only some bits are defined so far, so they must still be
checked against the current known supported bits.

Suggested-by: Jarno Rajahalme <jrajahalme@nicira.com>
Signed-off-by: Joe Stringer <joestringer@nicira.com>
Acked-by: Jarno Rajahalme <jarno@ovn.org>
ofproto/ofproto-dpif.c

index 8d6865e..9d50e31 100644 (file)
@@ -4023,6 +4023,11 @@ rule_check(struct rule *rule)
 
     support = &ofproto_dpif_get_support(ofproto)->odp;
     ct_state = MINIFLOW_GET_U16(&rule->cr.match.mask->masks, ct_state);
+    if (support->ct_state && support->ct_zone && support->ct_mark
+        && support->ct_label) {
+        return ct_state & CS_UNSUPPORTED_MASK ? OFPERR_OFPBMC_BAD_MASK : 0;
+    }
+
     ct_zone = MINIFLOW_GET_U16(&rule->cr.match.mask->masks, ct_zone);
     ct_mark = MINIFLOW_GET_U32(&rule->cr.match.mask->masks, ct_mark);
     ct_label = MINIFLOW_GET_U128(&rule->cr.match.mask->masks, ct_label);