[ovs-dev] [PATCH 6/6] OXM: Allow VLAN VID match to be masked
Simon Horman
horms at verge.net.au
Wed Jul 18 01:48:01 UTC 2012
Signed-off-by: Simon Horman <horms at 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
More information about the dev
mailing list