How about this? diff --git a/lib/match.c b/lib/match.c index 7d0b409..e34572d 100644 --- a/lib/match.c +++ b/lib/match.c @@ -360,6 +360,10 @@ match_set_dl_tci(struct match *match, ovs_be16 tci) void match_set_dl_tci_masked(struct match *match, ovs_be16 tci, ovs_be16 mask) { + if (mask && mask != htons(0xffff)) { + tci |= htons(VLAN_CFI); + mask |= htons(VLAN_CFI); + } match->flow.vlan_tci = tci & mask; match->wc.masks.vlan_tci = mask; }
On Fri, Jun 5, 2015 at 9:24 AM, Alex Wang <al...@nicira.com> wrote: > Thx for the reference, exactly what i want, > > Will change the solution~ > > Thanks, > Alex Wang, > > On Fri, Jun 5, 2015 at 8:24 AM, Ben Pfaff <b...@nicira.com> wrote: > >> On Wed, Jun 03, 2015 at 11:21:50PM -0700, Alex Wang wrote: >> > OVS datapath has check which prevents the installation of flow >> > that matches VLAN TCI but does not have exact match for VLAN_CFI >> > bit. However, the ovs userspace does not enforce it, so OpenFlow >> > flow like "vlan_tci=0x000a/0x0fff,action=output:local" can be added >> > to ovs. Subsequently, the generated megaflow will have match >> > field for vlan like "vlan(vid=5/0xfff,pcp=0/0x0,cfi=1/0)". >> > >> > With the OVS datapath check, the installation of such megaflow >> > will be rejected with: >> > "|WARN|system@ovs-system: failed to put[create][modify] (Invalid >> argument)" >> > >> > This commit adds a check in userspace that mark the vlan mask >> > invalid if it does not exact match for VLAN_CFI. So users will >> > be asked to provide correct mask. >> >> This is not the right fix, because it is legitimate and useful not to >> match on the "CFI" (actually "vlan present") bit in OpenFlow. See the >> comment in meta-flow.h: >> >> /* "vlan_tci". >> * >> * 802.1Q TCI. >> * >> * For a packet with an 802.1Q header, this is the Tag Control >> Information >> * (TCI) field, with the CFI bit forced to 1. For a packet with no >> 802.1Q >> * header, this has value 0. >> * >> * This field can be used in various ways: >> * >> * - If it is not constrained at all, the nx_match matches packets >> * without an 802.1Q header or with an 802.1Q header that has any >> TCI >> * value. >> * >> * - Testing for an exact match with 0 matches only packets without >> an >> * 802.1Q header. >> * >> * - Testing for an exact match with a TCI value with CFI=1 matches >> * packets that have an 802.1Q header with a specified VID and >> PCP. >> * >> * - Testing for an exact match with a nonzero TCI value with CFI=0 >> does >> * not make sense. The switch may reject this combination. >> * >> * - Testing with a specific VID and CFI=1, with nxm_mask=0x1fff, >> matches >> * packets that have an 802.1Q header with that VID (and any PCP). >> * >> * - Testing with a specific PCP and CFI=1, with nxm_mask=0xf000, >> matches >> * packets that have an 802.1Q header with that PCP (and any VID). >> * >> * - Testing with nxm_value=0, nxm_mask=0x0fff matches packets with >> no >> * 802.1Q header or with an 802.1Q header with a VID of 0. >> * >> * - Testing with nxm_value=0, nxm_mask=0xe000 matches packets with >> no >> * 802.1Q header or with an 802.1Q header with a PCP of 0. >> * >> * - Testing with nxm_value=0, nxm_mask=0xefff matches packets with >> no >> * 802.1Q header or with an 802.1Q header with both VID and PCP >> of 0. >> * >> * Type: be16. >> * Maskable: bitwise. >> * Formatting: hexadecimal. >> * Prerequisites: none. >> * Access: read/write. >> * NXM: NXM_OF_VLAN_TCI(4) since v1.1. >> * OXM: none. >> * OF1.0: exact match. >> * OF1.1: exact match. >> */ >> MFF_VLAN_TCI, >> >> I think that we should fix this in flow translation, by "unwildcarding" >> the CFI bit if any other bits in vlan_tci are unwildcarded. >> > > _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev