ofp-util: Wildcard VLAN PCP in OF1.0 matches when 802.1Q not present.
authorBen Pfaff <blp@nicira.com>
Tue, 10 Jul 2012 06:45:25 +0000 (23:45 -0700)
committerBen Pfaff <blp@nicira.com>
Wed, 18 Jul 2012 04:20:23 +0000 (21:20 -0700)
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 <blp@nicira.com>
Tested-by: Simon Horman <horms@verge.net.au>
lib/ofp-util.c
tests/flowgen.pl

index 5fb8d8f2d1caa81704c73a54868474f833d107f2..a62b554932815979f36de9454fa0de8534919528 100644 (file)
@@ -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;
index 2f6886990bb8e76146de42504f183f6ecf302bfc..536fb326aefb9471356dd9ba0e50c7c81802629a 100755 (executable)
@@ -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',