ofp-util: Work on decoding OF1.1 flow_mods.
[openvswitch] / tests / flowgen.pl
index d397515ae9982eeac4deac760c12d26d2d827167..536fb326aefb9471356dd9ba0e50c7c81802629a 100755 (executable)
@@ -1,6 +1,6 @@
 #! /usr/bin/perl
 
-# Copyright (c) 2009, 2010 Nicira Networks.
+# 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.
@@ -98,7 +98,7 @@ sub output {
         } else {
             die;
         }
-        if ($attrs{IP_FRAGMENT} ne 'no') {
+        if ($attrs{IP_FRAGMENT} ne 'no' && $attrs{IP_FRAGMENT} ne 'first') {
             $flow{TP_SRC} = $flow{TP_DST} = 0;
         }
     } elsif ($attrs{DL_TYPE} eq 'non-ip') {
@@ -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/;
@@ -158,14 +161,14 @@ sub output {
 
             if ($attrs{TP_PROTO} =~ '^TCP') {
                 my $tcp = pack('nnNNnnnn',
-                               $flow{TP_SRC},           # source port
-                               $flow{TP_DST},           # dest port
-                               87123455,                # seqno
-                               712378912,               # ackno
+                               $flow{TP_SRC},     # source port
+                               $flow{TP_DST},     # dest port
+                               87123455,          # seqno
+                               712378912,         # ackno
                                (5 << 12) | 0x02 | 0x10, # hdrlen, SYN, ACK
                                5823,                    # window size
                                18923,                   # checksum
-                               12893);                  # urgent pointer
+                               12893); # urgent pointer
                 if ($attrs{TP_PROTO} eq 'TCP+options') {
                     substr($tcp, 12, 2) = pack('n', (6 << 12) | 0x02 | 0x10);
                     $tcp .= pack('CCn', 2, 4, 1975); # MSS option
@@ -179,17 +182,16 @@ sub output {
                 $ip .= $udp;
             } elsif ($attrs{TP_PROTO} eq 'ICMP') {
                 $ip .= pack('CCnnn',
-                            8,    # echo request
-                            0,    # code
-                            0,    # checksum
-                            736,  # identifier
-                            931); # sequence number
+                            8,        # echo request
+                            0,        # code
+                            0,        # checksum
+                            736,      # identifier
+                            931);     # sequence number
             } elsif ($attrs{TP_PROTO} eq 'other') {
                 $ip .= 'other header';
             } else {
                 die;
             }
-
             substr($ip, 2, 2) = pack('n', length($ip));
             $packet .= $ip;
         }
@@ -205,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',