Signed-off-by: Simon Horman <ho...@verge.net.au> --- lib/classifier.c | 12 ++++++++++-- lib/classifier.h | 1 + lib/meta-flow.c | 7 +++++-- tests/ovs-ofctl.at | 20 ++++++++++++++++++++ 4 files changed, 36 insertions(+), 4 deletions(-)
diff --git a/lib/classifier.c b/lib/classifier.c index 18be0e1..104dec6 100644 --- a/lib/classifier.c +++ b/lib/classifier.c @@ -236,10 +236,18 @@ cls_rule_set_any_vid(struct cls_rule *rule) } void +cls_rule_set_dl_vlan_masked(struct cls_rule *rule, ovs_be16 dl_vlan, + ovs_be16 mask) +{ + flow_set_vlan_vid(&rule->flow, dl_vlan & mask); + rule->wc.vlan_tci_mask |= mask & htons(VLAN_VID_MASK | VLAN_CFI); +} + +void cls_rule_set_dl_vlan(struct cls_rule *rule, ovs_be16 dl_vlan) { - flow_set_vlan_vid(&rule->flow, dl_vlan); - rule->wc.vlan_tci_mask |= htons(VLAN_VID_MASK | VLAN_CFI); + cls_rule_set_dl_vlan_masked(rule, dl_vlan, + htons(VLAN_VID_MASK | VLAN_CFI)); } /* Modifies 'rule' so that the VLAN PCP is wildcarded. If the VID is already diff --git a/lib/classifier.h b/lib/classifier.h index b154899..8ec22a7 100644 --- a/lib/classifier.h +++ b/lib/classifier.h @@ -111,6 +111,7 @@ void cls_rule_set_dl_tci(struct cls_rule *, ovs_be16 tci); void cls_rule_set_dl_tci_masked(struct cls_rule *, ovs_be16 tci, ovs_be16 mask); void cls_rule_set_any_vid(struct cls_rule *); +void cls_rule_set_dl_vlan_masked(struct cls_rule *, ovs_be16, ovs_be16); void cls_rule_set_dl_vlan(struct cls_rule *, ovs_be16); void cls_rule_set_any_pcp(struct cls_rule *); void cls_rule_set_dl_vlan_pcp(struct cls_rule *, uint8_t); diff --git a/lib/meta-flow.c b/lib/meta-flow.c index 02f93e8..d17fb83 100644 --- a/lib/meta-flow.c +++ b/lib/meta-flow.c @@ -159,7 +159,7 @@ static const struct mf_field mf_fields[MFF_N_IDS] = { }, { MFF_VLAN_VID, "dl_vlan", NULL, sizeof(ovs_be16), 12, - MFM_NONE, 0, + MFM_FULLY, 0, MFS_DECIMAL, MFP_NONE, true, @@ -1493,7 +1493,6 @@ mf_set(const struct mf_field *mf, switch (mf->id) { case MFF_IN_PORT: case MFF_ETH_TYPE: - case MFF_VLAN_VID: case MFF_VLAN_PCP: case MFF_IPV6_LABEL: case MFF_IP_PROTO: @@ -1531,6 +1530,10 @@ mf_set(const struct mf_field *mf, cls_rule_set_dl_src_masked(rule, value->mac, mask->mac); break; + case MFF_VLAN_VID: + cls_rule_set_dl_vlan_masked(rule, value->be16, mask->be16); + break; + case MFF_VLAN_TCI: cls_rule_set_dl_tci_masked(rule, value->be16, mask->be16); break; diff --git a/tests/ovs-ofctl.at b/tests/ovs-ofctl.at index 63b411e..6ccd699 100644 --- a/tests/ovs-ofctl.at +++ b/tests/ovs-ofctl.at @@ -1316,7 +1316,17 @@ OXM_OF_VLAN_VID(0000) # Packets without 802.1Q header or with VID=0 OXM_OF_VLAN_VID(1123) # Packets with VID=123, any PCP OXM_OF_VLAN_VID(1123) OXM_OF_VLAN_PCP(01) # Packets with VID=123, PCP=1. OXM_OF_VLAN_VID(0123) # Does not make sense (but supported anyway) +OXM_OF_VLAN_VID_W(0123/0123) # Does not make sense (but supported anyway) +OXM_OF_VLAN_VID_W(1123/0123) # Does not make sense (but supported anyway) +OXM_OF_VLAN_VID_W(0123/1123) # Does not make sense (but supported anyway) OXM_OF_VLAN_VID(0123) OXM_OF_VLAN_PCP(01) #Bad Pre-Requisite +OXM_OF_VLAN_VID_W(1123/1fff) # Packets with VID=123, any PCP. +OXM_OF_VLAN_VID_W(1123/ffff) # Packets with VID=123, any PCP. +OXM_OF_VLAN_VID_W(1123/0000) # Packets with or without 802.1Q header +OXM_OF_VLAN_VID_W(1123/1f0f), # Packets with # VID=123 (masked) +OXM_OF_VLAN_VID_W(1123/1f0f), OXM_OF_VLAN_PCP(01) # Packets with VID=123 (masked), any PCP. +OXM_OF_VLAN_VID_W(1000/1000) # Packets with any VID, any PCP +OXM_OF_VLAN_VID_W(1000/1000), OXM_OF_VLAN_PCP(01) # Packets with any VID, PCP=1. # IP ECN OXM_OF_ETH_TYPE(0800) OXM_OF_IP_ECN(03) @@ -1489,7 +1499,17 @@ OXM_OF_VLAN_VID(0000) OXM_OF_VLAN_VID(1123) OXM_OF_VLAN_VID(1123), OXM_OF_VLAN_PCP(01) OXM_OF_VLAN_VID(0123) +OXM_OF_VLAN_VID_W(0123/0123) +OXM_OF_VLAN_VID_W(0123/0123) +OXM_OF_VLAN_VID_W(0123/1123) nx_pull_match() returned error OFPBMC_BAD_PREREQ +OXM_OF_VLAN_VID(1123) +OXM_OF_VLAN_VID(1123) +<any> +OXM_OF_VLAN_VID_W(1103/1f0f) +OXM_OF_VLAN_VID_W(1103/1f0f), OXM_OF_VLAN_PCP(01) +OXM_OF_VLAN_VID_W(1000/1000) +OXM_OF_VLAN_VID_W(1000/1000), OXM_OF_VLAN_PCP(01) # IP ECN OXM_OF_ETH_TYPE(0800), OXM_OF_IP_ECN(03) -- 1.7.10.2.484.gcd07cc5 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev