Is there any reason we can't simply ignore the CFI bit? Something like the following? I'm having trouble working out exactly how the CFI bit in OpenFlow matches interacts with the various versions and the classifier.
Ethan --- lib/ofp-util.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/ofp-util.c b/lib/ofp-util.c index 90475f7..9c29eb2 100644 --- a/lib/ofp-util.c +++ b/lib/ofp-util.c @@ -1165,6 +1165,7 @@ enum ofputil_protocol ofputil_usable_protocols(const struct cls_rule *rule) { const struct flow_wildcards *wc = &rule->wc; + uint16_t vlan_tci_mask = ntohs(wc->vlan_tci_mask); BUILD_ASSERT_DECL(FLOW_WC_SEQ == 9); @@ -1214,6 +1215,14 @@ ofputil_usable_protocols(const struct cls_rule *rule) return OFPUTIL_P_NXM_ANY; } + /* Only NXM supports arbitrary masking of vlan_tci. */ + if ((vlan_tci_mask & VLAN_PCP_MASK + && (vlan_tci_mask & VLAN_PCP_MASK) != VLAN_PCP_MASK) + || (vlan_tci_mask & VLAN_VID_MASK + && (vlan_tci_mask & VLAN_VID_MASK) != VLAN_VID_MASK)) { + return OFPUTIL_P_NXM_ANY; + } + /* Only NXM supports bitwise matching on transport port. */ if ((wc->tp_src_mask && wc->tp_src_mask != htons(UINT16_MAX)) || (wc->tp_dst_mask && wc->tp_dst_mask != htons(UINT16_MAX))) { -- 1.7.9.4 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev