From 41ca9a1e89c861823e6b73d3a207fdfbd95423e7 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Mon, 9 Jul 2012 23:45:25 -0700 Subject: [PATCH] ofp-util: Wildcard VLAN PCP in OF1.0 matches when 802.1Q not present. When an output OF1.0 match uses OFP_VLAN_NONE to match only when the 802.1Q header is not present, it is somewhat contradictory to specify any value for the VLAN PCP, since none can be present without an 802.1Q header, but the match output by Open vSwitch did so. This fixes it. Signed-off-by: Ben Pfaff Tested-by: Simon Horman --- lib/ofp-util.c | 1 + tests/flowgen.pl | 9 ++++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/ofp-util.c b/lib/ofp-util.c index 5fb8d8f2..a62b5549 100644 --- a/lib/ofp-util.c +++ b/lib/ofp-util.c @@ -234,6 +234,7 @@ ofputil_cls_rule_to_ofp10_match(const struct cls_rule *rule, } else if (rule->wc.vlan_tci_mask & htons(VLAN_CFI) && !(rule->flow.vlan_tci & htons(VLAN_CFI))) { match->dl_vlan = htons(OFP10_VLAN_NONE); + ofpfw |= OFPFW10_DL_VLAN_PCP; } else { if (!(rule->wc.vlan_tci_mask & htons(VLAN_VID_MASK))) { ofpfw |= OFPFW10_DL_VLAN; diff --git a/tests/flowgen.pl b/tests/flowgen.pl index 2f688699..536fb326 100755 --- a/tests/flowgen.pl +++ b/tests/flowgen.pl @@ -1,6 +1,6 @@ #! /usr/bin/perl -# Copyright (c) 2009, 2010, 2011 Nicira, Inc. +# Copyright (c) 2009, 2010, 2011, 2012 Nicira, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -109,10 +109,13 @@ sub output { # Compose packet. my $packet = ''; + my $wildcards = 0; $packet .= pack_ethaddr($flow{DL_DST}); $packet .= pack_ethaddr($flow{DL_SRC}); if ($flow{DL_VLAN} != 0xffff) { $packet .= pack('nn', 0x8100, $flow{DL_VLAN}); + } else { + $wildcards |= 1 << 20; # OFPFW10_DL_VLAN_PCP } my $len_ofs = length($packet); $packet .= pack('n', 0) if $attrs{DL_HEADER} =~ /^802.2/; @@ -204,8 +207,8 @@ sub output { print "\n"; print FLOWS pack('Nn', - 0, # wildcards - 1); # in_port + $wildcards, # wildcards + 1); # in_port print FLOWS pack_ethaddr($flow{DL_SRC}); print FLOWS pack_ethaddr($flow{DL_DST}); print FLOWS pack('nCxnCCxxNNnn', -- 2.30.2