From: Joe Stringer Date: Wed, 11 Nov 2015 19:39:51 +0000 (-0800) Subject: ofproto-dpif: Shortcut common case in rule_check(). X-Git-Tag: v2.5.0~211 X-Git-Url: http://git.cascardo.eti.br/?a=commitdiff_plain;ds=sidebyside;h=11968381be82dcfbfdd0823b7aed35d3ee3c7048;p=cascardo%2Fovs.git ofproto-dpif: Shortcut common case in rule_check(). 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 Signed-off-by: Joe Stringer Acked-by: Jarno Rajahalme --- diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c index 8d6865e26..9d50e314a 100644 --- a/ofproto/ofproto-dpif.c +++ b/ofproto/ofproto-dpif.c @@ -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);