On Thu, Jul 19, 2012 at 12:24:13AM -0700, Ben Pfaff wrote: > Signed-off-by: Ben Pfaff <b...@nicira.com> > --- > DESIGN | 106 > +++++++++++++++++++++++++++++++++++++++++++++++++ > tests/ovs-ofctl.at | 87 ++++++++++++++++++++++++++++++++++++++++ > utilities/ovs-ofctl.c | 76 +++++++++++++++++++++++++++++++++++ > 3 files changed, 269 insertions(+), 0 deletions(-) > > diff --git a/DESIGN b/DESIGN > index b06751f..9c1ff55 100644 > --- a/DESIGN > +++ b/DESIGN > @@ -152,6 +152,112 @@ sends flow_removed message --- --- --- % > % > receive the generated messages.) > > > +VLAN Matching > +============= > + > +The 802.1Q VLAN header causes more trouble than any other 4 bytes in > +networking. More specifically, three versions of OpenFlow and Open > +vSwitch have among them four different ways to match the contents and > +presence of the VLAN header. The following table describes how each > +version works. > + > + Match NXM OF1.0 OF1.1 OF1.2 > + ----- --------- ----------- ----------- ------------ > + [1] 0000/0000 ????/1,??/? ????/1,??/? 0000/0000,-- > + [2] 0000/ffff ffff/0,??/? ffff/0,??/? 0000/ffff,-- > + [3] 1xxx/1fff 0xxx/0,??/1 0xxx/0,??/1 1xxx/ffff,--
For [2] and [3] should the mask in the OF1.2 column be 1fff, that is the top three bits clear, as the PCP is not set? > + [4] z000/f000 ????/1,0y/0 fffe/0,0y/0 1000/1000,0y > + [5] zxxx/ffff 0xxx/0,0y/0 0xxx/0,0y/0 1xxx/ffff,0y > + [6] 0000/0fff <none> <none> <none> > + [7] 0000/f000 <none> <none> <none> > + [8] 0000/efff <none> <none> <none> > + [9] 1001/1001 <none> <none> 1001/1001,-- > + [10] 3000/3000 <none> <none> <none> And in the same vain as my comment on [5], I believe that [10] is invalid for OF1.2. > +Each column is interpreted as follows. > + > + - Match: See the list below. > + > + - NXM: xxxx/yyyy means NXM_OF_VLAN_TCI_W with value xxxx and mask > + yyyy. A mask of 0000 is equivalent to omitting > + NXM_OF_VLAN_TCI(_W), a mask of ffff is equivalent to > + NXM_OF_VLAN_TCI. > + > + - OF1.0 and OF1.1: wwww/x,yy/z means dl_vlan wwww, OFPFW_DL_VLAN > + x, dl_vlan_pcp yy, and OFPFW_DL_VLAN_PCP z. ? means that the > + given nibble is ignored (and conventionally 0 for wwww or z, > + conventionally 1 for x or z). <none> means that the given match > + is not supported. > + > + - OF1.2: xxxx/yyyy,zz means OXM_OF_VLAN_VID_W with value xxxx and > + mask yyyy, and OXM_OF_VLAN_PCP (which is not maskable) with > + value zz. A mask of 0000 is equivalent to omitting > + OXM_OF_VLAN_VID(_W), a mask of ffff is equivalent to > + OXM_OF_VLAN_VID. -- means that OXM_OF_VLAN_PCP is omitted. > + <none> means that the given match is not supported. > + > +The matches are: > + > + [1] Matches any packet, that is, one without an 802.1Q header or with > + an 802.1Q header with any TCI value. > + > + [2] Matches only packets without an 802.1Q header. > + > + NXM: Any match with (vlan_tci == 0) and (vlan_tci_mask & 0x1000) > + != 0 is equivalent to the one listed in the table. > + > + OF1.0: The spec doesn't define behavior if dl_vlan is set to > + 0xffff and OFPFW_DL_VLAN_PCP is not set. > + > + OF1.1: The spec says explicitly to ignore dl_vlan_pcp when > + dl_vlan is set to 0xffff. > + > + OF1.2: The spec doesn't say what should happen if (vlan_vid == 0) > + and (vlan_vid_mask & 0x1000) != 0 but (vlan_vid_mask != 0x1000), > + but it would be straightforward to also interpret as [2]. My reading is that the requirement for [2] is that the mask is absent and vlan_vid == 0x0000, or in language that might be understood outside of the spec: the CFI bit is clear and VID = 0x000. I would lean towards extending that logic to allow any mask, though as mentioned below I would prefer that there was a general restriction that the top three bits of masks are clear. > + [3] Matches only packets that have an 802.1Q header with VID xxx (and > + any PCP). > + > + [4] Matches only packets that have an 802.1Q header with PCP y (and > + any VID). > + > + NXM: z is ((y << 1) | 1). > + > + OF1.0: The spec isn't very clear, but OVS implements it this way. > + > + OF1.2: Presumably other masks such that (vlan_vid_mask & 0x1fff) > + == 0x1000 would also work, but the spec doesn't define their > + behavior. Yes, I agree. I think that its ok to accept other masks because, for example: 1000 & 1000 == 1000 & 1fff > + > + [5] Matches only packets that have an 802.1Q header with VID xxx and > + PCP y. > + > + NXM: z is ((y << 1) | 1). > + > + OF1.2: Presumably other masks such that (vlan_vid_mask & 0x1fff) > + == 0x1fff would also work. For OF1.2 I think its best to either require the top 3 bits of the mask to be clear or ignore them. Perdonally I prefer the first option. > + [6] Matches packets with no 802.1Q header or with an 802.1Q header > + with a VID of 0. Only possible with NXM. > + > + [7] Matches packets with no 802.1Q header or with an 802.1Q header > + with a PCP of 0. Only possible with NXM. > + > + [8] Matches packets with no 802.1Q header or with an 802.1Q header > + with both VID and PCP of 0. Only possible with NXM. > + > + [9] Matches only packets that have an 802.1Q header with an > + odd-numbered VID (and any PCP). Only possible with NXM and > + OF1.2. (This is just an example; one can match on any desired > + VID bit pattern.) For OF1.2 my feeling is that as all of these have OFPVID_NONE as the VID that they are all equivalent to [2]. Either that or all masks should be rejected if the VID is OFPVID_NONE. > + > +[10] Matches only packets that have an 802.1Q header with an > + odd-numbered PCP (and any VID). Only possible with NXM. (This > + is just an example; one can match on any desired VID bit > + pattern.) > + > + I concur that this is not valid for OF1.2. _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev