2
0
mirror of https://github.com/openvswitch/ovs synced 2025-08-31 22:35:15 +00:00

nx-match: Implement support for arbitrary VLAN TCI masks.

Since the Nicira Extended Match was specified nicira-ext.h has claimed that
arbitrary masks are allowed, but in fact only certain masks were actually
implemented.  This commit implements general masking for the 802.1Q VLAN
TCI field.
This commit is contained in:
Ben Pfaff
2010-11-23 10:06:28 -08:00
parent 2d8b103caa
commit 66642cb40b
13 changed files with 249 additions and 237 deletions

View File

@@ -167,14 +167,7 @@ odp_flow_key_from_flow(struct odp_flow_key *key, const struct flow *flow)
key->nw_src = flow->nw_src;
key->nw_dst = flow->nw_dst;
key->in_port = flow->in_port;
if (flow->dl_vlan == htons(OFP_VLAN_NONE)) {
key->dl_tci = htons(0);
} else {
uint16_t vid = flow->dl_vlan & htons(VLAN_VID_MASK);
uint16_t pcp = htons((flow->dl_vlan_pcp << VLAN_PCP_SHIFT)
& VLAN_PCP_MASK);
key->dl_tci = vid | pcp | htons(ODP_TCI_PRESENT);
}
key->dl_tci = flow->vlan_tci;
key->dl_type = flow->dl_type;
key->tp_src = flow->tp_src;
key->tp_dst = flow->tp_dst;
@@ -192,13 +185,7 @@ odp_flow_key_to_flow(const struct odp_flow_key *key, struct flow *flow)
flow->nw_src = key->nw_src;
flow->nw_dst = key->nw_dst;
flow->in_port = key->in_port;
if (key->dl_tci) {
flow->dl_vlan = htons(vlan_tci_to_vid(key->dl_tci));
flow->dl_vlan_pcp = vlan_tci_to_pcp(key->dl_tci);
} else {
flow->dl_vlan = htons(OFP_VLAN_NONE);
flow->dl_vlan_pcp = 0;
}
flow->vlan_tci = key->dl_tci;
flow->dl_type = key->dl_type;
flow->tp_src = key->tp_src;
flow->tp_dst = key->tp_dst;