$ ovs-vsctl add-br br0
$ ovs-vsctl add-port br0 int0 -- set Interface int0 type=internal
- $ ip addr add 192.168.0.123/24 dev int0
+ $ ip addr add 192.168.0.123/24 dev int0
$ ip link set int0 up
Even more simply, you can take advantage of the internal port that every
bridge has under the name of the bridge::
$ ovs-vsctl add-br br0
- $ ip addr add 192.168.0.123/24 dev br0
+ $ ip addr add 192.168.0.123/24 dev br0
$ ip link set br0 up
In more detail, a "tap" device is an interface between the Linux (or BSD)
$ ovs-vsctl add-port br0 eth0
$ ovs-vsctl add-port br0 vlan9 tag=9 \
-- set interface vlan9 type=internal
- $ ip addr add 192.168.0.7/24 dev vlan9
+ $ ip addr add 192.168.0.7/24 dev vlan9
$ ip link set vlan0 up
See also the following question.
The following group property experimenter type defined by this extension.
enum ntr_group_mod_subtype {
- NTRT_SELECTION_METHOD = 1,
+ NTRT_SELECTION_METHOD = 1,
};
The new sandbox starts out without any bridges. Use ``ovs-vsctl``
in the context of the new sandbox to create a bridge, e.g.::
- sim_add hv0 # Create sandbox hv0.
- as hv0 # Set hv0 as default sandbox.
- ovs-vsctl add-br br0 # Add bridge br0 inside hv0.
+ sim_add hv0 # Create sandbox hv0.
+ as hv0 # Set hv0 as default sandbox.
+ ovs-vsctl add-br br0 # Add bridge br0 inside hv0.
The Open vSwitch instances that ``sim_add`` creates enable
``dummy`` devices. This means that bridges and interfaces can be
net_add n1
for i in 0 1; do
- sim_add hv$i
- as hv$i ovs-vsctl add-br br0 -- add-port br0 vif$i
- as hv$i net_attach n1 br0
+ sim_add hv$i
+ as hv$i ovs-vsctl add-br br0 -- add-port br0 vif$i
+ as hv$i net_attach n1 br0
done
Here’s an extended version that also starts OVN::
ovn-nbctl ls-add lsw0
net_add n1
for i in 0 1; do
- sim_add hv$i
- as hv$i
- ovs-vsctl add-br br-phys
- ovn_attach n1 br-phys 192.168.0.`expr $i + 1`
- ovs-vsctl add-port br-int vif$i -- set Interface vif$i external-ids:iface-id=lp$i
- ovn-nbctl lsp-add lsw0 lp$i
- ovn-nbctl lsp-set-addresses lp$i f0:00:00:00:00:0$i
+ sim_add hv$i
+ as hv$i
+ ovs-vsctl add-br br-phys
+ ovn_attach n1 br-phys 192.168.0.`expr $i + 1`
+ ovs-vsctl add-port br-int vif$i -- set Interface vif$i external-ids:iface-id=lp$i
+ ovn-nbctl lsp-add lsw0 lp$i
+ ovn-nbctl lsp-set-addresses lp$i f0:00:00:00:00:0$i
done
Here’s a primitive OVN "scale test" (adjust the scale by changing
net_add n1
ovn-nbctl ls-add br0
for i in `seq $n`; do
- (sim_add hv$i
- as hv$i
- ovs-vsctl add-br br-phys
- y=$(expr $i / 256)
- x=$(expr $i % 256)
- ovn_attach n1 br-phys 192.168.$y.$x
- ovs-vsctl add-port br-int vif$i -- set Interface vif$i external-ids:iface-id=lp$i) &
- case $i in
- *50|*00) echo $i; wait ;;
- esac
+ (sim_add hv$i
+ as hv$i
+ ovs-vsctl add-br br-phys
+ y=$(expr $i / 256)
+ x=$(expr $i % 256)
+ ovn_attach n1 br-phys 192.168.$y.$x
+ ovs-vsctl add-port br-int vif$i -- set Interface vif$i external-ids:iface-id=lp$i) &
+ case $i in
+ *50|*00) echo $i; wait ;;
+ esac
done
wait
for i in `seq $n`; do
- yy=$(printf %02x $(expr $i / 256))
- xx=$(printf $02x $(expr $i % 256))
- ovn-nbctl lsp-add br0 lp$i
- ovn-nbctl lsp-set-addresses lp$i f0:00:00:00:$yy:$xx
+ yy=$(printf %02x $(expr $i / 256))
+ xx=$(printf $02x $(expr $i % 256))
+ ovn-nbctl lsp-add br0 lp$i
+ ovn-nbctl lsp-set-addresses lp$i f0:00:00:00:$yy:$xx
done
When the scale test has finished initializing, you can watch the
``connection_mode``)::
$ ovs-vsctl add-br br0 \
- -- set bridge br0 other-config:datapath-id=0000000000000001 \
- -- add-port br0 p1 -- set interface p1 ofport_request=1 \
- -- add-port br0 p2 -- set interface p2 ofport_request=2 \
- -- add-port br0 p3 -- set interface p3 ofport_request=3 \
- -- add-port br0 p4 -- set interface p4 ofport_request=4 \
- -- add-port br0 p5 -- set interface p5 ofport_request=5 \
- -- set-controller br0 tcp:127.0.0.1:6653 \
- -- set controller br0 connection-mode=out-of-band
+ -- set bridge br0 other-config:datapath-id=0000000000000001 \
+ -- add-port br0 p1 -- set interface p1 ofport_request=1 \
+ -- add-port br0 p2 -- set interface p2 ofport_request=2 \
+ -- add-port br0 p3 -- set interface p3 ofport_request=3 \
+ -- add-port br0 p4 -- set interface p4 ofport_request=4 \
+ -- add-port br0 p5 -- set interface p5 ofport_request=5 \
+ -- set-controller br0 tcp:127.0.0.1:6653 \
+ -- set controller br0 connection-mode=out-of-band
.. note::
dps:
switch-1:
- dp_id: 0x1
- timeout: 3600
- arp_neighbor_timeout: 3600
- interfaces:
- 1:
- native_vlan: 100
- acl_in: 1
- 2:
- native_vlan: 100
- 3:
- native_vlan: 100
- 4:
- native_vlan: 200
- 5:
- native_vlan: 200
+ dp_id: 0x1
+ timeout: 3600
+ arp_neighbor_timeout: 3600
+ interfaces:
+ 1:
+ native_vlan: 100
+ acl_in: 1
+ 2:
+ native_vlan: 100
+ 3:
+ native_vlan: 100
+ 4:
+ native_vlan: 200
+ 5:
+ native_vlan: 200
vlans:
100:
- faucet_vips: ["10.100.0.254/24"]
+ faucet_vips: ["10.100.0.254/24"]
200:
- faucet_vips: ["10.200.0.254/24"]
+ faucet_vips: ["10.200.0.254/24"]
routers:
router-1:
- vlans: [100, 200]
+ vlans: [100, 200]
acls:
1:
- - rule:
- dl_type: 0x800
- nw_proto: 6
- tcp_dst: 8080
- actions:
- allow: 0
- - rule:
- actions:
- allow: 1
+ - rule:
+ dl_type: 0x800
+ nw_proto: 6
+ tcp_dst: 8080
+ actions:
+ allow: 0
+ - rule:
+ actions:
+ allow: 1
Then restart Faucet::
bridge("br0")
-------------
0. dl_dst=01:80:c2:00:00:00/ff:ff:ff:ff:ff:f0, priority 32768
- drop
+ drop
Final flow: unchanged
Megaflow: recirc_id=0,in_port=1,dl_src=00:00:00:00:00:00/01:00:00:00:00:00,dl_dst=01:80:c2:00:00:00/ff:ff:ff:ff:ff:f0,dl_type=0x0000
bridge("br0")
-------------
0. priority 0
- resubmit(,1)
+ resubmit(,1)
1. No match.
- drop
+ drop
Final flow: unchanged
Megaflow: recirc_id=0,in_port=1,dl_src=00:00:00:00:00:00/01:00:00:00:00:00,dl_dst=01:80:c2:00:00:10/ff:ff:ff:ff:ff:f0,dl_type=0x0000
bridge("br0")
-------------
0. priority 0
- resubmit(,1)
+ resubmit(,1)
1. in_port=1, priority 99
- resubmit(,2)
+ resubmit(,2)
2. No match.
- drop
+ drop
Final flow: unchanged
Megaflow: recirc_id=0,in_port=1,dl_src=00:00:00:00:00:00/01:00:00:00:00:00,dl_dst=00:00:00:00:00:00/ff:ff:ff:ff:ff:f0,dl_type=0x0000
bridge("br0")
-------------
0. priority 0
- resubmit(,1)
+ resubmit(,1)
1. in_port=2,vlan_tci=0x0000, priority 99
- mod_vlan_vid:20
- resubmit(,2)
+ mod_vlan_vid:20
+ resubmit(,2)
2. No match.
- drop
+ drop
Final flow: in_port=2,dl_vlan=20,dl_vlan_pcp=0,dl_src=00:00:00:00:00:00,dl_dst=00:00:00:00:00:00,dl_type=0x0000
Megaflow: recirc_id=0,in_port=2,vlan_tci=0x0000,dl_src=00:00:00:00:00:00/01:00:00:00:00:00,dl_dst=00:00:00:00:00:00/ff:ff:ff:ff:ff:f0,dl_type=0x0000
bridge("br0")
-------------
0. priority 0
- resubmit(,1)
+ resubmit(,1)
1. priority 0
- drop
+ drop
Final flow: unchanged
Megaflow: recirc_id=0,in_port=2,vlan_tci=0x0005,dl_src=00:00:00:00:00:00/01:00:00:00:00:00,dl_dst=00:00:00:00:00:00/ff:ff:ff:ff:ff:f0,dl_type=0x0000
bridge("br0")
-------------
0. priority 0
- resubmit(,1)
+ resubmit(,1)
1. in_port=1, priority 99
- resubmit(,2)
+ resubmit(,2)
2. priority 32768
- learn(table=10,NXM_OF_VLAN_TCI[0..11],NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],load:NXM_OF_IN_PORT[]->NXM_NX_REG0[0..15])
- -> table=10 vlan_tci=0x0014/0x0fff,dl_dst=50:00:00:00:00:01 priority=32768 actions=load:0x1->NXM_NX_REG0[0..15]
- resubmit(,3)
+ learn(table=10,NXM_OF_VLAN_TCI[0..11],NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],load:NXM_OF_IN_PORT[]->NXM_NX_REG0[0..15])
+ -> table=10 vlan_tci=0x0014/0x0fff,dl_dst=50:00:00:00:00:01 priority=32768 actions=load:0x1->NXM_NX_REG0[0..15]
+ resubmit(,3)
3. No match.
- drop
+ drop
Final flow: unchanged
Megaflow: recirc_id=0,in_port=1,vlan_tci=0x0014/0x1fff,dl_src=50:00:00:00:00:01,dl_dst=00:00:00:00:00:00/ff:ff:ff:ff:ff:f0,dl_type=0x0000
bridge("br0")
-------------
0. priority 0
- resubmit(,1)
+ resubmit(,1)
1. in_port=1, priority 99
- resubmit(,2)
+ resubmit(,2)
2. priority 32768
- learn(table=10,NXM_OF_VLAN_TCI[0..11],NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],load:NXM_OF_IN_PORT[]->NXM_NX_REG0[0..15])
- -> table=10 vlan_tci=0x0014/0x0fff,dl_dst=f0:00:00:00:00:01 priority=32768 actions=load:0x1->NXM_NX_REG0[0..15]
- resubmit(,3)
+ learn(table=10,NXM_OF_VLAN_TCI[0..11],NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],load:NXM_OF_IN_PORT[]->NXM_NX_REG0[0..15])
+ -> table=10 vlan_tci=0x0014/0x0fff,dl_dst=f0:00:00:00:00:01 priority=32768 actions=load:0x1->NXM_NX_REG0[0..15]
+ resubmit(,3)
3. priority 50
- resubmit(,10)
- 10. No match.
- drop
- resubmit(,4)
+ resubmit(,10)
+ 10. No match.
+ drop
+ resubmit(,4)
4. No match.
- drop
+ drop
Final flow: unchanged
Megaflow: recirc_id=0,in_port=1,dl_vlan=20,dl_src=f0:00:00:00:00:01,dl_dst=90:00:00:00:00:01,dl_type=0x0000
bridge("br0")
-------------
0. priority 0
- resubmit(,1)
+ resubmit(,1)
1. in_port=2,vlan_tci=0x0000, priority 99
- mod_vlan_vid:20
- resubmit(,2)
+ mod_vlan_vid:20
+ resubmit(,2)
2. priority 32768
- learn(table=10,NXM_OF_VLAN_TCI[0..11],NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],load:NXM_OF_IN_PORT[]->NXM_NX_REG0[0..15])
- -> table=10 vlan_tci=0x0014/0x0fff,dl_dst=90:00:00:00:00:01 priority=32768 actions=load:0x2->NXM_NX_REG0[0..15]
- resubmit(,3)
+ learn(table=10,NXM_OF_VLAN_TCI[0..11],NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],load:NXM_OF_IN_PORT[]->NXM_NX_REG0[0..15])
+ -> table=10 vlan_tci=0x0014/0x0fff,dl_dst=90:00:00:00:00:01 priority=32768 actions=load:0x2->NXM_NX_REG0[0..15]
+ resubmit(,3)
3. priority 50
- resubmit(,10)
- 10. vlan_tci=0x0014/0x0fff,dl_dst=f0:00:00:00:00:01, priority 32768
- load:0x1->NXM_NX_REG0[0..15]
- resubmit(,4)
+ resubmit(,10)
+ 10. vlan_tci=0x0014/0x0fff,dl_dst=f0:00:00:00:00:01, priority 32768
+ load:0x1->NXM_NX_REG0[0..15]
+ resubmit(,4)
4. No match.
- drop
+ drop
Final flow: reg0=0x1,in_port=2,dl_vlan=20,dl_vlan_pcp=0,dl_src=90:00:00:00:00:01,dl_dst=f0:00:00:00:00:01,dl_type=0x0000
Megaflow: recirc_id=0,in_port=2,vlan_tci=0x0000,dl_src=90:00:00:00:00:01,dl_dst=f0:00:00:00:00:01,dl_type=0x0000
bridge("br0")
-------------
0. priority 0
- resubmit(,1)
+ resubmit(,1)
1. in_port=1, priority 99
- resubmit(,2)
+ resubmit(,2)
2. priority 32768
- learn(table=10,NXM_OF_VLAN_TCI[0..11],NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],load:NXM_OF_IN_PORT[]->NXM_NX_REG0[0..15])
- -> table=10 vlan_tci=0x0014/0x0fff,dl_dst=f0:00:00:00:00:01 priority=32768 actions=load:0x1->NXM_NX_REG0[0..15]
- resubmit(,3)
+ learn(table=10,NXM_OF_VLAN_TCI[0..11],NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],load:NXM_OF_IN_PORT[]->NXM_NX_REG0[0..15])
+ -> table=10 vlan_tci=0x0014/0x0fff,dl_dst=f0:00:00:00:00:01 priority=32768 actions=load:0x1->NXM_NX_REG0[0..15]
+ resubmit(,3)
3. priority 50
- resubmit(,10)
- 10. vlan_tci=0x0014/0x0fff,dl_dst=90:00:00:00:00:01, priority 32768
- load:0x2->NXM_NX_REG0[0..15]
- resubmit(,4)
+ resubmit(,10)
+ 10. vlan_tci=0x0014/0x0fff,dl_dst=90:00:00:00:00:01, priority 32768
+ load:0x2->NXM_NX_REG0[0..15]
+ resubmit(,4)
4. No match.
- drop
+ drop
Implementing Table 4: Output Processing
were allowed.)
- Allow support for arbitrary Ethernet masks. (Previously, only
the multicast bit in the destination address could be individually
- masked.)
+ masked.)
- New field OXM_OF_METADATA, to align with OpenFlow 1.1.
- The OFPST_QUEUE request now reports an error if a specified port or
queue does not exist, or for requests for a specific queue on all
aptitude -y update
aptitude -y upgrade
aptitude -y install -R \
- build-essential dpkg-dev lintian devscripts fakeroot \
- debhelper dh-autoreconf uuid-runtime \
- autoconf automake libtool \
- python-all python-twisted-core python-twisted-conch \
- xdg-utils groff graphviz netcat curl \
- wget python-six ethtool \
- libcap-ng-dev libssl-dev python-dev openssl \
- python-pyftpdlib python-flake8 python-tftpy \
- linux-headers-`uname -r`
+ build-essential dpkg-dev lintian devscripts fakeroot \
+ debhelper dh-autoreconf uuid-runtime \
+ autoconf automake libtool \
+ python-all python-twisted-core python-twisted-conch \
+ xdg-utils groff graphviz netcat curl \
+ wget python-six ethtool \
+ libcap-ng-dev libssl-dev python-dev openssl \
+ python-pyftpdlib python-flake8 python-tftpy \
+ linux-headers-`uname -r`
SCRIPT
$bootstrap_centos = <<SCRIPT
The original sources for this package can be found at:
- http://openvswitch.org/
+ http://openvswitch.org/
Upstream Authors (from AUTHORS):
Upstream Copyright Holders:
- Copyright (c) 2007, 2008, 2009, 2010, 2011, 2012, 2013 Nicira, Inc.
- Copyright (c) 2010 Jean Tourrilhes - HP-Labs.
- Copyright (c) 2008,2009,2010 Citrix Systems, Inc.
- and authors listed above.
- Copyright (c) 2011 Gaetano Catalli
- Copyright (C) 2000-2003 Geoffrey Wossum (gwossum@acm.org)
- Copyright (C) 2000 The NetBSD Foundation, Inc.
- Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- Copyright (c) 1982, 1986, 1990, 1993 The Regents of the University of California.
- Copyright (c) 2008, 2012 Vincent Bernat <bernat@luffy.cx>
- Copyright (c) 2014 Michael Chapman
- Copyright (c) 2014 WindRiver, Inc.
- Copyright (c) 2014 Avaya, Inc.
- Copyright (c) 2001 Daniel Hartmeier
- Copyright (c) 2002 - 2008 Henning Brauer
- Copyright (c) 2012 Gleb Smirnoff <glebius@FreeBSD.org>
+ Copyright (c) 2007, 2008, 2009, 2010, 2011, 2012, 2013 Nicira, Inc.
+ Copyright (c) 2010 Jean Tourrilhes - HP-Labs.
+ Copyright (c) 2008,2009,2010 Citrix Systems, Inc.
+ and authors listed above.
+ Copyright (c) 2011 Gaetano Catalli
+ Copyright (C) 2000-2003 Geoffrey Wossum (gwossum@acm.org)
+ Copyright (C) 2000 The NetBSD Foundation, Inc.
+ Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
+ Copyright (c) 1982, 1986, 1990, 1993 The Regents of the University of California.
+ Copyright (c) 2008, 2012 Vincent Bernat <bernat@luffy.cx>
+ Copyright (c) 2014 Michael Chapman
+ Copyright (c) 2014 WindRiver, Inc.
+ Copyright (c) 2014 Avaya, Inc.
+ Copyright (c) 2001 Daniel Hartmeier
+ Copyright (c) 2002 - 2008 Henning Brauer
+ Copyright (c) 2012 Gleb Smirnoff <glebius@FreeBSD.org>
License:
GNU Lesser General Public License version 2.1 only
with the exception clause below as a pre-amble.
- xenserver/etc_xensource_scripts_vif
- xenserver/opt_xensource_libexec_InterfaceReconfigure.py
- xenserver/opt_xensource_libexec_InterfaceReconfigureBridge.py
- xenserver/opt_xensource_libexec_InterfaceReconfigureVswitch.py
- xenserver/opt_xensource_libexec_interface-reconfigure
- xenserver/usr_lib_xsconsole_plugins-base_XSFeatureVSwitch.py
+ xenserver/etc_xensource_scripts_vif
+ xenserver/opt_xensource_libexec_InterfaceReconfigure.py
+ xenserver/opt_xensource_libexec_InterfaceReconfigureBridge.py
+ xenserver/opt_xensource_libexec_InterfaceReconfigureVswitch.py
+ xenserver/opt_xensource_libexec_interface-reconfigure
+ xenserver/usr_lib_xsconsole_plugins-base_XSFeatureVSwitch.py
- * These components are only distributed in the source package.
- They do not appear in any binary packages.
+ * These components are only distributed in the source package.
+ They do not appear in any binary packages.
On Debian systems, the complete text of the
GNU Lesser General Public License version 2.1 can be found in
* The following components are licensed under the
GNU Lesser General Public License version 2.1.
- utilities/bugtool/ovs-bugtool
- utilities/bugtool/ovs-bugtool-*
- utilities/bugtool/plugins/kernel-info/openvswitch.xml
- utilities/bugtool/plugins/network-status/openvswitch.xml
- utilities/bugtool/plugins/system-configuration.xml
- utilities/bugtool/plugins/system-configuration/openvswitch.xml
+ utilities/bugtool/ovs-bugtool
+ utilities/bugtool/ovs-bugtool-*
+ utilities/bugtool/plugins/kernel-info/openvswitch.xml
+ utilities/bugtool/plugins/network-status/openvswitch.xml
+ utilities/bugtool/plugins/system-configuration.xml
+ utilities/bugtool/plugins/system-configuration/openvswitch.xml
On Debian systems, the complete text of the
GNU Lesser General Public License version 2.1 can be found in
* The following component is licensed under the GNU General Public License
version 2.
- datapath/
+ datapath/
On Debian systems, the complete text of the GNU General Public License
version 2 can be found in `/usr/share/common-licenses/GPL-2'
* The following file is licensed under the GNU General Public License
version 2.
- build-aux/cccl
+ build-aux/cccl
* The following files are licensed under the 2-clause BSD license.
- lib/getopt_long.c
- include/windows/getopt.h
- datapath-windows/ovsext/Conntrack-tcp.c
- lib/conntrack-tcp.c
+ lib/getopt_long.c
+ include/windows/getopt.h
+ datapath-windows/ovsext/Conntrack-tcp.c
+ lib/conntrack-tcp.c
* The following files are licensed under the 3-clause BSD-license
- include/windows/netinet/icmp6.h
- include/windows/netinet/ip6.h
- lib/strsep.c
+ include/windows/netinet/icmp6.h
+ include/windows/netinet/ip6.h
+ lib/strsep.c
* The following components are dual-licensed under the
GNU General Public License version 2 and the Apache License Version 2.0.
- datapath/linux/compat/include/linux/openvswitch.h
+ datapath/linux/compat/include/linux/openvswitch.h
On Debian systems, the complete text of the GNU General Public License
version 2 can be found in `/usr/share/common-licenses/GPL-2'.
* The following components are licensed under the terms of either the
Sun Industry Standard Source License 1.1 or the InMon sFlow License:
- lib/sflow.h
- lib/sflow_agent.c
- lib/sflow_api.h
- lib/sflow_poller.c
- lib/sflow_receiver.c
- lib/sflow_sampler.c
+ lib/sflow.h
+ lib/sflow_agent.c
+ lib/sflow_api.h
+ lib/sflow_poller.c
+ lib/sflow_receiver.c
+ lib/sflow_sampler.c
These licenses are available, respectively, the following URLs:
* The following components are licensed for use as desired without restriction:
- lib/crc32c.c
+ lib/crc32c.c
* lib/ovs.tmac in the source distribution, and manpages in the
binaries, includes troff macros from groff 1.21 that contain the
BY THE TERMS AND CONDITIONS OF THIS AGREEMENT, YOU MAY NOT REPRODUCE OR IN ANY WAY UTILIZE
THE SOFTWARE OR THE DOCUMENTATION OR THE SPECIFICATIONS.
-1. Definitions.
+1. Definitions.
"Documentation" means the user manuals, training materials, and operating materials, if any,
InMon provides to Licensee under this Agreement.
"Trademark" means InMon's "sFlow(R)" trademark.
-2. License Grant.
+2. License Grant.
-2.1 Software, Documentation and Specifications License Grant. InMon hereby grants to
+2.1 Software, Documentation and Specifications License Grant. InMon hereby grants to
Licensee, under all of InMon's Intellectual Property Rights therein, a perpetual (subject
to InMon's termination rights under Section 7 below), nonexclusive, royalty-free, worldwide,
transferable, sublicensable license, to: (i) use and reproduce the Software, the
any Products that include the Software, the Documentation, or software in which the
Specifications have been implemented.
-2.2 Trademark License. InMon hereby grants to Licensee a perpetual (subject to InMon's
+2.2 Trademark License. InMon hereby grants to Licensee a perpetual (subject to InMon's
termination rights under Section 7 below), nonexclusive, royalty-free, worldwide,
transferable, sublicensable license to use the Trademark on or in connection with the
Software, the Documentation, the Specifications and any software that implements the
Specifications.
-2.3 Restrictions. Licensee agrees that it will not use the Software in a way
+2.3 Restrictions. Licensee agrees that it will not use the Software in a way
inconsistent with the license granted in Section 2.1. Further, Licensee agrees that, in
exercising its rights under the license granted to it in this Agreement, Licensee will:
(i) strictly adhere to and fully comply with the Specifications; (ii) use the Trademark,
actions and remedies as it deems necessary, including, but not limited to breach of
contract.
-3. Ownership. Except for the license expressly granted in Section 2, Inmon hereby
+3. Ownership. Except for the license expressly granted in Section 2, Inmon hereby
retains all right, title, and interest in and to the Trademark and all its Intellectual
Property Rights in the Software, the Documentation and the Specifications. Licensee
obtains no rights hereunder in the Trademark, Software, Documentation or Specifications by
that this Agreement does not transfer title in the Trademark, Software, Documentation or
Specifications, or any copy thereof, to Licensee.
-4. Support. Inmon shall have no obligation under this Agreement to (a) supply
+4. Support. Inmon shall have no obligation under this Agreement to (a) supply
maintenance or support, bug fixes or error corrections to the Licensed Software,
(b) supply future versions of the Licensed Software or (c) provide Licensed Software
development tools to Licensee.
-5. Warranty. INMON HEREBY DISCLAIMS ALL WARRANTIES, EITHER EXPRESS, IMPLIED OR
+5. Warranty. INMON HEREBY DISCLAIMS ALL WARRANTIES, EITHER EXPRESS, IMPLIED OR
STATUTORY, WITH RESPECT TO THE TRADEMARK, THE SOFTWARE, THE DOCUMENTATION, THE
SPECIFICATIONS. OR OTHERWISE, INCLUDING BUT NOT LIMITED TO IMPLIED WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT OF ANY INTELLECTUAL
PROPERTY RIGHTS.
-6. Limitation of Liability. IN NO EVENT SHALL INMON OR ITS SUPPLIERS OR LICENSORS BE
+6. Limitation of Liability. IN NO EVENT SHALL INMON OR ITS SUPPLIERS OR LICENSORS BE
LIABLE FOR ANY CONSEQUENTIAL, INCIDENTAL, SPECIAL, INDIRECT OR EXEMPLARY DAMAGES WHATSOEVER,
WHETHER RELATED TO OR ARISING OUT OF THIS AGREEMENT, THE TRADEMARK, THE SOFTWARE, THE
DOCUMENTATION, THE SPECIFICATIONS, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, DAMAGES FOR
PECUNIARY LOSS, EVEN IF INMON HAS BEEN ADVISED OF OR KNOWS OF THE POSSIBILITY OF SUCH
DAMAGES.
-7. Term and Termination. The term of this Agreement will begin on the Effective Date,
+7. Term and Termination. The term of this Agreement will begin on the Effective Date,
which shall be deemed to be the date of delivery of the Software and/or Documentation and/or
Specifications to Licensee, and shall continue indefinitely unless and until terminated by
Licensee's giving written notice of termination to InMon, or by InMon pursuant to InMon's
or that implement the Specifications. The rights and obligations contained in Sections 1,
3, 5, 6, 7, and 8 shall survive any termination of this Agreement.
-8. General Provisions.
+8. General Provisions.
-8.1 Assignment. This Agreement shall be binding upon and inure to the benefit of the
+8.1 Assignment. This Agreement shall be binding upon and inure to the benefit of the
parties hereto and their permitted successors and permitted assigns. InMon will have the
right to assign this Agreement without notice to Licensee. Licensee may assign or transfer
(whether by merger, operation of law or in any other manner) any of its rights or delegate
any of its obligations hereunder without the prior written consent of InMon, provided the
assignee assumes in writing all of Licensee's obligations hereunder.
-8.2 Notices. All notices permitted or required under this Agreement shall be in
+8.2 Notices. All notices permitted or required under this Agreement shall be in
writing and shall be delivered in person or mailed by first class, registered or certified
mail, postage prepaid, to the address of the party specified in this Agreement or such
other address as either party may specify in writing. Such notice shall be deemed to have
been given upon receipt.
-8.3 Non-Waiver. No term or provision hereof shall be deemed waived, and no breach
+8.3 Non-Waiver. No term or provision hereof shall be deemed waived, and no breach
excused, unless such waiver or consent shall be in writing and signed by the party claimed
to have waived or consented. Any consent or waiver, whether express or implied, shall not
constitute a consent or waiver of, or excuse for any separate, different or subsequent
breach.
-8.4 Independent Contractor. The parties' relationship shall be solely that of
+8.4 Independent Contractor. The parties' relationship shall be solely that of
independent contractors, and nothing contained in this Agreement shall be construed to make
either party an agent, partner, representative or principal of the other for any purpose.
-8.5 Choice of Law and Forum. This Agreement shall be governed by and construed under
+8.5 Choice of Law and Forum. This Agreement shall be governed by and construed under
the laws of the State of California, without giving effect to such state's conflict of laws
principles. The parties hereby submit to the personal jurisdiction of, and agree that any
legal proceeding with respect to or arising under this Agreement shall be brought in, the
United States District Court for the Northern District of California or the state courts
of the State of California for the County of San Francisco.
-8.6 U.S. Government Licenses. The Software and Documentation are considered a
+8.6 U.S. Government Licenses. The Software and Documentation are considered a
"commercial item" as that term is defined at 48 C.F.R 2.101, or "commercial computer
software" and "commercial computer software documentation" as such terms are used in
48 C.F.R 12.212 of the Federal Acquisition Regulations and its successors, and
48 C.F.R. 227.7202 of the DoD FAR Supplement and its successors.
-8.7 Severability. If any provision of this Agreement is held to be unenforceable under
+8.7 Severability. If any provision of this Agreement is held to be unenforceable under
applicable law, then such provision shall be excluded from this Agreement and the balance
of this Agreement shall be interpreted as if such provision were so excluded and shall be
enforceable in accordance with its terms. The court in its discretion may substitute for
the excluded provision an enforceable provision which in economic substance reasonably
approximates the excluded provision.
-8.8 Compliance With Law. Licensee shall comply with all applicable laws and
+8.8 Compliance With Law. Licensee shall comply with all applicable laws and
regulations (including privacy laws and regulations) having application to or governing its
use and/or operation of the Software and agrees to indemnify and hold InMon harmless from
and against any claims, damages, losses or obligations suffered or incurred by InMon
arising from its failure to so comply.
-8.9 Entire Agreement; Amendment. This Agreement constitutes the final, complete and
+8.9 Entire Agreement; Amendment. This Agreement constitutes the final, complete and
entire agreement between the parties with respect to the subject matter hereof, and
supersedes any previous proposals, negotiations, agreements, or arrangements, whether
verbal or written, made between the parties with respect to such subject matter. This
In order of increasing manual effort, these are:
* Use a Linux kernel 3.3 or later, which has an integrated Open
- vSwitch kernel module.
+ vSwitch kernel module.
- The upstream Linux kernel module lacks a few features that
- are in the third-party module. For details, please see the
- FAQ, "What features are not available in the Open vSwitch
- kernel datapath that ships as part of the upstream Linux
- kernel?".
+ The upstream Linux kernel module lacks a few features that
+ are in the third-party module. For details, please see the
+ FAQ, "What features are not available in the Open vSwitch
+ kernel datapath that ships as part of the upstream Linux
+ kernel?".
* Install the "openvswitch-datapath-dkms" Debian package that
- you built earlier. This should automatically build and
- install the Open vSwitch kernel module for your running
- kernel.
+ you built earlier. This should automatically build and
+ install the Open vSwitch kernel module for your running
+ kernel.
- This option requires that you have a compiler and toolchain
- installed on the machine where you run Open vSwitch, which
- may be unacceptable in some production server environments.
+ This option requires that you have a compiler and toolchain
+ installed on the machine where you run Open vSwitch, which
+ may be unacceptable in some production server environments.
* Install the "openvswitch-datapath-source" Debian package, use
- "module-assistant" to build a Debian package of the Open
- vSwitch kernel module for your kernel, and then install that
- Debian package.
-
- You can install the kernel module Debian packages that you
- build this way on the same machine where you built it or on
- another machine or machines, which means that you don't
- necessarily have to have any build infrastructure on the
- machines where you use the kernel module.
-
- /usr/share/doc/openvswitch-datapath-source/README.Debian has
- details on the build process.
+ "module-assistant" to build a Debian package of the Open
+ vSwitch kernel module for your kernel, and then install that
+ Debian package.
+
+ You can install the kernel module Debian packages that you
+ build this way on the same machine where you built it or on
+ another machine or machines, which means that you don't
+ necessarily have to have any build infrastructure on the
+ machines where you use the kernel module.
+
+ /usr/share/doc/openvswitch-datapath-source/README.Debian has
+ details on the build process.
* Build and install the kernel module by hand.
start () {
if ovs_ctl load-kmod; then
- :
+ :
else
- echo "Module has probably not been built for this kernel."
- if ! test -d /usr/share/doc/openvswitch-datapath-source; then
- echo "Install the openvswitch-datapath-source package, then read"
- else
+ echo "Module has probably not been built for this kernel."
+ if ! test -d /usr/share/doc/openvswitch-datapath-source; then
+ echo "Install the openvswitch-datapath-source package, then read"
+ else
echo "For instructions, read"
- fi
- echo "/usr/share/doc/openvswitch-datapath-source/README.Debian"
+ fi
+ echo "/usr/share/doc/openvswitch-datapath-source/README.Debian"
- if test X"$OVS_MISSING_KMOD_OK" = Xyes; then
- # We're being invoked by the package postinst. Do not
- # fail package installation just because the kernel module
- # is not available.
- exit 0
- fi
+ if test X"$OVS_MISSING_KMOD_OK" = Xyes; then
+ # We're being invoked by the package postinst. Do not
+ # fail package installation just because the kernel module
+ # is not available.
+ exit 0
+ fi
fi
set ovs_ctl ${1-start} --system-id=random
if test X"$FORCE_COREFILES" != X; then
- set "$@" --force-corefiles="$FORCE_COREFILES"
+ set "$@" --force-corefiles="$FORCE_COREFILES"
fi
set "$@" $OVS_CTL_OPTS
"$@" || exit $?
case $1 in
start)
start
- ;;
+ ;;
stop | force-stop)
stop
;;
missingok
rotate 30
postrotate
- # Tell Open vSwitch daemons to reopen their log files
- if [ -d /var/run/openvswitch ]; then
+ # Tell Open vSwitch daemons to reopen their log files
+ if [ -d /var/run/openvswitch ]; then
for ctl in /var/run/openvswitch/*.ctl; do
ovs-appctl -t "$ctl" vlog/reopen 2>/dev/null || :
done
- fi
+ fi
endscript
}
case "$1" in
configure)
- DEFAULT=/etc/default/ovn-central
- TEMPLATE=/usr/share/ovn/central/default.template
- if ! test -e $DEFAULT; then
- cp $TEMPLATE $DEFAULT
- else
+ DEFAULT=/etc/default/ovn-central
+ TEMPLATE=/usr/share/ovn/central/default.template
+ if ! test -e $DEFAULT; then
+ cp $TEMPLATE $DEFAULT
+ else
for var in $(awk -F'[ :]' '/^# [_A-Z0-9]+:/{print $2}' $TEMPLATE)
do
if ! grep $var $DEFAULT >/dev/null 2>&1; then
- echo >> $DEFAULT
- sed -n "/$var:/,/$var=/p" $TEMPLATE >> $DEFAULT
+ echo >> $DEFAULT
+ sed -n "/$var:/,/$var=/p" $TEMPLATE >> $DEFAULT
fi
done
- fi
+ fi
;;
abort-upgrade|abort-remove|abort-deconfigure)
case "$1" in
configure)
- DEFAULT=/etc/default/ovn-host
- TEMPLATE=/usr/share/ovn/host/default.template
- if ! test -e $DEFAULT; then
- cp $TEMPLATE $DEFAULT
- else
+ DEFAULT=/etc/default/ovn-host
+ TEMPLATE=/usr/share/ovn/host/default.template
+ if ! test -e $DEFAULT; then
+ cp $TEMPLATE $DEFAULT
+ else
for var in $(awk -F'[ :]' '/^# [_A-Z0-9]+:/{print $2}' $TEMPLATE)
do
if ! grep $var $DEFAULT >/dev/null 2>&1; then
- echo >> $DEFAULT
- sed -n "/$var:/,/$var=/p" $TEMPLATE >> $DEFAULT
+ echo >> $DEFAULT
+ sed -n "/$var:/,/$var=/p" $TEMPLATE >> $DEFAULT
fi
done
- fi
+ fi
;;
abort-upgrade|abort-remove|abort-deconfigure)
struct rconn_packet_counter;
struct rconn *rconn_create(int inactivity_probe_interval,
- int max_backoff, uint8_t dscp,
- uint32_t allowed_versions);
+ int max_backoff, uint8_t dscp,
+ uint32_t allowed_versions);
void rconn_set_dscp(struct rconn *rc, uint8_t dscp);
uint32_t rconn_get_allowed_versions(const struct rconn *);
uint8_t rconn_get_dscp(const struct rconn *rc);
}
ds_put_format(reply,
- "\tpackets received: %"PRIu64"\n"
- "\tpacket recirculations: %"PRIu64"\n"
- "\tavg. datapath passes per packet: %.02f\n"
- "\temc hits: %"PRIu64"\n"
- "\tmegaflow hits: %"PRIu64"\n"
- "\tavg. subtable lookups per megaflow hit: %.02f\n"
- "\tmiss with success upcall: %"PRIu64"\n"
- "\tmiss with failed upcall: %"PRIu64"\n"
- "\tavg. packets per output batch: %.02f\n",
+ " packets received: %"PRIu64"\n"
+ " packet recirculations: %"PRIu64"\n"
+ " avg. datapath passes per packet: %.02f\n"
+ " emc hits: %"PRIu64"\n"
+ " megaflow hits: %"PRIu64"\n"
+ " avg. subtable lookups per megaflow hit: %.02f\n"
+ " miss with success upcall: %"PRIu64"\n"
+ " miss with failed upcall: %"PRIu64"\n"
+ " avg. packets per output batch: %.02f\n",
total_packets, stats[PMD_STAT_RECIRC],
passes_per_pkt, stats[PMD_STAT_EXACT_HIT],
stats[PMD_STAT_MASKED_HIT], lookups_per_hit,
}
ds_put_format(reply,
- "\tidle cycles: %"PRIu64" (%.02f%%)\n"
- "\tprocessing cycles: %"PRIu64" (%.02f%%)\n",
+ " idle cycles: %"PRIu64" (%.02f%%)\n"
+ " processing cycles: %"PRIu64" (%.02f%%)\n",
stats[PMD_CYCLES_ITER_IDLE],
stats[PMD_CYCLES_ITER_IDLE] / (double) total_cycles * 100,
stats[PMD_CYCLES_ITER_BUSY],
}
ds_put_format(reply,
- "\tavg cycles per packet: %.02f (%"PRIu64"/%"PRIu64")\n",
+ " avg cycles per packet: %.02f (%"PRIu64"/%"PRIu64")\n",
total_cycles / (double) total_packets,
total_cycles, total_packets);
ds_put_format(reply,
- "\tavg processing cycles per packet: "
+ " avg processing cycles per packet: "
"%.02f (%"PRIu64"/%"PRIu64")\n",
stats[PMD_CYCLES_ITER_BUSY] / (double) total_packets,
stats[PMD_CYCLES_ITER_BUSY], total_packets);
uint64_t total_cycles = 0;
ds_put_format(reply,
- "pmd thread numa_id %d core_id %u:\n\tisolated : %s\n",
+ "pmd thread numa_id %d core_id %u:\n isolated : %s\n",
pmd->numa_id, pmd->core_id, (pmd->isolated)
? "true" : "false");
for (int j = 0; j < PMD_RXQ_INTERVAL_MAX; j++) {
proc_cycles += dp_netdev_rxq_get_intrvl_cycles(rxq, j);
}
- ds_put_format(reply, "\tport: %-16s\tqueue-id: %2d", name,
+ ds_put_format(reply, " port: %-16s queue-id: %2d", name,
netdev_rxq_get_queue_id(list[i].rxq->rx));
- ds_put_format(reply, "\tpmd usage: ");
+ ds_put_format(reply, " pmd usage: ");
if (total_cycles) {
ds_put_format(reply, "%2"PRIu64"",
proc_cycles * 100 / total_cycles);
netdev_close(netdev);
} else {
VLOG_WARN("could not open netdev %s type %s: %s",
- dpif_port.name, dpif_port.type, ovs_strerror(err));
+ dpif_port.name, dpif_port.type, ovs_strerror(err));
}
}
} else {
if (!aux->meter_action) {
aux->meter_action = action;
}
- break;
+ break;
case OVS_ACTION_ATTR_CT:
case OVS_ACTION_ATTR_OUTPUT:
<dt><dfn>Exact match</dfn>, e.g. <code>nw_src=10.1.2.3</code></dt>
<dd>
<p>
- Only a particular value of the field is matched; for example, only one
- particular source IP address. Exact matches are written as
- <code><var>field</var>=<var>value</var></code>. The forms accepted for
- <var>value</var> depend on the field.
+ Only a particular value of the field is matched; for example, only one
+ particular source IP address. Exact matches are written as
+ <code><var>field</var>=<var>value</var></code>. The forms accepted for
+ <var>value</var> depend on the field.
</p>
<p>
- All fields support exact matches.
+ All fields support exact matches.
</p>
</dd>
</dt>
<dd>
<p>
- Specific bits in the field must have specified values; for example,
- only source IP addresses in a particular subnet. Bitwise matches are
- written as
- <code><var>field</var>=<var>value</var>/<var>mask</var></code>, where
- <var>value</var> and <var>mask</var> take one of the forms accepted for
- an exact match on <var>field</var>. Some fields accept other forms for
- bitwise matches; for example, <code>nw_src=10.1.0.0/255.255.0.0</code>
- may also be written <code>nw_src=10.1.0.0/16</code>.
+ Specific bits in the field must have specified values; for example,
+ only source IP addresses in a particular subnet. Bitwise matches are
+ written as
+ <code><var>field</var>=<var>value</var>/<var>mask</var></code>, where
+ <var>value</var> and <var>mask</var> take one of the forms accepted for
+ an exact match on <var>field</var>. Some fields accept other forms for
+ bitwise matches; for example, <code>nw_src=10.1.0.0/255.255.0.0</code>
+ may also be written <code>nw_src=10.1.0.0/16</code>.
</p>
<p>
<dt><dfn>Wildcard</dfn>, e.g. ``any <code>nw_src</code>''</dt>
<dd>
<p>
- The value of the field is not constrained. Wildcarded fields may be
- written as <code><var>field</var>=*</code>, although it is unusual to
- mention them at all. (When specifying a wildcard explicitly in a
- command invocation, be sure to using quoting to protect against shell
- expansion.)
+ The value of the field is not constrained. Wildcarded fields may be
+ written as <code><var>field</var>=*</code>, although it is unusual to
+ mention them at all. (When specifying a wildcard explicitly in a
+ command invocation, be sure to using quoting to protect against shell
+ expansion.)
</p>
<p>
- There is a tiny difference between wildcarding a field and not
- specifying any match on a field: wildcarding a field requires
- satisfying the field's prerequisites.
+ There is a tiny difference between wildcarding a field and not
+ specifying any match on a field: wildcarding a field requires
+ satisfying the field's prerequisites.
</p>
</dd>
</dl>
8080}''</dt>
<dd>
<p>
- The value of a field is one of a specified set of values; for
- example, the TCP destination port is 80, 443, or 8080.
+ The value of a field is one of a specified set of values; for
+ example, the TCP destination port is 80, 443, or 8080.
</p>
<p>
- For matches used in flows (see <cite>Flows</cite>, below), multiple
- flows can simulate set matches.
+ For matches used in flows (see <cite>Flows</cite>, below), multiple
+ flows can simulate set matches.
</p>
</dd>
1999''</dt>
<dd>
<p>
- The value of the field must lie within a numerical range, for
- example, TCP destination ports between 1000 and 1999.
+ The value of the field must lie within a numerical range, for
+ example, TCP destination ports between 1000 and 1999.
</p>
<p>
- Range matches can be expressed as a collection of bitwise matches. For
- example, suppose that the goal is to match TCP source ports 1000 to
- 1999, inclusive. The binary representations of 1000 and 1999 are:
+ Range matches can be expressed as a collection of bitwise matches. For
+ example, suppose that the goal is to match TCP source ports 1000 to
+ 1999, inclusive. The binary representations of 1000 and 1999 are:
</p>
<pre fixed="yes">
</pre>
<p>
- The following series of bitwise matches will match 1000 and
- 1999 and all the values in between:
+ The following series of bitwise matches will match 1000 and
+ 1999 and all the values in between:
</p>
<pre fixed="yes">
</pre>
<p>
- which can be written as the following matches:
+ which can be written as the following matches:
</p>
<pre>
<dt><dfn>Inequality match</dfn>, e.g. ``<code>tcp_dst</code> ≠80''</dt>
<dd>
<p>
- The value of the field differs from a specified value, for
- example, all TCP destination ports except 80.
+ The value of the field differs from a specified value, for
+ example, all TCP destination ports except 80.
</p>
<p>
<dl>
<dt>``Port-based'' tunnels</dt>
<dd>
- <p>
- In this model, an OpenFlow port represents one tunnel: it matches a
- particular type of tunnel traffic between two IP endpoints, with a
- particular tunnel key (if keys are in use). In this situation, <ref
- field="in_port"/> suffices to distinguish one tunnel from another, so
- the tunnel header fields have little importance for OpenFlow
- processing. (They are still populated and may be used if it is
- convenient.) The tunnel header fields play no role in sending
- packets out such an OpenFlow port, either, because the OpenFlow port
- itself fully specifies the tunnel headers.
- </p>
-
- <p>
- The following Open vSwitch commands create a bridge
- <code>br-int</code>, add port <code>tap0</code> to the bridge as
- OpenFlow port 1, establish a port-based GRE tunnel between the local
- host and remote IP 192.168.1.1 using GRE key 5001 as OpenFlow port 2,
- and arranges to forward all traffic from <code>tap0</code> to the
- tunnel and vice versa:
- </p>
-
- <pre>
+ <p>
+ In this model, an OpenFlow port represents one tunnel: it matches a
+ particular type of tunnel traffic between two IP endpoints, with a
+ particular tunnel key (if keys are in use). In this situation, <ref
+ field="in_port"/> suffices to distinguish one tunnel from another, so
+ the tunnel header fields have little importance for OpenFlow
+ processing. (They are still populated and may be used if it is
+ convenient.) The tunnel header fields play no role in sending
+ packets out such an OpenFlow port, either, because the OpenFlow port
+ itself fully specifies the tunnel headers.
+ </p>
+
+ <p>
+ The following Open vSwitch commands create a bridge
+ <code>br-int</code>, add port <code>tap0</code> to the bridge as
+ OpenFlow port 1, establish a port-based GRE tunnel between the local
+ host and remote IP 192.168.1.1 using GRE key 5001 as OpenFlow port 2,
+ and arranges to forward all traffic from <code>tap0</code> to the
+ tunnel and vice versa:
+ </p>
+
+ <pre>
ovs-vsctl add-br br-int
ovs-vsctl add-port br-int tap0 -- set interface tap0 ofport_request=1
ovs-vsctl add-port br-int gre0 --
options:remote_ip=192.168.1.1 options:key=5001
ovs-ofctl add-flow br-int in_port=1,actions=2
ovs-ofctl add-flow br-int in_port=2,actions=1
- </pre>
+ </pre>
</dd>
<dt>``Flow-based'' tunnels</dt>
<dd>
- <p>
- In this model, one OpenFlow port represents all possible tunnels of a
- given type with an endpoint on the current host, for example, all GRE
- tunnels. In this situation, <ref field="in_port"/> only indicates
- that traffic was received on the particular kind of tunnel. This is
- where the tunnel header fields are most important: they allow the
- OpenFlow tables to discriminate among tunnels based on their IP
- endpoints or keys. Tunnel header fields also determine the IP
- endpoints and keys of packets sent out such a tunnel port.
- </p>
-
- <p>
- The following Open vSwitch commands create a bridge
- <code>br-int</code>, add port <code>tap0</code> to the
- bridge as OpenFlow port 1, establish a flow-based GRE tunnel
- port 3, and arranges to forward all traffic from
- <code>tap0</code> to remote IP 192.168.1.1 over a GRE tunnel
- with key 5001 and vice versa:
- </p>
-
- <pre>
+ <p>
+ In this model, one OpenFlow port represents all possible tunnels of a
+ given type with an endpoint on the current host, for example, all GRE
+ tunnels. In this situation, <ref field="in_port"/> only indicates
+ that traffic was received on the particular kind of tunnel. This is
+ where the tunnel header fields are most important: they allow the
+ OpenFlow tables to discriminate among tunnels based on their IP
+ endpoints or keys. Tunnel header fields also determine the IP
+ endpoints and keys of packets sent out such a tunnel port.
+ </p>
+
+ <p>
+ The following Open vSwitch commands create a bridge
+ <code>br-int</code>, add port <code>tap0</code> to the
+ bridge as OpenFlow port 1, establish a flow-based GRE tunnel
+ port 3, and arranges to forward all traffic from
+ <code>tap0</code> to remote IP 192.168.1.1 over a GRE tunnel
+ with key 5001 and vice versa:
+ </p>
+
+ <pre>
ovs-vsctl add-br br-int
ovs-vsctl add-port br-int tap0 -- set interface tap0 ofport_request=1
ovs-vsctl add-port br-int allgre --
ovs-ofctl add-flow br-int \
'in_port=1 actions=set_tunnel:5001,set_field:192.168.1.1->tun_dst,3'
ovs-ofctl add-flow br-int 'in_port=3,tun_src=192.168.1.1,tun_id=5001 actions=1'
- </pre>
+ </pre>
</dd>
<dt>Mixed models.</dt>
<dd>
- <p>
- One may define both flow-based and port-based tunnels at the
- same time. For example, it is valid and possibly useful to
- create and configure both <code>gre0</code> and
- <code>allgre</code> tunnel ports described above.
- </p>
-
- <p>
- Traffic is attributed on ingress to the most specific
- matching tunnel. For example, <code>gre0</code> is more
- specific than <code>allgre</code>. Therefore, if both
- exist, then <code>gre0</code> will be the ingress port for any
- GRE traffic received from 192.168.1.1 with key 5001.
- </p>
-
- <p>
- On egress, traffic may be directed to any appropriate tunnel
- port. If both <code>gre0</code> and <code>allgre</code> are
- configured as already described, then the actions
- <code>2</code> and
- <code>set_tunnel:5001,set_field:192.168.1.1->tun_dst,3</code>
- send the same tunnel traffic.
- </p>
+ <p>
+ One may define both flow-based and port-based tunnels at the
+ same time. For example, it is valid and possibly useful to
+ create and configure both <code>gre0</code> and
+ <code>allgre</code> tunnel ports described above.
+ </p>
+
+ <p>
+ Traffic is attributed on ingress to the most specific
+ matching tunnel. For example, <code>gre0</code> is more
+ specific than <code>allgre</code>. Therefore, if both
+ exist, then <code>gre0</code> will be the ingress port for any
+ GRE traffic received from 192.168.1.1 with key 5001.
+ </p>
+
+ <p>
+ On egress, traffic may be directed to any appropriate tunnel
+ port. If both <code>gre0</code> and <code>allgre</code> are
+ configured as already described, then the actions
+ <code>2</code> and
+ <code>set_tunnel:5001,set_field:192.168.1.1->tun_dst,3</code>
+ send the same tunnel traffic.
+ </p>
</dd>
<dt>Intermediate models.</dt>
<dd>
- Ports may be configured as partially flow-based. For example,
- one may define an OpenFlow port that represents tunnels
- between a pair of endpoints but leaves the flow table to
- discriminate on the flow key.
+ Ports may be configured as partially flow-based. For example,
+ one may define an OpenFlow port that represents tunnels
+ between a pair of endpoints but leaves the flow table to
+ discriminate on the flow key.
</dd>
</dl>
<field id="MFF_TUN_ID" title="Tunnel ID">
<p>
- Many kinds of tunnels support a tunnel ID:
+ Many kinds of tunnels support a tunnel ID:
</p>
<ul>
- <li>
+ <li>
VXLAN and Geneve have a 24-bit virtual network identifier (VNI).
</li>
- <li>LISP has a 24-bit instance ID.</li>
- <li>GRE has an optional 32-bit key.</li>
- <li>STT has a 64-bit key.</li>
+ <li>LISP has a 24-bit instance ID.</li>
+ <li>GRE has an optional 32-bit key.</li>
+ <li>STT has a 64-bit key.</li>
<li>ERSPAN has a 10-bit key (Session ID).</li>
</ul>
<p>
- When a packet is received from a tunnel, this field holds the
- tunnel ID in its least significant bits, zero-extended to fit.
- This field is zero if the tunnel does not support an ID, or if
- no ID is in use for a tunnel type that has an optional ID, or
- if an ID of zero received, or if the packet was not received
- over a tunnel.
+ When a packet is received from a tunnel, this field holds the
+ tunnel ID in its least significant bits, zero-extended to fit.
+ This field is zero if the tunnel does not support an ID, or if
+ no ID is in use for a tunnel type that has an optional ID, or
+ if an ID of zero received, or if the packet was not received
+ over a tunnel.
</p>
<p>
- When a packet is output to a tunnel port, the tunnel
- configuration determines whether the tunnel ID is taken from
- this field or bound to a fixed value. See the earlier
- description of ``port-based'' and ``flow-based'' tunnels for
- more information.
+ When a packet is output to a tunnel port, the tunnel
+ configuration determines whether the tunnel ID is taken from
+ this field or bound to a fixed value. See the earlier
+ description of ``port-based'' and ``flow-based'' tunnels for
+ more information.
</p>
<p>
- The following diagram shows the origin of this field in a
- typical keyed GRE tunnel:
+ The following diagram shows the origin of this field in a
+ typical keyed GRE tunnel:
</p>
<diagram>
- <header name="Ethernet">
- <bits name="dst" above="48" width="0.4"/>
- <bits name="src" above="48" width="0.4"/>
- <bits name="type" above="16" below="0x800" width="0.4"/>
- </header>
- <header name="IPv4">
- <bits name="..." width="0.4"/>
- <bits name="proto" above="8" below="47" width="0.4"/>
- <bits name="src" above="32" width="0.4"/>
- <bits name="dst" above="32" width="0.4"/>
- </header>
- <header name="GRE">
- <bits name="..." above="16" width="0.4"/>
- <bits name="type" above="16" below="0x6558" width="0.4"/>
- <bits name="key" above="32" width=".4" fill="yes"/>
- </header>
- <header name="Ethernet">
- <bits name="dst" above="48" width="0.4"/>
- <bits name="src" above="48" width="0.4"/>
- <bits name="type" above="16" width="0.4"/>
- </header>
- <dots/>
+ <header name="Ethernet">
+ <bits name="dst" above="48" width="0.4"/>
+ <bits name="src" above="48" width="0.4"/>
+ <bits name="type" above="16" below="0x800" width="0.4"/>
+ </header>
+ <header name="IPv4">
+ <bits name="..." width="0.4"/>
+ <bits name="proto" above="8" below="47" width="0.4"/>
+ <bits name="src" above="32" width="0.4"/>
+ <bits name="dst" above="32" width="0.4"/>
+ </header>
+ <header name="GRE">
+ <bits name="..." above="16" width="0.4"/>
+ <bits name="type" above="16" below="0x6558" width="0.4"/>
+ <bits name="key" above="32" width=".4" fill="yes"/>
+ </header>
+ <header name="Ethernet">
+ <bits name="dst" above="48" width="0.4"/>
+ <bits name="src" above="48" width="0.4"/>
+ <bits name="type" above="16" width="0.4"/>
+ </header>
+ <dots/>
</diagram>
</field>
<field id="MFF_TUN_SRC" title="Tunnel IPv4 Source">
<p>
- When a packet is received from a tunnel, this field is the
- source address in the outer IP header of the tunneled packet.
- This field is zero if the packet was not received over a
- tunnel.
+ When a packet is received from a tunnel, this field is the
+ source address in the outer IP header of the tunneled packet.
+ This field is zero if the packet was not received over a
+ tunnel.
</p>
<p>
- When a packet is output to a flow-based tunnel port, this
- field influences the IPv4 source address used to send the
- packet. If it is zero, then the kernel chooses an appropriate
- IP address based using the routing table.
+ When a packet is output to a flow-based tunnel port, this
+ field influences the IPv4 source address used to send the
+ packet. If it is zero, then the kernel chooses an appropriate
+ IP address based using the routing table.
</p>
<p>
- The following diagram shows the origin of this field in a
- typical keyed GRE tunnel:
+ The following diagram shows the origin of this field in a
+ typical keyed GRE tunnel:
</p>
<diagram>
- <header name="Ethernet">
- <bits name="dst" above="48" width="0.4"/>
- <bits name="src" above="48" width="0.4"/>
- <bits name="type" above="16" below="0x800" width="0.4"/>
- </header>
- <header name="IPv4">
- <bits name="..." width="0.4"/>
- <bits name="proto" above="8" below="47" width="0.4"/>
- <bits name="src" above="32" width="0.4" fill="yes"/>
- <bits name="dst" above="32" width="0.4"/>
- </header>
- <header name="GRE">
- <bits name="..." above="16" width="0.4"/>
- <bits name="type" above="16" below="0x6558" width="0.4"/>
- <bits name="key" above="32" width=".4"/>
- </header>
- <header name="Ethernet">
- <bits name="dst" above="48" width="0.4"/>
- <bits name="src" above="48" width="0.4"/>
- <bits name="type" above="16" width="0.4"/>
- </header>
- <dots/>
+ <header name="Ethernet">
+ <bits name="dst" above="48" width="0.4"/>
+ <bits name="src" above="48" width="0.4"/>
+ <bits name="type" above="16" below="0x800" width="0.4"/>
+ </header>
+ <header name="IPv4">
+ <bits name="..." width="0.4"/>
+ <bits name="proto" above="8" below="47" width="0.4"/>
+ <bits name="src" above="32" width="0.4" fill="yes"/>
+ <bits name="dst" above="32" width="0.4"/>
+ </header>
+ <header name="GRE">
+ <bits name="..." above="16" width="0.4"/>
+ <bits name="type" above="16" below="0x6558" width="0.4"/>
+ <bits name="key" above="32" width=".4"/>
+ </header>
+ <header name="Ethernet">
+ <bits name="dst" above="48" width="0.4"/>
+ <bits name="src" above="48" width="0.4"/>
+ <bits name="type" above="16" width="0.4"/>
+ </header>
+ <dots/>
</diagram>
</field>
<field id="MFF_TUN_DST" title="Tunnel IPv4 Destination">
<p>
- When a packet is received from a tunnel, this field is the
- destination address in the outer IP header of the tunneled
- packet. This field is zero if the packet was not received
- over a tunnel.
+ When a packet is received from a tunnel, this field is the
+ destination address in the outer IP header of the tunneled
+ packet. This field is zero if the packet was not received
+ over a tunnel.
</p>
<p>
- When a packet is output to a flow-based tunnel port, this
- field specifies the destination to which the tunnel packet is
- sent.
+ When a packet is output to a flow-based tunnel port, this
+ field specifies the destination to which the tunnel packet is
+ sent.
</p>
<p>
- The following diagram shows the origin of this field in a
- typical keyed GRE tunnel:
+ The following diagram shows the origin of this field in a
+ typical keyed GRE tunnel:
</p>
<diagram>
- <header name="Ethernet">
- <bits name="dst" above="48" width="0.4"/>
- <bits name="src" above="48" width="0.4"/>
- <bits name="type" above="16" below="0x800" width="0.4"/>
- </header>
- <header name="IPv4">
- <bits name="..." width="0.4"/>
- <bits name="proto" above="8" below="47" width="0.4"/>
- <bits name="src" above="32" width="0.4"/>
- <bits name="dst" above="32" width="0.4" fill="yes"/>
- </header>
- <header name="GRE">
- <bits name="..." above="16" width="0.4"/>
- <bits name="type" above="16" below="0x6558" width="0.4"/>
- <bits name="key" above="32" width=".4"/>
- </header>
- <header name="Ethernet">
- <bits name="dst" above="48" width="0.4"/>
- <bits name="src" above="48" width="0.4"/>
- <bits name="type" above="16" width="0.4"/>
- </header>
- <dots/>
+ <header name="Ethernet">
+ <bits name="dst" above="48" width="0.4"/>
+ <bits name="src" above="48" width="0.4"/>
+ <bits name="type" above="16" below="0x800" width="0.4"/>
+ </header>
+ <header name="IPv4">
+ <bits name="..." width="0.4"/>
+ <bits name="proto" above="8" below="47" width="0.4"/>
+ <bits name="src" above="32" width="0.4"/>
+ <bits name="dst" above="32" width="0.4" fill="yes"/>
+ </header>
+ <header name="GRE">
+ <bits name="..." above="16" width="0.4"/>
+ <bits name="type" above="16" below="0x6558" width="0.4"/>
+ <bits name="key" above="32" width=".4"/>
+ </header>
+ <header name="Ethernet">
+ <bits name="dst" above="48" width="0.4"/>
+ <bits name="src" above="48" width="0.4"/>
+ <bits name="type" above="16" width="0.4"/>
+ </header>
+ <dots/>
</diagram>
</field>
</p>
<diagram>
- <header name="header">
- <bits name="class" above="16" width="0.6"/>
- <bits name="type" above="8" width="0.5"/>
- <bits name="res" above="3" below="0" width="0.25"/>
- <bits name="length" above="5" width="0.4"/>
- </header>
+ <header name="header">
+ <bits name="class" above="16" width="0.6"/>
+ <bits name="type" above="8" width="0.5"/>
+ <bits name="res" above="3" below="0" width="0.25"/>
+ <bits name="length" above="5" width="0.4"/>
+ </header>
<nospace/>
- <header name="body">
- <bits name="value" above="4×(length - 1) bytes" width="1.7"/>
- </header>
+ <header name="body">
+ <bits name="value" above="4×(length - 1) bytes" width="1.7"/>
+ </header>
</diagram>
<p>
<field id="MFF_IN_PORT" title="Ingress Port">
<p>
- The OpenFlow port on which the packet being processed arrived.
- This is a 16-bit field that holds an OpenFlow 1.0 port number.
- For receiving a packet, the only values that appear in this
- field are:
+ The OpenFlow port on which the packet being processed arrived.
+ This is a 16-bit field that holds an OpenFlow 1.0 port number.
+ For receiving a packet, the only values that appear in this
+ field are:
</p>
<dl>
- <dt>1 through <code>0xfeff</code> (65,279), inclusive.</dt>
- <dd>
- Conventional OpenFlow port numbers.
- </dd>
-
- <dt><code>OFPP_LOCAL</code> (<code>0xfffe</code> or 65,534).</dt>
- <dd>
- <p>
- The ``local'' port, which in Open vSwitch is always named
- the same as the bridge itself. This represents a
- connection between the switch and the local TCP/IP stack.
- This port is where an IP address is most commonly
- configured on an Open vSwitch switch.
- </p>
-
- <p>
- OpenFlow does not require a switch to have a local port,
- but all existing versions of Open vSwitch have always
- included a local port. <b>Future Directions:</b> Future
- versions of Open vSwitch might be able to optionally omit
- the local port, if someone submits code to implement such
- a feature.
- </p>
- </dd>
-
- <dt><code>OFPP_NONE</code> (OpenFlow 1.0) or <code>OFPP_ANY</code> (OpenFlow 1.1+) (<code>0xffff</code> or 65,535).</dt>
- <dt><code>OFPP_CONTROLLER</code> (<code>0xfffd</code> or 65,533).</dt>
- <dd>
- <p>
- When a controller injects a packet into an OpenFlow switch
- with a ``packet-out'' request, it can specify one of these
- ingress ports to indicate that the packet was generated
- internally rather than having been received on some port.
- </p>
-
- <p>
- OpenFlow 1.0 specified <code>OFPP_NONE</code> for this
- purpose. Despite that, some controllers used
- <code>OFPP_CONTROLLER</code>, and some switches only
- accepted <code>OFPP_CONTROLLER</code>, so OpenFlow 1.0.2
- required support for both ports. OpenFlow 1.1 and later
- were more clearly drafted to allow only
- <code>OFPP_CONTROLLER</code>. For maximum compatibility,
- Open vSwitch allows both ports with all OpenFlow versions.
- </p>
- </dd>
+ <dt>1 through <code>0xfeff</code> (65,279), inclusive.</dt>
+ <dd>
+ Conventional OpenFlow port numbers.
+ </dd>
+
+ <dt><code>OFPP_LOCAL</code> (<code>0xfffe</code> or 65,534).</dt>
+ <dd>
+ <p>
+ The ``local'' port, which in Open vSwitch is always named
+ the same as the bridge itself. This represents a
+ connection between the switch and the local TCP/IP stack.
+ This port is where an IP address is most commonly
+ configured on an Open vSwitch switch.
+ </p>
+
+ <p>
+ OpenFlow does not require a switch to have a local port,
+ but all existing versions of Open vSwitch have always
+ included a local port. <b>Future Directions:</b> Future
+ versions of Open vSwitch might be able to optionally omit
+ the local port, if someone submits code to implement such
+ a feature.
+ </p>
+ </dd>
+
+ <dt><code>OFPP_NONE</code> (OpenFlow 1.0) or <code>OFPP_ANY</code> (OpenFlow 1.1+) (<code>0xffff</code> or 65,535).</dt>
+ <dt><code>OFPP_CONTROLLER</code> (<code>0xfffd</code> or 65,533).</dt>
+ <dd>
+ <p>
+ When a controller injects a packet into an OpenFlow switch
+ with a ``packet-out'' request, it can specify one of these
+ ingress ports to indicate that the packet was generated
+ internally rather than having been received on some port.
+ </p>
+
+ <p>
+ OpenFlow 1.0 specified <code>OFPP_NONE</code> for this
+ purpose. Despite that, some controllers used
+ <code>OFPP_CONTROLLER</code>, and some switches only
+ accepted <code>OFPP_CONTROLLER</code>, so OpenFlow 1.0.2
+ required support for both ports. OpenFlow 1.1 and later
+ were more clearly drafted to allow only
+ <code>OFPP_CONTROLLER</code>. For maximum compatibility,
+ Open vSwitch allows both ports with all OpenFlow versions.
+ </p>
+ </dd>
</dl>
<p>
- Values not mentioned above will never appear when receiving a
- packet, including the following notable values:
+ Values not mentioned above will never appear when receiving a
+ packet, including the following notable values:
</p>
<dl>
- <dt>0</dt>
- <dd>
- Zero is not a valid OpenFlow port number.
- </dd>
-
- <dt><code>OFPP_MAX</code> (<code>0xff00</code> or 65,280).</dt>
- <dd>
- This value has only been clearly specified as a valid port
- number as of OpenFlow 1.3.3. Before that, its status was
- unclear, and so Open vSwitch has never allowed
- <code>OFPP_MAX</code> to be used as a port number, so
- packets will never be received on this port. (Other
- OpenFlow switches, of course, might use it.)
- </dd>
+ <dt>0</dt>
+ <dd>
+ Zero is not a valid OpenFlow port number.
+ </dd>
+
+ <dt><code>OFPP_MAX</code> (<code>0xff00</code> or 65,280).</dt>
+ <dd>
+ This value has only been clearly specified as a valid port
+ number as of OpenFlow 1.3.3. Before that, its status was
+ unclear, and so Open vSwitch has never allowed
+ <code>OFPP_MAX</code> to be used as a port number, so
+ packets will never be received on this port. (Other
+ OpenFlow switches, of course, might use it.)
+ </dd>
<dt><code>OFPP_UNSET</code> (<code>0xfff7</code> or 65,527)</dt>
- <dt><code>OFPP_IN_PORT</code> (<code>0xfff8</code> or 65,528)</dt>
- <dt><code>OFPP_TABLE</code> (<code>0xfff9</code> or 65,529)</dt>
- <dt><code>OFPP_NORMAL</code> (<code>0xfffa</code> or 65,530)</dt>
- <dt><code>OFPP_FLOOD</code> (<code>0xfffb</code> or 65,531)</dt>
- <dt><code>OFPP_ALL</code> (<code>0xfffc</code> or 65,532)</dt>
- <dd>
+ <dt><code>OFPP_IN_PORT</code> (<code>0xfff8</code> or 65,528)</dt>
+ <dt><code>OFPP_TABLE</code> (<code>0xfff9</code> or 65,529)</dt>
+ <dt><code>OFPP_NORMAL</code> (<code>0xfffa</code> or 65,530)</dt>
+ <dt><code>OFPP_FLOOD</code> (<code>0xfffb</code> or 65,531)</dt>
+ <dt><code>OFPP_ALL</code> (<code>0xfffc</code> or 65,532)</dt>
+ <dd>
<p>
- These port numbers are used only in output actions and never
- appear as ingress ports.
+ These port numbers are used only in output actions and never
+ appear as ingress ports.
</p>
<p>
Most of these port numbers were defined in OpenFlow 1.0, but
<code>OFPP_UNSET</code> was only introduced in OpenFlow 1.5.
</p>
- </dd>
+ </dd>
</dl>
<p>
- Values that will never appear when receiving a packet may
- still be matched against in the flow table. There are still
- circumstances in which those flows can be matched:
+ Values that will never appear when receiving a packet may
+ still be matched against in the flow table. There are still
+ circumstances in which those flows can be matched:
</p>
<ul>
- <li>
- The <code>resubmit</code> Open vSwitch extension action allows a
- flow table lookup with an arbitrary ingress port.
- </li>
-
- <li>
- An action that modifies the ingress port field (see below),
- such as e.g. <code>load</code> or <code>set_field</code>,
- followed by an action or instruction that performs another
- flow table lookup, such as <code>resubmit</code> or
- <code>goto_table</code>.
- </li>
+ <li>
+ The <code>resubmit</code> Open vSwitch extension action allows a
+ flow table lookup with an arbitrary ingress port.
+ </li>
+
+ <li>
+ An action that modifies the ingress port field (see below),
+ such as e.g. <code>load</code> or <code>set_field</code>,
+ followed by an action or instruction that performs another
+ flow table lookup, such as <code>resubmit</code> or
+ <code>goto_table</code>.
+ </li>
</ul>
<p>
- This field is heavily used for matching in OpenFlow tables,
- but for packet egress, it has only very limited roles:
+ This field is heavily used for matching in OpenFlow tables,
+ but for packet egress, it has only very limited roles:
</p>
<ul>
- <li>
- <p>
- OpenFlow requires suppressing output actions to <ref
- field="in_port"/>. That is, the following two flows both drop all
- packets that arrive on port 1:
- </p>
-
- <pre>
+ <li>
+ <p>
+ OpenFlow requires suppressing output actions to <ref
+ field="in_port"/>. That is, the following two flows both drop all
+ packets that arrive on port 1:
+ </p>
+
+ <pre>
in_port=1,actions=1
in_port=1,actions=drop
- </pre>
-
- <p>
- (This behavior is occasionally useful for flooding to a
- subset of ports. Specifying <code>actions=1,2,3,4</code>,
- for example, outputs to ports 1, 2, 3, and 4, omitting the
- ingress port.)
- </p>
- </li>
-
- <li>
- OpenFlow has a special port <code>OFPP_IN_PORT</code> (with
- value 0xfff8) that outputs to the ingress port. For example,
- in a switch that has four ports numbered 1 through 4,
- <code>actions=1,2,3,4,in_port</code> outputs to ports 1, 2,
- 3, and 4, including the ingress port.
- </li>
+ </pre>
+
+ <p>
+ (This behavior is occasionally useful for flooding to a
+ subset of ports. Specifying <code>actions=1,2,3,4</code>,
+ for example, outputs to ports 1, 2, 3, and 4, omitting the
+ ingress port.)
+ </p>
+ </li>
+
+ <li>
+ OpenFlow has a special port <code>OFPP_IN_PORT</code> (with
+ value 0xfff8) that outputs to the ingress port. For example,
+ in a switch that has four ports numbered 1 through 4,
+ <code>actions=1,2,3,4,in_port</code> outputs to ports 1, 2,
+ 3, and 4, including the ingress port.
+ </li>
</ul>
<p>
- Because the ingress port field has so little influence on packet
- processing, it does not ordinarily make sense to modify the
- ingress port field. The field is writable only to support the
- occasional use case where the ingress port's roles in packet
- egress, described above, become troublesome. For example,
- <code>actions=load:0->NXM_OF_IN_PORT[],output:123</code>
- will output to port 123 regardless of whether it is in the
- ingress port. If the ingress port is important, then one may save
- and restore it on the stack:
+ Because the ingress port field has so little influence on packet
+ processing, it does not ordinarily make sense to modify the
+ ingress port field. The field is writable only to support the
+ occasional use case where the ingress port's roles in packet
+ egress, described above, become troublesome. For example,
+ <code>actions=load:0->NXM_OF_IN_PORT[],output:123</code>
+ will output to port 123 regardless of whether it is in the
+ ingress port. If the ingress port is important, then one may save
+ and restore it on the stack:
</p>
<pre>
</pre>
<p>
- The ability to modify the ingress port is an Open vSwitch
- extension to OpenFlow.
+ The ability to modify the ingress port is an Open vSwitch
+ extension to OpenFlow.
</p>
</field>
<field id="MFF_IN_PORT_OXM" title="OXM Ingress Port">
<p>
- OpenFlow 1.1 and later use a 32-bit port number, so this field
- supplies a 32-bit view of the ingress port. Current versions of
- Open vSwitch support only a 16-bit range of ports:
+ OpenFlow 1.1 and later use a 32-bit port number, so this field
+ supplies a 32-bit view of the ingress port. Current versions of
+ Open vSwitch support only a 16-bit range of ports:
</p>
<ul>
- <li>
- OpenFlow 1.0 ports <code>0x0000</code> to
- <code>0xfeff</code>, inclusive, map to OpenFlow 1.1
- port numbers with the same values.
- </li>
-
- <li>
- OpenFlow 1.0 ports <code>0xff00</code> to
- <code>0xffff</code>, inclusive, map to OpenFlow 1.1 port
- numbers <code>0xffffff00</code> to <code>0xffffffff</code>.
- </li>
-
- <li>
- OpenFlow 1.1 ports <code>0x0000ff00</code> to
- <code>0xfffffeff</code> are not mapped and not supported.
- </li>
+ <li>
+ OpenFlow 1.0 ports <code>0x0000</code> to
+ <code>0xfeff</code>, inclusive, map to OpenFlow 1.1
+ port numbers with the same values.
+ </li>
+
+ <li>
+ OpenFlow 1.0 ports <code>0xff00</code> to
+ <code>0xffff</code>, inclusive, map to OpenFlow 1.1 port
+ numbers <code>0xffffff00</code> to <code>0xffffffff</code>.
+ </li>
+
+ <li>
+ OpenFlow 1.1 ports <code>0x0000ff00</code> to
+ <code>0xfffffeff</code> are not mapped and not supported.
+ </li>
</ul>
<p>
- <ref field="in_port"/> and <ref field="in_port_oxm"/> are two views of
- the same information, so all of the comments on <ref field="in_port"/>
- apply to <ref field="in_port_oxm"/> too. Modifying <ref
- field="in_port"/> changes <ref field="in_port_oxm"/>, and vice versa.
+ <ref field="in_port"/> and <ref field="in_port_oxm"/> are two views of
+ the same information, so all of the comments on <ref field="in_port"/>
+ apply to <ref field="in_port_oxm"/> too. Modifying <ref
+ field="in_port"/> changes <ref field="in_port_oxm"/>, and vice versa.
</p>
<p>
- Setting <ref field="in_port_oxm"/> to an unsupported value yields
- unspecified behavior.
+ Setting <ref field="in_port_oxm"/> to an unsupported value yields
+ unspecified behavior.
</p>
</field>
<field id="MFF_SKB_PRIORITY" title="Output Queue">
<p>
- <b>Future Directions:</b> Open vSwitch implements the output queue as a
- field, but does not currently expose it through OXM or NXM for matching
- purposes. If this turns out to be a useful feature, it could be
- implemented in future versions. Only the <code>set_queue</code>,
- <code>enqueue</code>, and <code>pop_queue</code> actions currently
- influence the output queue.
+ <b>Future Directions:</b> Open vSwitch implements the output queue as a
+ field, but does not currently expose it through OXM or NXM for matching
+ purposes. If this turns out to be a useful feature, it could be
+ implemented in future versions. Only the <code>set_queue</code>,
+ <code>enqueue</code>, and <code>pop_queue</code> actions currently
+ influence the output queue.
</p>
<p>
- This field influences how packets in the flow will be queued,
- for quality of service (QoS) purposes, when they egress the
- switch. Its range of meaningful values, and their meanings,
- varies greatly from one OpenFlow implementation to another.
- Even within a single implementation, there is no guarantee
- that all OpenFlow ports have the same queues configured or
- that all OpenFlow ports in an implementation can be configured
- the same way queue-wise.
+ This field influences how packets in the flow will be queued,
+ for quality of service (QoS) purposes, when they egress the
+ switch. Its range of meaningful values, and their meanings,
+ varies greatly from one OpenFlow implementation to another.
+ Even within a single implementation, there is no guarantee
+ that all OpenFlow ports have the same queues configured or
+ that all OpenFlow ports in an implementation can be configured
+ the same way queue-wise.
</p>
<p>
- Configuring queues on OpenFlow is not well standardized. On
- Linux, Open vSwitch supports queue configuration via OVSDB,
- specifically the <code>QoS</code> and <code>Queue</code>
- tables (see <code>ovs-vswitchd.conf.db(5)</code> for details).
- Ports of Open vSwitch to other platforms might require queue
- configuration through some separate protocol (such as a CLI).
- Even on Linux, Open vSwitch exposes only a fraction of the
- kernel's queuing features through OVSDB, so advanced or
- unusual uses might require use of separate utilities
- (e.g. <code>tc</code>). OpenFlow switches other than Open
- vSwitch might use OF-CONFIG or any of the configuration
- methods mentioned above. Finally, some OpenFlow switches have
- a fixed number of fixed-function queues (e.g. eight queues
- with strictly defined priorities) and others do not support
- any control over queuing.
+ Configuring queues on OpenFlow is not well standardized. On
+ Linux, Open vSwitch supports queue configuration via OVSDB,
+ specifically the <code>QoS</code> and <code>Queue</code>
+ tables (see <code>ovs-vswitchd.conf.db(5)</code> for details).
+ Ports of Open vSwitch to other platforms might require queue
+ configuration through some separate protocol (such as a CLI).
+ Even on Linux, Open vSwitch exposes only a fraction of the
+ kernel's queuing features through OVSDB, so advanced or
+ unusual uses might require use of separate utilities
+ (e.g. <code>tc</code>). OpenFlow switches other than Open
+ vSwitch might use OF-CONFIG or any of the configuration
+ methods mentioned above. Finally, some OpenFlow switches have
+ a fixed number of fixed-function queues (e.g. eight queues
+ with strictly defined priorities) and others do not support
+ any control over queuing.
</p>
<p>
- The only output queue that all OpenFlow implementations must
- support is zero, to identify a default queue, whose properties
- are implementation-defined. Outputting a packet to a queue
- that does not exist on the output port yields unpredictable
- behavior: among the possibilities are that the packet might be
- dropped or transmitted with a very high or very low priority.
+ The only output queue that all OpenFlow implementations must
+ support is zero, to identify a default queue, whose properties
+ are implementation-defined. Outputting a packet to a queue
+ that does not exist on the output port yields unpredictable
+ behavior: among the possibilities are that the packet might be
+ dropped or transmitted with a very high or very low priority.
</p>
<p>
- OpenFlow 1.0 only allowed output queues to be specified as part of an
- <code>enqueue</code> action that specified both a queue and an output
- port. That is, OpenFlow 1.0 treats the queue as an argument to an
- action, not as a field.
+ OpenFlow 1.0 only allowed output queues to be specified as part of an
+ <code>enqueue</code> action that specified both a queue and an output
+ port. That is, OpenFlow 1.0 treats the queue as an argument to an
+ action, not as a field.
</p>
<p>
- To increase flexibility, OpenFlow 1.1 added an action to set the output
- queue. This model was carried forward, without change, through
- OpenFlow 1.5.
+ To increase flexibility, OpenFlow 1.1 added an action to set the output
+ queue. This model was carried forward, without change, through
+ OpenFlow 1.5.
</p>
<p>
- Open vSwitch implements the native queuing model of each
- OpenFlow version it supports. Open vSwitch also includes an
- extension for setting the output queue as an action in
- OpenFlow 1.0.
+ Open vSwitch implements the native queuing model of each
+ OpenFlow version it supports. Open vSwitch also includes an
+ extension for setting the output queue as an action in
+ OpenFlow 1.0.
</p>
<p>
- When a packet ingresses into an OpenFlow switch, the output
- queue is ordinarily set to 0, indicating the default queue.
- However, Open vSwitch supports various ways to forward a
- packet from one OpenFlow switch to another within a single
- host. In these cases, Open vSwitch maintains the output queue
- across the forwarding step. For example:
+ When a packet ingresses into an OpenFlow switch, the output
+ queue is ordinarily set to 0, indicating the default queue.
+ However, Open vSwitch supports various ways to forward a
+ packet from one OpenFlow switch to another within a single
+ host. In these cases, Open vSwitch maintains the output queue
+ across the forwarding step. For example:
</p>
<ul>
- <li>
- A hop across an Open vSwitch ``patch port'' (which does not
- actually involve queuing) preserves the output queue.
- </li>
-
- <li>
- <p>
- When a flow sets the output queue then outputs to an
- OpenFlow tunnel port, the encapsulation preserves the
- output queue. If the kernel TCP/IP stack routes the
- encapsulated packet directly to a physical interface, then
- that output honors the output queue. Alternatively, if
- the kernel routes the encapsulated packet to another Open
- vSwitch bridge, then the output queue set previously
- becomes the initial output queue on ingress to the second
- bridge and will thus be used for further output actions
- (unless overridden by a new ``set queue'' action).
- </p>
-
- <p>
- (This description reflects the current behavior of Open
- vSwitch on Linux. This behavior relies on details of the
- Linux TCP/IP stack. It could be difficult to make ports
- to other operating systems behave the same way.)
- </p>
- </li>
+ <li>
+ A hop across an Open vSwitch ``patch port'' (which does not
+ actually involve queuing) preserves the output queue.
+ </li>
+
+ <li>
+ <p>
+ When a flow sets the output queue then outputs to an
+ OpenFlow tunnel port, the encapsulation preserves the
+ output queue. If the kernel TCP/IP stack routes the
+ encapsulated packet directly to a physical interface, then
+ that output honors the output queue. Alternatively, if
+ the kernel routes the encapsulated packet to another Open
+ vSwitch bridge, then the output queue set previously
+ becomes the initial output queue on ingress to the second
+ bridge and will thus be used for further output actions
+ (unless overridden by a new ``set queue'' action).
+ </p>
+
+ <p>
+ (This description reflects the current behavior of Open
+ vSwitch on Linux. This behavior relies on details of the
+ Linux TCP/IP stack. It could be difficult to make ports
+ to other operating systems behave the same way.)
+ </p>
+ </li>
</ul>
</field>
</p>
<p>
- Packet mark is an attempt at a generalization of the
- <code>skb_mark</code> concept beyond Linux, at least through more
- generic naming. Like <ref field="skb_priority"/>, packet mark is
- preserved across forwarding steps within a machine. Unlike <ref
- field="skb_priority"/>, packet mark has no direct effect on packet
- forwarding: the value set in packet mark does not matter unless some
- later OpenFlow table or switch matches on packet mark, or unless the
- packet passes through some other kernel subsystem that has been
- configured to interpret packet mark in specific ways, e.g. through
- <code>iptables</code> configuration mentioned above.
+ Packet mark is an attempt at a generalization of the
+ <code>skb_mark</code> concept beyond Linux, at least through more
+ generic naming. Like <ref field="skb_priority"/>, packet mark is
+ preserved across forwarding steps within a machine. Unlike <ref
+ field="skb_priority"/>, packet mark has no direct effect on packet
+ forwarding: the value set in packet mark does not matter unless some
+ later OpenFlow table or switch matches on packet mark, or unless the
+ packet passes through some other kernel subsystem that has been
+ configured to interpret packet mark in specific ways, e.g. through
+ <code>iptables</code> configuration mentioned above.
</p>
<p>
- Preserving packet mark across kernel forwarding steps relies
- heavily on kernel support, which ports to non-Linux operating
- systems may not have. Regardless of operating system support,
- Open vSwitch supports packet mark within a single bridge and
- across patch ports.
+ Preserving packet mark across kernel forwarding steps relies
+ heavily on kernel support, which ports to non-Linux operating
+ systems may not have. Regardless of operating system support,
+ Open vSwitch supports packet mark within a single bridge and
+ across patch ports.
</p>
<p>
- The value of packet mark when a packet ingresses into the
- first Open vSwich bridge is typically zero, but it could be
- nonzero if its value was previously set by some kernel
- subsystem.
+ The value of packet mark when a packet ingresses into the
+ first Open vSwich bridge is typically zero, but it could be
+ nonzero if its value was previously set by some kernel
+ subsystem.
</p>
</field>
</p>
<diagram>
- <header name="Packet type">
- <bits name="ns" above="16" width=".75"/>
- <bits name="ns_type" above="16" width=".75"/>
- </header>
- <dots/>
+ <header name="Packet type">
+ <bits name="ns" above="16" width=".75"/>
+ <bits name="ns_type" above="16" width=".75"/>
+ </header>
+ <dots/>
</diagram>
<p>
</p>
<diagram>
- <header name="Ethernet">
- <bits name="dst" above="48" width="0.4"/>
- <bits name="src" above="48" width="0.4"/>
- <bits name="type" above="16" below="0x800" width="0.4"/>
- </header>
- <header name="IPv4">
- <bits name="..." width="0.4"/>
- <bits name="proto" above="8" width="0.4"/>
- <bits name="src" above="32" width="0.4"/>
- <bits name="dst" above="32" width="0.4"/>
- </header>
- <dots/>
+ <header name="Ethernet">
+ <bits name="dst" above="48" width="0.4"/>
+ <bits name="src" above="48" width="0.4"/>
+ <bits name="type" above="16" below="0x800" width="0.4"/>
+ </header>
+ <header name="IPv4">
+ <bits name="..." width="0.4"/>
+ <bits name="proto" above="8" width="0.4"/>
+ <bits name="src" above="32" width="0.4"/>
+ <bits name="dst" above="32" width="0.4"/>
+ </header>
+ <dots/>
</diagram>
<p>
</p>
<diagram>
- <header name="IPv4">
- <bits name="..." width="0.4"/>
- <bits name="proto" above="8" width="0.4"/>
- <bits name="src" above="32" width="0.4"/>
- <bits name="dst" above="32" width="0.4"/>
- </header>
- <dots/>
+ <header name="IPv4">
+ <bits name="..." width="0.4"/>
+ <bits name="proto" above="8" width="0.4"/>
+ <bits name="src" above="32" width="0.4"/>
+ <bits name="dst" above="32" width="0.4"/>
+ </header>
+ <dots/>
</diagram>
<p>
<field id="MFF_METADATA" title="OpenFlow Metadata">
<p>
- This field is the oldest standardized OpenFlow register field,
- introduced in OpenFlow 1.1. It was introduced to model the limited
- number of user-defined bits that some ASIC-based switches can carry
- through their pipelines. Because of hardware limitations, OpenFlow
- allows switches to support writing and masking only an
- implementation-defined subset of bits, even no bits at all. The Open
- vSwitch software switch always supports all 64 bits, but of course an
- Open vSwitch port to an ASIC would have the same restriction as the
- ASIC itself.
+ This field is the oldest standardized OpenFlow register field,
+ introduced in OpenFlow 1.1. It was introduced to model the limited
+ number of user-defined bits that some ASIC-based switches can carry
+ through their pipelines. Because of hardware limitations, OpenFlow
+ allows switches to support writing and masking only an
+ implementation-defined subset of bits, even no bits at all. The Open
+ vSwitch software switch always supports all 64 bits, but of course an
+ Open vSwitch port to an ASIC would have the same restriction as the
+ ASIC itself.
</p>
<p>
- This field has an OXM code point, but OpenFlow 1.4 and earlier allow it
- to be modified only with a specialized instruction, not with a
- ``set-field'' action. OpenFlow 1.5 removes this restriction. Open
- vSwitch does not enforce this restriction, regardless of OpenFlow
- version.
+ This field has an OXM code point, but OpenFlow 1.4 and earlier allow it
+ to be modified only with a specialized instruction, not with a
+ ``set-field'' action. OpenFlow 1.5 removes this restriction. Open
+ vSwitch does not enforce this restriction, regardless of OpenFlow
+ version.
</p>
</field>
</p>
<diagram>
- <header name="Ethernet">
- <bits name="dst" above="48" width=".75"/>
- <bits name="src" above="48" width=".75" fill="yes"/>
- <bits name="type" above="16" width="0.4"/>
- </header>
- <dots/>
+ <header name="Ethernet">
+ <bits name="dst" above="48" width=".75"/>
+ <bits name="src" above="48" width=".75" fill="yes"/>
+ <bits name="type" above="16" width="0.4"/>
+ </header>
+ <dots/>
</diagram>
</field>
<field id="MFF_ETH_DST" title="Ethernet Destination">
<p>
- The Ethernet destination address:
+ The Ethernet destination address:
</p>
<diagram>
- <header name="Ethernet">
- <bits name="dst" above="48" width=".75" fill="yes"/>
- <bits name="src" above="48" width=".75"/>
- <bits name="type" above="16" width="0.4"/>
- </header>
- <dots/>
+ <header name="Ethernet">
+ <bits name="dst" above="48" width=".75" fill="yes"/>
+ <bits name="src" above="48" width=".75"/>
+ <bits name="type" above="16" width="0.4"/>
+ </header>
+ <dots/>
</diagram>
<p>
<field id="MFF_ETH_TYPE" title="Ethernet Type">
<p>
- The most commonly seen Ethernet frames today use a format
- called ``Ethernet II,'' in which the last two bytes of the
- Ethernet header specify the Ethertype. For such a frame, this
- field is copied from those bytes of the header, like so:
+ The most commonly seen Ethernet frames today use a format
+ called ``Ethernet II,'' in which the last two bytes of the
+ Ethernet header specify the Ethertype. For such a frame, this
+ field is copied from those bytes of the header, like so:
</p>
<diagram>
- <header name="Ethernet">
- <bits name="dst" above="48" width=".75"/>
- <bits name="src" above="48" width=".75"/>
- <bits name="type" above="16" below="\[>=]0x600" width="0.4" fill="yes"/>
- </header>
- <dots/>
+ <header name="Ethernet">
+ <bits name="dst" above="48" width=".75"/>
+ <bits name="src" above="48" width=".75"/>
+ <bits name="type" above="16" below="\[>=]0x600" width="0.4" fill="yes"/>
+ </header>
+ <dots/>
</diagram>
<p>
- Every Ethernet type has a value 0x600 (1,536) or greater.
- When the last two bytes of the Ethernet header have a value
- too small to be an Ethernet type, then the value found there
- is the total length of the frame in bytes, excluding the
- Ethernet header. An 802.2 LLC header typically follows the
- Ethernet header. OpenFlow and Open vSwitch only support LLC
- headers with DSAP and SSAP <code>0xaa</code> and control byte
- <code>0x03</code>, which indicate that a SNAP header follows
- the LLC header. In turn, OpenFlow and Open vSwitch only
- support a SNAP header with organization <code>0x000000</code>.
- In such a case, this field is copied from the type field in
- the SNAP header, like this:
+ Every Ethernet type has a value 0x600 (1,536) or greater.
+ When the last two bytes of the Ethernet header have a value
+ too small to be an Ethernet type, then the value found there
+ is the total length of the frame in bytes, excluding the
+ Ethernet header. An 802.2 LLC header typically follows the
+ Ethernet header. OpenFlow and Open vSwitch only support LLC
+ headers with DSAP and SSAP <code>0xaa</code> and control byte
+ <code>0x03</code>, which indicate that a SNAP header follows
+ the LLC header. In turn, OpenFlow and Open vSwitch only
+ support a SNAP header with organization <code>0x000000</code>.
+ In such a case, this field is copied from the type field in
+ the SNAP header, like this:
</p>
<diagram>
- <header name="Ethernet">
- <bits name="dst" above="48" width=".75"/>
- <bits name="src" above="48" width=".75"/>
- <bits name="type" above="16" below="<0x600" width="0.4"/>
- </header>
- <header name="LLC">
- <bits name="DSAP" above="8" below="0xaa" width=".4"/>
- <bits name="SSAP" above="8" below="0xaa" width=".4"/>
- <bits name="cntl" above="8" below="0x03" width=".4"/>
- </header>
- <header name="SNAP">
- <bits name="org" above="24" below="0x000000" width=".75"/>
- <bits name="type" above="16" below="\[>=]0x600" width=".4" fill="yes"/>
- </header>
- <dots/>
+ <header name="Ethernet">
+ <bits name="dst" above="48" width=".75"/>
+ <bits name="src" above="48" width=".75"/>
+ <bits name="type" above="16" below="<0x600" width="0.4"/>
+ </header>
+ <header name="LLC">
+ <bits name="DSAP" above="8" below="0xaa" width=".4"/>
+ <bits name="SSAP" above="8" below="0xaa" width=".4"/>
+ <bits name="cntl" above="8" below="0x03" width=".4"/>
+ </header>
+ <header name="SNAP">
+ <bits name="org" above="24" below="0x000000" width=".75"/>
+ <bits name="type" above="16" below="\[>=]0x600" width=".4" fill="yes"/>
+ </header>
+ <dots/>
</diagram>
<p>
- When an 802.1Q header is inserted after the Ethernet source
- and destination, this field is populated with the encapsulated
- Ethertype, not the 802.1Q Ethertype. With an Ethernet II
- inner frame, the result looks like this:
+ When an 802.1Q header is inserted after the Ethernet source
+ and destination, this field is populated with the encapsulated
+ Ethertype, not the 802.1Q Ethertype. With an Ethernet II
+ inner frame, the result looks like this:
</p>
<diagram>
- <header name="Ethernet">
- <bits name="dst" above="48" width=".75"/>
- <bits name="src" above="48" width=".75"/>
- </header>
- <header name="802.1Q">
- <bits name="TPID" above="16" below="0x8100" width=".4"/>
- <bits name="TCI" above="16" width=".4"/>
- </header>
- <header name="Ethertype">
- <bits name="type" above="16" below="\[>=]0x600" width=".4" fill="yes"/>
- </header>
- <dots/>
+ <header name="Ethernet">
+ <bits name="dst" above="48" width=".75"/>
+ <bits name="src" above="48" width=".75"/>
+ </header>
+ <header name="802.1Q">
+ <bits name="TPID" above="16" below="0x8100" width=".4"/>
+ <bits name="TCI" above="16" width=".4"/>
+ </header>
+ <header name="Ethertype">
+ <bits name="type" above="16" below="\[>=]0x600" width=".4" fill="yes"/>
+ </header>
+ <dots/>
</diagram>
<p>
- LLC and SNAP encapsulation look like this with an 802.1Q header:
+ LLC and SNAP encapsulation look like this with an 802.1Q header:
</p>
<diagram>
- <header name="Ethernet">
- <bits name="dst" above="48" width=".75"/>
- <bits name="src" above="48" width=".75"/>
- </header>
- <header name="802.1Q">
- <bits name="TPID" above="16" below="0x8100" width=".4"/>
- <bits name="TCI" above="16" width=".4"/>
- </header>
- <header name="Ethertype">
- <bits name="type" above="16" below="<0x600" width="0.4"/>
- </header>
- <header name="LLC">
- <bits name="DSAP" above="8" below="0xaa" width=".4"/>
- <bits name="SSAP" above="8" below="0xaa" width=".4"/>
- <bits name="cntl" above="8" below="0x03" width=".4"/>
- </header>
- <header name="SNAP">
- <bits name="org" above="24" below="0x000000" width=".75"/>
- <bits name="type" above="16" below="\[>=]0x600" width=".4" fill="yes"/>
- </header>
- <dots/>
+ <header name="Ethernet">
+ <bits name="dst" above="48" width=".75"/>
+ <bits name="src" above="48" width=".75"/>
+ </header>
+ <header name="802.1Q">
+ <bits name="TPID" above="16" below="0x8100" width=".4"/>
+ <bits name="TCI" above="16" width=".4"/>
+ </header>
+ <header name="Ethertype">
+ <bits name="type" above="16" below="<0x600" width="0.4"/>
+ </header>
+ <header name="LLC">
+ <bits name="DSAP" above="8" below="0xaa" width=".4"/>
+ <bits name="SSAP" above="8" below="0xaa" width=".4"/>
+ <bits name="cntl" above="8" below="0x03" width=".4"/>
+ </header>
+ <header name="SNAP">
+ <bits name="org" above="24" below="0x000000" width=".75"/>
+ <bits name="type" above="16" below="\[>=]0x600" width=".4" fill="yes"/>
+ </header>
+ <dots/>
</diagram>
<p>
- When a packet doesn't match any of the header formats described
- above, Open vSwitch and OpenFlow set this field to
- <code>0x5ff</code> (<code>OFP_DL_TYPE_NOT_ETH_TYPE</code>).
+ When a packet doesn't match any of the header formats described
+ above, Open vSwitch and OpenFlow set this field to
+ <code>0x5ff</code> (<code>OFP_DL_TYPE_NOT_ETH_TYPE</code>).
</p>
</field>
</group>
<diagram>
<header name="TPID">
- <bits name="Ethertype" above="16" below="0x8100" width="1.8"/>
+ <bits name="Ethertype" above="16" below="0x8100" width="1.8"/>
</header>
<nospace/>
<header name="TCI">
- <bits name="PCP" above="3" width=".6"/>
- <bits name="CFI" above="1" below="0" width=".3"/>
- <bits name="VID" above="12" width=".9"/>
+ <bits name="PCP" above="3" width=".6"/>
+ <bits name="CFI" above="1" below="0" width=".3"/>
+ <bits name="VID" above="12" width=".9"/>
</header>
</diagram>
<ul>
<li>
- <dfn>PCP</dfn> (Priority Control Point), is a 3-bit 802.1p
- <dfn>priority</dfn>. The lowest priority is value 1, the
- second-lowest is value 0, and priority increases from 2 up to
- highest priority 7.
+ <dfn>PCP</dfn> (Priority Control Point), is a 3-bit 802.1p
+ <dfn>priority</dfn>. The lowest priority is value 1, the
+ second-lowest is value 0, and priority increases from 2 up to
+ highest priority 7.
</li>
<li>
<p>
- <dfn>CFI</dfn> (Canonical Format Indicator), is a 1-bit field. On an
- Ethernet network, its value is always 0. This led to it later being
- repurposed under the name <dfn>DEI</dfn> (Drop Eligibility
- Indicator). By either name, OpenFlow and Open vSwitch don't provide
- any way to match or set this bit.
+ <dfn>CFI</dfn> (Canonical Format Indicator), is a 1-bit field. On an
+ Ethernet network, its value is always 0. This led to it later being
+ repurposed under the name <dfn>DEI</dfn> (Drop Eligibility
+ Indicator). By either name, OpenFlow and Open vSwitch don't provide
+ any way to match or set this bit.
</p>
</li>
<li>
- <dfn>VID</dfn> (VLAN IDentifier), is a 12-bit VLAN. If the
- VID is 0, then the frame is not part of a VLAN. In that case,
- the VLAN header is called a <dfn>priority tag</dfn> because it
- is only meaningful for assigning the frame a priority. VID
- <code>0xfff</code> (4,095) is reserved.
+ <dfn>VID</dfn> (VLAN IDentifier), is a 12-bit VLAN. If the
+ VID is 0, then the frame is not part of a VLAN. In that case,
+ the VLAN header is called a <dfn>priority tag</dfn> because it
+ is only meaningful for assigning the frame a priority. VID
+ <code>0xfff</code> (4,095) is reserved.
</li>
</ul>
<ul>
<li>
- When both <code>dl_vlan</code> and <code>dl_vlan_pcp</code> are
- wildcarded, the flow matches packets without an 802.1Q header or
- with any 802.1Q header.
+ When both <code>dl_vlan</code> and <code>dl_vlan_pcp</code> are
+ wildcarded, the flow matches packets without an 802.1Q header or
+ with any 802.1Q header.
</li>
<li>
</li>
<li>
- <p>
- Otherwise, the flow matches only packets with an 802.1Q
- header. If <code>dl_vlan</code> is not wildcarded, then the
- flow only matches packets with the VLAN ID specified in
- <code>dl_vlan</code>'s low 12 bits. If
- <code>dl_vlan_pcp</code> is not wildcarded, then the flow
- only matches packets with the priority specified in
- <code>dl_vlan_pcp</code>'s low 3 bits.
- </p>
-
- <p>
- OpenFlow does not specify how to interpret the high 4 bits of
- <code>dl_vlan</code> or the high 5 bits of <code>dl_vlan_pcp</code>.
- Open vSwitch ignores them.
- </p>
+ <p>
+ Otherwise, the flow matches only packets with an 802.1Q
+ header. If <code>dl_vlan</code> is not wildcarded, then the
+ flow only matches packets with the VLAN ID specified in
+ <code>dl_vlan</code>'s low 12 bits. If
+ <code>dl_vlan_pcp</code> is not wildcarded, then the flow
+ only matches packets with the priority specified in
+ <code>dl_vlan_pcp</code>'s low 3 bits.
+ </p>
+
+ <p>
+ OpenFlow does not specify how to interpret the high 4 bits of
+ <code>dl_vlan</code> or the high 5 bits of <code>dl_vlan_pcp</code>.
+ Open vSwitch ignores them.
+ </p>
</li>
</ul>
<field id="MFF_DL_VLAN" title="OpenFlow 1.0 VLAN ID" hidden="yes"/>
<field id="MFF_DL_VLAN_PCP" title="OpenFlow 1.0 VLAN Priority"
- hidden="yes"/>
+ hidden="yes"/>
<h2>OpenFlow 1.1 VLAN Fields</h2>
<field id="MFF_VLAN_VID" title="OpenFlow 1.2+ VLAN ID">
<p>
- The OpenFlow standard describes this field as consisting of
- ``12+1'' bits. On ingress, its value is 0 if no 802.1Q header
- is present, and otherwise it holds the VLAN VID in its least
- significant 12 bits, with bit 12 (<code>0x1000</code> aka
- <code>OFPVID_PRESENT</code>) also set to 1. The three most
- significant bits are always zero:
+ The OpenFlow standard describes this field as consisting of
+ ``12+1'' bits. On ingress, its value is 0 if no 802.1Q header
+ is present, and otherwise it holds the VLAN VID in its least
+ significant 12 bits, with bit 12 (<code>0x1000</code> aka
+ <code>OFPVID_PRESENT</code>) also set to 1. The three most
+ significant bits are always zero:
</p>
<diagram>
- <header name="OXM_OF_VLAN_VID">
- <bits name="" above="3" below="0" width=".6"/>
- <bits name="P" above="1" width=".1"/>
- <bits name="VLAN ID" above="12" width=".9"/>
- </header>
+ <header name="OXM_OF_VLAN_VID">
+ <bits name="" above="3" below="0" width=".6"/>
+ <bits name="P" above="1" width=".1"/>
+ <bits name="VLAN ID" above="12" width=".9"/>
+ </header>
</diagram>
<p>
- As a consequence of this field's format, one may use it to match the
- VLAN ID in all of the ways available with the OpenFlow 1.0 and 1.1
- formats, and a few new ways:
+ As a consequence of this field's format, one may use it to match the
+ VLAN ID in all of the ways available with the OpenFlow 1.0 and 1.1
+ formats, and a few new ways:
</p>
<dl>
- <dt>Fully wildcarded</dt>
- <dd>
- Matches any packet, that is, one without an 802.1Q header or
- with an 802.1Q header with any TCI value.
- </dd>
-
- <dt>
- Value <code>0x0000</code> (<code>OFPVID_NONE</code>), mask
- <code>0xffff</code> (or no mask)
- </dt>
- <dd>
- Matches only packets without an 802.1Q header.
- </dd>
-
- <dt>
- Value <code>0x1000</code>, mask <code>0x1000</code>
- </dt>
- <dd>
- Matches any packet with an 802.1Q header, regardless of VLAN
- ID.
- </dd>
-
- <dt>
- Value <code>0x1009</code>, mask <code>0xffff</code> (or no mask)
- </dt>
- <dd>
- Match only packets with an 802.1Q header with VLAN ID 9.
- </dd>
-
- <dt>Value <code>0x1001</code>, mask <code>0x1001</code></dt>
- <dd>
- Matches only packets that have an 802.1Q header with an
- odd-numbered VLAN ID. (This is just an example; one can
- match on any desired VLAN ID bit pattern.)
- </dd>
+ <dt>Fully wildcarded</dt>
+ <dd>
+ Matches any packet, that is, one without an 802.1Q header or
+ with an 802.1Q header with any TCI value.
+ </dd>
+
+ <dt>
+ Value <code>0x0000</code> (<code>OFPVID_NONE</code>), mask
+ <code>0xffff</code> (or no mask)
+ </dt>
+ <dd>
+ Matches only packets without an 802.1Q header.
+ </dd>
+
+ <dt>
+ Value <code>0x1000</code>, mask <code>0x1000</code>
+ </dt>
+ <dd>
+ Matches any packet with an 802.1Q header, regardless of VLAN
+ ID.
+ </dd>
+
+ <dt>
+ Value <code>0x1009</code>, mask <code>0xffff</code> (or no mask)
+ </dt>
+ <dd>
+ Match only packets with an 802.1Q header with VLAN ID 9.
+ </dd>
+
+ <dt>Value <code>0x1001</code>, mask <code>0x1001</code></dt>
+ <dd>
+ Matches only packets that have an 802.1Q header with an
+ odd-numbered VLAN ID. (This is just an example; one can
+ match on any desired VLAN ID bit pattern.)
+ </dd>
</dl>
</field>
<field id="MFF_VLAN_PCP" title="OpenFlow 1.2+ VLAN Priority">
<p>
- The 3 least significant bits may be used to match the PCP bits
- in an 802.1Q header. Other bits are always zero:
+ The 3 least significant bits may be used to match the PCP bits
+ in an 802.1Q header. Other bits are always zero:
</p>
<diagram>
- <header name="OXM_OF_VLAN_VID">
- <bits name="zero" above="5" below="0" width="1.0"/>
- <bits name="PCP" above="3" width=".6"/>
- </header>
+ <header name="OXM_OF_VLAN_VID">
+ <bits name="zero" above="5" below="0" width="1.0"/>
+ <bits name="PCP" above="3" width=".6"/>
+ </header>
</diagram>
<p>
- This field may only be used when <ref field="vlan_vid"/> is not
- wildcarded and does not exact match on 0 (which only matches
- when there is no 802.1Q header).
+ This field may only be used when <ref field="vlan_vid"/> is not
+ wildcarded and does not exact match on 0 (which only matches
+ when there is no 802.1Q header).
</p>
<p>
- See <cite>VLAN Comparison Chart</cite>, below, for some examples.
+ See <cite>VLAN Comparison Chart</cite>, below, for some examples.
</p>
</field>
<field id="MFF_VLAN_TCI" title="VLAN TCI">
<p>
- For a packet without an 802.1Q header, this field is zero. For a
- packet with an 802.1Q header, this field is the TCI with the bit in
- CFI's position (marked <code>P</code> for ``present'' below) forced to
- 1. Thus, for a packet in VLAN 9 with priority 7, it has the value
- <code>0xf009</code>:
+ For a packet without an 802.1Q header, this field is zero. For a
+ packet with an 802.1Q header, this field is the TCI with the bit in
+ CFI's position (marked <code>P</code> for ``present'' below) forced to
+ 1. Thus, for a packet in VLAN 9 with priority 7, it has the value
+ <code>0xf009</code>:
</p>
<diagram>
- <header name="NXM_VLAN_TCI">
- <bits name="PCP" above="3" below="7" width=".6"/>
- <bits name="P" above="1" below="1" width=".2"/>
- <bits name="VID" above="12" below="9" width=".9"/>
- </header>
+ <header name="NXM_VLAN_TCI">
+ <bits name="PCP" above="3" below="7" width=".6"/>
+ <bits name="P" above="1" below="1" width=".2"/>
+ <bits name="VID" above="12" below="9" width=".9"/>
+ </header>
</diagram>
<p>
</dl>
<p>
- See <cite>VLAN Comparison Chart</cite>, below, for more examples.
+ See <cite>VLAN Comparison Chart</cite>, below, for more examples.
</p>
</field>
<tbl>
r r r r r.
-Criteria OpenFlow 1.0 OpenFlow 1.1 OpenFlow 1.2+ NXM
-\_ \_ \_ \_ \_
-[1] \fL????\fR/\fL1\fR,\fL??\fR/\fL?\fR \fL????\fR/\fL1\fR,\fL??\fR/\fL?\fR \fL0000\fR/\fL0000\fR,\fL--\fR \fL0000\fR/\fL0000\fR
-[2] \fLffff\fR/\fL0\fR,\fL??\fR/\fL?\fR \fLffff\fR/\fL0\fR,\fL??\fR/\fL?\fR \fL0000\fR/\fLffff\fR,\fL--\fR \fL0000\fR/\fLffff\fR
-[3] \fL0xxx\fR/\fL0\fR,\fL??\fR/\fL1\fR \fL0xxx\fR/\fL0\fR,\fL??\fR/\fL1\fR \fL1xxx\fR/\fLffff\fR,\fL--\fR \fL1xxx\fR/\fL1fff\fR
-[4] \fL????\fR/\fL1\fR,\fL0y\fR/\fL0\fR \fLfffe\fR/\fL0\fR,\fL0y\fR/\fL0\fR \fL1000\fR/\fL1000\fR,\fL0y\fR \fLz000\fR/\fLf000\fR
-[5] \fL0xxx\fR/\fL0\fR,\fL0y\fR/\fL0\fR \fL0xxx\fR/\fL0\fR,\fL0y\fR/\fL0\fR \fL1xxx\fR/\fLffff\fR,\fL0y\fR \fLzxxx\fR/\fLffff\fR
+Criteria OpenFlow 1.0 OpenFlow 1.1 OpenFlow 1.2+ NXM
+\_ \_ \_ \_ \_
+[1] \fL????\fR/\fL1\fR,\fL??\fR/\fL?\fR \fL????\fR/\fL1\fR,\fL??\fR/\fL?\fR \fL0000\fR/\fL0000\fR,\fL--\fR \fL0000\fR/\fL0000\fR
+[2] \fLffff\fR/\fL0\fR,\fL??\fR/\fL?\fR \fLffff\fR/\fL0\fR,\fL??\fR/\fL?\fR \fL0000\fR/\fLffff\fR,\fL--\fR \fL0000\fR/\fLffff\fR
+[3] \fL0xxx\fR/\fL0\fR,\fL??\fR/\fL1\fR \fL0xxx\fR/\fL0\fR,\fL??\fR/\fL1\fR \fL1xxx\fR/\fLffff\fR,\fL--\fR \fL1xxx\fR/\fL1fff\fR
+[4] \fL????\fR/\fL1\fR,\fL0y\fR/\fL0\fR \fLfffe\fR/\fL0\fR,\fL0y\fR/\fL0\fR \fL1000\fR/\fL1000\fR,\fL0y\fR \fLz000\fR/\fLf000\fR
+[5] \fL0xxx\fR/\fL0\fR,\fL0y\fR/\fL0\fR \fL0xxx\fR/\fL0\fR,\fL0y\fR/\fL0\fR \fL1xxx\fR/\fLffff\fR,\fL0y\fR \fLzxxx\fR/\fLffff\fR
.T&
r r c c r.
-[6] (none) (none) \fL1001\fR/\fL1001\fR,\fL--\fR \fL1001\fR/\fL1001\fR
+[6] (none) (none) \fL1001\fR/\fL1001\fR,\fL--\fR \fL1001\fR/\fL1001\fR
.T&
r r c c c.
-[7] (none) (none) (none) \fL3000\fR/\fL3000\fR
-[8] (none) (none) (none) \fL0000\fR/\fL0fff\fR
-[9] (none) (none) (none) \fL0000\fR/\fLf000\fR
-[10] (none) (none) (none) \fL0000\fR/\fLefff\fR
+[7] (none) (none) (none) \fL3000\fR/\fL3000\fR
+[8] (none) (none) (none) \fL0000\fR/\fL0fff\fR
+[9] (none) (none) (none) \fL0000\fR/\fLf000\fR
+[10] (none) (none) (none) \fL0000\fR/\fLefff\fR
</tbl>
<p>
<dt>OpenFlow 1.0</dt>
<dt>OpenFlow 1.1</dt>
<dd>
- <literal>wwww/x,yy/z</literal> means VLAN ID match value
- <literal>wwww</literal> with wildcard bit <literal>x</literal>
- and VLAN PCP match value <literal>yy</literal> with wildcard
- bit <literal>z</literal>. <literal>?</literal> means that the
- given bits are ignored (and conventionally
- <literal>0</literal> for <literal>wwww</literal> or
- <literal>yy</literal>, conventionally <literal>1</literal> for
- <literal>x</literal> or <literal>z</literal>). ``(none)''
- means that OpenFlow 1.0 (or 1.1) cannot match with these
- criteria.
+ <literal>wwww/x,yy/z</literal> means VLAN ID match value
+ <literal>wwww</literal> with wildcard bit <literal>x</literal>
+ and VLAN PCP match value <literal>yy</literal> with wildcard
+ bit <literal>z</literal>. <literal>?</literal> means that the
+ given bits are ignored (and conventionally
+ <literal>0</literal> for <literal>wwww</literal> or
+ <literal>yy</literal>, conventionally <literal>1</literal> for
+ <literal>x</literal> or <literal>z</literal>). ``(none)''
+ means that OpenFlow 1.0 (or 1.1) cannot match with these
+ criteria.
</dd>
<dt>OpenFlow 1.2+</dt>
<dd>
- <literal>xxxx/yyyy,zz</literal> means <ref field="vlan_vid"/> with
- value <literal>xxxx</literal> and mask <literal>yyyy</literal>, and
- <ref field="vlan_pcp"/> (which is not maskable) with value
- <literal>zz</literal>. <literal>--</literal> means that <ref
- field="vlan_pcp"/> is omitted. ``(none)'' means that OpenFlow 1.2
- cannot match with these criteria.
+ <literal>xxxx/yyyy,zz</literal> means <ref field="vlan_vid"/> with
+ value <literal>xxxx</literal> and mask <literal>yyyy</literal>, and
+ <ref field="vlan_pcp"/> (which is not maskable) with value
+ <literal>zz</literal>. <literal>--</literal> means that <ref
+ field="vlan_pcp"/> is omitted. ``(none)'' means that OpenFlow 1.2
+ cannot match with these criteria.
</dd>
<dt>NXM</dt>
<dd>
- <literal>xxxx/yyyy</literal> means <ref field="vlan_tci"/> with value
- <literal>xxxx</literal> and mask <literal>yyyy</literal>.
+ <literal>xxxx/yyyy</literal> means <ref field="vlan_tci"/> with value
+ <literal>xxxx</literal> and mask <literal>yyyy</literal>.
</dd>
</dl>
<dl>
<dt>[1]</dt>
<dd>
- Matches any packet, that is, one without an 802.1Q header or
- with an 802.1Q header with any TCI value.
+ Matches any packet, that is, one without an 802.1Q header or
+ with an 802.1Q header with any TCI value.
</dd>
<dt>[2]</dt>
<dd>
- <p>
- Matches only packets without an 802.1Q header.
- </p>
-
- <p>
- OpenFlow 1.0 doesn't define the behavior if <ref field="dl_vlan"/> is
- set to <code>0xffff</code> and <ref field="dl_vlan_pcp"/> is not
- wildcarded. (Open vSwitch always ignores <ref field="dl_vlan_pcp"/>
- when <ref field="dl_vlan"/> is set to <code>0xffff</code>.)
- </p>
-
- <p>
- OpenFlow 1.1 says explicitly to ignore <ref field="dl_vlan_pcp"/>
- when <ref field="dl_vlan"/> is set to <code>0xffff</code>.
- </p>
-
- <p>
- OpenFlow 1.2 doesn't say how to interpret a match with <ref
- field="vlan_vid"/> value 0 and a mask with
- <code>OFPVID_PRESENT</code> (<code>0x1000</code>) set to 1 and some
- other bits in the mask set to 1 also. Open vSwitch interprets it the
- same way as a mask of <code>0x1000</code>.
- </p>
-
- <p>
- Any NXM match with <ref field="vlan_tci"/> value 0 and the CFI bit
- set to 1 in the mask is equivalent to the one listed in the table.
- </p>
+ <p>
+ Matches only packets without an 802.1Q header.
+ </p>
+
+ <p>
+ OpenFlow 1.0 doesn't define the behavior if <ref field="dl_vlan"/> is
+ set to <code>0xffff</code> and <ref field="dl_vlan_pcp"/> is not
+ wildcarded. (Open vSwitch always ignores <ref field="dl_vlan_pcp"/>
+ when <ref field="dl_vlan"/> is set to <code>0xffff</code>.)
+ </p>
+
+ <p>
+ OpenFlow 1.1 says explicitly to ignore <ref field="dl_vlan_pcp"/>
+ when <ref field="dl_vlan"/> is set to <code>0xffff</code>.
+ </p>
+
+ <p>
+ OpenFlow 1.2 doesn't say how to interpret a match with <ref
+ field="vlan_vid"/> value 0 and a mask with
+ <code>OFPVID_PRESENT</code> (<code>0x1000</code>) set to 1 and some
+ other bits in the mask set to 1 also. Open vSwitch interprets it the
+ same way as a mask of <code>0x1000</code>.
+ </p>
+
+ <p>
+ Any NXM match with <ref field="vlan_tci"/> value 0 and the CFI bit
+ set to 1 in the mask is equivalent to the one listed in the table.
+ </p>
</dd>
<dt>[3]</dt>
<dd>
- Matches only packets that have an 802.1Q header with VID
- <literal>xxx</literal> (and any PCP).
+ Matches only packets that have an 802.1Q header with VID
+ <literal>xxx</literal> (and any PCP).
</dd>
<dt>[4]</dt>
<dd>
- <p>
- Matches only packets that have an 802.1Q header with PCP
- <literal>y</literal> (and any VID).
- </p>
-
- <p>
- OpenFlow 1.0 doesn't clearly define the behavior for this
- case. Open vSwitch implements it this way.
- </p>
-
- <p>
- In the NXM value, <literal>z</literal> equals
- (<literal>y</literal> << 1) | 1.
- </p>
+ <p>
+ Matches only packets that have an 802.1Q header with PCP
+ <literal>y</literal> (and any VID).
+ </p>
+
+ <p>
+ OpenFlow 1.0 doesn't clearly define the behavior for this
+ case. Open vSwitch implements it this way.
+ </p>
+
+ <p>
+ In the NXM value, <literal>z</literal> equals
+ (<literal>y</literal> << 1) | 1.
+ </p>
</dd>
<dt>[5]</dt>
<dd>
- <p>
- Matches only packets that have an 802.1Q header with VID
- <literal>xxx</literal> and PCP <literal>y</literal>.
- </p>
-
- <p>
- In the NXM value, <literal>z</literal> equals
- (<literal>y</literal> << 1) | 1.
- </p>
+ <p>
+ Matches only packets that have an 802.1Q header with VID
+ <literal>xxx</literal> and PCP <literal>y</literal>.
+ </p>
+
+ <p>
+ In the NXM value, <literal>z</literal> equals
+ (<literal>y</literal> << 1) | 1.
+ </p>
</dd>
<dt>[6]</dt>
<dd>
- Matches only packets that have an 802.1Q header with an
- odd-numbered VID (and any PCP). Only possible with OpenFlow
- 1.2 and NXM. (This is just an example; one can match on any
- desired VID bit pattern.)
+ Matches only packets that have an 802.1Q header with an
+ odd-numbered VID (and any PCP). Only possible with OpenFlow
+ 1.2 and NXM. (This is just an example; one can match on any
+ desired VID bit pattern.)
</dd>
<dt>[7]</dt>
<dd>
- 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.)
+ 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.)
</dd>
<dt>[8]</dt>
<dd>
- Matches packets with no 802.1Q header or with an 802.1Q header
- with a VID of 0. Only possible with NXM.
+ Matches packets with no 802.1Q header or with an 802.1Q header
+ with a VID of 0. Only possible with NXM.
</dd>
<dt>[9]</dt>
<dd>
- Matches packets with no 802.1Q header or with an 802.1Q header
- with a PCP of 0. Only possible with NXM.
+ Matches packets with no 802.1Q header or with an 802.1Q header
+ with a PCP of 0. Only possible with NXM.
</dd>
<dt>[10]</dt>
<dd>
- Matches packets with no 802.1Q header or with an 802.1Q header
- with both VID and PCP of 0. Only possible with NXM.
+ Matches packets with no 802.1Q header or with an 802.1Q header
+ with both VID and PCP of 0. Only possible with NXM.
</dd>
</dl>
</group>
<diagram>
<header name="Ethernet">
- <bits name="dst" above="48" width="0.75"/>
- <bits name="src" above="48" width="0.75"/>
- <bits name="type" above="16" below="0x8847" width="0.4"/>
+ <bits name="dst" above="48" width="0.75"/>
+ <bits name="src" above="48" width="0.75"/>
+ <bits name="type" above="16" below="0x8847" width="0.4"/>
</header>
<header name="MPLS">
- <bits name="label" above="20" width=".6"/>
- <bits name="TC" above="3" width=".3"/>
- <bits name="S" above="1" width=".1"/>
- <bits name="TTL" above="8" width=".4"/>
+ <bits name="label" above="20" width=".6"/>
+ <bits name="TC" above="3" width=".3"/>
+ <bits name="S" above="1" width=".1"/>
+ <bits name="TTL" above="8" width=".4"/>
</header>
<dots/>
</diagram>
<diagram>
<header name="Ethernet">
- <bits name="dst" above="48" width=".75"/>
- <bits name="src" above="48" width=".75"/>
+ <bits name="dst" above="48" width=".75"/>
+ <bits name="src" above="48" width=".75"/>
</header>
<header name="802.1Q">
- <bits name="TPID" above="16" below="0x8100" width=".4"/>
- <bits name="TCI" above="16" width=".4"/>
+ <bits name="TPID" above="16" below="0x8100" width=".4"/>
+ <bits name="TCI" above="16" width=".4"/>
</header>
<header name="Ethertype">
- <bits name="type" above="16" below="0x8847" width=".4"/>
+ <bits name="type" above="16" below="0x8847" width=".4"/>
</header>
<header name="MPLS">
- <bits name="label" above="20" width=".6"/>
- <bits name="TC" above="3" width=".3"/>
- <bits name="S" above="1" width=".1"/>
- <bits name="TTL" above="8" width=".4"/>
+ <bits name="label" above="20" width=".6"/>
+ <bits name="TC" above="3" width=".3"/>
+ <bits name="S" above="1" width=".1"/>
+ <bits name="TTL" above="8" width=".4"/>
</header>
<dots/>
</diagram>
<dl>
<dt>Label, 20 bits.</dt>
<dd>
- An identifier.
+ An identifier.
</dd>
<dt>Traffic control (TC), 3 bits.</dt>
<dd>
- Used for quality of service.
+ Used for quality of service.
</dd>
<dt>Bottom of stack (BOS), 1 bit (labeled just ``S'' above).</dt>
<dd>
- <p>
- 0 indicates that another MPLS label follows this one.
- </p>
-
- <p>
- 1 indicates that this MPLS label is the last one in the
- stack, so that some other protocol follows this one.
- </p>
+ <p>
+ 0 indicates that another MPLS label follows this one.
+ </p>
+
+ <p>
+ 1 indicates that this MPLS label is the last one in the
+ stack, so that some other protocol follows this one.
+ </p>
</dd>
<dt>Time to live (TTL), 8 bits.</dt>
<dd>
- <p>
- Each hop across an MPLS network decrements the TTL by 1. If
- it reaches 0, the packet is discarded.
- </p>
-
- <p>
- OpenFlow does not make the MPLS TTL available as a match field, but
- actions are available to set and decrement the TTL. Open vSwitch 2.6
- and later makes the MPLS TTL available as an extension.
- </p>
+ <p>
+ Each hop across an MPLS network decrements the TTL by 1. If
+ it reaches 0, the packet is discarded.
+ </p>
+
+ <p>
+ OpenFlow does not make the MPLS TTL available as a match field, but
+ actions are available to set and decrement the TTL. Open vSwitch 2.6
+ and later makes the MPLS TTL available as an extension.
+ </p>
</dd>
</dl>
<ul>
<li>
- A few reserved label values do indicate an inner protocol.
- Label 0, the ``IPv4 Explicit NULL Label,'' indicates inner
- IPv4. Label 2, the ``IPv6 Explicit NULL Label,'' indicates
- inner IPv6.
+ A few reserved label values do indicate an inner protocol.
+ Label 0, the ``IPv4 Explicit NULL Label,'' indicates inner
+ IPv4. Label 2, the ``IPv6 Explicit NULL Label,'' indicates
+ inner IPv6.
</li>
<li>
- Some deployments use a single inner protocol consistently.
+ Some deployments use a single inner protocol consistently.
</li>
<li>
- In some deployments, the inner protocol must be inferred from
- the innermost label.
+ In some deployments, the inner protocol must be inferred from
+ the innermost label.
</li>
<li>
- In some deployments, the inner protocol must be inferred from
- the innermost label and the encapsulated data, e.g. to
- distinguish between inner IPv4 and IPv6 based on whether the
- first nibble of the inner protocol data are <code>4</code> or
- <code>6</code>. OpenFlow and Open vSwitch do not currently
- support these cases.
+ In some deployments, the inner protocol must be inferred from
+ the innermost label and the encapsulated data, e.g. to
+ distinguish between inner IPv4 and IPv6 based on whether the
+ first nibble of the inner protocol data are <code>4</code> or
+ <code>6</code>. OpenFlow and Open vSwitch do not currently
+ support these cases.
</li>
</ul>
<field id="MFF_MPLS_LABEL" title="MPLS Label">
<p>
- The least significant 20 bits hold the ``label'' field from
- the MPLS label. Other bits are zero:
+ The least significant 20 bits hold the ``label'' field from
+ the MPLS label. Other bits are zero:
</p>
<diagram>
- <header name="OXM_OF_MPLS_LABEL">
- <bits name="zero" above="12" below="0" width=".6"/>
- <bits name="label" above="20" width="1.0"/>
- </header>
+ <header name="OXM_OF_MPLS_LABEL">
+ <bits name="zero" above="12" below="0" width=".6"/>
+ <bits name="label" above="20" width="1.0"/>
+ </header>
</diagram>
<p>
- Most label values are available for any use by deployments.
- Values under 16 are reserved.
+ Most label values are available for any use by deployments.
+ Values under 16 are reserved.
</p>
</field>
<field id="MFF_MPLS_TC" title="MPLS Traffic Class">
<p>
- The least significant 3 bits hold the TC field from the MPLS
- label. Other bits are zero:
+ The least significant 3 bits hold the TC field from the MPLS
+ label. Other bits are zero:
</p>
<diagram>
- <header name="OXM_OF_MPLS_TC">
- <bits name="zero" above="5" below="0" width="1.0"/>
- <bits name="TC" above="3" width=".6"/>
- </header>
+ <header name="OXM_OF_MPLS_TC">
+ <bits name="zero" above="5" below="0" width="1.0"/>
+ <bits name="TC" above="3" width=".6"/>
+ </header>
</diagram>
<p>
- This field is intended for use for Quality of Service (QoS)
- and Explicit Congestion Notification purposes, but its
- particular interpretation is deployment specific.
+ This field is intended for use for Quality of Service (QoS)
+ and Explicit Congestion Notification purposes, but its
+ particular interpretation is deployment specific.
</p>
<p>
- Before 2009, this field was named EXP and reserved for
- experimental use [RFC 5462].
+ Before 2009, this field was named EXP and reserved for
+ experimental use [RFC 5462].
</p>
</field>
<field id="MFF_MPLS_BOS" title="MPLS Bottom of Stack">
<p>
- The least significant bit holds the BOS field from the MPLS
- label. Other bits are zero:
+ The least significant bit holds the BOS field from the MPLS
+ label. Other bits are zero:
</p>
<diagram>
- <header name="OXM_OF_MPLS_BOS">
- <bits name="zero" above="7" below="0" width="1.3"/>
- <bits name="BOS" above="1" width=".3"/>
- </header>
+ <header name="OXM_OF_MPLS_BOS">
+ <bits name="zero" above="7" below="0" width="1.3"/>
+ <bits name="BOS" above="1" width=".3"/>
+ </header>
</diagram>
<p>
- This field is useful as part of processing a series of incoming MPLS
- labels. A flow that includes a <code>pop_mpls</code> action should
- generally match on <ref field="mpls_bos"/>:
+ This field is useful as part of processing a series of incoming MPLS
+ labels. A flow that includes a <code>pop_mpls</code> action should
+ generally match on <ref field="mpls_bos"/>:
</p>
<ul>
- <li>
- When <ref field="mpls_bos"/> is 1, there is another MPLS label
- following this one, so the Ethertype passed to <code>pop_mpls</code>
- should be an MPLS Ethertype. For example: <code>table=0,
- dl_type=0x8847, mpls_bos=1, actions=pop_mpls:0x8847,
- goto_table:1</code>
- </li>
-
- <li>
- When <ref field="mpls_bos"/> is 0, this MPLS label is the last one,
- so the Ethertype passed to <code>pop_mpls</code> should be a non-MPLS
- Ethertype such as IPv4. For example: <code>table=1, dl_type=0x8847,
- mpls_bos=0, actions=pop_mpls:0x0800, goto_table:2</code>
- </li>
+ <li>
+ When <ref field="mpls_bos"/> is 1, there is another MPLS label
+ following this one, so the Ethertype passed to <code>pop_mpls</code>
+ should be an MPLS Ethertype. For example: <code>table=0,
+ dl_type=0x8847, mpls_bos=1, actions=pop_mpls:0x8847,
+ goto_table:1</code>
+ </li>
+
+ <li>
+ When <ref field="mpls_bos"/> is 0, this MPLS label is the last one,
+ so the Ethertype passed to <code>pop_mpls</code> should be a non-MPLS
+ Ethertype such as IPv4. For example: <code>table=1, dl_type=0x8847,
+ mpls_bos=0, actions=pop_mpls:0x0800, goto_table:2</code>
+ </li>
</ul>
</field>
</p>
<diagram>
- <header name="NXM_NX_MPLS_TTL">
- <bits name="TTL" above="8" width=".4"/>
- </header>
+ <header name="NXM_NX_MPLS_TTL">
+ <bits name="TTL" above="8" width=".4"/>
+ </header>
</diagram>
</field>
</group>
</p>
<diagram>
- <header name="Ethernet">
- <bits name="dst" above="48" width="0.4"/>
- <bits name="src" above="48" width="0.4"/>
- <bits name="type" above="16" below="0x800" width="0.4"/>
- </header>
- <header name="IPv4">
- <bits name="..." width="0.4"/>
- <bits name="proto" above="8" width="0.4"/>
- <bits name="src" above="32" width="0.4" fill="yes"/>
- <bits name="dst" above="32" width="0.4"/>
- </header>
- <dots/>
+ <header name="Ethernet">
+ <bits name="dst" above="48" width="0.4"/>
+ <bits name="src" above="48" width="0.4"/>
+ <bits name="type" above="16" below="0x800" width="0.4"/>
+ </header>
+ <header name="IPv4">
+ <bits name="..." width="0.4"/>
+ <bits name="proto" above="8" width="0.4"/>
+ <bits name="src" above="32" width="0.4" fill="yes"/>
+ <bits name="dst" above="32" width="0.4"/>
+ </header>
+ <dots/>
</diagram>
<p>
</p>
<diagram>
- <header name="Ethernet">
- <bits name="dst" above="48" width="0.4"/>
- <bits name="src" above="48" width="0.4"/>
- <bits name="type" above="16" below="0x800" width="0.4"/>
- </header>
- <header name="IPv4">
- <bits name="..." width="0.4"/>
- <bits name="proto" above="8" width="0.4"/>
- <bits name="src" above="32" width="0.4"/>
- <bits name="dst" above="32" width="0.4" fill="yes"/>
- </header>
- <dots/>
+ <header name="Ethernet">
+ <bits name="dst" above="48" width="0.4"/>
+ <bits name="src" above="48" width="0.4"/>
+ <bits name="type" above="16" below="0x800" width="0.4"/>
+ </header>
+ <header name="IPv4">
+ <bits name="..." width="0.4"/>
+ <bits name="proto" above="8" width="0.4"/>
+ <bits name="src" above="32" width="0.4"/>
+ <bits name="dst" above="32" width="0.4" fill="yes"/>
+ </header>
+ <dots/>
</diagram>
<p>
</p>
<diagram>
- <header name="Ethernet">
- <bits name="dst" above="48" width="0.4"/>
- <bits name="src" above="48" width="0.4"/>
- <bits name="type" above="16" below="0x86dd" width="0.4"/>
- </header>
- <header name="IPv6">
- <bits name="..." width="0.4"/>
- <bits name="next" above="8" width="0.3"/>
- <bits name="src" above="128" width="0.8" fill="yes"/>
- <bits name="dst" above="128" width="0.8"/>
- </header>
- <dots/>
+ <header name="Ethernet">
+ <bits name="dst" above="48" width="0.4"/>
+ <bits name="src" above="48" width="0.4"/>
+ <bits name="type" above="16" below="0x86dd" width="0.4"/>
+ </header>
+ <header name="IPv6">
+ <bits name="..." width="0.4"/>
+ <bits name="next" above="8" width="0.3"/>
+ <bits name="src" above="128" width="0.8" fill="yes"/>
+ <bits name="dst" above="128" width="0.8"/>
+ </header>
+ <dots/>
</diagram>
<p>
The destination address from the IPv6 header:
</p>
<diagram>
- <header name="Ethernet">
- <bits name="dst" above="48" width="0.4"/>
- <bits name="src" above="48" width="0.4"/>
- <bits name="type" above="16" below="0x86dd" width="0.4"/>
- </header>
- <header name="IPv6">
- <bits name="..." width="0.4"/>
- <bits name="next" above="8" width="0.3"/>
- <bits name="src" above="128" width="0.8"/>
- <bits name="dst" above="128" width="0.8" fill="yes"/>
- </header>
- <dots/>
+ <header name="Ethernet">
+ <bits name="dst" above="48" width="0.4"/>
+ <bits name="src" above="48" width="0.4"/>
+ <bits name="type" above="16" below="0x86dd" width="0.4"/>
+ </header>
+ <header name="IPv6">
+ <bits name="..." width="0.4"/>
+ <bits name="next" above="8" width="0.3"/>
+ <bits name="src" above="128" width="0.8"/>
+ <bits name="dst" above="128" width="0.8" fill="yes"/>
+ </header>
+ <dots/>
</diagram>
<p>
</field>
<field id="MFF_IPV6_LABEL" title="IPv6 Flow Label">
<p>
- The least significant 20 bits hold the flow label field from
- the IPv6 header. Other bits are zero:
+ The least significant 20 bits hold the flow label field from
+ the IPv6 header. Other bits are zero:
</p>
<diagram>
- <header name="OXM_OF_IPV6_FLABEL">
- <bits name="zero" above="12" below="0" width=".6"/>
- <bits name="label" above="20" width="1.0"/>
- </header>
+ <header name="OXM_OF_IPV6_FLABEL">
+ <bits name="zero" above="12" below="0" width=".6"/>
+ <bits name="label" above="20" width="1.0"/>
+ </header>
</diagram>
</field>
</p>
<diagram>
- <header name="NXM_NX_IP_FRAG">
- <bits name="zero" above="6" below="0" width=".9"/>
- <bits name="later" above="1" width=".3"/>
- <bits name="any" above="1" width=".3"/>
- </header>
+ <header name="NXM_NX_IP_FRAG">
+ <bits name="zero" above="6" below="0" width=".9"/>
+ <bits name="later" above="1" width=".3"/>
+ <bits name="any" above="1" width=".3"/>
+ </header>
</diagram>
<p>
<diagram>
<header name="type of service">
- <bits name="DSCP" above="6" width=".9"/>
- <bits name="ECN" above="2" width=".3"/>
+ <bits name="DSCP" above="6" width=".9"/>
+ <bits name="ECN" above="2" width=".3"/>
</header>
</diagram>
</p>
<diagram>
- <header name="NXM_OF_IP_TOS">
- <bits name="DSCP" above="6" width=".9"/>
- <bits name="zero" above="2" below="0" width=".3"/>
- </header>
+ <header name="NXM_OF_IP_TOS">
+ <bits name="DSCP" above="6" width=".9"/>
+ <bits name="zero" above="2" below="0" width=".3"/>
+ </header>
</diagram>
</field>
<field id="MFF_IP_DSCP_SHIFTED" title="IPv4/v6 DSCP (Bits 0-5)">
</p>
<diagram>
- <header name="OXM_OF_IP_DSCP">
- <bits name="zero" above="2" below="0" width=".3"/>
- <bits name="DSCP" above="6" width=".9"/>
- </header>
+ <header name="OXM_OF_IP_DSCP">
+ <bits name="zero" above="2" below="0" width=".3"/>
+ <bits name="DSCP" above="6" width=".9"/>
+ </header>
</diagram>
</field>
<field id="MFF_IP_ECN" title="IPv4/v6 ECN">
</p>
<diagram>
- <header name="OXM_OF_IP_ECN">
- <bits name="zero" above="6" below="0" width=".9"/>
- <bits name="ECN" above="2" width=".35"/>
- </header>
+ <header name="OXM_OF_IP_ECN">
+ <bits name="zero" above="6" below="0" width=".9"/>
+ <bits name="ECN" above="2" width=".35"/>
+ </header>
</diagram>
</field>
<diagram>
<header name="Ethernet">
- <bits name="dst" above="48" width="0.4"/>
- <bits name="src" above="48" width="0.4"/>
- <bits name="type" above="16" below="0x806" width="0.4"/>
+ <bits name="dst" above="48" width="0.4"/>
+ <bits name="src" above="48" width="0.4"/>
+ <bits name="type" above="16" below="0x806" width="0.4"/>
</header>
<header name="ARP">
- <bits name="hrd" above="16" below="1" width=".3"/>
- <bits name="pro" above="16" below="0x800" width=".3"/>
- <bits name="hln" above="8" below="6" width=".2"/>
- <bits name="pln" above="8" below="4" width=".2"/>
- <bits name="op" above="16" width=".2" fill="yes"/>
- <bits name="sha" above="48" width="0.5" fill="yes"/>
- <bits name="spa" above="16" width="0.3" fill="yes"/>
- <bits name="tha" above="48" width="0.5" fill="yes"/>
- <bits name="tpa" above="16" width="0.3" fill="yes"/>
+ <bits name="hrd" above="16" below="1" width=".3"/>
+ <bits name="pro" above="16" below="0x800" width=".3"/>
+ <bits name="hln" above="8" below="6" width=".2"/>
+ <bits name="pln" above="8" below="4" width=".2"/>
+ <bits name="op" above="16" width=".2" fill="yes"/>
+ <bits name="sha" above="48" width="0.5" fill="yes"/>
+ <bits name="spa" above="16" width="0.3" fill="yes"/>
+ <bits name="tha" above="48" width="0.5" fill="yes"/>
+ <bits name="tpa" above="16" width="0.3" fill="yes"/>
</header>
</diagram>
<diagram>
<header name="Ethernet">
- <bits name="dst" above="48" width="0.4"/>
- <bits name="src" above="48" width="0.4"/>
- <bits name="type" above="16" below="0x800" width="0.4"/>
+ <bits name="dst" above="48" width="0.4"/>
+ <bits name="src" above="48" width="0.4"/>
+ <bits name="type" above="16" below="0x800" width="0.4"/>
</header>
<header name="IPv4">
- <bits name="..." width="0.4"/>
- <bits name="proto" above="8" below="6" width="0.3"/>
- <bits name="src" above="32" width="0.4"/>
- <bits name="dst" above="32" width="0.4"/>
+ <bits name="..." width="0.4"/>
+ <bits name="proto" above="8" below="6" width="0.3"/>
+ <bits name="src" above="32" width="0.4"/>
+ <bits name="dst" above="32" width="0.4"/>
</header>
<header name="TCP">
- <bits name="src" above="16" width=".2"/>
- <bits name="dst" above="16" width=".2"/>
- <bits name="..." width=".75"/>
- <bits name="flags" above="12" width=".3"/>
- <bits name="..." width=".6"/>
+ <bits name="src" above="16" width=".2"/>
+ <bits name="dst" above="16" width=".2"/>
+ <bits name="..." width=".75"/>
+ <bits name="flags" above="12" width=".3"/>
+ <bits name="..." width=".6"/>
</header>
<dots/>
</diagram>
</p>
<diagram>
- <header>
- <bits name="zero" above="4" below="0" width=".9"/>
- </header>
- <nospace/>
- <header name="reserved">
- <bits name="[800]" above="1" width=".35"/>
- <bits name="[400]" above="1" width=".35"/>
- <bits name="[200]" above="1" width=".35"/>
- </header>
- <nospace/>
- <header name="later RFCs">
- <bits name="NS" above="1" width=".35"/>
- <bits name="CWR" above="1" width=".35"/>
- <bits name="ECE" above="1" width=".35"/>
- </header>
- <nospace/>
- <header name="RFC 793">
- <bits name="URG" above="1" width=".35"/>
- <bits name="ACK" above="1" width=".35"/>
- <bits name="PSH" above="1" width=".35"/>
- <bits name="RST" above="1" width=".35"/>
- <bits name="SYN" above="1" width=".35"/>
- <bits name="FIN" above="1" width=".35"/>
- </header>
+ <header>
+ <bits name="zero" above="4" below="0" width=".9"/>
+ </header>
+ <nospace/>
+ <header name="reserved">
+ <bits name="[800]" above="1" width=".35"/>
+ <bits name="[400]" above="1" width=".35"/>
+ <bits name="[200]" above="1" width=".35"/>
+ </header>
+ <nospace/>
+ <header name="later RFCs">
+ <bits name="NS" above="1" width=".35"/>
+ <bits name="CWR" above="1" width=".35"/>
+ <bits name="ECE" above="1" width=".35"/>
+ </header>
+ <nospace/>
+ <header name="RFC 793">
+ <bits name="URG" above="1" width=".35"/>
+ <bits name="ACK" above="1" width=".35"/>
+ <bits name="PSH" above="1" width=".35"/>
+ <bits name="RST" above="1" width=".35"/>
+ <bits name="SYN" above="1" width=".35"/>
+ <bits name="FIN" above="1" width=".35"/>
+ </header>
</diagram>
</field>
<diagram>
<header name="Ethernet">
- <bits name="dst" above="48" width="0.4"/>
- <bits name="src" above="48" width="0.4"/>
- <bits name="type" above="16" below="0x800" width="0.4"/>
+ <bits name="dst" above="48" width="0.4"/>
+ <bits name="src" above="48" width="0.4"/>
+ <bits name="type" above="16" below="0x800" width="0.4"/>
</header>
<header name="IPv4">
- <bits name="..." width="0.4"/>
- <bits name="proto" above="8" below="17" width="0.3"/>
- <bits name="src" above="32" width="0.4"/>
- <bits name="dst" above="32" width="0.4"/>
+ <bits name="..." width="0.4"/>
+ <bits name="proto" above="8" below="17" width="0.3"/>
+ <bits name="src" above="32" width="0.4"/>
+ <bits name="dst" above="32" width="0.4"/>
</header>
<header name="UDP">
- <bits name="src" above="16" width=".2"/>
- <bits name="dst" above="16" width=".2"/>
- <bits name="..." width=".4"/>
+ <bits name="src" above="16" width=".2"/>
+ <bits name="dst" above="16" width=".2"/>
+ <bits name="..." width=".4"/>
</header>
<dots/>
</diagram>
<diagram>
<header name="Ethernet">
- <bits name="dst" above="48" width="0.4"/>
- <bits name="src" above="48" width="0.4"/>
- <bits name="type" above="16" below="0x800" width="0.4"/>
+ <bits name="dst" above="48" width="0.4"/>
+ <bits name="src" above="48" width="0.4"/>
+ <bits name="type" above="16" below="0x800" width="0.4"/>
</header>
<header name="IPv4">
- <bits name="..." width="0.4"/>
- <bits name="proto" above="8" below="132" width="0.3"/>
- <bits name="src" above="32" width="0.4"/>
- <bits name="dst" above="32" width="0.4"/>
+ <bits name="..." width="0.4"/>
+ <bits name="proto" above="8" below="132" width="0.3"/>
+ <bits name="src" above="32" width="0.4"/>
+ <bits name="dst" above="32" width="0.4"/>
</header>
<header name="SCTP">
- <bits name="src" above="16" width=".2"/>
- <bits name="dst" above="16" width=".2"/>
- <bits name="..." width=".8"/>
+ <bits name="src" above="16" width=".2"/>
+ <bits name="dst" above="16" width=".2"/>
+ <bits name="..." width=".8"/>
</header>
<dots/>
</diagram>
<h2>ICMPv4</h2>
<diagram>
<header name="Ethernet">
- <bits name="dst" above="48" width="0.4"/>
- <bits name="src" above="48" width="0.4"/>
- <bits name="type" above="16" below="0x800" width="0.4"/>
+ <bits name="dst" above="48" width="0.4"/>
+ <bits name="src" above="48" width="0.4"/>
+ <bits name="type" above="16" below="0x800" width="0.4"/>
</header>
<header name="IPv4">
- <bits name="..." width="0.4"/>
- <bits name="proto" above="8" below="1" width="0.3"/>
- <bits name="src" above="32" width="0.4"/>
- <bits name="dst" above="32" width="0.4"/>
+ <bits name="..." width="0.4"/>
+ <bits name="proto" above="8" below="1" width="0.3"/>
+ <bits name="src" above="32" width="0.4"/>
+ <bits name="dst" above="32" width="0.4"/>
</header>
<header name="ICMPv4">
- <bits name="type" above="8" width=".3"/>
- <bits name="code" above="8" width=".3"/>
- <bits name="..." width=".8"/>
+ <bits name="type" above="8" width=".3"/>
+ <bits name="code" above="8" width=".3"/>
+ <bits name="..." width=".8"/>
</header>
<dots/>
</diagram>
<h2>ICMPv6</h2>
<diagram>
<header name="Ethernet">
- <bits name="dst" above="48" width="0.4"/>
- <bits name="src" above="48" width="0.4"/>
- <bits name="type" above="16" below="0x86dd" width="0.4"/>
+ <bits name="dst" above="48" width="0.4"/>
+ <bits name="src" above="48" width="0.4"/>
+ <bits name="type" above="16" below="0x86dd" width="0.4"/>
</header>
<header name="IPv6">
- <bits name="..." width="0.2"/>
- <bits name="next" above="8" below="58" width="0.3"/>
- <bits name="src" above="128" width="0.4"/>
- <bits name="dst" above="128" width="0.4"/>
+ <bits name="..." width="0.2"/>
+ <bits name="next" above="8" below="58" width="0.3"/>
+ <bits name="src" above="128" width="0.4"/>
+ <bits name="dst" above="128" width="0.4"/>
</header>
<header name="ICMPv6">
- <bits name="type" above="8" width=".3"/>
- <bits name="code" above="8" width=".3"/>
- <bits name="..." width=".8"/>
+ <bits name="type" above="8" width=".3"/>
+ <bits name="code" above="8" width=".3"/>
+ <bits name="..." width=".8"/>
</header>
<dots/>
</diagram>
<h2>ICMPv6 Neighbor Discovery</h2>
<diagram>
<header name="Ethernet">
- <bits name="dst" above="48" width="0.4"/>
- <bits name="src" above="48" width="0.4"/>
- <bits name="type" above="16" below="0x86dd" width="0.4"/>
+ <bits name="dst" above="48" width="0.4"/>
+ <bits name="src" above="48" width="0.4"/>
+ <bits name="type" above="16" below="0x86dd" width="0.4"/>
</header>
<header name="IPv6">
- <bits name="..." width="0.2"/>
- <bits name="next" above="8" below="58" width="0.3"/>
- <bits name="src" above="128" width="0.4"/>
- <bits name="dst" above="128" width="0.4"/>
+ <bits name="..." width="0.2"/>
+ <bits name="next" above="8" below="58" width="0.3"/>
+ <bits name="src" above="128" width="0.4"/>
+ <bits name="dst" above="128" width="0.4"/>
</header>
<header name="ICMPv6">
- <bits name="type" above="8" below="135/136" width=".3"/>
- <bits name="code" above="8" below="0" width=".3"/>
- <bits name="..." width=".8"/>
+ <bits name="type" above="8" below="135/136" width=".3"/>
+ <bits name="code" above="8" below="0" width=".3"/>
+ <bits name="..." width=".8"/>
</header>
<header name="ICMPv6 ND">
- <bits name="target" above="128" width=".4"/>
- <bits name="option ..." width=".6"/>
+ <bits name="target" above="128" width=".4"/>
+ <bits name="option ..." width=".6"/>
</header>
</diagram>
<field id="MFF_ND_TARGET" title="ICMPv6 Neighbor Discovery Target IPv6"/>
<field id="MFF_ND_SLL"
- title="ICMPv6 Neighbor Discovery Source Ethernet Address"/>
+ title="ICMPv6 Neighbor Discovery Source Ethernet Address"/>
<field id="MFF_ND_TLL"
- title="ICMPv6 Neighbor Discovery Target Ethernet Address"/>
+ title="ICMPv6 Neighbor Discovery Target Ethernet Address"/>
</group>
<h1>References</h1>
struct ofputil_tlv_map *map;
ds_put_cstr(s, " mapping table:\n");
- ds_put_cstr(s, " class\ttype\tlength\tmatch field\n");
- ds_put_cstr(s, " -----\t----\t------\t-----------");
+ ds_put_cstr(s, " class type length match field\n");
+ ds_put_cstr(s, " ------ ---- ------ --------------");
LIST_FOR_EACH (map, list_node, mappings) {
- ds_put_char(s, '\n');
- ds_put_format(s, " 0x%"PRIx16"\t0x%"PRIx8"\t%"PRIu8"\ttun_metadata%"PRIu16,
+ ds_put_format(s, "\n %#6"PRIx16" %#4"PRIx8" %6"PRIu8" "
+ "tun_metadata%"PRIu16,
map->option_class, map->option_type, map->option_len,
map->index);
}
data_tunnel->tunnel_key_length = tunnel_port->tunnel_key_length;
/* tun_id is in network order, and tunnel key is in low bits. */
tun_id = (const uint8_t *) &tunnel_key->tun_id;
- memcpy(data_tunnel->tunnel_key,
+ memcpy(data_tunnel->tunnel_key,
&tun_id[8 - tunnel_port->tunnel_key_length],
tunnel_port->tunnel_key_length);
}
/* Include LACP counters and identifiers if this port is part of a LAG. */
if (ofproto_port_get_lacp_stats(dsp->ofport, &lacp_stats) == 0) {
- memset(&lacp_elem, 0, sizeof lacp_elem);
- lacp_elem.tag = SFLCOUNTERS_LACP;
- lacp_elem.counterBlock.lacp.actorSystemID =
+ memset(&lacp_elem, 0, sizeof lacp_elem);
+ lacp_elem.tag = SFLCOUNTERS_LACP;
+ lacp_elem.counterBlock.lacp.actorSystemID =
lacp_stats.dot3adAggPortActorSystemID;
- lacp_elem.counterBlock.lacp.partnerSystemID =
+ lacp_elem.counterBlock.lacp.partnerSystemID =
lacp_stats.dot3adAggPortPartnerOperSystemID;
- lacp_elem.counterBlock.lacp.attachedAggID =
- lacp_stats.dot3adAggPortAttachedAggID;
- lacp_elem.counterBlock.lacp.portState.v.actorAdmin =
- lacp_stats.dot3adAggPortActorAdminState;
- lacp_elem.counterBlock.lacp.portState.v.actorOper =
- lacp_stats.dot3adAggPortActorOperState;
- lacp_elem.counterBlock.lacp.portState.v.partnerAdmin =
- lacp_stats.dot3adAggPortPartnerAdminState;
- lacp_elem.counterBlock.lacp.portState.v.partnerOper =
- lacp_stats.dot3adAggPortPartnerOperState;
- lacp_elem.counterBlock.lacp.LACPDUsRx =
- lacp_stats.dot3adAggPortStatsLACPDUsRx;
- SFL_UNDEF_COUNTER(lacp_elem.counterBlock.lacp.markerPDUsRx);
- SFL_UNDEF_COUNTER(lacp_elem.counterBlock.lacp.markerResponsePDUsRx);
- SFL_UNDEF_COUNTER(lacp_elem.counterBlock.lacp.unknownRx);
- lacp_elem.counterBlock.lacp.illegalRx =
- lacp_stats.dot3adAggPortStatsIllegalRx;
- lacp_elem.counterBlock.lacp.LACPDUsTx =
- lacp_stats.dot3adAggPortStatsLACPDUsTx;
- SFL_UNDEF_COUNTER(lacp_elem.counterBlock.lacp.markerPDUsTx);
- SFL_UNDEF_COUNTER(lacp_elem.counterBlock.lacp.markerResponsePDUsTx);
- SFLADD_ELEMENT(cs, &lacp_elem);
+ lacp_elem.counterBlock.lacp.attachedAggID =
+ lacp_stats.dot3adAggPortAttachedAggID;
+ lacp_elem.counterBlock.lacp.portState.v.actorAdmin =
+ lacp_stats.dot3adAggPortActorAdminState;
+ lacp_elem.counterBlock.lacp.portState.v.actorOper =
+ lacp_stats.dot3adAggPortActorOperState;
+ lacp_elem.counterBlock.lacp.portState.v.partnerAdmin =
+ lacp_stats.dot3adAggPortPartnerAdminState;
+ lacp_elem.counterBlock.lacp.portState.v.partnerOper =
+ lacp_stats.dot3adAggPortPartnerOperState;
+ lacp_elem.counterBlock.lacp.LACPDUsRx =
+ lacp_stats.dot3adAggPortStatsLACPDUsRx;
+ SFL_UNDEF_COUNTER(lacp_elem.counterBlock.lacp.markerPDUsRx);
+ SFL_UNDEF_COUNTER(lacp_elem.counterBlock.lacp.markerResponsePDUsRx);
+ SFL_UNDEF_COUNTER(lacp_elem.counterBlock.lacp.unknownRx);
+ lacp_elem.counterBlock.lacp.illegalRx =
+ lacp_stats.dot3adAggPortStatsIllegalRx;
+ lacp_elem.counterBlock.lacp.LACPDUsTx =
+ lacp_stats.dot3adAggPortStatsLACPDUsTx;
+ SFL_UNDEF_COUNTER(lacp_elem.counterBlock.lacp.markerPDUsTx);
+ SFL_UNDEF_COUNTER(lacp_elem.counterBlock.lacp.markerResponsePDUsTx);
+ SFLADD_ELEMENT(cs, &lacp_elem);
}
/* Include Port name. */
if ((ifName = netdev_get_name(dsp->ofport->netdev)) != NULL) {
- memset(&name_elem, 0, sizeof name_elem);
- name_elem.tag = SFLCOUNTERS_PORTNAME;
- name_elem.counterBlock.portName.portName.str = (char *)ifName;
- name_elem.counterBlock.portName.portName.len = strlen(ifName);
- SFLADD_ELEMENT(cs, &name_elem);
+ memset(&name_elem, 0, sizeof name_elem);
+ name_elem.tag = SFLCOUNTERS_PORTNAME;
+ name_elem.counterBlock.portName.portName.str = (char *)ifName;
+ name_elem.counterBlock.portName.portName.len = strlen(ifName);
+ SFLADD_ELEMENT(cs, &name_elem);
}
/* Include OpenFlow DPID and openflow port number. */
memset(&of_elem, 0, sizeof of_elem);
of_elem.tag = SFLCOUNTERS_OPENFLOWPORT;
of_elem.counterBlock.ofPort.datapath_id =
- ofproto_get_datapath_id(dsp->ofport->ofproto);
+ ofproto_get_datapath_id(dsp->ofport->ofproto);
of_elem.counterBlock.ofPort.port_no =
(OVS_FORCE uint32_t)dsp->ofport->ofp_port;
SFLADD_ELEMENT(cs, &of_elem);
dpif_sflow_tunnel_type(struct ofport *ofport) {
const char *type = netdev_get_type(ofport->netdev);
if (type) {
- if (strcmp(type, "gre") == 0) {
- return DPIF_SFLOW_TUNNEL_GRE;
- } else if (strcmp(type, "vxlan") == 0) {
- return DPIF_SFLOW_TUNNEL_VXLAN;
- } else if (strcmp(type, "lisp") == 0) {
- return DPIF_SFLOW_TUNNEL_LISP;
- } else if (strcmp(type, "geneve") == 0) {
- return DPIF_SFLOW_TUNNEL_GENEVE;
- }
+ if (strcmp(type, "gre") == 0) {
+ return DPIF_SFLOW_TUNNEL_GRE;
+ } else if (strcmp(type, "vxlan") == 0) {
+ return DPIF_SFLOW_TUNNEL_VXLAN;
+ } else if (strcmp(type, "lisp") == 0) {
+ return DPIF_SFLOW_TUNNEL_LISP;
+ } else if (strcmp(type, "geneve") == 0) {
+ return DPIF_SFLOW_TUNNEL_GENEVE;
+ }
}
return DPIF_SFLOW_TUNNEL_UNKNOWN;
}
ifindex = netdev_get_ifindex(ofport->netdev);
if (ifindex <= 0
- && tunnel_type == DPIF_SFLOW_TUNNEL_UNKNOWN) {
+ && tunnel_type == DPIF_SFLOW_TUNNEL_UNKNOWN) {
/* Not an ifindex port, and not a tunnel port either
- * so do not add a cross-reference to it here.
- */
+ * so do not add a cross-reference to it here.
+ */
goto out;
}
hmap_insert(&ds->ports, &dsp->hmap_node, hash_odp_port(odp_port));
if (ifindex > 0) {
- /* Add poller for ports that have ifindex. */
- SFL_DS_SET(dsp->dsi, SFL_DSCLASS_IFINDEX, ifindex, 0);
- if (ds->sflow_agent) {
- dpif_sflow_add_poller(ds, dsp);
- }
+ /* Add poller for ports that have ifindex. */
+ SFL_DS_SET(dsp->dsi, SFL_DSCLASS_IFINDEX, ifindex, 0);
+ if (ds->sflow_agent) {
+ dpif_sflow_add_poller(ds, dsp);
+ }
} else {
- /* Record "ifindex unknown" for the others */
- SFL_DS_SET(dsp->dsi, SFL_DSCLASS_IFINDEX, 0, 0);
+ /* Record "ifindex unknown" for the others */
+ SFL_DS_SET(dsp->dsi, SFL_DSCLASS_IFINDEX, 0, 0);
}
out:
OVS_REQUIRES(mutex)
{
if (ds->sflow_agent
- && SFL_DS_INDEX(dsp->dsi)) {
- sfl_agent_removePoller(ds->sflow_agent, &dsp->dsi);
- sfl_agent_removeSampler(ds->sflow_agent, &dsp->dsi);
+ && SFL_DS_INDEX(dsp->dsi)) {
+ sfl_agent_removePoller(ds->sflow_agent, &dsp->dsi);
+ sfl_agent_removeSampler(ds->sflow_agent, &dsp->dsi);
}
hmap_remove(&ds->ports, &dsp->hmap_node);
free(dsp);
HMAP_FOR_EACH (dsp, hmap_node, &ds->ports) {
if (SFL_DS_INDEX(dsp->dsi)) {
dpif_sflow_add_poller(ds, dsp);
- }
+ }
}
ovs_be32 lse)
{
if (sflow_actions->mpls_stack_depth >= FLOW_MAX_MPLS_LABELS) {
- sflow_actions->mpls_err = true;
- return;
+ sflow_actions->mpls_err = true;
+ return;
}
/* Record the new lse in host-byte-order. */
dpif_sflow_pop_mpls_lse(struct dpif_sflow_actions *sflow_actions)
{
if (sflow_actions->mpls_stack_depth == 0) {
- sflow_actions->mpls_err = true;
- return;
+ sflow_actions->mpls_err = true;
+ return;
}
sflow_actions->mpls_stack_depth--;
}
static void
dpif_sflow_set_mpls(struct dpif_sflow_actions *sflow_actions,
- const struct ovs_key_mpls *mpls_key, int n)
+ const struct ovs_key_mpls *mpls_key, int n)
{
int ii;
if (n > FLOW_MAX_MPLS_LABELS) {
- sflow_actions->mpls_err = true;
- return;
+ sflow_actions->mpls_err = true;
+ return;
}
for (ii = 0; ii < n; ii++) {
- /* Reverse stack order, and use host-byte-order for each lse. */
- sflow_actions->mpls_lse[n - ii - 1] = ntohl(mpls_key[ii].mpls_lse);
+ /* Reverse stack order, and use host-byte-order for each lse. */
+ sflow_actions->mpls_lse[n - ii - 1] = ntohl(mpls_key[ii].mpls_lse);
}
sflow_actions->mpls_stack_depth = n;
}
unsigned int left;
if (actions_len == 0) {
- /* Packet dropped.*/
- return;
+ /* Packet dropped.*/
+ return;
}
if (flow != NULL && capture_mpls == true) {
- /* Make sure the MPLS output stack
- * is seeded with the input stack.
- */
- dpif_sflow_capture_input_mpls(flow, sflow_actions);
-
- /* XXX when 802.1AD(QinQ) is supported then
- * we can do the same with VLAN stacks here
- */
+ /* Make sure the MPLS output stack
+ * is seeded with the input stack.
+ */
+ dpif_sflow_capture_input_mpls(flow, sflow_actions);
+
+ /* XXX when 802.1AD(QinQ) is supported then
+ * we can do the same with VLAN stacks here
+ */
}
NL_ATTR_FOR_EACH (a, left, actions, actions_len) {
- enum ovs_action_attr type = nl_attr_type(a);
- switch (type) {
- case OVS_ACTION_ATTR_OUTPUT:
- /* Capture the output port in case we need it
- * to get the output tunnel type.
- */
- sflow_actions->out_port = nl_attr_get_odp_port(a);
- break;
-
- case OVS_ACTION_ATTR_TUNNEL_POP:
- /* XXX: Do not handle this for now. It's not clear
- * if we should start with encap_depth == 1 when we
- * see an input tunnel, or if we should assume
- * that the input tunnel was always "popped" if it
- * was presented to us decoded in flow->tunnel?
- *
- * If we do handle this it might look like this,
- * as we clear the captured tunnel info and decrement
- * the encap_depth:
- *
- * memset(&sflow_actions->tunnel, 0, sizeof struct flow_tnl);
- * sflow_actions->tunnel_ipproto = 0;
- * --sflow_actions->encap_depth;
- *
- * but for now just disable the tunnel annotation:
- */
- sflow_actions->tunnel_err = true;
- break;
-
- case OVS_ACTION_ATTR_TUNNEL_PUSH:
- /* XXX: This actions appears to come with it's own
- * OUTPUT action, so should it be regarded as having
- * an implicit "pop" following it too? Put another
- * way, would two tnl_push() actions in succession
- * result in a packet with two layers of encap?
- */
- if (++sflow_actions->encap_depth > 1) {
- /* Do not handle multi-encap for now. */
- sflow_actions->tunnel_err = true;
- } else {
- sflow_read_tnl_push_action(a, sflow_actions);
- }
- break;
-
- case OVS_ACTION_ATTR_TRUNC:
- case OVS_ACTION_ATTR_USERSPACE:
- case OVS_ACTION_ATTR_RECIRC:
- case OVS_ACTION_ATTR_HASH:
+ enum ovs_action_attr type = nl_attr_type(a);
+ switch (type) {
+ case OVS_ACTION_ATTR_OUTPUT:
+ /* Capture the output port in case we need it
+ * to get the output tunnel type.
+ */
+ sflow_actions->out_port = nl_attr_get_odp_port(a);
+ break;
+
+ case OVS_ACTION_ATTR_TUNNEL_POP:
+ /* XXX: Do not handle this for now. It's not clear
+ * if we should start with encap_depth == 1 when we
+ * see an input tunnel, or if we should assume
+ * that the input tunnel was always "popped" if it
+ * was presented to us decoded in flow->tunnel?
+ *
+ * If we do handle this it might look like this,
+ * as we clear the captured tunnel info and decrement
+ * the encap_depth:
+ *
+ * memset(&sflow_actions->tunnel, 0, sizeof struct flow_tnl);
+ * sflow_actions->tunnel_ipproto = 0;
+ * --sflow_actions->encap_depth;
+ *
+ * but for now just disable the tunnel annotation:
+ */
+ sflow_actions->tunnel_err = true;
+ break;
+
+ case OVS_ACTION_ATTR_TUNNEL_PUSH:
+ /* XXX: This actions appears to come with it's own
+ * OUTPUT action, so should it be regarded as having
+ * an implicit "pop" following it too? Put another
+ * way, would two tnl_push() actions in succession
+ * result in a packet with two layers of encap?
+ */
+ if (++sflow_actions->encap_depth > 1) {
+ /* Do not handle multi-encap for now. */
+ sflow_actions->tunnel_err = true;
+ } else {
+ sflow_read_tnl_push_action(a, sflow_actions);
+ }
+ break;
+
+ case OVS_ACTION_ATTR_TRUNC:
+ case OVS_ACTION_ATTR_USERSPACE:
+ case OVS_ACTION_ATTR_RECIRC:
+ case OVS_ACTION_ATTR_HASH:
case OVS_ACTION_ATTR_CT:
case OVS_ACTION_ATTR_CT_CLEAR:
case OVS_ACTION_ATTR_METER:
- break;
-
- case OVS_ACTION_ATTR_SET_MASKED:
- /* TODO: apply mask. XXX: Are we likely to see this? */
- break;
-
- case OVS_ACTION_ATTR_SET:
- sflow_read_set_action(nl_attr_get(a), sflow_actions);
- break;
-
- case OVS_ACTION_ATTR_PUSH_VLAN:
- case OVS_ACTION_ATTR_POP_VLAN:
- /* TODO: 802.1AD(QinQ) is not supported by OVS (yet), so do not
- * construct a VLAN-stack. The sFlow user-action cookie already
- * captures the egress VLAN ID so there is nothing more to do here.
- */
- break;
-
- case OVS_ACTION_ATTR_PUSH_MPLS: {
- const struct ovs_action_push_mpls *mpls = nl_attr_get(a);
- if (mpls) {
- dpif_sflow_push_mpls_lse(sflow_actions, mpls->mpls_lse);
- }
- break;
- }
- case OVS_ACTION_ATTR_POP_MPLS: {
- dpif_sflow_pop_mpls_lse(sflow_actions);
- break;
- }
- case OVS_ACTION_ATTR_PUSH_ETH:
- case OVS_ACTION_ATTR_POP_ETH:
- /* TODO: SFlow does not currently define a MAC-in-MAC
- * encapsulation structure. We could use an extension
- * structure to report this.
- */
- break;
+ break;
+
+ case OVS_ACTION_ATTR_SET_MASKED:
+ /* TODO: apply mask. XXX: Are we likely to see this? */
+ break;
+
+ case OVS_ACTION_ATTR_SET:
+ sflow_read_set_action(nl_attr_get(a), sflow_actions);
+ break;
+
+ case OVS_ACTION_ATTR_PUSH_VLAN:
+ case OVS_ACTION_ATTR_POP_VLAN:
+ /* TODO: 802.1AD(QinQ) is not supported by OVS (yet), so do not
+ * construct a VLAN-stack. The sFlow user-action cookie already
+ * captures the egress VLAN ID so there is nothing more to do here.
+ */
+ break;
+
+ case OVS_ACTION_ATTR_PUSH_MPLS: {
+ const struct ovs_action_push_mpls *mpls = nl_attr_get(a);
+ if (mpls) {
+ dpif_sflow_push_mpls_lse(sflow_actions, mpls->mpls_lse);
+ }
+ break;
+ }
+ case OVS_ACTION_ATTR_POP_MPLS: {
+ dpif_sflow_pop_mpls_lse(sflow_actions);
+ break;
+ }
+ case OVS_ACTION_ATTR_PUSH_ETH:
+ case OVS_ACTION_ATTR_POP_ETH:
+ /* TODO: SFlow does not currently define a MAC-in-MAC
+ * encapsulation structure. We could use an extension
+ * structure to report this.
+ */
+ break;
case OVS_ACTION_ATTR_CLONE:
if (flow != NULL) {
dpif_sflow_read_actions(flow, nl_attr_get(a), nl_attr_get_size(a),
sflow_actions, false);
}
break;
- case OVS_ACTION_ATTR_SAMPLE:
+ case OVS_ACTION_ATTR_SAMPLE:
case OVS_ACTION_ATTR_PUSH_NSH:
case OVS_ACTION_ATTR_POP_NSH:
- case OVS_ACTION_ATTR_UNSPEC:
- case __OVS_ACTION_ATTR_MAX:
- default:
- break;
- }
+ case OVS_ACTION_ATTR_UNSPEC:
+ case __OVS_ACTION_ATTR_MAX:
+ default:
+ break;
+ }
}
}
/* Input tunnel. */
if (flow->tunnel.ip_dst) {
- memset(&tnlInElem, 0, sizeof(tnlInElem));
- tnlInElem.tag = SFLFLOW_EX_IPV4_TUNNEL_INGRESS;
- tnlInProto = in_dsp ? dpif_sflow_tunnel_proto(in_dsp->tunnel_type) : 0;
- dpif_sflow_tunnel_v4(tnlInProto,
- &flow->tunnel,
- &tnlInElem.flowType.ipv4);
- SFLADD_ELEMENT(&fs, &tnlInElem);
- if (flow->tunnel.tun_id) {
- memset(&vniInElem, 0, sizeof(vniInElem));
- vniInElem.tag = SFLFLOW_EX_VNI_INGRESS;
- vniInElem.flowType.tunnel_vni.vni
- = ntohll(flow->tunnel.tun_id);
- SFLADD_ELEMENT(&fs, &vniInElem);
- }
+ memset(&tnlInElem, 0, sizeof(tnlInElem));
+ tnlInElem.tag = SFLFLOW_EX_IPV4_TUNNEL_INGRESS;
+ tnlInProto = in_dsp ? dpif_sflow_tunnel_proto(in_dsp->tunnel_type) : 0;
+ dpif_sflow_tunnel_v4(tnlInProto,
+ &flow->tunnel,
+ &tnlInElem.flowType.ipv4);
+ SFLADD_ELEMENT(&fs, &tnlInElem);
+ if (flow->tunnel.tun_id) {
+ memset(&vniInElem, 0, sizeof(vniInElem));
+ vniInElem.tag = SFLFLOW_EX_VNI_INGRESS;
+ vniInElem.flowType.tunnel_vni.vni
+ = ntohll(flow->tunnel.tun_id);
+ SFLADD_ELEMENT(&fs, &vniInElem);
+ }
}
/* Output tunnel. */
if (sflow_actions
- && sflow_actions->encap_depth == 1
- && !sflow_actions->tunnel_err
- && dpif_sflow_cookie_num_outputs(cookie) == 1) {
- tnlOutProto = sflow_actions->tunnel_ipproto;
- if (tnlOutProto == 0) {
- /* Try to infer the ip-protocol from the output port. */
- if (sflow_actions->out_port != ODPP_NONE) {
- out_dsp = dpif_sflow_find_port(ds, sflow_actions->out_port);
- if (out_dsp) {
- tnlOutProto = dpif_sflow_tunnel_proto(out_dsp->tunnel_type);
- }
- }
- }
- memset(&tnlOutElem, 0, sizeof(tnlOutElem));
- tnlOutElem.tag = SFLFLOW_EX_IPV4_TUNNEL_EGRESS;
- dpif_sflow_tunnel_v4(tnlOutProto,
- &sflow_actions->tunnel,
- &tnlOutElem.flowType.ipv4);
- SFLADD_ELEMENT(&fs, &tnlOutElem);
- if (sflow_actions->tunnel.tun_id) {
- memset(&vniOutElem, 0, sizeof(vniOutElem));
- vniOutElem.tag = SFLFLOW_EX_VNI_EGRESS;
- vniOutElem.flowType.tunnel_vni.vni
- = ntohll(sflow_actions->tunnel.tun_id);
- SFLADD_ELEMENT(&fs, &vniOutElem);
- }
+ && sflow_actions->encap_depth == 1
+ && !sflow_actions->tunnel_err
+ && dpif_sflow_cookie_num_outputs(cookie) == 1) {
+ tnlOutProto = sflow_actions->tunnel_ipproto;
+ if (tnlOutProto == 0) {
+ /* Try to infer the ip-protocol from the output port. */
+ if (sflow_actions->out_port != ODPP_NONE) {
+ out_dsp = dpif_sflow_find_port(ds, sflow_actions->out_port);
+ if (out_dsp) {
+ tnlOutProto = dpif_sflow_tunnel_proto(out_dsp->tunnel_type);
+ }
+ }
+ }
+ memset(&tnlOutElem, 0, sizeof(tnlOutElem));
+ tnlOutElem.tag = SFLFLOW_EX_IPV4_TUNNEL_EGRESS;
+ dpif_sflow_tunnel_v4(tnlOutProto,
+ &sflow_actions->tunnel,
+ &tnlOutElem.flowType.ipv4);
+ SFLADD_ELEMENT(&fs, &tnlOutElem);
+ if (sflow_actions->tunnel.tun_id) {
+ memset(&vniOutElem, 0, sizeof(vniOutElem));
+ vniOutElem.tag = SFLFLOW_EX_VNI_EGRESS;
+ vniOutElem.flowType.tunnel_vni.vni
+ = ntohll(sflow_actions->tunnel.tun_id);
+ SFLADD_ELEMENT(&fs, &vniOutElem);
+ }
}
/* MPLS output label stack. */
if (sflow_actions
- && sflow_actions->mpls_stack_depth > 0
- && !sflow_actions->mpls_err
- && dpif_sflow_cookie_num_outputs(cookie) == 1) {
- memset(&mplsElem, 0, sizeof(mplsElem));
- mplsElem.tag = SFLFLOW_EX_MPLS;
- dpif_sflow_encode_mpls_stack(&mplsElem.flowType.mpls.out_stack,
- mpls_lse_buf,
- sflow_actions);
- SFLADD_ELEMENT(&fs, &mplsElem);
+ && sflow_actions->mpls_stack_depth > 0
+ && !sflow_actions->mpls_err
+ && dpif_sflow_cookie_num_outputs(cookie) == 1) {
+ memset(&mplsElem, 0, sizeof(mplsElem));
+ mplsElem.tag = SFLFLOW_EX_MPLS;
+ dpif_sflow_encode_mpls_stack(&mplsElem.flowType.mpls.out_stack,
+ mpls_lse_buf,
+ sflow_actions);
+ SFLADD_ELEMENT(&fs, &mplsElem);
}
/* Submit the flow sample to be encoded into the next datagram. */
/* Backup flow & base_flow data. */
memcpy(&old_base_flow, &ctx->base_flow, sizeof old_base_flow);
memcpy(&old_flow, &ctx->xin->flow, sizeof old_flow);
-
+
if (flow->tunnel.ip_src) {
in6_addr_set_mapped_ipv4(&s_ip6, flow->tunnel.ip_src);
}
# print lflow info when the current flow block ends
if regex_table_id.match(line) or line.strip() == '':
lflow = get_lflow_from_cookie(ovsdb_ovnsb, cookie)
- print_lflow(lflow, "\t* ")
- print_lflow_nb_hint(lflow, "\t\t* ", ovsdb_ovnnb)
+ print_lflow(lflow, " * ")
+ print_lflow_nb_hint(lflow, " * ", ovsdb_ovnnb)
cookie = None
print line.strip()
}
}
- printf("\ttable %s", table);
+ printf(" table %s", table);
if (!old_name) {
if (new_name) {
if (!value_string) {
value_string = json_to_string(value, JSSF_SORT);
}
- printf("\t\t%s=%s\n", column, value_string);
+ printf(" %s=%s\n", column, value_string);
free(value_string);
}
}
xmemdup0(row_uuid, 8));
}
} else if (columns->type == JSON_NULL) {
- printf("\t\tdelete row\n");
+ printf(" delete row\n");
smap_remove(names, row_uuid);
}
set ovs_ctl ${1-start}
set "$@" --system-id=random
if test X"$FORCE_COREFILES" != X; then
- set "$@" --force-corefiles="$FORCE_COREFILES"
+ set "$@" --force-corefiles="$FORCE_COREFILES"
fi
if test X"$OVSDB_SERVER_PRIORITY" != X; then
- set "$@" --ovsdb-server-priority="$OVSDB_SERVER_PRIORITY"
+ set "$@" --ovsdb-server-priority="$OVSDB_SERVER_PRIORITY"
fi
if test X"$VSWITCHD_PRIORITY" != X; then
- set "$@" --ovs-vswitchd-priority="$VSWITCHD_PRIORITY"
+ set "$@" --ovs-vswitchd-priority="$VSWITCHD_PRIORITY"
fi
if test X"$VSWITCHD_MLOCKALL" != X; then
- set "$@" --mlockall="$VSWITCHD_MLOCKALL"
+ set "$@" --mlockall="$VSWITCHD_MLOCKALL"
fi
set "$@" $OVS_CTL_OPTS
"$@"
SERVICE_UNIT=/usr/lib/systemd/system/ovsdb-server.service
if [ -f $SERVICE_UNIT ] && [ -x /usr/bin/systemctl ]; then
- if ! systemctl --quiet is-active ovsdb-server.service; then
- systemctl start ovsdb-server.service
- fi
+ if ! systemctl --quiet is-active ovsdb-server.service; then
+ systemctl start ovsdb-server.service
+ fi
else
- if [ ! -f /var/lock/subsys/openvswitch ]; then
- /sbin/service openvswitch start
- fi
+ if [ ! -f /var/lock/subsys/openvswitch ]; then
+ /sbin/service openvswitch start
+ fi
fi
case "$TYPE" in
- OVSBridge|OVSUserBridge)
- ${OTHERSCRIPT} ${CONFIG} $2
- retval=$?
- ovs-vsctl -t ${TIMEOUT} -- --if-exists del-br "$DEVICE"
- ;;
- OVSPort|OVSIntPort|OVSBond)
- ${OTHERSCRIPT} ${CONFIG} $2
- retval=$?
- ovs-vsctl -t ${TIMEOUT} -- --if-exists del-port "$OVS_BRIDGE" "$DEVICE"
- ;;
- OVSPatchPort|OVSTunnel)
- ovs-vsctl -t ${TIMEOUT} -- --if-exists del-port "$OVS_BRIDGE" "$DEVICE"
- ;;
- OVSDPDKPort|OVSDPDKRPort|OVSDPDKVhostUserPort|OVSDPDKBond)
- ovs-vsctl -t ${TIMEOUT} -- --if-exists del-port "$OVS_BRIDGE" "$DEVICE"
- ;;
- *)
- echo $"Invalid OVS interface type $TYPE"
- exit 1
- ;;
+ OVSBridge|OVSUserBridge)
+ ${OTHERSCRIPT} ${CONFIG} $2
+ retval=$?
+ ovs-vsctl -t ${TIMEOUT} -- --if-exists del-br "$DEVICE"
+ ;;
+ OVSPort|OVSIntPort|OVSBond)
+ ${OTHERSCRIPT} ${CONFIG} $2
+ retval=$?
+ ovs-vsctl -t ${TIMEOUT} -- --if-exists del-port "$OVS_BRIDGE" "$DEVICE"
+ ;;
+ OVSPatchPort|OVSTunnel)
+ ovs-vsctl -t ${TIMEOUT} -- --if-exists del-port "$OVS_BRIDGE" "$DEVICE"
+ ;;
+ OVSDPDKPort|OVSDPDKRPort|OVSDPDKVhostUserPort|OVSDPDKBond)
+ ovs-vsctl -t ${TIMEOUT} -- --if-exists del-port "$OVS_BRIDGE" "$DEVICE"
+ ;;
+ *)
+ echo $"Invalid OVS interface type $TYPE"
+ exit 1
+ ;;
esac
exit $retval
OTHERSCRIPT="/etc/sysconfig/network-scripts/ifup-${REAL_DEVICETYPE}"
if [ ! -x ${OTHERSCRIPT} ]; then
- OTHERSCRIPT="/etc/sysconfig/network-scripts/ifup-eth"
+ OTHERSCRIPT="/etc/sysconfig/network-scripts/ifup-eth"
fi
check_recursion ()
{
- [ -n "${UPPEDSTACK}" ] && for _r in ${UPPEDSTACK}; do
- [ "$_r" = "$1" ] && return 1
- done
+ [ -n "${UPPEDSTACK}" ] && for _r in ${UPPEDSTACK}; do
+ [ "$_r" = "$1" ] && return 1
+ done
- return 0
+ return 0
}
ifup_ovs_bridge ()
{
- if ovs-vsctl br-exists "${OVS_BRIDGE}"; then :; else
- /sbin/ifup "${OVS_BRIDGE}"
- fi
+ if ovs-vsctl br-exists "${OVS_BRIDGE}"; then :; else
+ /sbin/ifup "${OVS_BRIDGE}"
+ fi
}
if [ -z "${UPPEDSTACK}" ]; then
- UPPEDSTACK="${DEVICE}"
+ UPPEDSTACK="${DEVICE}"
fi
[ -n "${OVSREQUIRES}" ] && for _i in ${OVSREQUIRES}; do
- if ( check_recursion "$_i" ); then
- UPPEDSTACK="${UPPEDSTACK} $_i" /sbin/ifup "$_i"
- fi
+ if ( check_recursion "$_i" ); then
+ UPPEDSTACK="${UPPEDSTACK} $_i" /sbin/ifup "$_i"
+ fi
done
SERVICE_UNIT=/usr/lib/systemd/system/openvswitch.service
if [ -f $SERVICE_UNIT ] && [ -x /usr/bin/systemctl ]; then
- if ! systemctl --quiet is-active openvswitch.service; then
- systemctl start openvswitch.service
- fi
+ if ! systemctl --quiet is-active openvswitch.service; then
+ systemctl start openvswitch.service
+ fi
else
- if [ ! -f /var/lock/subsys/openvswitch ]; then
- /sbin/service openvswitch start
- fi
+ if [ ! -f /var/lock/subsys/openvswitch ]; then
+ /sbin/service openvswitch start
+ fi
fi
case "$TYPE" in
- OVSBridge|OVSUserBridge)
- # If bridge already exists and is up, it has been configured through
- # other cases like OVSPort, OVSIntPort and OVSBond. If it is down or
- # it does not exist, create it. It is possible for a bridge to exist
- # because it remained in the OVSDB for some reason, but it won't be up.
- if [ "${TYPE}" = "OVSUserBridge" ]; then
- DATAPATH="netdev"
- fi
- if check_device_down "${DEVICE}"; then
- ovs-vsctl -t ${TIMEOUT} -- --may-exist add-br "$DEVICE" $OVS_OPTIONS \
- ${OVS_EXTRA+-- $OVS_EXTRA} \
- ${STP+-- set bridge "$DEVICE" stp_enable="${STP}"} \
- ${DATAPATH+-- set bridge "$DEVICE" datapath_type="$DATAPATH"}
- else
- OVSBRIDGECONFIGURED="yes"
- fi
-
- # If MACADDR is provided in the interface configuration file,
- # we need to set it using ovs-vsctl; setting it with the "ip"
- # command in ifup-eth does not make the change persistent.
- if [ -n "$MACADDR" ]; then
- ovs-vsctl -t ${TIMEOUT} -- set bridge "$DEVICE" \
- other-config:hwaddr="$MACADDR"
- fi
-
- # When dhcp is enabled, the assumption is that there will be a port to
- # attach (otherwise, we can't reach out for dhcp). So, we do not
- # configure the bridge through rhel's ifup infrastructure unless
- # it is being configured after the port has been configured.
- # The "OVSINTF" is set only after the port is configured.
- if [ "${OVSBOOTPROTO}" = "dhcp" ] && [ -n "${OVSINTF}" ]; then
- case " ${OVSDHCPINTERFACES} " in
- *" ${OVSINTF} "*)
- BOOTPROTO=dhcp ${OTHERSCRIPT} ${CONFIG}
- ;;
- esac
- fi
-
- # When dhcp is not enabled, it is possible that someone may want
- # a standalone bridge (i.e it may not have any ports). Configure it.
- if [ "${OVSBOOTPROTO}" != "dhcp" ] && [ -z "${OVSINTF}" ] && \
- [ "${OVSBRIDGECONFIGURED}" != "yes" ]; then
- ${OTHERSCRIPT} ${CONFIG}
- fi
- exit 0
- ;;
- OVSPort)
- ifup_ovs_bridge
- ${OTHERSCRIPT} ${CONFIG} ${2}
- # The port might be already in the database but not yet
- # in the datapath. So, remove the stale interface first.
- ovs-vsctl -t ${TIMEOUT} \
- -- --if-exists del-port "$OVS_BRIDGE" "$DEVICE" \
- -- add-port "$OVS_BRIDGE" "$DEVICE" $OVS_OPTIONS ${OVS_EXTRA+-- $OVS_EXTRA}
- OVSINTF=${DEVICE} /sbin/ifup "$OVS_BRIDGE"
- ;;
- OVSIntPort)
- ifup_ovs_bridge
- ovs-vsctl -t ${TIMEOUT} \
- -- --if-exists del-port "$OVS_BRIDGE" "$DEVICE" \
- -- add-port "$OVS_BRIDGE" "$DEVICE" $OVS_OPTIONS \
- -- set Interface "$DEVICE" type=internal ${OVS_EXTRA+-- $OVS_EXTRA}
- if [ -n "${OVSDHCPINTERFACES}" ]; then
- for _iface in ${OVSDHCPINTERFACES}; do
- /sbin/ifup ${_iface}
- done
- fi
- BOOTPROTO="${OVSBOOTPROTO}" ${OTHERSCRIPT} ${CONFIG} ${2}
- ;;
- OVSBond)
- ifup_ovs_bridge
- for _iface in $BOND_IFACES; do
- /sbin/ifup ${_iface}
- done
- ovs-vsctl -t ${TIMEOUT} \
- -- --if-exists del-port "$OVS_BRIDGE" "$DEVICE" \
- -- add-bond "$OVS_BRIDGE" "$DEVICE" ${BOND_IFACES} $OVS_OPTIONS ${OVS_EXTRA+-- $OVS_EXTRA}
- OVSINTF=${DEVICE} /sbin/ifup "$OVS_BRIDGE"
- ;;
- OVSTunnel)
- ifup_ovs_bridge
- ovs-vsctl -t ${TIMEOUT} \
- -- --if-exists del-port "$OVS_BRIDGE" "$DEVICE" \
- -- add-port "$OVS_BRIDGE" "$DEVICE" $OVS_OPTIONS \
- -- set Interface "$DEVICE" type=$OVS_TUNNEL_TYPE $OVS_TUNNEL_OPTIONS ${OVS_EXTRA+-- $OVS_EXTRA}
- ;;
- OVSPatchPort)
- ifup_ovs_bridge
- ovs-vsctl -t ${TIMEOUT} \
- -- --if-exists del-port "$OVS_BRIDGE" "$DEVICE" \
- -- add-port "$OVS_BRIDGE" "$DEVICE" $OVS_OPTIONS \
- -- set Interface "$DEVICE" type=patch options:peer="${OVS_PATCH_PEER}" ${OVS_EXTRA+-- $OVS_EXTRA}
- ;;
- OVSDPDKPort)
- ifup_ovs_bridge
- BRIDGE_MAC_ORIG=$(get_hwaddr $OVS_BRIDGE)
- ovs-vsctl -t ${TIMEOUT} \
- -- --if-exists del-port "$OVS_BRIDGE" "$DEVICE" \
- -- add-port "$OVS_BRIDGE" "$DEVICE" $OVS_OPTIONS \
- -- set Interface "$DEVICE" type=dpdk ${OVS_EXTRA+-- $OVS_EXTRA}
- BRIDGE_MAC=$(get_hwaddr $OVS_BRIDGE)
- # The bridge may change its MAC to be the lower one among all its
- # ports. If that happens, bridge configuration (e.g. routes) will
- # be lost. Restore the post-up bridge configuration again.
- if [ "$BRIDGE_MAC_ORIG" != "$BRIDGE_MAC" ]; then
- ${OTHERSCRIPT} "$OVS_BRIDGE"
- fi
- ;;
- OVSDPDKRPort)
- ifup_ovs_bridge
- ovs-vsctl -t ${TIMEOUT} \
- -- --if-exists del-port "$OVS_BRIDGE" "$DEVICE" \
- -- add-port "$OVS_BRIDGE" "$DEVICE" $OVS_OPTIONS \
- -- set Interface "$DEVICE" type=dpdkr ${OVS_EXTRA+-- $OVS_EXTRA}
- ;;
- OVSDPDKVhostUserPort)
- ifup_ovs_bridge
- PORT_TYPE="dpdkvhostuser"
- PORT_PATH=""
- if [ "$OVS_PORT_MODE" == "client" ]; then
- PORT_TYPE="dpdkvhostuserclient"
- PORT_PATH="options:vhost-server-path=${OVS_PORT_PATH}"
- fi
- ovs-vsctl -t ${TIMEOUT} \
- -- --if-exists del-port "$OVS_BRIDGE" "$DEVICE" \
- -- add-port "$OVS_BRIDGE" "$DEVICE" $OVS_OPTIONS \
- -- set Interface "$DEVICE" type=$PORT_TYPE \
- $PORT_PATH \
- ${OVS_EXTRA+-- $OVS_EXTRA}
- ;;
- OVSDPDKBond)
- ifup_ovs_bridge
- BRIDGE_MAC_ORIG=$(get_hwaddr $OVS_BRIDGE)
- for _iface in $BOND_IFACES; do
- IFACE_TYPES="${IFACE_TYPES} -- set interface ${_iface} type=dpdk"
- done
- ovs-vsctl -t ${TIMEOUT} \
- -- --if-exists del-port "$OVS_BRIDGE" "$DEVICE" \
- -- add-bond "$OVS_BRIDGE" "$DEVICE" ${BOND_IFACES} $OVS_OPTIONS ${IFACE_TYPES} ${OVS_EXTRA+-- $OVS_EXTRA}
- BRIDGE_MAC=$(get_hwaddr $OVS_BRIDGE)
- # The bridge may change its MAC to be the lower one among all its
- # ports. If that happens, bridge configuration (e.g. routes) will
- # be lost. Restore the post-up bridge configuration again.
- if [ "$BRIDGE_MAC_ORIG" != "$BRIDGE_MAC" ]; then
- ${OTHERSCRIPT} "$OVS_BRIDGE"
- fi
- ;;
- *)
- echo $"Invalid OVS interface type $TYPE"
- exit 1
- ;;
+ OVSBridge|OVSUserBridge)
+ # If bridge already exists and is up, it has been configured through
+ # other cases like OVSPort, OVSIntPort and OVSBond. If it is down or
+ # it does not exist, create it. It is possible for a bridge to exist
+ # because it remained in the OVSDB for some reason, but it won't be up.
+ if [ "${TYPE}" = "OVSUserBridge" ]; then
+ DATAPATH="netdev"
+ fi
+ if check_device_down "${DEVICE}"; then
+ ovs-vsctl -t ${TIMEOUT} -- --may-exist add-br "$DEVICE" $OVS_OPTIONS \
+ ${OVS_EXTRA+-- $OVS_EXTRA} \
+ ${STP+-- set bridge "$DEVICE" stp_enable="${STP}"} \
+ ${DATAPATH+-- set bridge "$DEVICE" datapath_type="$DATAPATH"}
+ else
+ OVSBRIDGECONFIGURED="yes"
+ fi
+
+ # If MACADDR is provided in the interface configuration file,
+ # we need to set it using ovs-vsctl; setting it with the "ip"
+ # command in ifup-eth does not make the change persistent.
+ if [ -n "$MACADDR" ]; then
+ ovs-vsctl -t ${TIMEOUT} -- set bridge "$DEVICE" \
+ other-config:hwaddr="$MACADDR"
+ fi
+
+ # When dhcp is enabled, the assumption is that there will be a port to
+ # attach (otherwise, we can't reach out for dhcp). So, we do not
+ # configure the bridge through rhel's ifup infrastructure unless
+ # it is being configured after the port has been configured.
+ # The "OVSINTF" is set only after the port is configured.
+ if [ "${OVSBOOTPROTO}" = "dhcp" ] && [ -n "${OVSINTF}" ]; then
+ case " ${OVSDHCPINTERFACES} " in
+ *" ${OVSINTF} "*)
+ BOOTPROTO=dhcp ${OTHERSCRIPT} ${CONFIG}
+ ;;
+ esac
+ fi
+
+ # When dhcp is not enabled, it is possible that someone may want
+ # a standalone bridge (i.e it may not have any ports). Configure it.
+ if [ "${OVSBOOTPROTO}" != "dhcp" ] && [ -z "${OVSINTF}" ] && \
+ [ "${OVSBRIDGECONFIGURED}" != "yes" ]; then
+ ${OTHERSCRIPT} ${CONFIG}
+ fi
+ exit 0
+ ;;
+ OVSPort)
+ ifup_ovs_bridge
+ ${OTHERSCRIPT} ${CONFIG} ${2}
+ # The port might be already in the database but not yet
+ # in the datapath. So, remove the stale interface first.
+ ovs-vsctl -t ${TIMEOUT} \
+ -- --if-exists del-port "$OVS_BRIDGE" "$DEVICE" \
+ -- add-port "$OVS_BRIDGE" "$DEVICE" $OVS_OPTIONS ${OVS_EXTRA+-- $OVS_EXTRA}
+ OVSINTF=${DEVICE} /sbin/ifup "$OVS_BRIDGE"
+ ;;
+ OVSIntPort)
+ ifup_ovs_bridge
+ ovs-vsctl -t ${TIMEOUT} \
+ -- --if-exists del-port "$OVS_BRIDGE" "$DEVICE" \
+ -- add-port "$OVS_BRIDGE" "$DEVICE" $OVS_OPTIONS \
+ -- set Interface "$DEVICE" type=internal ${OVS_EXTRA+-- $OVS_EXTRA}
+ if [ -n "${OVSDHCPINTERFACES}" ]; then
+ for _iface in ${OVSDHCPINTERFACES}; do
+ /sbin/ifup ${_iface}
+ done
+ fi
+ BOOTPROTO="${OVSBOOTPROTO}" ${OTHERSCRIPT} ${CONFIG} ${2}
+ ;;
+ OVSBond)
+ ifup_ovs_bridge
+ for _iface in $BOND_IFACES; do
+ /sbin/ifup ${_iface}
+ done
+ ovs-vsctl -t ${TIMEOUT} \
+ -- --if-exists del-port "$OVS_BRIDGE" "$DEVICE" \
+ -- add-bond "$OVS_BRIDGE" "$DEVICE" ${BOND_IFACES} $OVS_OPTIONS ${OVS_EXTRA+-- $OVS_EXTRA}
+ OVSINTF=${DEVICE} /sbin/ifup "$OVS_BRIDGE"
+ ;;
+ OVSTunnel)
+ ifup_ovs_bridge
+ ovs-vsctl -t ${TIMEOUT} \
+ -- --if-exists del-port "$OVS_BRIDGE" "$DEVICE" \
+ -- add-port "$OVS_BRIDGE" "$DEVICE" $OVS_OPTIONS \
+ -- set Interface "$DEVICE" type=$OVS_TUNNEL_TYPE $OVS_TUNNEL_OPTIONS ${OVS_EXTRA+-- $OVS_EXTRA}
+ ;;
+ OVSPatchPort)
+ ifup_ovs_bridge
+ ovs-vsctl -t ${TIMEOUT} \
+ -- --if-exists del-port "$OVS_BRIDGE" "$DEVICE" \
+ -- add-port "$OVS_BRIDGE" "$DEVICE" $OVS_OPTIONS \
+ -- set Interface "$DEVICE" type=patch options:peer="${OVS_PATCH_PEER}" ${OVS_EXTRA+-- $OVS_EXTRA}
+ ;;
+ OVSDPDKPort)
+ ifup_ovs_bridge
+ BRIDGE_MAC_ORIG=$(get_hwaddr $OVS_BRIDGE)
+ ovs-vsctl -t ${TIMEOUT} \
+ -- --if-exists del-port "$OVS_BRIDGE" "$DEVICE" \
+ -- add-port "$OVS_BRIDGE" "$DEVICE" $OVS_OPTIONS \
+ -- set Interface "$DEVICE" type=dpdk ${OVS_EXTRA+-- $OVS_EXTRA}
+ BRIDGE_MAC=$(get_hwaddr $OVS_BRIDGE)
+ # The bridge may change its MAC to be the lower one among all its
+ # ports. If that happens, bridge configuration (e.g. routes) will
+ # be lost. Restore the post-up bridge configuration again.
+ if [ "$BRIDGE_MAC_ORIG" != "$BRIDGE_MAC" ]; then
+ ${OTHERSCRIPT} "$OVS_BRIDGE"
+ fi
+ ;;
+ OVSDPDKRPort)
+ ifup_ovs_bridge
+ ovs-vsctl -t ${TIMEOUT} \
+ -- --if-exists del-port "$OVS_BRIDGE" "$DEVICE" \
+ -- add-port "$OVS_BRIDGE" "$DEVICE" $OVS_OPTIONS \
+ -- set Interface "$DEVICE" type=dpdkr ${OVS_EXTRA+-- $OVS_EXTRA}
+ ;;
+ OVSDPDKVhostUserPort)
+ ifup_ovs_bridge
+ PORT_TYPE="dpdkvhostuser"
+ PORT_PATH=""
+ if [ "$OVS_PORT_MODE" == "client" ]; then
+ PORT_TYPE="dpdkvhostuserclient"
+ PORT_PATH="options:vhost-server-path=${OVS_PORT_PATH}"
+ fi
+ ovs-vsctl -t ${TIMEOUT} \
+ -- --if-exists del-port "$OVS_BRIDGE" "$DEVICE" \
+ -- add-port "$OVS_BRIDGE" "$DEVICE" $OVS_OPTIONS \
+ -- set Interface "$DEVICE" type=$PORT_TYPE \
+ $PORT_PATH \
+ ${OVS_EXTRA+-- $OVS_EXTRA}
+ ;;
+ OVSDPDKBond)
+ ifup_ovs_bridge
+ BRIDGE_MAC_ORIG=$(get_hwaddr $OVS_BRIDGE)
+ for _iface in $BOND_IFACES; do
+ IFACE_TYPES="${IFACE_TYPES} -- set interface ${_iface} type=dpdk"
+ done
+ ovs-vsctl -t ${TIMEOUT} \
+ -- --if-exists del-port "$OVS_BRIDGE" "$DEVICE" \
+ -- add-bond "$OVS_BRIDGE" "$DEVICE" ${BOND_IFACES} $OVS_OPTIONS ${IFACE_TYPES} ${OVS_EXTRA+-- $OVS_EXTRA}
+ BRIDGE_MAC=$(get_hwaddr $OVS_BRIDGE)
+ # The bridge may change its MAC to be the lower one among all its
+ # ports. If that happens, bridge configuration (e.g. routes) will
+ # be lost. Restore the post-up bridge configuration again.
+ if [ "$BRIDGE_MAC_ORIG" != "$BRIDGE_MAC" ]; then
+ ${OTHERSCRIPT} "$OVS_BRIDGE"
+ fi
+ ;;
+ *)
+ echo $"Invalid OVS interface type $TYPE"
+ exit 1
+ ;;
esac
%build
%configure \
%if %{with libcapng}
- --enable-libcapng \
+ --enable-libcapng \
%else
- --disable-libcapng \
+ --disable-libcapng \
%endif
%if %{with dpdk}
- --with-dpdk=$(dirname %{_datadir}/dpdk/*/.config) \
+ --with-dpdk=$(dirname %{_datadir}/dpdk/*/.config) \
%endif
- --enable-ssl \
- --with-pkidir=%{_sharedstatedir}/openvswitch/pki \
+ --enable-ssl \
+ --with-pkidir=%{_sharedstatedir}/openvswitch/pki \
%if 0%{?fedora} > 22 || %{with build_python3}
- PYTHON3=%{__python3} \
- PYTHON=%{__python2}
+ PYTHON3=%{__python3} \
+ PYTHON=%{__python2}
%else
- PYTHON=%{__python}
+ PYTHON=%{__python}
%endif
build-aux/dpdkstrip.py \
%if %{with dpdk}
- --dpdk \
+ --dpdk \
%else
- --nodpdk \
+ --nodpdk \
%endif
- < rhel/usr_lib_systemd_system_ovs-vswitchd.service.in \
- > rhel/usr_lib_systemd_system_ovs-vswitchd.service
+ < rhel/usr_lib_systemd_system_ovs-vswitchd.service.in \
+ > rhel/usr_lib_systemd_system_ovs-vswitchd.service
make %{?_smp_mflags}
make selinux-policy
rhel/usr_share_openvswitch_scripts_systemd_sysconfig.template \
$RPM_BUILD_ROOT/%{_sysconfdir}/sysconfig/openvswitch
for service in openvswitch ovsdb-server ovs-vswitchd ovs-delete-transient-ports \
- ovn-controller ovn-controller-vtep ovn-northd; do
- install -p -D -m 0644 \
- rhel/usr_lib_systemd_system_${service}.service \
- $RPM_BUILD_ROOT%{_unitdir}/${service}.service
+ ovn-controller ovn-controller-vtep ovn-northd; do
+ install -p -D -m 0644 \
+ rhel/usr_lib_systemd_system_${service}.service \
+ $RPM_BUILD_ROOT%{_unitdir}/${service}.service
done
install -m 0755 rhel/etc_init.d_openvswitch \
$RPM_BUILD_ROOT%{_datadir}/openvswitch/scripts/openvswitch.init
%build
for flavor in %flavors_to_build; do
- mkdir _$flavor
- (cd _$flavor && ../configure --with-linux="%{kernel_source $flavor}")
- %{__make} -C _$flavor/datapath/linux %{?_smp_mflags}
+ mkdir _$flavor
+ (cd _$flavor && ../configure --with-linux="%{kernel_source $flavor}")
+ %{__make} -C _$flavor/datapath/linux %{?_smp_mflags}
done
%install
printf '\n\n--- check_liveness %d ---\n\n\n' $1
shift
- echo >>expout "OFPT_PORT_STATUS (OF1.3): MOD: 1(p0): addr:
+ echo >>expout "OFPT_PORT_STATUS (OF1.3): MOD: 1(p0): addr:
config: 0
state: $1
speed: 0 Mbps now, 0 Mbps max"
- AT_CHECK(
+ AT_CHECK(
[[sed '
s/ (xid=0x[0-9a-fA-F]*)//
s/ *duration.*//
printf '\n\n--- check_liveness %d ---\n\n\n' $1
shift
- echo >>expout "OFPT_PORT_STATUS (OF1.4): MOD: 1(p0): addr:
+ echo >>expout "OFPT_PORT_STATUS (OF1.4): MOD: 1(p0): addr:
config: 0
state: $1
speed: 0 Mbps now, 0 Mbps max"
- AT_CHECK(
+ AT_CHECK(
[[sed '
s/ (xid=0x[0-9a-fA-F]*)//
s/ *duration.*//
printf '\n\n--- check_liveness %d ---\n\n\n' $1
shift
- echo >>expout "OFPT_PORT_STATUS (OF1.5): MOD: 1(p0): addr:
+ echo >>expout "OFPT_PORT_STATUS (OF1.5): MOD: 1(p0): addr:
config: 0
state: $1
speed: 0 Mbps now, 0 Mbps max"
- AT_CHECK(
+ AT_CHECK(
[[sed '
s/ (xid=0x[0-9a-fA-F]*)//
s/ *duration.*//
printf '\n\n--- check_liveness %d ---\n\n\n' $1
shift
- echo >>expout "OFPT_PORT_STATUS (OF1.3): MOD: 1(p0): addr:
+ echo >>expout "OFPT_PORT_STATUS (OF1.3): MOD: 1(p0): addr:
config: 0
state: $1
speed: 0 Mbps now, 0 Mbps max"
- AT_CHECK(
+ AT_CHECK(
[[sed '
s/ (xid=0x[0-9a-fA-F]*)//
s/ *duration.*//
printf '\n\n--- check_liveness %d ---\n\n\n' $1
shift
- echo >>expout "OFPT_PORT_STATUS (OF1.4): MOD: 1(p0): addr:
+ echo >>expout "OFPT_PORT_STATUS (OF1.4): MOD: 1(p0): addr:
config: 0
state: $1
speed: 0 Mbps now, 0 Mbps max"
- AT_CHECK(
+ AT_CHECK(
[[sed '
s/ (xid=0x[0-9a-fA-F]*)//
s/ *duration.*//
printf '\n\n--- check_liveness %d ---\n\n\n' $1
shift
- echo >>expout "OFPT_PORT_STATUS (OF1.5): MOD: 1(p0): addr:
+ echo >>expout "OFPT_PORT_STATUS (OF1.5): MOD: 1(p0): addr:
config: 0
state: $1
speed: 0 Mbps now, 0 Mbps max"
- AT_CHECK(
+ AT_CHECK(
[[sed '
s/ (xid=0x[0-9a-fA-F]*)//
s/ *duration.*//
[[12]][[123]]) out=1 ;;
32) out=2 ;;
[[13]][[234]]) out=3 ;;
- ?1) out=4 ;;
+ ?1) out=4 ;;
15) out=5 ;;
*) out=6
esac
filter_flow_dump () {
grep 'flow_dump ' | sed '
- s/.*flow_dump //
- s/used:[0-9]*\.[0-9]*/used:0.0/
+ s/.*flow_dump //
+ s/used:[0-9]*\.[0-9]*/used:0.0/
' | sort | uniq
}
test X"${2}" = Xinterface && \
test X"${4}" = Xofport; then
if test X"${3}" = Xeth2; then
- echo 5
- else
- echo -1
- fi
+ echo 5
+ else
+ echo -1
+ fi
fi
shift
cat > var/xapi/network.dbcache <<'EOF'
<?xml version="1.0" ?>
<xenserver-network-configuration>
- <pif ref="OpaqueRef:e0955887-571f-17fc-a971-61c1ec7d81b6">
- <VLAN_slave_of/>
+ <pif ref="OpaqueRef:e0955887-571f-17fc-a971-61c1ec7d81b6">
+ <VLAN_slave_of/>
<tunnel_access_PIF_of/>
- <management>
- False
- </management>
- <bond_slave_of>
- OpaqueRef:86d81bcf-0d25-90b2-cb11-af2007bd586e
- </bond_slave_of>
- <uuid>
- bd62a141-091f-3909-e334-0334f67ff3be
- </uuid>
- <IP>
-
- </IP>
- <VLAN_master_of>
- OpaqueRef:NULL
- </VLAN_master_of>
- <VLAN>
- -1
- </VLAN>
- <netmask>
-
- </netmask>
- <other_config/>
- <MAC>
- 00:22:19:22:4b:af
- </MAC>
- <ip_configuration_mode>
- None
- </ip_configuration_mode>
- <DNS>
-
- </DNS>
- <device>
- eth0
- </device>
- <bond_master_of/>
- <currently_attached>
- False
- </currently_attached>
- <gateway>
-
- </gateway>
- <network>
- OpaqueRef:83e4a934-aeb5-e6f0-a743-d1c7ef7364c5
- </network>
- </pif>
- <pif ref="OpaqueRef:eea8da94-a5e6-18fc-34a7-5e9b5a235806">
- <VLAN_slave_of/>
+ <management>
+ False
+ </management>
+ <bond_slave_of>
+ OpaqueRef:86d81bcf-0d25-90b2-cb11-af2007bd586e
+ </bond_slave_of>
+ <uuid>
+ bd62a141-091f-3909-e334-0334f67ff3be
+ </uuid>
+ <IP>
+
+ </IP>
+ <VLAN_master_of>
+ OpaqueRef:NULL
+ </VLAN_master_of>
+ <VLAN>
+ -1
+ </VLAN>
+ <netmask>
+
+ </netmask>
+ <other_config/>
+ <MAC>
+ 00:22:19:22:4b:af
+ </MAC>
+ <ip_configuration_mode>
+ None
+ </ip_configuration_mode>
+ <DNS>
+
+ </DNS>
+ <device>
+ eth0
+ </device>
+ <bond_master_of/>
+ <currently_attached>
+ False
+ </currently_attached>
+ <gateway>
+
+ </gateway>
+ <network>
+ OpaqueRef:83e4a934-aeb5-e6f0-a743-d1c7ef7364c5
+ </network>
+ </pif>
+ <pif ref="OpaqueRef:eea8da94-a5e6-18fc-34a7-5e9b5a235806">
+ <VLAN_slave_of/>
<tunnel_access_PIF_of/>
- <management>
- False
- </management>
- <bond_slave_of>
- OpaqueRef:NULL
- </bond_slave_of>
- <uuid>
- df8d35c2-cc3a-a623-7065-d987a29feb75
- </uuid>
- <IP>
-
- </IP>
- <VLAN_master_of>
- OpaqueRef:NULL
- </VLAN_master_of>
- <VLAN>
- -1
- </VLAN>
- <netmask>
-
- </netmask>
- <other_config/>
- <MAC>
- 00:1b:21:29:ce:51
- </MAC>
- <ip_configuration_mode>
- None
- </ip_configuration_mode>
- <DNS>
-
- </DNS>
- <device>
- eth4
- </device>
- <bond_master_of/>
- <currently_attached>
- False
- </currently_attached>
- <gateway>
-
- </gateway>
- <network>
- OpaqueRef:bf51b4d3-7bdc-ea55-ba21-539b150b0531
- </network>
- </pif>
- <pif ref="OpaqueRef:2956e6c8-487e-981c-85ff-c84796418768">
- <VLAN_slave_of/>
+ <management>
+ False
+ </management>
+ <bond_slave_of>
+ OpaqueRef:NULL
+ </bond_slave_of>
+ <uuid>
+ df8d35c2-cc3a-a623-7065-d987a29feb75
+ </uuid>
+ <IP>
+
+ </IP>
+ <VLAN_master_of>
+ OpaqueRef:NULL
+ </VLAN_master_of>
+ <VLAN>
+ -1
+ </VLAN>
+ <netmask>
+
+ </netmask>
+ <other_config/>
+ <MAC>
+ 00:1b:21:29:ce:51
+ </MAC>
+ <ip_configuration_mode>
+ None
+ </ip_configuration_mode>
+ <DNS>
+
+ </DNS>
+ <device>
+ eth4
+ </device>
+ <bond_master_of/>
+ <currently_attached>
+ False
+ </currently_attached>
+ <gateway>
+
+ </gateway>
+ <network>
+ OpaqueRef:bf51b4d3-7bdc-ea55-ba21-539b150b0531
+ </network>
+ </pif>
+ <pif ref="OpaqueRef:2956e6c8-487e-981c-85ff-c84796418768">
+ <VLAN_slave_of/>
<tunnel_access_PIF_of/>
- <management>
- False
- </management>
- <bond_slave_of>
- OpaqueRef:86d81bcf-0d25-90b2-cb11-af2007bd586e
- </bond_slave_of>
- <uuid>
- 2f87fc95-5ab4-571a-2487-3f4ac1985663
- </uuid>
- <IP>
-
- </IP>
- <VLAN_master_of>
- OpaqueRef:NULL
- </VLAN_master_of>
- <VLAN>
- -1
- </VLAN>
- <netmask>
-
- </netmask>
- <other_config/>
- <MAC>
- 00:22:19:22:4b:b1
- </MAC>
- <ip_configuration_mode>
- None
- </ip_configuration_mode>
- <DNS>
-
- </DNS>
- <device>
- eth1
- </device>
- <bond_master_of/>
- <currently_attached>
- False
- </currently_attached>
- <gateway>
-
- </gateway>
- <network>
- OpaqueRef:92b41bf6-aa21-45d3-1c86-c87a5fa98f7d
- </network>
- </pif>
- <pif ref="OpaqueRef:d2d1e51e-4da9-3163-8f57-bb683429335e">
- <VLAN_slave_of/>
+ <management>
+ False
+ </management>
+ <bond_slave_of>
+ OpaqueRef:86d81bcf-0d25-90b2-cb11-af2007bd586e
+ </bond_slave_of>
+ <uuid>
+ 2f87fc95-5ab4-571a-2487-3f4ac1985663
+ </uuid>
+ <IP>
+
+ </IP>
+ <VLAN_master_of>
+ OpaqueRef:NULL
+ </VLAN_master_of>
+ <VLAN>
+ -1
+ </VLAN>
+ <netmask>
+
+ </netmask>
+ <other_config/>
+ <MAC>
+ 00:22:19:22:4b:b1
+ </MAC>
+ <ip_configuration_mode>
+ None
+ </ip_configuration_mode>
+ <DNS>
+
+ </DNS>
+ <device>
+ eth1
+ </device>
+ <bond_master_of/>
+ <currently_attached>
+ False
+ </currently_attached>
+ <gateway>
+
+ </gateway>
+ <network>
+ OpaqueRef:92b41bf6-aa21-45d3-1c86-c87a5fa98f7d
+ </network>
+ </pif>
+ <pif ref="OpaqueRef:d2d1e51e-4da9-3163-8f57-bb683429335e">
+ <VLAN_slave_of/>
<tunnel_access_PIF_of/>
- <management>
- False
- </management>
- <bond_slave_of>
- OpaqueRef:NULL
- </bond_slave_of>
- <uuid>
- d2dfdab3-daf4-afea-f055-a25a0d24d714
- </uuid>
- <IP>
-
- </IP>
- <VLAN_master_of>
- OpaqueRef:4c0eb823-4d96-da1d-e75f-411b85badb0c
- </VLAN_master_of>
- <VLAN>
- 4
- </VLAN>
- <netmask>
-
- </netmask>
- <other_config/>
- <MAC>
- fe:ff:ff:ff:ff:ff
- </MAC>
- <ip_configuration_mode>
- None
- </ip_configuration_mode>
- <DNS>
-
- </DNS>
- <device>
- bond0
- </device>
- <bond_master_of/>
- <currently_attached>
- True
- </currently_attached>
- <gateway>
-
- </gateway>
- <network>
- OpaqueRef:a63afad0-fb4c-b4a4-3696-cbb3d88afc47
- </network>
- </pif>
- <pif ref="OpaqueRef:2bc0fab5-523a-4125-609d-212391f5f6fc">
- <VLAN_slave_of>
- <master>
- OpaqueRef:e623e1d6-cd02-be8d-820d-49d65c710297
- </master>
- </VLAN_slave_of>
+ <management>
+ False
+ </management>
+ <bond_slave_of>
+ OpaqueRef:NULL
+ </bond_slave_of>
+ <uuid>
+ d2dfdab3-daf4-afea-f055-a25a0d24d714
+ </uuid>
+ <IP>
+
+ </IP>
+ <VLAN_master_of>
+ OpaqueRef:4c0eb823-4d96-da1d-e75f-411b85badb0c
+ </VLAN_master_of>
+ <VLAN>
+ 4
+ </VLAN>
+ <netmask>
+
+ </netmask>
+ <other_config/>
+ <MAC>
+ fe:ff:ff:ff:ff:ff
+ </MAC>
+ <ip_configuration_mode>
+ None
+ </ip_configuration_mode>
+ <DNS>
+
+ </DNS>
+ <device>
+ bond0
+ </device>
+ <bond_master_of/>
+ <currently_attached>
+ True
+ </currently_attached>
+ <gateway>
+
+ </gateway>
+ <network>
+ OpaqueRef:a63afad0-fb4c-b4a4-3696-cbb3d88afc47
+ </network>
+ </pif>
+ <pif ref="OpaqueRef:2bc0fab5-523a-4125-609d-212391f5f6fc">
+ <VLAN_slave_of>
+ <master>
+ OpaqueRef:e623e1d6-cd02-be8d-820d-49d65c710297
+ </master>
+ </VLAN_slave_of>
<tunnel_access_PIF_of/>
- <management>
- False
- </management>
- <bond_slave_of>
- OpaqueRef:NULL
- </bond_slave_of>
- <uuid>
- f4ba396e-a993-a592-5fbc-a1d566afb59e
- </uuid>
- <IP>
- 10.0.0.188
- </IP>
- <VLAN_master_of>
- OpaqueRef:NULL
- </VLAN_master_of>
- <VLAN>
- -1
- </VLAN>
- <netmask>
- 255.0.0.0
- </netmask>
- <other_config/>
- <MAC>
- 00:15:17:a0:29:81
- </MAC>
- <ip_configuration_mode>
- Static
- </ip_configuration_mode>
- <DNS>
-
- </DNS>
- <device>
- eth3
- </device>
- <bond_master_of/>
- <currently_attached>
- True
- </currently_attached>
- <gateway>
-
- </gateway>
- <network>
- OpaqueRef:d9189da2-d00b-61ba-8a6d-ac42cc868e32
- </network>
- </pif>
- <pif ref="OpaqueRef:205d1186-2cd1-d5e6-45e4-ea1698ea6e15">
- <VLAN_slave_of/>
+ <management>
+ False
+ </management>
+ <bond_slave_of>
+ OpaqueRef:NULL
+ </bond_slave_of>
+ <uuid>
+ f4ba396e-a993-a592-5fbc-a1d566afb59e
+ </uuid>
+ <IP>
+ 10.0.0.188
+ </IP>
+ <VLAN_master_of>
+ OpaqueRef:NULL
+ </VLAN_master_of>
+ <VLAN>
+ -1
+ </VLAN>
+ <netmask>
+ 255.0.0.0
+ </netmask>
+ <other_config/>
+ <MAC>
+ 00:15:17:a0:29:81
+ </MAC>
+ <ip_configuration_mode>
+ Static
+ </ip_configuration_mode>
+ <DNS>
+
+ </DNS>
+ <device>
+ eth3
+ </device>
+ <bond_master_of/>
+ <currently_attached>
+ True
+ </currently_attached>
+ <gateway>
+
+ </gateway>
+ <network>
+ OpaqueRef:d9189da2-d00b-61ba-8a6d-ac42cc868e32
+ </network>
+ </pif>
+ <pif ref="OpaqueRef:205d1186-2cd1-d5e6-45e4-ea1698ea6e15">
+ <VLAN_slave_of/>
<tunnel_access_PIF_of/>
- <management>
- True
- </management>
- <bond_slave_of>
- OpaqueRef:NULL
- </bond_slave_of>
- <uuid>
- 646ca9a1-36ad-e2f9-3ecc-1e5622c201c2
- </uuid>
- <IP>
- 172.18.3.188
- </IP>
- <VLAN_master_of>
- OpaqueRef:NULL
- </VLAN_master_of>
- <VLAN>
- -1
- </VLAN>
- <netmask>
- 255.255.0.0
- </netmask>
- <other_config/>
- <MAC>
- 00:15:17:a0:29:80
- </MAC>
- <ip_configuration_mode>
- DHCP
- </ip_configuration_mode>
- <DNS>
-
- </DNS>
- <device>
- eth2
- </device>
- <bond_master_of/>
- <currently_attached>
- True
- </currently_attached>
- <gateway>
-
- </gateway>
- <network>
- OpaqueRef:6e7c6e81-6b5e-b91f-e1f9-9e028567bdfe
- </network>
- </pif>
- <pif ref="OpaqueRef:8e3e37e6-ebb9-087e-0201-f6a56bf554c3">
- <VLAN_slave_of/>
+ <management>
+ True
+ </management>
+ <bond_slave_of>
+ OpaqueRef:NULL
+ </bond_slave_of>
+ <uuid>
+ 646ca9a1-36ad-e2f9-3ecc-1e5622c201c2
+ </uuid>
+ <IP>
+ 172.18.3.188
+ </IP>
+ <VLAN_master_of>
+ OpaqueRef:NULL
+ </VLAN_master_of>
+ <VLAN>
+ -1
+ </VLAN>
+ <netmask>
+ 255.255.0.0
+ </netmask>
+ <other_config/>
+ <MAC>
+ 00:15:17:a0:29:80
+ </MAC>
+ <ip_configuration_mode>
+ DHCP
+ </ip_configuration_mode>
+ <DNS>
+
+ </DNS>
+ <device>
+ eth2
+ </device>
+ <bond_master_of/>
+ <currently_attached>
+ True
+ </currently_attached>
+ <gateway>
+
+ </gateway>
+ <network>
+ OpaqueRef:6e7c6e81-6b5e-b91f-e1f9-9e028567bdfe
+ </network>
+ </pif>
+ <pif ref="OpaqueRef:8e3e37e6-ebb9-087e-0201-f6a56bf554c3">
+ <VLAN_slave_of/>
<tunnel_access_PIF_of/>
- <management>
- False
- </management>
- <bond_slave_of>
- OpaqueRef:NULL
- </bond_slave_of>
- <uuid>
- 3941edd2-865b-8dd8-61f0-199f5e1fa652
- </uuid>
- <IP>
-
- </IP>
- <VLAN_master_of>
- OpaqueRef:e623e1d6-cd02-be8d-820d-49d65c710297
- </VLAN_master_of>
- <VLAN>
- 123
- </VLAN>
- <netmask>
-
- </netmask>
- <other_config/>
- <MAC>
- fe:ff:ff:ff:ff:ff
- </MAC>
- <ip_configuration_mode>
- None
- </ip_configuration_mode>
- <DNS>
-
- </DNS>
- <device>
- eth3
- </device>
- <bond_master_of/>
- <currently_attached>
- True
- </currently_attached>
- <gateway>
-
- </gateway>
- <network>
- OpaqueRef:240fb5f8-addc-6ea3-f921-2a42b42acd17
- </network>
- </pif>
- <pif ref="OpaqueRef:69c904bb-8da9-3424-485b-8b47c2d3ef11">
- <VLAN_slave_of>
- <master>
- OpaqueRef:4c0eb823-4d96-da1d-e75f-411b85badb0c
- </master>
- </VLAN_slave_of>
+ <management>
+ False
+ </management>
+ <bond_slave_of>
+ OpaqueRef:NULL
+ </bond_slave_of>
+ <uuid>
+ 3941edd2-865b-8dd8-61f0-199f5e1fa652
+ </uuid>
+ <IP>
+
+ </IP>
+ <VLAN_master_of>
+ OpaqueRef:e623e1d6-cd02-be8d-820d-49d65c710297
+ </VLAN_master_of>
+ <VLAN>
+ 123
+ </VLAN>
+ <netmask>
+
+ </netmask>
+ <other_config/>
+ <MAC>
+ fe:ff:ff:ff:ff:ff
+ </MAC>
+ <ip_configuration_mode>
+ None
+ </ip_configuration_mode>
+ <DNS>
+
+ </DNS>
+ <device>
+ eth3
+ </device>
+ <bond_master_of/>
+ <currently_attached>
+ True
+ </currently_attached>
+ <gateway>
+
+ </gateway>
+ <network>
+ OpaqueRef:240fb5f8-addc-6ea3-f921-2a42b42acd17
+ </network>
+ </pif>
+ <pif ref="OpaqueRef:69c904bb-8da9-3424-485b-8b47c2d3ef11">
+ <VLAN_slave_of>
+ <master>
+ OpaqueRef:4c0eb823-4d96-da1d-e75f-411b85badb0c
+ </master>
+ </VLAN_slave_of>
<tunnel_access_PIF_of/>
- <management>
- False
- </management>
- <bond_slave_of>
- OpaqueRef:NULL
- </bond_slave_of>
- <uuid>
- 6c0327a9-afa3-fc19-6798-a1bfe20095ed
- </uuid>
- <IP>
-
- </IP>
- <VLAN_master_of>
- OpaqueRef:NULL
- </VLAN_master_of>
- <VLAN>
- -1
- </VLAN>
- <netmask>
-
- </netmask>
- <other_config/>
- <MAC>
- 00:22:19:22:4b:af
- </MAC>
- <ip_configuration_mode>
- None
- </ip_configuration_mode>
- <DNS>
-
- </DNS>
- <device>
- bond0
- </device>
- <bond_master_of>
- <slave>
- OpaqueRef:86d81bcf-0d25-90b2-cb11-af2007bd586e
- </slave>
- </bond_master_of>
- <currently_attached>
- True
- </currently_attached>
- <gateway>
-
- </gateway>
- <network>
- OpaqueRef:ec1e5037-60ea-97e5-54b8-39bdb43c071a
- </network>
- </pif>
- <bond ref="OpaqueRef:86d81bcf-0d25-90b2-cb11-af2007bd586e">
- <master>
- OpaqueRef:69c904bb-8da9-3424-485b-8b47c2d3ef11
- </master>
- <uuid>
- dad825f1-6d81-386e-849c-5589281e53e1
- </uuid>
- <slaves>
- <slave>
- OpaqueRef:e0955887-571f-17fc-a971-61c1ec7d81b6
- </slave>
- <slave>
- OpaqueRef:2956e6c8-487e-981c-85ff-c84796418768
- </slave>
- </slaves>
- </bond>
- <vlan ref="OpaqueRef:4c0eb823-4d96-da1d-e75f-411b85badb0c">
- <tagged_PIF>
- OpaqueRef:69c904bb-8da9-3424-485b-8b47c2d3ef11
- </tagged_PIF>
- <uuid>
- 841814da-d0d2-9da4-0b2e-b6143480bbfb
- </uuid>
- <untagged_PIF>
- OpaqueRef:d2d1e51e-4da9-3163-8f57-bb683429335e
- </untagged_PIF>
- </vlan>
- <vlan ref="OpaqueRef:e623e1d6-cd02-be8d-820d-49d65c710297">
- <tagged_PIF>
- OpaqueRef:2bc0fab5-523a-4125-609d-212391f5f6fc
- </tagged_PIF>
- <uuid>
- 399279a2-5ccd-5368-9af3-8622a1f1ac82
- </uuid>
- <untagged_PIF>
- OpaqueRef:8e3e37e6-ebb9-087e-0201-f6a56bf554c3
- </untagged_PIF>
- </vlan>
- <network ref="OpaqueRef:a63afad0-fb4c-b4a4-3696-cbb3d88afc47">
- <PIFs>
- <PIF>
- OpaqueRef:d2d1e51e-4da9-3163-8f57-bb683429335e
- </PIF>
- </PIFs>
- <bridge>
- xapi2
- </bridge>
- <other_config/>
- <uuid>
- 99be2da4-6c33-6f8e-49ea-3bc592fe3c85
- </uuid>
- </network>
- <network ref="OpaqueRef:d9189da2-d00b-61ba-8a6d-ac42cc868e32">
- <PIFs>
- <PIF>
- OpaqueRef:2bc0fab5-523a-4125-609d-212391f5f6fc
- </PIF>
- </PIFs>
- <bridge>
- xenbr3
- </bridge>
- <other_config/>
- <uuid>
- 2902ae1b-8013-897a-b697-0b200ea3aaa5
- </uuid>
- </network>
- <network ref="OpaqueRef:ec1e5037-60ea-97e5-54b8-39bdb43c071a">
- <PIFs>
- <PIF>
- OpaqueRef:69c904bb-8da9-3424-485b-8b47c2d3ef11
- </PIF>
- </PIFs>
- <bridge>
- xapi1
- </bridge>
- <other_config/>
- <uuid>
- 45cbbb43-113d-a712-3231-c6463f253cef
- </uuid>
- </network>
- <network ref="OpaqueRef:92b41bf6-aa21-45d3-1c86-c87a5fa98f7d">
- <PIFs>
- <PIF>
- OpaqueRef:2956e6c8-487e-981c-85ff-c84796418768
- </PIF>
- </PIFs>
- <bridge>
- xenbr1
- </bridge>
- <other_config/>
- <uuid>
- 99f8771a-645a-26a3-e06c-30a401f1d009
- </uuid>
- </network>
- <network ref="OpaqueRef:6e7c6e81-6b5e-b91f-e1f9-9e028567bdfe">
- <PIFs>
- <PIF>
- OpaqueRef:205d1186-2cd1-d5e6-45e4-ea1698ea6e15
- </PIF>
- </PIFs>
- <bridge>
- xenbr2
- </bridge>
- <other_config/>
- <uuid>
- d08c8749-0c8f-9e8d-ce25-fd364661ee99
- </uuid>
- </network>
- <network ref="OpaqueRef:83e4a934-aeb5-e6f0-a743-d1c7ef7364c5">
- <PIFs>
- <PIF>
- OpaqueRef:e0955887-571f-17fc-a971-61c1ec7d81b6
- </PIF>
- </PIFs>
- <bridge>
- xenbr0
- </bridge>
- <other_config>
- <vswitch-disable-in-band>
- true
- </vswitch-disable-in-band>
- </other_config>
- <uuid>
- c9eecb03-560d-61de-b6a8-56dfc766f67e
- </uuid>
- </network>
- <network ref="OpaqueRef:bf51b4d3-7bdc-ea55-ba21-539b150b0531">
- <PIFs>
- <PIF>
- OpaqueRef:eea8da94-a5e6-18fc-34a7-5e9b5a235806
- </PIF>
- </PIFs>
- <bridge>
- xenbr4
- </bridge>
- <other_config/>
- <uuid>
- d2c14c89-29cc-51d4-7664-633eff02b2ad
- </uuid>
- </network>
- <network ref="OpaqueRef:0b7354a4-8f4b-aa08-2f16-a22c117e4211">
- <PIFs/>
- <bridge>
- xapi0
- </bridge>
- <other_config/>
- <uuid>
- dc0f0632-c2aa-1b78-2fea-0d3a23c51740
- </uuid>
- </network>
- <network ref="OpaqueRef:240fb5f8-addc-6ea3-f921-2a42b42acd17">
- <PIFs>
- <PIF>
- OpaqueRef:8e3e37e6-ebb9-087e-0201-f6a56bf554c3
- </PIF>
- </PIFs>
- <bridge>
- xapi3
- </bridge>
- <other_config/>
- <uuid>
- db7bdc03-074d-42ae-fc73-9b06de1d57f6
- </uuid>
- </network>
+ <management>
+ False
+ </management>
+ <bond_slave_of>
+ OpaqueRef:NULL
+ </bond_slave_of>
+ <uuid>
+ 6c0327a9-afa3-fc19-6798-a1bfe20095ed
+ </uuid>
+ <IP>
+
+ </IP>
+ <VLAN_master_of>
+ OpaqueRef:NULL
+ </VLAN_master_of>
+ <VLAN>
+ -1
+ </VLAN>
+ <netmask>
+
+ </netmask>
+ <other_config/>
+ <MAC>
+ 00:22:19:22:4b:af
+ </MAC>
+ <ip_configuration_mode>
+ None
+ </ip_configuration_mode>
+ <DNS>
+
+ </DNS>
+ <device>
+ bond0
+ </device>
+ <bond_master_of>
+ <slave>
+ OpaqueRef:86d81bcf-0d25-90b2-cb11-af2007bd586e
+ </slave>
+ </bond_master_of>
+ <currently_attached>
+ True
+ </currently_attached>
+ <gateway>
+
+ </gateway>
+ <network>
+ OpaqueRef:ec1e5037-60ea-97e5-54b8-39bdb43c071a
+ </network>
+ </pif>
+ <bond ref="OpaqueRef:86d81bcf-0d25-90b2-cb11-af2007bd586e">
+ <master>
+ OpaqueRef:69c904bb-8da9-3424-485b-8b47c2d3ef11
+ </master>
+ <uuid>
+ dad825f1-6d81-386e-849c-5589281e53e1
+ </uuid>
+ <slaves>
+ <slave>
+ OpaqueRef:e0955887-571f-17fc-a971-61c1ec7d81b6
+ </slave>
+ <slave>
+ OpaqueRef:2956e6c8-487e-981c-85ff-c84796418768
+ </slave>
+ </slaves>
+ </bond>
+ <vlan ref="OpaqueRef:4c0eb823-4d96-da1d-e75f-411b85badb0c">
+ <tagged_PIF>
+ OpaqueRef:69c904bb-8da9-3424-485b-8b47c2d3ef11
+ </tagged_PIF>
+ <uuid>
+ 841814da-d0d2-9da4-0b2e-b6143480bbfb
+ </uuid>
+ <untagged_PIF>
+ OpaqueRef:d2d1e51e-4da9-3163-8f57-bb683429335e
+ </untagged_PIF>
+ </vlan>
+ <vlan ref="OpaqueRef:e623e1d6-cd02-be8d-820d-49d65c710297">
+ <tagged_PIF>
+ OpaqueRef:2bc0fab5-523a-4125-609d-212391f5f6fc
+ </tagged_PIF>
+ <uuid>
+ 399279a2-5ccd-5368-9af3-8622a1f1ac82
+ </uuid>
+ <untagged_PIF>
+ OpaqueRef:8e3e37e6-ebb9-087e-0201-f6a56bf554c3
+ </untagged_PIF>
+ </vlan>
+ <network ref="OpaqueRef:a63afad0-fb4c-b4a4-3696-cbb3d88afc47">
+ <PIFs>
+ <PIF>
+ OpaqueRef:d2d1e51e-4da9-3163-8f57-bb683429335e
+ </PIF>
+ </PIFs>
+ <bridge>
+ xapi2
+ </bridge>
+ <other_config/>
+ <uuid>
+ 99be2da4-6c33-6f8e-49ea-3bc592fe3c85
+ </uuid>
+ </network>
+ <network ref="OpaqueRef:d9189da2-d00b-61ba-8a6d-ac42cc868e32">
+ <PIFs>
+ <PIF>
+ OpaqueRef:2bc0fab5-523a-4125-609d-212391f5f6fc
+ </PIF>
+ </PIFs>
+ <bridge>
+ xenbr3
+ </bridge>
+ <other_config/>
+ <uuid>
+ 2902ae1b-8013-897a-b697-0b200ea3aaa5
+ </uuid>
+ </network>
+ <network ref="OpaqueRef:ec1e5037-60ea-97e5-54b8-39bdb43c071a">
+ <PIFs>
+ <PIF>
+ OpaqueRef:69c904bb-8da9-3424-485b-8b47c2d3ef11
+ </PIF>
+ </PIFs>
+ <bridge>
+ xapi1
+ </bridge>
+ <other_config/>
+ <uuid>
+ 45cbbb43-113d-a712-3231-c6463f253cef
+ </uuid>
+ </network>
+ <network ref="OpaqueRef:92b41bf6-aa21-45d3-1c86-c87a5fa98f7d">
+ <PIFs>
+ <PIF>
+ OpaqueRef:2956e6c8-487e-981c-85ff-c84796418768
+ </PIF>
+ </PIFs>
+ <bridge>
+ xenbr1
+ </bridge>
+ <other_config/>
+ <uuid>
+ 99f8771a-645a-26a3-e06c-30a401f1d009
+ </uuid>
+ </network>
+ <network ref="OpaqueRef:6e7c6e81-6b5e-b91f-e1f9-9e028567bdfe">
+ <PIFs>
+ <PIF>
+ OpaqueRef:205d1186-2cd1-d5e6-45e4-ea1698ea6e15
+ </PIF>
+ </PIFs>
+ <bridge>
+ xenbr2
+ </bridge>
+ <other_config/>
+ <uuid>
+ d08c8749-0c8f-9e8d-ce25-fd364661ee99
+ </uuid>
+ </network>
+ <network ref="OpaqueRef:83e4a934-aeb5-e6f0-a743-d1c7ef7364c5">
+ <PIFs>
+ <PIF>
+ OpaqueRef:e0955887-571f-17fc-a971-61c1ec7d81b6
+ </PIF>
+ </PIFs>
+ <bridge>
+ xenbr0
+ </bridge>
+ <other_config>
+ <vswitch-disable-in-band>
+ true
+ </vswitch-disable-in-band>
+ </other_config>
+ <uuid>
+ c9eecb03-560d-61de-b6a8-56dfc766f67e
+ </uuid>
+ </network>
+ <network ref="OpaqueRef:bf51b4d3-7bdc-ea55-ba21-539b150b0531">
+ <PIFs>
+ <PIF>
+ OpaqueRef:eea8da94-a5e6-18fc-34a7-5e9b5a235806
+ </PIF>
+ </PIFs>
+ <bridge>
+ xenbr4
+ </bridge>
+ <other_config/>
+ <uuid>
+ d2c14c89-29cc-51d4-7664-633eff02b2ad
+ </uuid>
+ </network>
+ <network ref="OpaqueRef:0b7354a4-8f4b-aa08-2f16-a22c117e4211">
+ <PIFs/>
+ <bridge>
+ xapi0
+ </bridge>
+ <other_config/>
+ <uuid>
+ dc0f0632-c2aa-1b78-2fea-0d3a23c51740
+ </uuid>
+ </network>
+ <network ref="OpaqueRef:240fb5f8-addc-6ea3-f921-2a42b42acd17">
+ <PIFs>
+ <PIF>
+ OpaqueRef:8e3e37e6-ebb9-087e-0201-f6a56bf554c3
+ </PIF>
+ </PIFs>
+ <bridge>
+ xapi3
+ </bridge>
+ <other_config/>
+ <uuid>
+ db7bdc03-074d-42ae-fc73-9b06de1d57f6
+ </uuid>
+ </network>
<pool ref="OpaqueRef:a765d06c-fc82-cc67-8f6c-fd8db45f6a84">
<other_config>
<vswitch-controller-fail-mode>
printf '\n\n--- check_liveness %d ---\n\n\n' $1
shift
- echo >>expout "OFPT_PORT_STATUS (OF1.3): MOD: 1(p0): addr:
+ echo >>expout "OFPT_PORT_STATUS (OF1.3): MOD: 1(p0): addr:
config: 0
state: $1
speed: 0 Mbps now, 0 Mbps max"
- AT_CHECK(
+ AT_CHECK(
[[sed '
s/ (xid=0x[0-9a-fA-F]*)//
s/ *duration.*//
printf '\n\n--- check_liveness %d ---\n\n\n' $1
shift
- echo >>expout "OFPT_PORT_STATUS (OF1.4): MOD: 1(p0): addr:
+ echo >>expout "OFPT_PORT_STATUS (OF1.4): MOD: 1(p0): addr:
config: 0
state: $1
speed: 0 Mbps now, 0 Mbps max"
- AT_CHECK(
+ AT_CHECK(
[[sed '
s/ (xid=0x[0-9a-fA-F]*)//
s/ *duration.*//
printf '\n\n--- check_liveness %d ---\n\n\n' $1
shift
- echo >>expout "OFPT_PORT_STATUS (OF1.5): MOD: 1(p0): addr:
+ echo >>expout "OFPT_PORT_STATUS (OF1.5): MOD: 1(p0): addr:
config: 0
state: $1
speed: 0 Mbps now, 0 Mbps max"
- AT_CHECK(
+ AT_CHECK(
[[sed '
s/ (xid=0x[0-9a-fA-F]*)//
s/ *duration.*//
dnl Modified MPLS pop action.
dnl The input is a frame with two MPLS label stack entries which tcpdump -vve shows as:
dnl 60:66:66:66:01:00 > 50:54:00:00:00:07, ethertype MPLS multicast (0x8848), length 66: MPLS (label 20, exp 0, ttl 32)
-dnl (label 20, exp 0, [S], ttl 31)
-dnl (tos 0x0, ttl 254, id 0, offset 0, flags [none], proto TCP (6), length 44)
+dnl (label 20, exp 0, [S], ttl 31)
+dnl (tos 0x0, ttl 254, id 0, offset 0, flags [none], proto TCP (6), length 44)
dnl 192.168.0.1.80 > 192.168.0.2.0: Flags [none], cksum 0x7744 (correct), seq 42:46, win 10000, length 4
AT_CHECK([ovs-ofctl monitor br0 65534 -P nxt_packet_in --detach --pidfile 2> ofctl_monitor.log])
dnl Modified MPLS pop action.
dnl The input is a frame with two MPLS label stack entries which tcpdump -vve shows as:
dnl 60:66:66:66:01:01 > 50:54:00:00:00:07, ethertype MPLS unicast (0x8847), length 66: MPLS (label 20, exp 0, ttl 32)
-dnl (label 20, exp 0, [S], ttl 31)
-dnl (tos 0x0, ttl 254, id 0, offset 0, flags [none], proto TCP (6), length 44)
+dnl (label 20, exp 0, [S], ttl 31)
+dnl (tos 0x0, ttl 254, id 0, offset 0, flags [none], proto TCP (6), length 44)
dnl 192.168.0.1.80 > 192.168.0.2.0: Flags [none], cksum 0x7744 (correct), seq 42:46, win 10000, length 4
AT_CHECK([ovs-ofctl monitor br0 65534 -P nxt_packet_in --detach --pidfile 2> ofctl_monitor.log])
dnl Modified MPLS pop action.
dnl The input is a frame with two MPLS label stack entries which tcpdump -vve shows as:
dnl 60:66:66:66:01:02 > 50:54:00:00:00:07, ethertype MPLS multicast (0x8848), length 66: MPLS (label 20, exp 0, ttl 32)
-dnl (label 20, exp 0, [S], ttl 31)
-dnl (tos 0x0, ttl 254, id 0, offset 0, flags [none], proto TCP (6), length 44)
+dnl (label 20, exp 0, [S], ttl 31)
+dnl (tos 0x0, ttl 254, id 0, offset 0, flags [none], proto TCP (6), length 44)
dnl 192.168.0.1.80 > 192.168.0.2.0: Flags [none], cksum 0x7744 (correct), seq 42:46, win 10000, length 4
AT_CHECK([ovs-ofctl monitor br0 65534 -P nxt_packet_in --detach --pidfile 2> ofctl_monitor.log])
dnl Modified MPLS pop action.
dnl The input is a frame with two MPLS label stack entries which tcpdump -vve shows as:
dnl 60:66:66:66:02:00 > 50:54:00:00:02:00, ethertype MPLS unicast (0x8847), length 66: MPLS (label 20, exp 0, ttl 32)
-dnl (label 20, exp 0, [S], ttl 31)
-dnl (tos 0x0, ttl 254, id 0, offset 0, flags [none], proto TCP (6), length 44)
+dnl (label 20, exp 0, [S], ttl 31)
+dnl (tos 0x0, ttl 254, id 0, offset 0, flags [none], proto TCP (6), length 44)
dnl 192.168.0.1.80 > 192.168.0.2.0: Flags [none], cksum 0x7744 (correct), seq 42:46, win 10000, length 4
AT_CHECK([ovs-ofctl monitor br0 65534 -P nxt_packet_in --detach --pidfile 2> ofctl_monitor.log])
dnl Modified MPLS pop action.
dnl The input is a frame with two MPLS label stack entries which tcpdump -vve shows as:
dnl 60:66:66:66:02:01 > 50:54:00:00:02:01, ethertype MPLS multicast (0x8848), length 66: MPLS (label 20, exp 0, ttl 32)
-dnl (label 20, exp 0, [S], ttl 31)
-dnl (tos 0x0, ttl 254, id 0, offset 0, flags [none], proto TCP (6), length 44)
+dnl (label 20, exp 0, [S], ttl 31)
+dnl (tos 0x0, ttl 254, id 0, offset 0, flags [none], proto TCP (6), length 44)
dnl 192.168.0.1.80 > 192.168.0.2.0: Flags [none], cksum 0x7744 (correct), seq 42:46, win 10000, length 4
AT_CHECK([ovs-ofctl monitor br0 65534 -P nxt_packet_in --detach --pidfile 2> ofctl_monitor.log])
dnl Modified MPLS pop action.
dnl The input is a frame with two MPLS label stack entries which tcpdump -vve shows as:
dnl 60:66:66:66:02:10 > 50:54:00:00:00:07, ethertype MPLS unicast (0x8847), length 66: MPLS (label 20, exp 0, ttl 32)
-dnl (label 20, exp 0, [S], ttl 31)
-dnl (tos 0x0, ttl 254, id 0, offset 0, flags [none], proto TCP (6), length 44)
+dnl (label 20, exp 0, [S], ttl 31)
+dnl (tos 0x0, ttl 254, id 0, offset 0, flags [none], proto TCP (6), length 44)
dnl 192.168.0.1.80 > 192.168.0.2.0: Flags [none], cksum 0x7744 (correct), seq 42:46, win 10000, length 4
AT_CHECK([ovs-ofctl monitor br0 65534 -P nxt_packet_in --detach --pidfile 2> ofctl_monitor.log])
dnl Modified MPLS pop action.
dnl The input is a frame with three MPLS label stack entries which tcpdump -vve shows as:
dnl 60:66:66:66:03:00 > 50:54:00:00:00:07, ethertype MPLS unicast (0x8847), length 66: MPLS (label 20, exp 0, ttl 32)
-dnl (label 20, exp 0, ttl 31)
-dnl (label 20, exp 0, [S], ttl 30)
-dnl (tos 0x0, ttl 254, id 0, offset 0, flags [none], proto TCP (6), length 44)
+dnl (label 20, exp 0, ttl 31)
+dnl (label 20, exp 0, [S], ttl 30)
+dnl (tos 0x0, ttl 254, id 0, offset 0, flags [none], proto TCP (6), length 44)
dnl 192.168.0.1.80 > 192.168.0.2.0: Flags [none], cksum 0x7744 (correct), seq 42:46, win 10000, length 4
AT_CHECK([ovs-ofctl monitor br0 65534 -P nxt_packet_in --detach --pidfile 2> ofctl_monitor.log])
dnl Modified MPLS pop action.
dnl The input is a frame with three MPLS label stack entries which tcpdump -vve shows as:
dnl 60:66:66:66:03:01 > 50:54:00:00:00:00, ethertype MPLS multicast (0x8848), length 66: MPLS (label 20, exp 0, ttl 32)
-dnl (label 20, exp 0, ttl 31)
-dnl (label 20, exp 0, [S], ttl 30)
-dnl (tos 0x0, ttl 254, id 0, offset 0, flags [none], proto TCP (6), length 44)
+dnl (label 20, exp 0, ttl 31)
+dnl (label 20, exp 0, [S], ttl 30)
+dnl (tos 0x0, ttl 254, id 0, offset 0, flags [none], proto TCP (6), length 44)
dnl 192.168.0.1.80 > 192.168.0.2.0: Flags [none], cksum 0x7744 (correct), seq 42:46, win 10000, length 4
AT_CHECK([ovs-ofctl monitor br0 65534 -P nxt_packet_in --detach --pidfile 2> ofctl_monitor.log])
dnl Modified MPLS pop action.
dnl The input is a frame with three MPLS label stack entries which tcpdump -vve shows as:
dnl 60:66:66:66:03:10 > 50:54:00:00:00:00, ethertype MPLS unicast (0x8847), length 66: MPLS (label 20, exp 0, ttl 32)
-dnl (label 20, exp 0, ttl 31)
-dnl (label 20, exp 0, [S], ttl 30)
-dnl (tos 0x0, ttl 254, id 0, offset 0, flags [none], proto TCP (6), length 44)
+dnl (label 20, exp 0, ttl 31)
+dnl (label 20, exp 0, [S], ttl 30)
+dnl (tos 0x0, ttl 254, id 0, offset 0, flags [none], proto TCP (6), length 44)
dnl 192.168.0.1.80 > 192.168.0.2.0: Flags [none], cksum 0x7744 (correct), seq 42:46, win 10000, length 4
AT_CHECK([ovs-ofctl monitor br0 65534 -P nxt_packet_in --detach --pidfile 2> ofctl_monitor.log])
add_of_ports br0 1 2 3
ovs-vsctl \
-- set Bridge br0 fail-mode=standalone mirrors=@m1,@m2 \
- -- --id=@m1 create Mirror name=m1 select_all=true output_vlan=500 \
- -- --id=@m2 create Mirror name=m2 select_all=true output_vlan=501 \
- -- set Port br0 tag=0 \
- -- set Port p1 tag=0 \
- -- set Port p2 tag=500 \
- -- set Port p3 tag=501
+ -- --id=@m1 create Mirror name=m1 select_all=true output_vlan=500 \
+ -- --id=@m2 create Mirror name=m2 select_all=true output_vlan=501 \
+ -- set Port br0 tag=0 \
+ -- set Port p1 tag=0 \
+ -- set Port p2 tag=500 \
+ -- set Port p3 tag=501
flow='in_port=1'
AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
OVS_APP_EXIT_AND_WAIT([test-sflow])
AT_CHECK_UNQUOTED([[sort sflow.log | $EGREP 'HEADER|ERROR' | sed 's/ /\
- /g']], [0], [dnl
+ /g']], [0], [dnl
HEADER
- dgramSeqNo=1
- ds=127.0.0.1>2:1000
- fsSeqNo=1
- in_vlan=0
- in_priority=0
- out_vlan=0
- out_priority=0
- meanSkip=1
- samplePool=1
- dropEvents=0
- in_ifindex=1004
- in_format=0
- out_ifindex=2
- out_format=2
- hdr_prot=1
- pkt_len=46
- stripped=4
- hdr_len=42
- hdr=FF-FF-FF-FF-FF-FF-50-54-00-00-00-05-08-06-00-01-08-00-06-04-00-01-50-54-00-00-00-05-C0-A8-00-02-00-00-00-00-00-00-C0-A8-00-01
+ dgramSeqNo=1
+ ds=127.0.0.1>2:1000
+ fsSeqNo=1
+ in_vlan=0
+ in_priority=0
+ out_vlan=0
+ out_priority=0
+ meanSkip=1
+ samplePool=1
+ dropEvents=0
+ in_ifindex=1004
+ in_format=0
+ out_ifindex=2
+ out_format=2
+ hdr_prot=1
+ pkt_len=46
+ stripped=4
+ hdr_len=42
+ hdr=FF-FF-FF-FF-FF-FF-50-54-00-00-00-05-08-06-00-01-08-00-06-04-00-01-50-54-00-00-00-05-C0-A8-00-02-00-00-00-00-00-00-C0-A8-00-01
HEADER
- dgramSeqNo=1
- ds=127.0.0.1>2:1000
- fsSeqNo=2
- in_vlan=0
- in_priority=0
- out_vlan=0
- out_priority=0
- meanSkip=1
- samplePool=2
- dropEvents=0
- in_ifindex=1003
- in_format=0
- out_ifindex=2
- out_format=2
- hdr_prot=1
- pkt_len=46
- stripped=4
- hdr_len=42
- hdr=FF-FF-FF-FF-FF-FF-50-54-00-00-00-07-08-06-00-01-08-00-06-04-00-01-50-54-00-00-00-07-C0-A8-00-01-00-00-00-00-00-00-C0-A8-00-02
+ dgramSeqNo=1
+ ds=127.0.0.1>2:1000
+ fsSeqNo=2
+ in_vlan=0
+ in_priority=0
+ out_vlan=0
+ out_priority=0
+ meanSkip=1
+ samplePool=2
+ dropEvents=0
+ in_ifindex=1003
+ in_format=0
+ out_ifindex=2
+ out_format=2
+ hdr_prot=1
+ pkt_len=46
+ stripped=4
+ hdr_len=42
+ hdr=FF-FF-FF-FF-FF-FF-50-54-00-00-00-07-08-06-00-01-08-00-06-04-00-01-50-54-00-00-00-07-C0-A8-00-01-00-00-00-00-00-00-C0-A8-00-02
HEADER
- dgramSeqNo=1
- ds=127.0.0.1>2:1000
- fsSeqNo=3
- in_vlan=0
- in_priority=0
- out_vlan=0
- out_priority=0
- meanSkip=1
- samplePool=3
- dropEvents=0
- in_ifindex=1004
- in_format=0
- out_ifindex=1003
- out_format=0
- hdr_prot=1
- pkt_len=110
- stripped=4
- hdr_len=106
- hdr=50-54-00-00-00-07-50-54-00-00-00-05-08-00-45-00-00-5C-00-00-00-00-40-01-F9-4D-C0-A8-00-01-C0-A8-00-02-08-00-13-FC-00-00-00-00-00-01-02-03-04-05-06-07-08-09-0A-0B-0C-0D-0E-0F-10-11-12-13-14-15-16-17-18-19-1A-1B-1C-1D-1E-1F-20-21-22-23-24-25-26-27-28-29-2A-2B-2C-2D-2E-2F-30-31-32-33-34-35-36-37-38-39-3A-3B-3C-3D-3E-3F
+ dgramSeqNo=1
+ ds=127.0.0.1>2:1000
+ fsSeqNo=3
+ in_vlan=0
+ in_priority=0
+ out_vlan=0
+ out_priority=0
+ meanSkip=1
+ samplePool=3
+ dropEvents=0
+ in_ifindex=1004
+ in_format=0
+ out_ifindex=1003
+ out_format=0
+ hdr_prot=1
+ pkt_len=110
+ stripped=4
+ hdr_len=106
+ hdr=50-54-00-00-00-07-50-54-00-00-00-05-08-00-45-00-00-5C-00-00-00-00-40-01-F9-4D-C0-A8-00-01-C0-A8-00-02-08-00-13-FC-00-00-00-00-00-01-02-03-04-05-06-07-08-09-0A-0B-0C-0D-0E-0F-10-11-12-13-14-15-16-17-18-19-1A-1B-1C-1D-1E-1F-20-21-22-23-24-25-26-27-28-29-2A-2B-2C-2D-2E-2F-30-31-32-33-34-35-36-37-38-39-3A-3B-3C-3D-3E-3F
HEADER
- dgramSeqNo=1
- ds=127.0.0.1>2:1000
- fsSeqNo=4
- in_vlan=0
- in_priority=0
- out_vlan=0
- out_priority=0
- meanSkip=1
- samplePool=4
- dropEvents=0
- in_ifindex=1003
- in_format=0
- out_ifindex=1004
- out_format=0
- hdr_prot=1
- pkt_len=110
- stripped=4
- hdr_len=106
- hdr=50-54-00-00-00-05-50-54-00-00-00-07-08-00-45-00-00-5C-00-00-00-00-40-01-F9-4D-C0-A8-00-02-C0-A8-00-01-00-00-1B-FC-00-00-00-00-00-01-02-03-04-05-06-07-08-09-0A-0B-0C-0D-0E-0F-10-11-12-13-14-15-16-17-18-19-1A-1B-1C-1D-1E-1F-20-21-22-23-24-25-26-27-28-29-2A-2B-2C-2D-2E-2F-30-31-32-33-34-35-36-37-38-39-3A-3B-3C-3D-3E-3F
+ dgramSeqNo=1
+ ds=127.0.0.1>2:1000
+ fsSeqNo=4
+ in_vlan=0
+ in_priority=0
+ out_vlan=0
+ out_priority=0
+ meanSkip=1
+ samplePool=4
+ dropEvents=0
+ in_ifindex=1003
+ in_format=0
+ out_ifindex=1004
+ out_format=0
+ hdr_prot=1
+ pkt_len=110
+ stripped=4
+ hdr_len=106
+ hdr=50-54-00-00-00-05-50-54-00-00-00-07-08-00-45-00-00-5C-00-00-00-00-40-01-F9-4D-C0-A8-00-02-C0-A8-00-01-00-00-1B-FC-00-00-00-00-00-01-02-03-04-05-06-07-08-09-0A-0B-0C-0D-0E-0F-10-11-12-13-14-15-16-17-18-19-1A-1B-1C-1D-1E-1F-20-21-22-23-24-25-26-27-28-29-2A-2B-2C-2D-2E-2F-30-31-32-33-34-35-36-37-38-39-3A-3B-3C-3D-3E-3F
HEADER
- dgramSeqNo=1
- ds=127.0.0.1>2:1000
- fsSeqNo=5
- in_vlan=0
- in_priority=0
- out_vlan=0
- out_priority=0
- meanSkip=1
- samplePool=5
- dropEvents=0
- in_ifindex=1003
- in_format=0
- out_ifindex=1004
- out_format=0
- hdr_prot=1
- pkt_len=58
- stripped=4
- hdr_len=54
- hdr=50-54-00-00-00-05-50-54-00-00-00-07-86-DD-67-00-00-00-00-00-0A-80-FE-80-00-00-00-00-00-00-00-00-00-00-00-00-00-01-FE-80-00-00-00-00-00-00-00-00-00-00-00-00-00-02
+ dgramSeqNo=1
+ ds=127.0.0.1>2:1000
+ fsSeqNo=5
+ in_vlan=0
+ in_priority=0
+ out_vlan=0
+ out_priority=0
+ meanSkip=1
+ samplePool=5
+ dropEvents=0
+ in_ifindex=1003
+ in_format=0
+ out_ifindex=1004
+ out_format=0
+ hdr_prot=1
+ pkt_len=58
+ stripped=4
+ hdr_len=54
+ hdr=50-54-00-00-00-05-50-54-00-00-00-07-86-DD-67-00-00-00-00-00-0A-80-FE-80-00-00-00-00-00-00-00-00-00-00-00-00-00-01-FE-80-00-00-00-00-00-00-00-00-00-00-00-00-00-02
])
AT_CHECK_UNQUOTED([[sort sflow.log | $EGREP 'ETHCOUNTERS|IFCOUNTERS|ERROR|PORTNAME|OPENFLOWPORT' | head -24 | sed 's/ /\
- /g']], [0], [dnl
+ /g']], [0], [dnl
ETHCOUNTERS
- dot3StatsAlignmentErrors=4294967295
- dot3StatsFCSErrors=4294967295
- dot3StatsSingleCollisionFrames=4294967295
- dot3StatsMultipleCollisionFrames=4294967295
- dot3StatsSQETestErrors=4294967295
- dot3StatsDeferredTransmissions=4294967295
- dot3StatsLateCollisions=4294967295
- dot3StatsExcessiveCollisions=4294967295
- dot3StatsInternalMacTransmitErrors=4294967295
- dot3StatsCarrierSenseErrors=4294967295
- dot3StatsFrameTooLongs=4294967295
- dot3StatsInternalMacReceiveErrors=4294967295
- dot3StatsSymbolErrors=4294967295
+ dot3StatsAlignmentErrors=4294967295
+ dot3StatsFCSErrors=4294967295
+ dot3StatsSingleCollisionFrames=4294967295
+ dot3StatsMultipleCollisionFrames=4294967295
+ dot3StatsSQETestErrors=4294967295
+ dot3StatsDeferredTransmissions=4294967295
+ dot3StatsLateCollisions=4294967295
+ dot3StatsExcessiveCollisions=4294967295
+ dot3StatsInternalMacTransmitErrors=4294967295
+ dot3StatsCarrierSenseErrors=4294967295
+ dot3StatsFrameTooLongs=4294967295
+ dot3StatsInternalMacReceiveErrors=4294967295
+ dot3StatsSymbolErrors=4294967295
ETHCOUNTERS
- dot3StatsAlignmentErrors=4294967295
- dot3StatsFCSErrors=4294967295
- dot3StatsSingleCollisionFrames=4294967295
- dot3StatsMultipleCollisionFrames=4294967295
- dot3StatsSQETestErrors=4294967295
- dot3StatsDeferredTransmissions=4294967295
- dot3StatsLateCollisions=4294967295
- dot3StatsExcessiveCollisions=4294967295
- dot3StatsInternalMacTransmitErrors=4294967295
- dot3StatsCarrierSenseErrors=4294967295
- dot3StatsFrameTooLongs=4294967295
- dot3StatsInternalMacReceiveErrors=4294967295
- dot3StatsSymbolErrors=4294967295
+ dot3StatsAlignmentErrors=4294967295
+ dot3StatsFCSErrors=4294967295
+ dot3StatsSingleCollisionFrames=4294967295
+ dot3StatsMultipleCollisionFrames=4294967295
+ dot3StatsSQETestErrors=4294967295
+ dot3StatsDeferredTransmissions=4294967295
+ dot3StatsLateCollisions=4294967295
+ dot3StatsExcessiveCollisions=4294967295
+ dot3StatsInternalMacTransmitErrors=4294967295
+ dot3StatsCarrierSenseErrors=4294967295
+ dot3StatsFrameTooLongs=4294967295
+ dot3StatsInternalMacReceiveErrors=4294967295
+ dot3StatsSymbolErrors=4294967295
ETHCOUNTERS
- dot3StatsAlignmentErrors=4294967295
- dot3StatsFCSErrors=4294967295
- dot3StatsSingleCollisionFrames=4294967295
- dot3StatsMultipleCollisionFrames=4294967295
- dot3StatsSQETestErrors=4294967295
- dot3StatsDeferredTransmissions=4294967295
- dot3StatsLateCollisions=4294967295
- dot3StatsExcessiveCollisions=4294967295
- dot3StatsInternalMacTransmitErrors=4294967295
- dot3StatsCarrierSenseErrors=4294967295
- dot3StatsFrameTooLongs=4294967295
- dot3StatsInternalMacReceiveErrors=4294967295
- dot3StatsSymbolErrors=4294967295
+ dot3StatsAlignmentErrors=4294967295
+ dot3StatsFCSErrors=4294967295
+ dot3StatsSingleCollisionFrames=4294967295
+ dot3StatsMultipleCollisionFrames=4294967295
+ dot3StatsSQETestErrors=4294967295
+ dot3StatsDeferredTransmissions=4294967295
+ dot3StatsLateCollisions=4294967295
+ dot3StatsExcessiveCollisions=4294967295
+ dot3StatsInternalMacTransmitErrors=4294967295
+ dot3StatsCarrierSenseErrors=4294967295
+ dot3StatsFrameTooLongs=4294967295
+ dot3StatsInternalMacReceiveErrors=4294967295
+ dot3StatsSymbolErrors=4294967295
ETHCOUNTERS
- dot3StatsAlignmentErrors=4294967295
- dot3StatsFCSErrors=4294967295
- dot3StatsSingleCollisionFrames=4294967295
- dot3StatsMultipleCollisionFrames=4294967295
- dot3StatsSQETestErrors=4294967295
- dot3StatsDeferredTransmissions=4294967295
- dot3StatsLateCollisions=4294967295
- dot3StatsExcessiveCollisions=4294967295
- dot3StatsInternalMacTransmitErrors=4294967295
- dot3StatsCarrierSenseErrors=4294967295
- dot3StatsFrameTooLongs=4294967295
- dot3StatsInternalMacReceiveErrors=4294967295
- dot3StatsSymbolErrors=4294967295
+ dot3StatsAlignmentErrors=4294967295
+ dot3StatsFCSErrors=4294967295
+ dot3StatsSingleCollisionFrames=4294967295
+ dot3StatsMultipleCollisionFrames=4294967295
+ dot3StatsSQETestErrors=4294967295
+ dot3StatsDeferredTransmissions=4294967295
+ dot3StatsLateCollisions=4294967295
+ dot3StatsExcessiveCollisions=4294967295
+ dot3StatsInternalMacTransmitErrors=4294967295
+ dot3StatsCarrierSenseErrors=4294967295
+ dot3StatsFrameTooLongs=4294967295
+ dot3StatsInternalMacReceiveErrors=4294967295
+ dot3StatsSymbolErrors=4294967295
ETHCOUNTERS
- dot3StatsAlignmentErrors=4294967295
- dot3StatsFCSErrors=4294967295
- dot3StatsSingleCollisionFrames=4294967295
- dot3StatsMultipleCollisionFrames=4294967295
- dot3StatsSQETestErrors=4294967295
- dot3StatsDeferredTransmissions=4294967295
- dot3StatsLateCollisions=4294967295
- dot3StatsExcessiveCollisions=4294967295
- dot3StatsInternalMacTransmitErrors=4294967295
- dot3StatsCarrierSenseErrors=4294967295
- dot3StatsFrameTooLongs=4294967295
- dot3StatsInternalMacReceiveErrors=4294967295
- dot3StatsSymbolErrors=4294967295
+ dot3StatsAlignmentErrors=4294967295
+ dot3StatsFCSErrors=4294967295
+ dot3StatsSingleCollisionFrames=4294967295
+ dot3StatsMultipleCollisionFrames=4294967295
+ dot3StatsSQETestErrors=4294967295
+ dot3StatsDeferredTransmissions=4294967295
+ dot3StatsLateCollisions=4294967295
+ dot3StatsExcessiveCollisions=4294967295
+ dot3StatsInternalMacTransmitErrors=4294967295
+ dot3StatsCarrierSenseErrors=4294967295
+ dot3StatsFrameTooLongs=4294967295
+ dot3StatsInternalMacReceiveErrors=4294967295
+ dot3StatsSymbolErrors=4294967295
ETHCOUNTERS
- dot3StatsAlignmentErrors=4294967295
- dot3StatsFCSErrors=4294967295
- dot3StatsSingleCollisionFrames=4294967295
- dot3StatsMultipleCollisionFrames=4294967295
- dot3StatsSQETestErrors=4294967295
- dot3StatsDeferredTransmissions=4294967295
- dot3StatsLateCollisions=4294967295
- dot3StatsExcessiveCollisions=4294967295
- dot3StatsInternalMacTransmitErrors=4294967295
- dot3StatsCarrierSenseErrors=4294967295
- dot3StatsFrameTooLongs=4294967295
- dot3StatsInternalMacReceiveErrors=4294967295
- dot3StatsSymbolErrors=4294967295
+ dot3StatsAlignmentErrors=4294967295
+ dot3StatsFCSErrors=4294967295
+ dot3StatsSingleCollisionFrames=4294967295
+ dot3StatsMultipleCollisionFrames=4294967295
+ dot3StatsSQETestErrors=4294967295
+ dot3StatsDeferredTransmissions=4294967295
+ dot3StatsLateCollisions=4294967295
+ dot3StatsExcessiveCollisions=4294967295
+ dot3StatsInternalMacTransmitErrors=4294967295
+ dot3StatsCarrierSenseErrors=4294967295
+ dot3StatsFrameTooLongs=4294967295
+ dot3StatsInternalMacReceiveErrors=4294967295
+ dot3StatsSymbolErrors=4294967295
IFCOUNTERS
- dgramSeqNo=1
- ds=127.0.0.1>0:1003
- csSeqNo=1
- ifindex=1003
- type=6
- ifspeed=100000000
- direction=0
- status=0
- in_octets=202
- in_unicasts=3
- in_multicasts=4294967295
- in_broadcasts=4294967295
- in_discards=4294967295
- in_errors=4294967295
- in_unknownprotos=4294967295
- out_octets=148
- out_unicasts=2
- out_multicasts=4294967295
- out_broadcasts=4294967295
- out_discards=4294967295
- out_errors=4294967295
- promiscuous=0
+ dgramSeqNo=1
+ ds=127.0.0.1>0:1003
+ csSeqNo=1
+ ifindex=1003
+ type=6
+ ifspeed=100000000
+ direction=0
+ status=0
+ in_octets=202
+ in_unicasts=3
+ in_multicasts=4294967295
+ in_broadcasts=4294967295
+ in_discards=4294967295
+ in_errors=4294967295
+ in_unknownprotos=4294967295
+ out_octets=148
+ out_unicasts=2
+ out_multicasts=4294967295
+ out_broadcasts=4294967295
+ out_discards=4294967295
+ out_errors=4294967295
+ promiscuous=0
IFCOUNTERS
- dgramSeqNo=1
- ds=127.0.0.1>0:1004
- csSeqNo=1
- ifindex=1004
- type=6
- ifspeed=100000000
- direction=0
- status=0
- in_octets=148
- in_unicasts=2
- in_multicasts=4294967295
- in_broadcasts=4294967295
- in_discards=4294967295
- in_errors=4294967295
- in_unknownprotos=4294967295
- out_octets=202
- out_unicasts=3
- out_multicasts=4294967295
- out_broadcasts=4294967295
- out_discards=4294967295
- out_errors=4294967295
- promiscuous=0
+ dgramSeqNo=1
+ ds=127.0.0.1>0:1004
+ csSeqNo=1
+ ifindex=1004
+ type=6
+ ifspeed=100000000
+ direction=0
+ status=0
+ in_octets=148
+ in_unicasts=2
+ in_multicasts=4294967295
+ in_broadcasts=4294967295
+ in_discards=4294967295
+ in_errors=4294967295
+ in_unknownprotos=4294967295
+ out_octets=202
+ out_unicasts=3
+ out_multicasts=4294967295
+ out_broadcasts=4294967295
+ out_discards=4294967295
+ out_errors=4294967295
+ promiscuous=0
IFCOUNTERS
- dgramSeqNo=2
- ds=127.0.0.1>0:1002
- csSeqNo=1
- ifindex=1002
- type=6
- ifspeed=100000000
- direction=0
- status=0
- in_octets=0
- in_unicasts=0
- in_multicasts=4294967295
- in_broadcasts=4294967295
- in_discards=4294967295
- in_errors=4294967295
- in_unknownprotos=4294967295
- out_octets=84
- out_unicasts=2
- out_multicasts=4294967295
- out_broadcasts=4294967295
- out_discards=4294967295
- out_errors=4294967295
- promiscuous=0
+ dgramSeqNo=2
+ ds=127.0.0.1>0:1002
+ csSeqNo=1
+ ifindex=1002
+ type=6
+ ifspeed=100000000
+ direction=0
+ status=0
+ in_octets=0
+ in_unicasts=0
+ in_multicasts=4294967295
+ in_broadcasts=4294967295
+ in_discards=4294967295
+ in_errors=4294967295
+ in_unknownprotos=4294967295
+ out_octets=84
+ out_unicasts=2
+ out_multicasts=4294967295
+ out_broadcasts=4294967295
+ out_discards=4294967295
+ out_errors=4294967295
+ promiscuous=0
IFCOUNTERS
- dgramSeqNo=3
- ds=127.0.0.1>0:1002
- csSeqNo=2
- ifindex=1002
- type=6
- ifspeed=100000000
- direction=0
- status=0
- in_octets=0
- in_unicasts=0
- in_multicasts=4294967295
- in_broadcasts=4294967295
- in_discards=4294967295
- in_errors=4294967295
- in_unknownprotos=4294967295
- out_octets=84
- out_unicasts=2
- out_multicasts=4294967295
- out_broadcasts=4294967295
- out_discards=4294967295
- out_errors=4294967295
- promiscuous=0
+ dgramSeqNo=3
+ ds=127.0.0.1>0:1002
+ csSeqNo=2
+ ifindex=1002
+ type=6
+ ifspeed=100000000
+ direction=0
+ status=0
+ in_octets=0
+ in_unicasts=0
+ in_multicasts=4294967295
+ in_broadcasts=4294967295
+ in_discards=4294967295
+ in_errors=4294967295
+ in_unknownprotos=4294967295
+ out_octets=84
+ out_unicasts=2
+ out_multicasts=4294967295
+ out_broadcasts=4294967295
+ out_discards=4294967295
+ out_errors=4294967295
+ promiscuous=0
IFCOUNTERS
- dgramSeqNo=3
- ds=127.0.0.1>0:1003
- csSeqNo=2
- ifindex=1003
- type=6
- ifspeed=100000000
- direction=0
- status=0
- in_octets=202
- in_unicasts=3
- in_multicasts=4294967295
- in_broadcasts=4294967295
- in_discards=4294967295
- in_errors=4294967295
- in_unknownprotos=4294967295
- out_octets=148
- out_unicasts=2
- out_multicasts=4294967295
- out_broadcasts=4294967295
- out_discards=4294967295
- out_errors=4294967295
- promiscuous=0
+ dgramSeqNo=3
+ ds=127.0.0.1>0:1003
+ csSeqNo=2
+ ifindex=1003
+ type=6
+ ifspeed=100000000
+ direction=0
+ status=0
+ in_octets=202
+ in_unicasts=3
+ in_multicasts=4294967295
+ in_broadcasts=4294967295
+ in_discards=4294967295
+ in_errors=4294967295
+ in_unknownprotos=4294967295
+ out_octets=148
+ out_unicasts=2
+ out_multicasts=4294967295
+ out_broadcasts=4294967295
+ out_discards=4294967295
+ out_errors=4294967295
+ promiscuous=0
IFCOUNTERS
- dgramSeqNo=3
- ds=127.0.0.1>0:1004
- csSeqNo=2
- ifindex=1004
- type=6
- ifspeed=100000000
- direction=0
- status=0
- in_octets=148
- in_unicasts=2
- in_multicasts=4294967295
- in_broadcasts=4294967295
- in_discards=4294967295
- in_errors=4294967295
- in_unknownprotos=4294967295
- out_octets=202
- out_unicasts=3
- out_multicasts=4294967295
- out_broadcasts=4294967295
- out_discards=4294967295
- out_errors=4294967295
- promiscuous=0
+ dgramSeqNo=3
+ ds=127.0.0.1>0:1004
+ csSeqNo=2
+ ifindex=1004
+ type=6
+ ifspeed=100000000
+ direction=0
+ status=0
+ in_octets=148
+ in_unicasts=2
+ in_multicasts=4294967295
+ in_broadcasts=4294967295
+ in_discards=4294967295
+ in_errors=4294967295
+ in_unknownprotos=4294967295
+ out_octets=202
+ out_unicasts=3
+ out_multicasts=4294967295
+ out_broadcasts=4294967295
+ out_discards=4294967295
+ out_errors=4294967295
+ promiscuous=0
OPENFLOWPORT
- datapath_id=18364758544493064720
- port_no=1
+ datapath_id=18364758544493064720
+ port_no=1
OPENFLOWPORT
- datapath_id=18364758544493064720
- port_no=1
+ datapath_id=18364758544493064720
+ port_no=1
OPENFLOWPORT
- datapath_id=18364758544493064720
- port_no=2
+ datapath_id=18364758544493064720
+ port_no=2
OPENFLOWPORT
- datapath_id=18364758544493064720
- port_no=2
+ datapath_id=18364758544493064720
+ port_no=2
OPENFLOWPORT
- datapath_id=18364758544493064720
- port_no=65534
+ datapath_id=18364758544493064720
+ port_no=65534
OPENFLOWPORT
- datapath_id=18364758544493064720
- port_no=65534
+ datapath_id=18364758544493064720
+ port_no=65534
PORTNAME
- portName=br0
+ portName=br0
PORTNAME
- portName=br0
+ portName=br0
PORTNAME
- portName=p1
+ portName=p1
PORTNAME
- portName=p1
+ portName=p1
PORTNAME
- portName=p2
+ portName=p2
PORTNAME
- portName=p2
+ portName=p2
])])
AT_SETUP([ofproto-dpif - basic truncate action])
AT_SETUP([ofproto-dpif - sFlow packet sampling - LACP structures])
AT_SKIP_IF([test "$IS_WIN32" = "yes"])
OVS_VSWITCHD_START([dnl
- add-bond br0 bond p1 p2 -- \
- set Port bond lacp=active bond-mode=active-backup \
- other_config:lacp-time="fast" \
- other_config:lacp-system-id=11:22:33:44:55:66 \
- other_config:lacp-system-priority=54321 -- \
- set Interface p1 type=dummy \
- other_config:lacp-port-id=11 \
- other_config:lacp-port-priority=111 \
- other_config:lacp-aggregation-key=3333 -- \
- set Interface p2 type=dummy \
- other_config:lacp-port-id=22 \
- other_config:lacp-port-priority=222 \
- other_config:lacp-aggregation-key=3333 ])
+ add-bond br0 bond p1 p2 -- \
+ set Port bond lacp=active bond-mode=active-backup \
+ other_config:lacp-time="fast" \
+ other_config:lacp-system-id=11:22:33:44:55:66 \
+ other_config:lacp-system-priority=54321 -- \
+ set Interface p1 type=dummy \
+ other_config:lacp-port-id=11 \
+ other_config:lacp-port-priority=111 \
+ other_config:lacp-aggregation-key=3333 -- \
+ set Interface p2 type=dummy \
+ other_config:lacp-port-id=22 \
+ other_config:lacp-port-priority=222 \
+ other_config:lacp-aggregation-key=3333 ])
on_exit 'kill `cat test-sflow.pid`'
AT_CHECK([ovstest test-sflow --log-file --detach --no-chdir --pidfile 0:127.0.0.1 > sflow.log], [0], [], [ignore])
ovs-appctl time/stop
ovs-vsctl \
- set Interface p1 options:ifindex=1003 -- \
- set Bridge br0 sflow=@sf -- \
- --id=@sf create sflow targets=\"127.0.0.1:$SFLOW_PORT\" \
+ set Interface p1 options:ifindex=1003 -- \
+ set Bridge br0 sflow=@sf -- \
+ --id=@sf create sflow targets=\"127.0.0.1:$SFLOW_PORT\" \
header=128 sampling=1 polling=1 agent=127.0.0.1
dnl sleep long enough to get the sFlow datagram flushed out (may be delayed for up to 1 second)
OVS_VSWITCHD_STOP
OVS_APP_EXIT_AND_WAIT([test-sflow])
AT_CHECK([[sort sflow.log | $EGREP 'LACPCOUNTERS|ERROR' | head -n 1 | sed 's/ /\
- /g']], [0], [dnl
+ /g']], [0], [dnl
LACPCOUNTERS
- sysID=11:22:33:44:55:66
- partnerID=00:00:00:00:00:00
- aggID=3333
- actorAdmin=0x7
- actorOper=0xbf
- partnerAdmin=0x0
- partnerOper=0x2
- LACPDUsRx=0
- markerPDUsRx=4294967295
- markerRespPDUsRx=4294967295
- unknownRx=4294967295
- illegalRx=0
- LACPDUsTx=1
- markerPDUsTx=4294967295
- markerRespPDUsTx=4294967295
+ sysID=11:22:33:44:55:66
+ partnerID=00:00:00:00:00:00
+ aggID=3333
+ actorAdmin=0x7
+ actorOper=0xbf
+ partnerAdmin=0x0
+ partnerOper=0x2
+ LACPDUsRx=0
+ markerPDUsRx=4294967295
+ markerRespPDUsRx=4294967295
+ unknownRx=4294967295
+ illegalRx=0
+ LACPDUsTx=1
+ markerPDUsTx=4294967295
+ markerRespPDUsTx=4294967295
])
AT_CLEANUP
OVS_VSWITCHD_DISABLE_TUNNEL_PUSH_POP
AT_CHECK([ovs-vsctl add-port br0 gre0 -- set Interface gre0 type=gre \
- options:remote_ip=1.1.1.1 options:key=456 ofport_request=3])
+ options:remote_ip=1.1.1.1 options:key=456 ofport_request=3])
AT_CHECK([ovs-vsctl add-port br0 p1 -- set Interface p1 type=dummy ofport_request=4])
AT_CHECK([ovs-ofctl add-flow br0 action=3])
OVS_APP_EXIT_AND_WAIT([test-sflow])
AT_CHECK_UNQUOTED([[sort sflow.log | $EGREP 'HEADER|ERROR' | sed 's/ /\
- /g']], [0], [dnl
+ /g']], [0], [dnl
HEADER
- dgramSeqNo=1
- ds=127.0.0.1>2:1000
- fsSeqNo=1
- tunnel4_out_length=0
- tunnel4_out_protocol=47
- tunnel4_out_src=0.0.0.0
- tunnel4_out_dst=1.1.1.1
- tunnel4_out_src_port=0
- tunnel4_out_dst_port=0
- tunnel4_out_tcp_flags=0
- tunnel4_out_tos=1
- tunnel_out_vni=456
- in_vlan=0
- in_priority=0
- out_vlan=0
- out_priority=0
- meanSkip=1
- samplePool=1
- dropEvents=0
- in_ifindex=0
- in_format=0
- out_ifindex=1
- out_format=2
- hdr_prot=1
- pkt_len=110
- stripped=4
- hdr_len=106
- hdr=50-54-00-00-00-0A-50-54-00-00-00-09-08-00-45-01-00-5C-00-00-00-00-80-01-12-8A-0A-0A-0A-02-0A-0A-0A-01-08-00-13-FC-00-00-00-00-00-01-02-03-04-05-06-07-08-09-0A-0B-0C-0D-0E-0F-10-11-12-13-14-15-16-17-18-19-1A-1B-1C-1D-1E-1F-20-21-22-23-24-25-26-27-28-29-2A-2B-2C-2D-2E-2F-30-31-32-33-34-35-36-37-38-39-3A-3B-3C-3D-3E-3F
+ dgramSeqNo=1
+ ds=127.0.0.1>2:1000
+ fsSeqNo=1
+ tunnel4_out_length=0
+ tunnel4_out_protocol=47
+ tunnel4_out_src=0.0.0.0
+ tunnel4_out_dst=1.1.1.1
+ tunnel4_out_src_port=0
+ tunnel4_out_dst_port=0
+ tunnel4_out_tcp_flags=0
+ tunnel4_out_tos=1
+ tunnel_out_vni=456
+ in_vlan=0
+ in_priority=0
+ out_vlan=0
+ out_priority=0
+ meanSkip=1
+ samplePool=1
+ dropEvents=0
+ in_ifindex=0
+ in_format=0
+ out_ifindex=1
+ out_format=2
+ hdr_prot=1
+ pkt_len=110
+ stripped=4
+ hdr_len=106
+ hdr=50-54-00-00-00-0A-50-54-00-00-00-09-08-00-45-01-00-5C-00-00-00-00-80-01-12-8A-0A-0A-0A-02-0A-0A-0A-01-08-00-13-FC-00-00-00-00-00-01-02-03-04-05-06-07-08-09-0A-0B-0C-0D-0E-0F-10-11-12-13-14-15-16-17-18-19-1A-1B-1C-1D-1E-1F-20-21-22-23-24-25-26-27-28-29-2A-2B-2C-2D-2E-2F-30-31-32-33-34-35-36-37-38-39-3A-3B-3C-3D-3E-3F
])
OVS_VSWITCHD_STOP
OVS_APP_EXIT_AND_WAIT([test-sflow])
AT_CHECK_UNQUOTED([[sort sflow.log | $EGREP 'HEADER|ERROR' | sed 's/ /\
- /g']], [0], [dnl
+ /g']], [0], [dnl
HEADER
- dgramSeqNo=1
- ds=127.0.0.1>2:1000
- fsSeqNo=1
- tunnel4_out_length=0
- tunnel4_out_protocol=47
- tunnel4_out_src=1.1.2.88
- tunnel4_out_dst=1.1.2.92
- tunnel4_out_src_port=0
- tunnel4_out_dst_port=0
- tunnel4_out_tcp_flags=0
- tunnel4_out_tos=0
- tunnel_out_vni=456
- in_vlan=0
- in_priority=0
- out_vlan=0
- out_priority=0
- meanSkip=1
- samplePool=1
- dropEvents=0
- in_ifindex=2011
- in_format=0
- out_ifindex=1
- out_format=2
- hdr_prot=1
- pkt_len=110
- stripped=4
- hdr_len=106
- hdr=50-54-00-00-00-0A-50-54-00-00-00-05-08-00-45-00-00-5C-00-00-00-00-80-01-B6-4D-C0-A8-01-01-C0-A8-02-02-08-00-13-FC-00-00-00-00-00-01-02-03-04-05-06-07-08-09-0A-0B-0C-0D-0E-0F-10-11-12-13-14-15-16-17-18-19-1A-1B-1C-1D-1E-1F-20-21-22-23-24-25-26-27-28-29-2A-2B-2C-2D-2E-2F-30-31-32-33-34-35-36-37-38-39-3A-3B-3C-3D-3E-3F
+ dgramSeqNo=1
+ ds=127.0.0.1>2:1000
+ fsSeqNo=1
+ tunnel4_out_length=0
+ tunnel4_out_protocol=47
+ tunnel4_out_src=1.1.2.88
+ tunnel4_out_dst=1.1.2.92
+ tunnel4_out_src_port=0
+ tunnel4_out_dst_port=0
+ tunnel4_out_tcp_flags=0
+ tunnel4_out_tos=0
+ tunnel_out_vni=456
+ in_vlan=0
+ in_priority=0
+ out_vlan=0
+ out_priority=0
+ meanSkip=1
+ samplePool=1
+ dropEvents=0
+ in_ifindex=2011
+ in_format=0
+ out_ifindex=1
+ out_format=2
+ hdr_prot=1
+ pkt_len=110
+ stripped=4
+ hdr_len=106
+ hdr=50-54-00-00-00-0A-50-54-00-00-00-05-08-00-45-00-00-5C-00-00-00-00-80-01-B6-4D-C0-A8-01-01-C0-A8-02-02-08-00-13-FC-00-00-00-00-00-01-02-03-04-05-06-07-08-09-0A-0B-0C-0D-0E-0F-10-11-12-13-14-15-16-17-18-19-1A-1B-1C-1D-1E-1F-20-21-22-23-24-25-26-27-28-29-2A-2B-2C-2D-2E-2F-30-31-32-33-34-35-36-37-38-39-3A-3B-3C-3D-3E-3F
])
OVS_VSWITCHD_STOP
OVS_APP_EXIT_AND_WAIT([test-sflow])
AT_CHECK_UNQUOTED([[sort sflow.log | $EGREP 'HEADER|ERROR' | sed 's/ /\
- /g']], [0], [dnl
+ /g']], [0], [dnl
HEADER
- dgramSeqNo=1
- ds=127.0.0.1>2:1000
- fsSeqNo=1
- mpls_label_0=789
- mpls_tc_0=4
- mpls_ttl_0=32
- mpls_bos_0=0
- mpls_label_1=11
- mpls_tc_1=3
- mpls_ttl_1=64
- mpls_bos_1=1
- in_vlan=0
- in_priority=0
- out_vlan=0
- out_priority=0
- meanSkip=1
- samplePool=1
- dropEvents=0
- in_ifindex=0
- in_format=0
- out_ifindex=1
- out_format=2
- hdr_prot=1
- pkt_len=22
- stripped=4
- hdr_len=18
- hdr=50-54-00-00-00-0A-50-54-00-00-00-09-88-47-00-00-B7-40
+ dgramSeqNo=1
+ ds=127.0.0.1>2:1000
+ fsSeqNo=1
+ mpls_label_0=789
+ mpls_tc_0=4
+ mpls_ttl_0=32
+ mpls_bos_0=0
+ mpls_label_1=11
+ mpls_tc_1=3
+ mpls_ttl_1=64
+ mpls_bos_1=1
+ in_vlan=0
+ in_priority=0
+ out_vlan=0
+ out_priority=0
+ meanSkip=1
+ samplePool=1
+ dropEvents=0
+ in_ifindex=0
+ in_format=0
+ out_ifindex=1
+ out_format=2
+ hdr_prot=1
+ pkt_len=22
+ stripped=4
+ hdr_len=18
+ hdr=50-54-00-00-00-0A-50-54-00-00-00-09-88-47-00-00-B7-40
HEADER
- dgramSeqNo=1
- ds=127.0.0.1>2:1000
- fsSeqNo=2
- mpls_label_0=789
- mpls_tc_0=4
- mpls_ttl_0=32
- mpls_bos_0=1
- in_vlan=0
- in_priority=0
- out_vlan=0
- out_priority=0
- meanSkip=1
- samplePool=2
- dropEvents=0
- in_ifindex=0
- in_format=0
- out_ifindex=1
- out_format=2
- hdr_prot=1
- pkt_len=38
- stripped=4
- hdr_len=34
- hdr=50-54-00-00-00-0A-50-54-00-00-00-09-08-00-45-00-00-14-00-00-00-00-00-00-BA-EB-00-00-00-00-00-00-00-00
+ dgramSeqNo=1
+ ds=127.0.0.1>2:1000
+ fsSeqNo=2
+ mpls_label_0=789
+ mpls_tc_0=4
+ mpls_ttl_0=32
+ mpls_bos_0=1
+ in_vlan=0
+ in_priority=0
+ out_vlan=0
+ out_priority=0
+ meanSkip=1
+ samplePool=2
+ dropEvents=0
+ in_ifindex=0
+ in_format=0
+ out_ifindex=1
+ out_format=2
+ hdr_prot=1
+ pkt_len=38
+ stripped=4
+ hdr_len=34
+ hdr=50-54-00-00-00-0A-50-54-00-00-00-09-08-00-45-00-00-14-00-00-00-00-00-00-BA-EB-00-00-00-00-00-00-00-00
])
OVS_VSWITCHD_STOP
AT_CHECK([ovs-ofctl monitor br0 65534 invalid_ttl -P nxt_packet_in --detach --no-chdir --pidfile 2> ofctl_monitor.log])
for i in 1 2 3; do
- AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 CONTROLLER controller '50540000000a5054000000091234'])
+ AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 CONTROLLER controller '50540000000a5054000000091234'])
done
OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
AT_CHECK([ovs-ofctl monitor br1 65534 invalid_ttl -P nxt_packet_in --detach --no-chdir --pidfile 2> ofctl_monitor.log])
for i in 1 2 3; do
- AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 CONTROLLER output:1 '50540000000a5054000000091234'])
+ AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 CONTROLLER output:1 '50540000000a5054000000091234'])
done
OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
local mac=aa:55:aa:55:00:0$brnum
ovs-vsctl --timeout=20 \
-- add-br $br \
- -- set bridge $br datapath-type=dummy \
- fail-mode=secure \
- other-config:datapath-id=$dpid \
- other-config:hwaddr=$mac \
- protocols="[[OpenFlow10,OpenFlow11,OpenFlow12,\
+ -- set bridge $br datapath-type=dummy \
+ fail-mode=secure \
+ other-config:datapath-id=$dpid \
+ other-config:hwaddr=$mac \
+ protocols="[[OpenFlow10,OpenFlow11,OpenFlow12,\
OpenFlow13,OpenFlow14,OpenFlow15,\
OpenFlow16]]" \
-- "$@"
m4_define([WAIT_FOR_DUMMY_PORTS], \
[m4_foreach([dummy_port], [$@],
[ \
- OVS_WAIT_WHILE([ovs-appctl netdev-dummy/conn-state dummy_port \
+ OVS_WAIT_WHILE([ovs-appctl netdev-dummy/conn-state dummy_port \
| grep 'unknown\|disconnected'])])])
if test X"$1" = X"OFPTR_VACANCY_UP"; then shift;
ovs-vsctl -- --id=@t1 create Flow_Table flow-limit=10 -- set bridge br0 flow_tables:1=@t1
- # Turn on vacancy events, then add flows until we're full.
- # With initial vacancy of 100% and vacancy_up of 80%, so that
- # vacancy >= vacancy_up, this enables VACANY_DOWN events, so
- # we get a single such message when vacancy dips below 20%.
+ # Turn on vacancy events, then add flows until we're full.
+ # With initial vacancy of 100% and vacancy_up of 80%, so that
+ # vacancy >= vacancy_up, this enables VACANY_DOWN events, so
+ # we get a single such message when vacancy dips below 20%.
ovs-ofctl -O OpenFlow14 mod-table br0 1 vacancy:20,80
ovs-ofctl -O OpenFlow14 add-flow br0 table=1,in_port=1,actions=2
ovs-ofctl -O OpenFlow14 add-flow br0 table=1,in_port=2,actions=2
eviction=off eviction_flags=OTHER|IMPORTANCE|LIFETIME
vacancy=on vacancy_down=20% vacancy_up=80% vacancy=10%"
# Then delete flows until we're empty. Sending the
- # VACANCY_DOWN message enabled VACANCY_UP events, so we get a
- # single such message when vacancy rises above 80%.
+ # VACANCY_DOWN message enabled VACANCY_UP events, so we get a
+ # single such message when vacancy rises above 80%.
ovs-ofctl -O OpenFlow14 del-flows br0 table=1,in_port=1
ovs-ofctl -O OpenFlow14 del-flows br0 table=1,in_port=2
ovs-ofctl -O OpenFlow14 del-flows br0 table=1,in_port=3
vacancy=on vacancy_down=20% vacancy_up=80% vacancy=90%"
# Now approach vacancy from the other direction. First
- # disable vacancy events. With initial vacancy of 70%, so
- # that vacancy < vacancy_up, this enables VACANCY_UP events.
- # That means that filling up the table generates no message,
- # but deleting all the flows generates VACANCY_UP at the point
- # vacancy rises above 80%.
+ # disable vacancy events. With initial vacancy of 70%, so
+ # that vacancy < vacancy_up, this enables VACANCY_UP events.
+ # That means that filling up the table generates no message,
+ # but deleting all the flows generates VACANCY_UP at the point
+ # vacancy rises above 80%.
ovs-ofctl -O OpenFlow14 mod-table br0 1 novacancy
ovs-ofctl -O OpenFlow14 add-flow br0 table=1,in_port=1,actions=2
ovs-ofctl -O OpenFlow14 add-flow br0 table=1,in_port=2,actions=2
set_and_check_specific_ofports () {
ovs-vsctl set Interface p1 ofport_request="$1" -- \
- set Interface p2 ofport_request="$2" -- \
- set Interface p3 ofport_request="$3"
+ set Interface p2 ofport_request="$2" -- \
+ set Interface p3 ofport_request="$3"
ofports=`ovs-vsctl get Interface p1 ofport -- \
- get Interface p2 ofport -- \
- get Interface p3 ofport`
+ get Interface p2 ofport -- \
+ get Interface p3 ofport`
AT_CHECK_UNQUOTED([echo $ofports], [0], [$1 $2 $3
])
}
for post in '1 2 3' '1 3 2' '2 1 3' '2 3 1' '3 1 2' '3 2 1'; do
echo -----------------------------------------------------------
echo "Check changing port numbers from $pre to $post"
- set_and_check_specific_ofports $pre
- set_and_check_specific_ofports $post
+ set_and_check_specific_ofports $pre
+ set_and_check_specific_ofports $post
done
done
set_and_check_poorly_specified_ofports () {
ovs-vsctl set Interface p1 ofport_request="$1" -- \
- set Interface p2 ofport_request="$2"
+ set Interface p2 ofport_request="$2"
p1=`ovs-vsctl get Interface p1 ofport`
p2=`ovs-vsctl get Interface p2 ofport`
echo $p1 $p2
AT_CHECK([test "$p1" != "$p2"])
if test "$1" = "$2" && test "$1" != '[[]]'; then
# One port number must be the requested one.
- AT_CHECK([test "$p1" = "$1" || test "$p2" = "$1"])
- # The other port number must be different (already tested above).
+ AT_CHECK([test "$p1" = "$1" || test "$p2" = "$1"])
+ # The other port number must be different (already tested above).
else
AT_CHECK([test "$1" = '[[]]' || test "$p1" = "$1"])
AT_CHECK([test "$2" = '[[]]' || test "$p2" = "$2"])
# Prints the name of the logical switch that contains LSP.
lsp_to_ls () {
case $1 in dnl (
- lp?[[12]]) echo ls1 ;; dnl (
- lp?[[34]]) echo ls2 ;; dnl (
- lp?5) echo ls3 ;; dnl (
- *) AT_FAIL_IF([:]) ;;
+ lp?[[12]]) echo ls1 ;; dnl (
+ lp?[[34]]) echo ls2 ;; dnl (
+ lp?5) echo ls3 ;; dnl (
+ *) AT_FAIL_IF([:]) ;;
esac
}
ofport-request=$i$j
lsp_name=lp$i$j
- ls_name=$(lsp_to_ls $lsp_name)
+ ls_name=$(lsp_to_ls $lsp_name)
ovn-nbctl lsp-add $ls_name $lsp_name
ovn-nbctl lsp-set-addresses $lsp_name f0:00:00:00:00:$i$j
tos=$(echo "$flow" | sed -n 's/.*nw_tos=\([[0-9]]\{1,\}\).*/\1/p')
case $tos in
'') echo none ;;
- *) echo $tos ;;
+ *) echo $tos ;;
esac
}
# Not all shells support "exec -a NAME", so test for it.
if (exec -a myname true); then
run_as () {
- (exec -a "$@")
+ (exec -a "$@")
}
else
run_as () {
shift
- (exec "$@")
+ (exec "$@")
}
fi
]
OVS_VSWITCHD_START([add-port br0 p1 -- set Interface p1 type=dummy ofport_request=1 \
-- add-port br0 p2 -- set Interface p2 type=dummy ofport_request=2])
AT_DATA([flows.txt], [dnl
- in_port=1,tcp,tp_dst=80,tcp_flags=+syn-rst-ack-fin,action=2 # Allow outbound web traffic bare-SYN
- in_port=1,tcp,tp_dst=80,tcp_flags=+ack,action=2 # Allow outbound web traffic with ACK bit
- in_port=1,tcp,tp_dst=80,tcp_flags=+rst,action=2 # Allow outbound web traffic with RST bit
- in_port=2,tcp,tp_src=80,tcp_flags=+ack,action=1 # Allow inbound web traffic with ACK bit
- in_port=2,tcp,tp_src=80,tcp_flags=+rst,action=1 # Allow inbound web traffic with RST bit
- priority=0,in_port=1,action=drop # Default drop outbound
- priority=0,in_port=2,action=drop # Default drop inbound
+ in_port=1,tcp,tp_dst=80,tcp_flags=+syn-rst-ack-fin,action=2 # Allow outbound web traffic bare-SYN
+ in_port=1,tcp,tp_dst=80,tcp_flags=+ack,action=2 # Allow outbound web traffic with ACK bit
+ in_port=1,tcp,tp_dst=80,tcp_flags=+rst,action=2 # Allow outbound web traffic with RST bit
+ in_port=2,tcp,tp_src=80,tcp_flags=+ack,action=1 # Allow inbound web traffic with ACK bit
+ in_port=2,tcp,tp_src=80,tcp_flags=+rst,action=1 # Allow inbound web traffic with RST bit
+ priority=0,in_port=1,action=drop # Default drop outbound
+ priority=0,in_port=2,action=drop # Default drop inbound
])
AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
AT_SETUP([appctl - route/add with gateway])
AT_KEYWORDS([ovs_router])
OVS_VSWITCHD_START([add-port br0 p2 -- set Interface p2 type=gre \
- options:local_ip=2.2.2.2 options:remote_ip=1.1.1.1 \
- -- add-port br0 p1 -- set interface p1 type=dummy])
+ options:local_ip=2.2.2.2 options:remote_ip=1.1.1.1 \
+ -- add-port br0 p1 -- set interface p1 type=dummy])
AT_CHECK([ovs-appctl netdev-dummy/ip4addr br0 2.2.2.2/24], [0], [OK
])
AT_CHECK([ovs-appctl ovs/route/add 1.1.1.0/24 br0 2.2.2.10], [0], [OK
["ordinals",
{"op": "update",
"table": "ordinals",
- "where": [],
- "row": {"name": ""}}]']],
+ "where": [],
+ "row": {"name": ""}}]']],
[0],
[[[{"count":6}]
]])
AT_CHECK(
[[for txn in 'transact zero 0' \
'query one 1' \
- 'transact two 2' \
- 'query three 3' \
- 'transact four 4' \
- 'query five 5'
+ 'transact two 2' \
+ 'query three 3' \
+ 'transact four 4' \
+ 'query five 5'
do
set -- $txn
ovsdb-client $1 '
on_exit 'kill `cat *.pid`'
for i in `seq $n`; do
- AT_CHECK([ovsdb-server -vraft -vconsole:off -vsyslog:off --detach --no-chdir --log-file=s$i.log --pidfile=s$i.pid --unixctl=s$i --remote=punix:s$i.ovsdb s$i.db])
+ AT_CHECK([ovsdb-server -vraft -vconsole:off -vsyslog:off --detach --no-chdir --log-file=s$i.log --pidfile=s$i.pid --unixctl=s$i --remote=punix:s$i.ovsdb s$i.db])
done
for i in `seq $n`; do
- AT_CHECK([ovsdb-client --timeout=30 wait unix:s$i.ovsdb $schema connected])
+ AT_CHECK([ovsdb-client --timeout=30 wait unix:s$i.ovsdb $schema connected])
done
for txn
done
AT_CHECK_UNQUOTED([uuidfilt output], [0], [$output])
for i in `seq $n`; do
- OVS_APP_EXIT_AND_WAIT_BY_TARGET([`pwd`/s$i], [s$i.pid])
+ OVS_APP_EXIT_AND_WAIT_BY_TARGET([`pwd`/s$i], [s$i.pid])
done
AT_CHECK([ovsdb-tool check-cluster s*.db])
# Torture test.
OVS_START_SHELL_HELPERS
ovsdb_torture_test () {
- local n=$1 # Number of cluster members
- local victim=$2 # Cluster member to kill or remove
+ local n=$1 # Number of cluster members
+ local victim=$2 # Cluster member to kill or remove
local variant=$3 # 'kill' and restart or 'remove' and add
cp $top_srcdir/ovn/ovn-sb.ovsschema schema
schema=`ovsdb-tool schema-name schema`
join_cluster() {
local i=$1
- others=
- for j in `seq 1 $n`; do
- if test $i != $j; then
- others="$others unix:s$j.raft"
+ others=
+ for j in `seq 1 $n`; do
+ if test $i != $j; then
+ others="$others unix:s$j.raft"
fi
- done
- AT_CHECK([ovsdb-tool join-cluster s$i.db $schema unix:s$i.raft $others])
+ done
+ AT_CHECK([ovsdb-tool join-cluster s$i.db $schema unix:s$i.raft $others])
}
start_server() {
local i=$1
- printf "\ns$i: starting\n"
- AT_CHECK([ovsdb-server -vjsonrpc -vconsole:off -vsyslog:off --detach --no-chdir --log-file=s$i.log --pidfile=s$i.pid --unixctl=s$i --remote=punix:s$i.ovsdb s$i.db])
+ printf "\ns$i: starting\n"
+ AT_CHECK([ovsdb-server -vjsonrpc -vconsole:off -vsyslog:off --detach --no-chdir --log-file=s$i.log --pidfile=s$i.pid --unixctl=s$i --remote=punix:s$i.ovsdb s$i.db])
}
stop_server() {
local i=$1
- printf "\ns$i: stopping\n"
+ printf "\ns$i: stopping\n"
OVS_APP_EXIT_AND_WAIT_BY_TARGET([`pwd`/s$i], [s$i.pid])
}
connect_server() {
local i=$1
- printf "\ns$i: waiting to connect to storage\n"
- AT_CHECK([ovsdb-client --timeout=30 -vfile -vsyslog:off -vvlog:off --log-file=connect$i.log wait unix:s$i.ovsdb $schema connected])
+ printf "\ns$i: waiting to connect to storage\n"
+ AT_CHECK([ovsdb-client --timeout=30 -vfile -vsyslog:off -vvlog:off --log-file=connect$i.log wait unix:s$i.ovsdb $schema connected])
}
remove_server() {
local i=$1
- printf "\ns$i: removing from cluster\n"
- AT_CHECK([ovs-appctl --timeout=30 -t "`pwd`"/s$i cluster/leave OVN_Southbound])
- printf "\ns$i: waiting for removal to complete\n"
- AT_CHECK([ovsdb-client --timeout=30 -vfile -vsyslog:off -vvlog:off --log-file=remove$i.log wait unix:s$i.ovsdb $schema removed])
- stop_server $victim
+ printf "\ns$i: removing from cluster\n"
+ AT_CHECK([ovs-appctl --timeout=30 -t "`pwd`"/s$i cluster/leave OVN_Southbound])
+ printf "\ns$i: waiting for removal to complete\n"
+ AT_CHECK([ovsdb-client --timeout=30 -vfile -vsyslog:off -vvlog:off --log-file=remove$i.log wait unix:s$i.ovsdb $schema removed])
+ stop_server $victim
}
add_server() {
local i=$1
- rm s$i.db
+ rm s$i.db
join_cluster $i
- start_server $i
- connect_server $i
+ start_server $i
+ connect_server $i
}
cid=`ovsdb-tool db-cid s1.db`
n1=10 n2=5
echo "starting $n1*$n2 ovn-sbctl processes..."
for i in $(seq 0 $(expr $n1 - 1) ); do
- (for j in $(seq $n2); do
+ (for j in $(seq $n2); do
: > $i-$j.running
- run_as "ovn-sbctl($i-$j)" ovn-sbctl "-vPATTERN:console:ovn-sbctl($i-$j)|%D{%H:%M:%S}|%05N|%c|%p|%m" --log-file=$i-$j.log -vfile -vsyslog:off -vtimeval:off --timeout=120 --no-leader-only add SB_Global . external_ids $i-$j=$i-$j
- status=$?
- if test $status != 0; then
- echo "$i-$j exited with status $status" > $i-$j:$status
+ run_as "ovn-sbctl($i-$j)" ovn-sbctl "-vPATTERN:console:ovn-sbctl($i-$j)|%D{%H:%M:%S}|%05N|%c|%p|%m" --log-file=$i-$j.log -vfile -vsyslog:off -vtimeval:off --timeout=120 --no-leader-only add SB_Global . external_ids $i-$j=$i-$j
+ status=$?
+ if test $status != 0; then
+ echo "$i-$j exited with status $status" > $i-$j:$status
fi
rm $i-$j.running
- done
- : > $i.done)&
+ done
+ : > $i.done)&
done
echo "...done"
sleep 2
i=0
(while :; do echo; sleep 1; done) | while read; do
printf "t=%2d s:" $i
- done=0
+ done=0
for j in $(seq 0 $(expr $n1 - 1)); do
- if test -f $j.done; then
- printf " $j"
- done=$(expr $done + 1)
+ if test -f $j.done; then
+ printf " $j"
+ done=$(expr $done + 1)
fi
- done
- printf '\n'
- if test $done = $n1; then
- break
+ done
+ printf '\n'
+ if test $done = $n1; then
+ break
fi
case $phase in # (
- 0)
+ 0)
if test $done -ge $(expr $n1 / 4); then
- if test $variant = kill; then
- stop_server $victim
- else
- remove_server $victim
- fi
- phase=1
- next=$(expr $i + 2)
+ if test $variant = kill; then
+ stop_server $victim
+ else
+ remove_server $victim
+ fi
+ phase=1
+ next=$(expr $i + 2)
fi
- ;; # (
+ ;; # (
1)
- if test $i -ge $next; then
- if test $variant = kill; then
- start_server $victim
- connect_server $victim
- else
- add_server $victim
- fi
- phase=2
- fi
- ;;
- esac
+ if test $i -ge $next; then
+ if test $variant = kill; then
+ start_server $victim
+ connect_server $victim
+ else
+ add_server $victim
+ fi
+ phase=2
+ fi
+ ;;
+ esac
- i=$(expr $i + 1)
+ i=$(expr $i + 1)
done
echo "...done"
AT_CHECK([if test $phase != 2; then exit 77; fi])
AT_CHECK([ovn-sbctl --timeout=30 --log-file=finalize.log -vtimeval:off -vfile -vsyslog:off --bare get SB_Global . external-ids | sed 's/, /\n/g; s/[[{}""]]//g;' | sort], [0], [expout])
for i in `seq $n`; do
- if test $i != $victim || test $phase != 1; then
- stop_server $i
- fi
+ if test $i != $victim || test $phase != 1; then
+ stop_server $i
+ fi
done
# We ignore stdout because non-fatal warnings get printed there.
{"i": {"type": "integer"},
"r": {"type": "real"},
"b": {"type": "boolean"},
- "s": {"type": "string"},
+ "s": {"type": "string"},
"u": {"type": "uuid"}}}' \
'[["i", "==", 0]]' \
'[["i", "!=", 1]]' \
{"i": {"type": "integer"},
"r": {"type": "real"},
"b": {"type": "boolean"},
- "s": {"type": "string"},
+ "s": {"type": "string"},
"u": {"type": "uuid"}}}' \
'[["b", ">", true]]' \
'[["b", ">=", false]]' \
{"i": {"type": {"key": "integer", "min": 0, "max": "unlimited"}},
"r": {"type": {"key": "real", "min": 0, "max": "unlimited"}},
"b": {"type": {"key": "boolean", "min": 0, "max": "unlimited"}},
- "s": {"type": {"key": "string", "min": 0, "max": "unlimited"}},
+ "s": {"type": {"key": "string", "min": 0, "max": "unlimited"}},
"u": {"type": {"key": "uuid", "min": 0, "max": "unlimited"}}}}' \
'[["i", "==", ["set", []]]]' \
'[["i", "!=", ["set", [1]]]]' \
"table": "link1",
"where": [],
"row": {"k": ["uuid", "#0#"]}}]']],
- [0], [stdout], [stderr])
+ [0], [stdout], [stderr])
AT_CHECK([sort stdout | uuidfilt], [0],
[[000: empty
001: {"error":null,"result":[{"uuid":["uuid","<0>"]}]}
rm -f file
AT_CHECK(
[[test-ovsdb $option log-io file create \
- 'write:{"x":0}' \
- 'replace_start' \
- 'new-write:{"x":1}' \
- 'new-write:{"x":2}' \
- 'old-write:{"x":4}' \
- 'replace_commit' \
- 'read' \
- 'write:{"x":3}']], [0],
+ 'write:{"x":0}' \
+ 'replace_start' \
+ 'new-write:{"x":1}' \
+ 'new-write:{"x":2}' \
+ 'old-write:{"x":4}' \
+ 'replace_commit' \
+ 'read' \
+ 'write:{"x":3}']], [0],
[[file: open successful
file: write:{"x":0} successful
file: replace_start successful
rm -f file
AT_CHECK(
[[test-ovsdb $option log-io file create \
- 'write:{"x":0}' \
- 'replace_start' \
- 'new-write:{"x":1}' \
- 'new-write:{"x":2}' \
- 'old-write:{"x":4}' \
- 'replace_abort' \
- 'read' \
- 'write:{"x":3}']], [0],
+ 'write:{"x":0}' \
+ 'replace_start' \
+ 'new-write:{"x":1}' \
+ 'new-write:{"x":2}' \
+ 'old-write:{"x":4}' \
+ 'replace_abort' \
+ 'read' \
+ 'write:{"x":3}']], [0],
[[file: open successful
file: write:{"x":0} successful
file: replace_start successful
$schema_func > schema
AT_CHECK([ovsdb-tool create db schema], [0], [stdout], [ignore])
while test "$1" != "--"; do
- AT_CHECK([ovsdb-tool transact db "$1"], [0], [ignore], [ignore])
- shift
+ AT_CHECK([ovsdb-tool transact db "$1"], [0], [ignore], [ignore])
+ shift
done
shift
AT_CHECK([ovsdb-server --detach --no-chdir --pidfile --remote=punix:socket --log-file db > ovsdb-server.stdout 2> ovsdb-server.stderr],
- [0], [], [])
+ [0], [], [])
on_exit 'kill `cat ovsdb-server.pid`'
if test "$IS_WIN32" = "yes"; then
AT_CHECK([ovsdb-client -vjsonrpc --pidfile --log-file -d json monitor --format=csv unix:socket $db $table $columns > output 2> ovsdb-client.stderr &],
- [0], [ignore], [ignore])
+ [0], [ignore], [ignore])
sleep 1
else
AT_CHECK([ovsdb-client -vjsonrpc --detach --pidfile --log-file -d json monitor --format=csv unix:socket $db $table $columns > output 2> ovsdb-client.stderr],
- [0], [ignore], [ignore])
+ [0], [ignore], [ignore])
fi
on_exit 'kill `cat ovsdb-client.pid`'
for txn in ${1+"$@"} '[["'$db'"]]'; do
AT_CHECK([ovsdb-server --detach --no-chdir --pidfile --remote=punix:socket --log-file="`pwd`"/ovsdb-server-log db >/dev/null 2>&1])
on_exit 'kill `cat ovsdb-server.pid`'
AT_CHECK([ovsdb-client -vjsonrpc --pidfile --detach --no-chdir -d json monitor-cond --format=csv unix:socket $4 '[$8]' $5 $9 > output],
- [0], [ignore], [ignore])
+ [0], [ignore], [ignore])
on_exit 'kill `cat ovsdb-client.pid`'
for txn in m4_foreach([txn], [$6], ['txn' ]); do
AT_CHECK([ovsdb-client transact unix:socket "$txn"], [0],
{"i": {"type": "integer"},
"r": {"type": "real"},
"b": {"type": "boolean"},
- "s": {"type": "string"},
+ "s": {"type": "string"},
"u": {"type": "uuid"}}}' \
'[["i", "+=", 0]]' \
'[["i", "-=", 1]]' \
{"i": {"type": "integer"},
"r": {"type": "real"},
"b": {"type": "boolean"},
- "s": {"type": "string"},
+ "s": {"type": "string"},
"u": {"type": "uuid"}}}' \
'[["i", "xxx", 1]]' \
'[["i", "insert", 1]]' \
{"i": {"type": {"key": "integer", "min": 0, "max": "unlimited"}},
"r": {"type": {"key": "real", "min": 0, "max": "unlimited"}},
"b": {"type": {"key": "boolean", "min": 0, "max": "unlimited"}},
- "s": {"type": {"key": "string", "min": 0, "max": "unlimited"}},
+ "s": {"type": {"key": "string", "min": 0, "max": "unlimited"}},
"u": {"type": {"key": "uuid", "min": 0, "max": "unlimited"}}}}' \
'[["i", "+=", 1]]' \
'[["i", "-=", 2]]' \
{"i": {"type": "integer"},
"r": {"type": "real"},
"b": {"type": "boolean"},
- "s": {"type": "string"},
+ "s": {"type": "string"},
"u": {"type": "uuid"}}}' \
'[{"i": 0,
"r": 0.5,
{"i": {"type": "integer"},
"r": {"type": "real"},
"b": {"type": "boolean"},
- "s": {"type": "string"},
+ "s": {"type": "string"},
"u": {"type": "uuid"}}}' \
'[{"i": 0,
"r": 0.5,
{"i": {"type": "integer"},
"r": {"type": "real"},
"b": {"type": "boolean"},
- "s": {"type": "string"},
+ "s": {"type": "string"},
"u": {"type": "uuid"}}}' \
'[{"i": 0,
"r": 0.5,
{"i": {"type": "integer"},
"r": {"type": "real"},
"b": {"type": "boolean"},
- "s": {"type": "string"},
+ "s": {"type": "string"},
"u": {"type": "uuid"}}}' \
'["null", {}]' \
'["i1", {"i": 1}]' \
{"i": {"type": {"key": "integer", "min": 0, "max": "unlimited"}},
"r": {"type": {"key": "real", "min": 0, "max": "unlimited"}},
"b": {"type": {"key": "boolean", "min": 0, "max": "unlimited"}},
- "s": {"type": {"key": "string", "min": 0, "max": "unlimited"}},
+ "s": {"type": {"key": "string", "min": 0, "max": "unlimited"}},
"u": {"type": {"key": "uuid", "min": 0, "max": "unlimited"}}}}' \
'["null0", {"i": ["set", []]}]' \
'["i0", {"i": ["set", [0]]}]' \
"min": 0, "max": "unlimited"}},
"bb": {"type": {"key": "boolean", "value": "boolean",
"min": 0, "max": "unlimited"}},
- "ss": {"type": {"key": "string", "value": "string",
+ "ss": {"type": {"key": "string", "value": "string",
"min": 0, "max": "unlimited"}}}}' \
'["null", {}]' \
'["ii0", {"ii": ["map", [[0, 0]]]}]' \
OVSDB_CHECK_POSITIVE_CPY([schema with immutable weak references],
[[parse-schema \
'{"name": "mydb",
- "version": "4.2.1",
- "tables": {
- "a": {
- "columns": {
- "x": {
- "type": {
- "key": {
- "type": "uuid",
- "refTable": "a",
- "refType": "weak"}},
- "mutable": false}}}}}']],
+ "version": "4.2.1",
+ "tables": {
+ "a": {
+ "columns": {
+ "x": {
+ "type": {
+ "key": {
+ "type": "uuid",
+ "refTable": "a",
+ "refType": "weak"}},
+ "mutable": false}}}}}']],
[[{"name":"mydb","tables":{"a":{"columns":{"x":{"type":{"key":{"refTable":"a","refType":"weak","type":"uuid"}}}}}},"version":"4.2.1"}]])
dnl Schemas without version numbers are accepted for backward
# msys on Windows does not convert the path style automatically.
# So, do that forcefully with a 'pwd -W' (called through pwd() function).
PKIDIR="$(cd $abs_top_builddir/tests && pwd)"
-AT_SKIP_IF([expr "$PKIDIR" : ".*[ '\"
+AT_SKIP_IF([expr "$PKIDIR" : ".*[ '\"
\\]"])
AT_DATA([schema],
[[{"name": "mydb",
dnl than replacing the symlinks with regular files.
mkdir dir
if test "$IS_WIN32" = "no"; then
- ln -s dir/db db
- ln -s dir/.db.~lock~ .db.~lock~
- AT_SKIP_IF([test ! -h db || test ! -h .db.~lock~])
+ ln -s dir/db db
+ ln -s dir/.db.~lock~ .db.~lock~
+ AT_SKIP_IF([test ! -h db || test ! -h .db.~lock~])
fi
AT_CHECK([if test $model = standalone; then
ovsdb-tool create db schema
dnl Do a bunch of random transactions that put crap in the database log.
AT_CHECK(
[[for pair in 'zero 0' 'one 1' 'two 2' 'three 3' 'four 4' 'five 5'; do
- set -- $pair
- ovsdb-client transact unix:socket '
- ["ordinals",
- {"op": "insert",
- "table": "ordinals",
- "row": {"name": "'$1'", "number": '$2'}},
- {"op": "comment",
- "comment": "add row for '"$pair"'"}]'
- ovsdb-client transact unix:socket '
- ["ordinals",
- {"op": "delete",
- "table": "ordinals",
- "where": [["number", "==", '$2']]},
- {"op": "comment",
- "comment": "delete row for '"$2"'"}]'
- ovsdb-client transact unix:socket '
- ["ordinals",
- {"op": "insert",
- "table": "ordinals",
- "row": {"name": "'$1'", "number": '$2'}},
- {"op": "comment",
- "comment": "add back row for '"$pair"'"}]'
- done]],
+ set -- $pair
+ ovsdb-client transact unix:socket '
+ ["ordinals",
+ {"op": "insert",
+ "table": "ordinals",
+ "row": {"name": "'$1'", "number": '$2'}},
+ {"op": "comment",
+ "comment": "add row for '"$pair"'"}]'
+ ovsdb-client transact unix:socket '
+ ["ordinals",
+ {"op": "delete",
+ "table": "ordinals",
+ "where": [["number", "==", '$2']]},
+ {"op": "comment",
+ "comment": "delete row for '"$2"'"}]'
+ ovsdb-client transact unix:socket '
+ ["ordinals",
+ {"op": "insert",
+ "table": "ordinals",
+ "row": {"name": "'$1'", "number": '$2'}},
+ {"op": "comment",
+ "comment": "add back row for '"$pair"'"}]'
+ done]],
[0], [stdout])
if test $model = standalone; then
- dnl Check that all the crap is in fact in the database log.
- AT_CHECK([[uuidfilt db | grep -v ^OVSDB | sed 's/"_date":[0-9]*/"_date":0/' | ovstest test-json --multiple -]], [0],
+ dnl Check that all the crap is in fact in the database log.
+ AT_CHECK([[uuidfilt db | grep -v ^OVSDB | sed 's/"_date":[0-9]*/"_date":0/' | ovstest test-json --multiple -]], [0],
[[{"cksum":"12345678 9","name":"ordinals","tables":{"ordinals":{"columns":{"name":{"type":"string"},"number":{"type":"integer"}},"indexes":[["number"]]}},"version":"5.1.3"}
{"_comment":"add row for zero 0","_date":0,"ordinals":{"<0>":{"name":"zero"}}}
{"_comment":"delete row for 0","_date":0,"ordinals":{"<0>":null}}
]])
else
dnl Check that at least there's a lot of transactions.
- AT_CHECK([test `wc -l < db` -gt 50])
+ AT_CHECK([test `wc -l < db` -gt 50])
fi
dnl Dump out and check the actual database contents.
AT_CHECK([ovsdb-client dump unix:socket ordinals], [0], [stdout])
dnl Make sure that "db" is still a symlink to dir/db instead of getting
dnl replaced by a regular file, ditto for .db.~lock~.
if test "$IS_WIN32" = "no"; then
- AT_CHECK([test -h db])
- AT_CHECK([test -h .db.~lock~])
- AT_CHECK([test -f dir/db])
- AT_CHECK([test -f dir/.db.~lock~])
+ AT_CHECK([test -h db])
+ AT_CHECK([test -h .db.~lock~])
+ AT_CHECK([test -f dir/db])
+ AT_CHECK([test -f dir/.db.~lock~])
fi
# We can't fully re-check the contents of the database log, because the
dnl Now do some more transactions.
AT_CHECK(
[[ovsdb-client transact unix:socket '
- ["ordinals",
- {"op": "delete",
- "table": "ordinals",
- "where": [["number", "<", 3]]}]']],
+ ["ordinals",
+ {"op": "delete",
+ "table": "ordinals",
+ "where": [["number", "<", 3]]}]']],
[0], [[[{"count":3}]
]], [ignore])
[[{"name": "ordinals",
"tables": {
"ordinals": {
- "columns": {
- "number": {"type": "integer"}}}}}
+ "columns": {
+ "number": {"type": "integer"}}}}}
]])
dnl Make sure that "ovsdb-tool create" works with a dangling symlink for
dnl the database and the lockfile, creating the target of each symlink
dnl rather than replacing the symlinks with regular files.
mkdir dir
if test "$IS_WIN32" = "no"; then
- ln -s dir/db db
- ln -s dir/.db.~lock~ .db.~lock~
- AT_SKIP_IF([test ! -h db || test ! -h .db.~lock~])
+ ln -s dir/db db
+ ln -s dir/.db.~lock~ .db.~lock~
+ AT_SKIP_IF([test ! -h db || test ! -h .db.~lock~])
fi
AT_CHECK([if test $model = standalone; then
ovsdb-tool create db schema
dnl Put some data in the database.
AT_CHECK(
[[for pair in 'zero 0' 'one 1' 'two 2' 'three 3' 'four 4' 'five 5'; do
- set -- $pair
- ovsdb-client transact '
- ["ordinals",
- {"op": "insert",
- "table": "ordinals",
- "row": {"name": "'$1'", "number": '$2'}},
- {"op": "comment",
- "comment": "add row for '"$pair"'"}]'
- done | uuidfilt]], [0],
+ set -- $pair
+ ovsdb-client transact '
+ ["ordinals",
+ {"op": "insert",
+ "table": "ordinals",
+ "row": {"name": "'$1'", "number": '$2'}},
+ {"op": "comment",
+ "comment": "add row for '"$pair"'"}]'
+ done | uuidfilt]], [0],
[[[{"uuid":["uuid","<0>"]},{}]
[{"uuid":["uuid","<1>"]},{}]
[{"uuid":["uuid","<2>"]},{}]
dnl Start two long-running transactions (triggers) on the 'ordinals' db,
dnl one that is database change aware and one that is not.
ordinals_txn='[["ordinals",
- {"op": "wait",
- "table": "ordinals",
- "where": [["name", "==", "seven"]],
- "columns": ["name", "number"],
- "rows": [],
- "until": "!="}]]'
+ {"op": "wait",
+ "table": "ordinals",
+ "where": [["name", "==", "seven"]],
+ "columns": ["name", "number"],
+ "rows": [],
+ "until": "!="}]]'
AT_CHECK([ovsdb-client -vfile -vvlog:off --detach --pidfile=trigger-ordinals-aware.pid --log-file=trigger-ordinals-aware.log --db-change-aware transact "$ordinals_txn" > trigger-ordinals-aware.stdout 2> trigger-ordinals-aware.stderr])
AT_CAPTURE_FILE([trigger-ordinals-aware.stdout])
AT_CAPTURE_FILE([trigger-ordinals-aware.log])
dnl Start two long-running transactions (triggers) on the _Server db,
dnl one that is database change aware and one that is not.
server_txn='[["_Server",
- {"op": "wait",
- "table": "Database",
- "where": [["name", "==", "xyzzy"]],
- "columns": ["name"],
- "rows": [],
- "until": "!="}]]'
+ {"op": "wait",
+ "table": "Database",
+ "where": [["name", "==", "xyzzy"]],
+ "columns": ["name"],
+ "rows": [],
+ "until": "!="}]]'
AT_CHECK([ovsdb-client -vfile -vvlog:off --detach --pidfile=trigger-server-aware.pid --log-file=trigger-server-aware.log --db-change-aware transact "$server_txn" > trigger-server-aware.stdout 2> trigger-server-aware.stderr])
AT_CAPTURE_FILE([trigger-server-aware.stdout])
AT_CAPTURE_FILE([trigger-server-aware.log])
dnl Verify that the "ordinals" monitors behaved as they should have.
dnl Both should have exited, for different reasons.
for x in aware unaware; do
- echo $x
- OVS_WAIT_WHILE([test -e monitor-ordinals-$x.pid])
- AT_CHECK([sort -k 3 monitor-ordinals-$x.stdout | uuidfilt], [0],
+ echo $x
+ OVS_WAIT_WHILE([test -e monitor-ordinals-$x.pid])
+ AT_CHECK([sort -k 3 monitor-ordinals-$x.stdout | uuidfilt], [0],
[<0> initial 0 zero
<1> initial 1 one
<2> initial 2 two
dnl Verify that the _Server monitors behaved as they should have.
dnl The db-aware monitor should still be running, but not the unaware one.
for x in aware unaware; do
- AT_CHECK([sort -k 3 monitor-server-$x.stdout | uuidfilt], [0],
+ AT_CHECK([sort -k 3 monitor-server-$x.stdout | uuidfilt], [0],
[<0> initial _Server
<1> initial ordinals
])
dnl Verify that the "ordinals" triggers behaved as they should have:
dnl Both should have exited, for different reasons.
for x in unaware aware; do
- OVS_WAIT_WHILE([test -e trigger-ordinals-$x.pid])
- AT_CHECK([cat trigger-ordinals-$x.stdout])
+ OVS_WAIT_WHILE([test -e trigger-ordinals-$x.pid])
+ AT_CHECK([cat trigger-ordinals-$x.stdout])
done
AT_CHECK([cat trigger-ordinals-unaware.stderr], [0], [ovsdb-client: transaction failed (End of file)
])
dnl Verify that the _Server triggers behaved as they should have:
dnl The db-aware trigger should still be waiting, but not the unaware one.
for x in aware unaware; do
- AT_CHECK([cat trigger-server-$x.stdout])
+ AT_CHECK([cat trigger-server-$x.stdout])
done
OVS_WAIT_WHILE([test -e trigger-server-unaware.pid])
AT_CHECK([sed 's/.*: //' trigger-ordinals-unaware.stderr], [0], [transaction failed (End of file)
AT_CAPTURE_FILE([db])
if test $model = standalone; then
- dnl We can't fully re-check the contents of the database log, because the
- dnl order of the records is not predictable, but there should only be 4 lines
- dnl in it now.
- AT_CHECK([test `wc -l < db` -eq 4])
+ dnl We can't fully re-check the contents of the database log, because the
+ dnl order of the records is not predictable, but there should only be 4 lines
+ dnl in it now.
+ AT_CHECK([test `wc -l < db` -eq 4])
fi
dnl Check that the dumped data is the same except for the removed column:
AT_CHECK([ovsdb-client dump unix:db.sock ordinals | uuidfilt], [0], [dnl
dnl is as expected.
AT_CHECK(
[[ovsdb-client transact '
- ["ordinals",
- {"op": "insert",
- "table": "ordinals",
- "row": {"number": 6}},
- {"op": "comment",
- "comment": "add row for 6"}]' | uuidfilt]], [0],
+ ["ordinals",
+ {"op": "insert",
+ "table": "ordinals",
+ "row": {"number": 6}},
+ {"op": "comment",
+ "comment": "add row for 6"}]' | uuidfilt]], [0],
[[[{"uuid":["uuid","<0>"]},{}]
]])
if test $model = standalone; then
dnl Make sure that "db" is still a symlink to dir/db instead of getting
dnl replaced by a regular file, ditto for .db.~lock~.
if test "$IS_WIN32" = "no"; then
- AT_CHECK([test -h db])
- AT_CHECK([test -h .db.~lock~])
- AT_CHECK([test -f dir/db])
- AT_CHECK([test -f dir/.db.~lock~])
+ AT_CHECK([test -h db])
+ AT_CHECK([test -h .db.~lock~])
+ AT_CHECK([test -f dir/db])
+ AT_CHECK([test -f dir/.db.~lock~])
fi
OVS_APP_EXIT_AND_WAIT([ovsdb-server])
dnl Dump out and check the actual database contents.
on_exit 'kill `cat ovsdb-server.pid`'
AT_CHECK([[ovsdb-server --detach --pidfile --no-chdir --remote=punix:socket db]],
- [0], [stdout], [ignore])
+ [0], [stdout], [ignore])
AT_CHECK([[ovsdb-client dump unix:socket ordinals]],
- [0], [stdout], [ignore])
+ [0], [stdout], [ignore])
OVS_APP_EXIT_AND_WAIT([ovsdb-server])
AT_CHECK([uuidfilt stdout], [0], [dnl
AT_CHECK([test `wc -l < db` -eq 4])
dnl And check that the dumped data is the same too:
AT_CHECK([[ovsdb-server --detach --pidfile --no-chdir --remote=punix:socket db]],
- [0], [stdout], [ignore])
+ [0], [stdout], [ignore])
AT_CHECK([[ovsdb-client dump unix:socket ordinals]],
- [0], [stdout], [ignore])
+ [0], [stdout], [ignore])
OVS_APP_EXIT_AND_WAIT([ovsdb-server])
AT_CHECK([uuidfilt stdout], [0], [dnl
[[for pair in 'zero 0' 'one 1' 'two 2' 'three 3' 'four 4' 'five 5'; do
set -- $pair
ovsdb-tool transact db1 '
- ["ordinals",
- {"op": "insert",
- "table": "ordinals",
- "row": {"name": "'$1'", "number": '$2'}},
- {"op": "comment",
- "comment": "add row for '"$pair"'"}]'
+ ["ordinals",
+ {"op": "insert",
+ "table": "ordinals",
+ "row": {"name": "'$1'", "number": '$2'}},
+ {"op": "comment",
+ "comment": "add row for '"$pair"'"}]'
done | uuidfilt]], [0],
[[[{"uuid":["uuid","<0>"]},{}]
[{"uuid":["uuid","<1>"]},{}]
# of every rxq (one per line) in the form:
# port_name rxq_id numa_id core_id
parse_pmd_rxq_show () {
- awk '/pmd thread/ {numa=$4; core=substr($6, 1, length($6) - 1)} /\tport:/ {print $2, $4, numa, core}' | sort
+ awk '/pmd thread/ {numa=$4; core=substr($6, 1, length($6) - 1)} /^ port:/ {print $2, $4, numa, core}' | sort
}
# Given the output of `ovs-appctl dpif-netdev/pmd-rxq-show`,
AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | sed SED_NUMA_CORE_PATTERN], [0], [dnl
pmd thread numa_id <cleared> core_id <cleared>:
- isolated : false
- port: p0 queue-id: 0 pmd usage: NOT AVAIL
+ isolated : false
+ port: p0 queue-id: 0 pmd usage: NOT AVAIL
])
AT_CHECK([ovs-appctl dpif/show | sed 's/\(tx_queues=\)[[0-9]]*/\1<cleared>/g'], [0], [dnl
AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | sed SED_NUMA_CORE_PATTERN], [0], [dnl
pmd thread numa_id <cleared> core_id <cleared>:
- isolated : false
- port: p0 queue-id: 0 pmd usage: NOT AVAIL
- port: p0 queue-id: 1 pmd usage: NOT AVAIL
- port: p0 queue-id: 2 pmd usage: NOT AVAIL
- port: p0 queue-id: 3 pmd usage: NOT AVAIL
- port: p0 queue-id: 4 pmd usage: NOT AVAIL
- port: p0 queue-id: 5 pmd usage: NOT AVAIL
- port: p0 queue-id: 6 pmd usage: NOT AVAIL
- port: p0 queue-id: 7 pmd usage: NOT AVAIL
+ isolated : false
+ port: p0 queue-id: 0 pmd usage: NOT AVAIL
+ port: p0 queue-id: 1 pmd usage: NOT AVAIL
+ port: p0 queue-id: 2 pmd usage: NOT AVAIL
+ port: p0 queue-id: 3 pmd usage: NOT AVAIL
+ port: p0 queue-id: 4 pmd usage: NOT AVAIL
+ port: p0 queue-id: 5 pmd usage: NOT AVAIL
+ port: p0 queue-id: 6 pmd usage: NOT AVAIL
+ port: p0 queue-id: 7 pmd usage: NOT AVAIL
])
OVS_VSWITCHD_STOP
AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | sed SED_NUMA_CORE_PATTERN], [0], [dnl
pmd thread numa_id <cleared> core_id <cleared>:
- isolated : false
- port: p0 queue-id: 0 pmd usage: NOT AVAIL
- port: p0 queue-id: 1 pmd usage: NOT AVAIL
- port: p0 queue-id: 2 pmd usage: NOT AVAIL
- port: p0 queue-id: 3 pmd usage: NOT AVAIL
- port: p0 queue-id: 4 pmd usage: NOT AVAIL
- port: p0 queue-id: 5 pmd usage: NOT AVAIL
- port: p0 queue-id: 6 pmd usage: NOT AVAIL
- port: p0 queue-id: 7 pmd usage: NOT AVAIL
+ isolated : false
+ port: p0 queue-id: 0 pmd usage: NOT AVAIL
+ port: p0 queue-id: 1 pmd usage: NOT AVAIL
+ port: p0 queue-id: 2 pmd usage: NOT AVAIL
+ port: p0 queue-id: 3 pmd usage: NOT AVAIL
+ port: p0 queue-id: 4 pmd usage: NOT AVAIL
+ port: p0 queue-id: 5 pmd usage: NOT AVAIL
+ port: p0 queue-id: 6 pmd usage: NOT AVAIL
+ port: p0 queue-id: 7 pmd usage: NOT AVAIL
])
TMP=$(cat ovs-vswitchd.log | wc -l | tr -d [[:blank:]])
AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | sed SED_NUMA_CORE_PATTERN], [0], [dnl
pmd thread numa_id <cleared> core_id <cleared>:
- isolated : false
- port: p0 queue-id: 0 pmd usage: NOT AVAIL
- port: p0 queue-id: 1 pmd usage: NOT AVAIL
- port: p0 queue-id: 2 pmd usage: NOT AVAIL
- port: p0 queue-id: 3 pmd usage: NOT AVAIL
- port: p0 queue-id: 4 pmd usage: NOT AVAIL
- port: p0 queue-id: 5 pmd usage: NOT AVAIL
- port: p0 queue-id: 6 pmd usage: NOT AVAIL
- port: p0 queue-id: 7 pmd usage: NOT AVAIL
+ isolated : false
+ port: p0 queue-id: 0 pmd usage: NOT AVAIL
+ port: p0 queue-id: 1 pmd usage: NOT AVAIL
+ port: p0 queue-id: 2 pmd usage: NOT AVAIL
+ port: p0 queue-id: 3 pmd usage: NOT AVAIL
+ port: p0 queue-id: 4 pmd usage: NOT AVAIL
+ port: p0 queue-id: 5 pmd usage: NOT AVAIL
+ port: p0 queue-id: 6 pmd usage: NOT AVAIL
+ port: p0 queue-id: 7 pmd usage: NOT AVAIL
])
OVS_VSWITCHD_STOP
AT_CHECK([ovs-appctl dpif-netdev/pmd-stats-show | sed SED_NUMA_CORE_PATTERN | sed '/cycles/d' | grep pmd -A 8], [0], [dnl
pmd thread numa_id <cleared> core_id <cleared>:
- packets received: 0
- packet recirculations: 0
- avg. datapath passes per packet: 0.00
- emc hits: 0
- megaflow hits: 0
- avg. subtable lookups per megaflow hit: 0.00
- miss with success upcall: 0
- miss with failed upcall: 0
+ packets received: 0
+ packet recirculations: 0
+ avg. datapath passes per packet: 0.00
+ emc hits: 0
+ megaflow hits: 0
+ avg. subtable lookups per megaflow hit: 0.00
+ miss with success upcall: 0
+ miss with failed upcall: 0
])
ovs-appctl time/stop
AT_CHECK([ovs-appctl dpif-netdev/pmd-stats-show | sed SED_NUMA_CORE_PATTERN | sed '/cycles/d' | grep pmd -A 8], [0], [dnl
pmd thread numa_id <cleared> core_id <cleared>:
- packets received: 20
- packet recirculations: 0
- avg. datapath passes per packet: 1.00
- emc hits: 19
- megaflow hits: 0
- avg. subtable lookups per megaflow hit: 0.00
- miss with success upcall: 1
- miss with failed upcall: 0
+ packets received: 20
+ packet recirculations: 0
+ avg. datapath passes per packet: 1.00
+ emc hits: 19
+ megaflow hits: 0
+ avg. subtable lookups per megaflow hit: 0.00
+ miss with success upcall: 1
+ miss with failed upcall: 0
])
OVS_VSWITCHD_STOP
-- set bridge br0 datapath-type=dummy fail-mode=secure
for port in p1 p2 p3 p4; do
run ovs-vsctl --no-wait \
- -- add-port br0 $port \
- -- set interface $port type=dummy \
+ -- add-port br0 $port \
+ -- set interface $port type=dummy \
options:pstream=punix:$OVS_RUNDIR/$port
done
run ovs-vsctl \
----------------------------------------------------------------------
Logs may be found under $sandbox, e.g.:
- $sandbox/oft.log
- $sandbox/ovs-vswitchd.log
- $sandbox/ovsdb-server.log
+ $sandbox/oft.log
+ $sandbox/ovs-vswitchd.log
+ $sandbox/ovsdb-server.log
----------------------------------------------------------------------
EOF
-- set controller $bridge connection-mode=out-of-band \
max-backoff=1000 \
-- add-port $bridge $port1 \
- -- set interface $port1 ofport_request=1 type=dummy \
+ -- set interface $port1 ofport_request=1 type=dummy \
options:${stream_mode}:"$sandbox"/p1.sock \
-- add-port $bridge $port2 \
-- set interface $port2 ofport_request=2 type=dummy \
----------------------------------------------------------------------
Logs may be found under $sandbox, e.g.:$logs
- $sandbox/ovs-vswitchd.log
- $sandbox/ovsdb-server.log
+ $sandbox/ovs-vswitchd.log
+ $sandbox/ovsdb-server.log
----------------------------------------------------------------------
EOF
static const struct option long_options[] = {
{"help", no_argument, NULL, 'h'},
{"version", no_argument, NULL, 'V'},
- {"verbose", optional_argument, NULL, 'v'},
+ {"verbose", optional_argument, NULL, 'v'},
{NULL, 0, NULL, 0},
};
char *short_options = "hVv";
struct {
uint32_t HEADER;
uint32_t SWITCH;
- uint32_t TUNNEL4_OUT;
- uint32_t TUNNEL4_IN;
- uint32_t TUNNEL_VNI_OUT;
- uint32_t TUNNEL_VNI_IN;
- uint32_t MPLS;
- uint32_t IFCOUNTERS;
- uint32_t ETHCOUNTERS;
- uint32_t LACPCOUNTERS;
- uint32_t OPENFLOWPORT;
- uint32_t PORTNAME;
+ uint32_t TUNNEL4_OUT;
+ uint32_t TUNNEL4_IN;
+ uint32_t TUNNEL_VNI_OUT;
+ uint32_t TUNNEL_VNI_IN;
+ uint32_t MPLS;
+ uint32_t IFCOUNTERS;
+ uint32_t ETHCOUNTERS;
+ uint32_t LACPCOUNTERS;
+ uint32_t OPENFLOWPORT;
+ uint32_t PORTNAME;
} offset;
/* Flow sample fields. */
printf("\n");
}
if (x->offset.LACPCOUNTERS) {
- struct eth_addr *mac;
- union {
- ovs_be32 all;
- struct {
- uint8_t actorAdmin;
- uint8_t actorOper;
- uint8_t partnerAdmin;
- uint8_t partnerOper;
- } v;
- } state;
+ struct eth_addr *mac;
+ union {
+ ovs_be32 all;
+ struct {
+ uint8_t actorAdmin;
+ uint8_t actorOper;
+ uint8_t partnerAdmin;
+ uint8_t partnerOper;
+ } v;
+ } state;
sflowxdr_setc(x, x->offset.LACPCOUNTERS);
printf("LACPCOUNTERS");
- mac = (void *)sflowxdr_str(x);
- printf(" sysID="ETH_ADDR_FMT, ETH_ADDR_ARGS(*mac));
- sflowxdr_skip(x, 2);
- mac = (void *)sflowxdr_str(x);
- printf(" partnerID="ETH_ADDR_FMT, ETH_ADDR_ARGS(*mac));
- sflowxdr_skip(x, 2);
- printf(" aggID=%"PRIu32, sflowxdr_next(x));
- state.all = sflowxdr_next_n(x);
- printf(" actorAdmin=0x%"PRIx32, state.v.actorAdmin);
- printf(" actorOper=0x%"PRIx32, state.v.actorOper);
- printf(" partnerAdmin=0x%"PRIx32, state.v.partnerAdmin);
- printf(" partnerOper=0x%"PRIx32, state.v.partnerOper);
- printf(" LACPDUsRx=%"PRIu32, sflowxdr_next(x));
- printf(" markerPDUsRx=%"PRIu32, sflowxdr_next(x));
- printf(" markerRespPDUsRx=%"PRIu32, sflowxdr_next(x));
- printf(" unknownRx=%"PRIu32, sflowxdr_next(x));
- printf(" illegalRx=%"PRIu32, sflowxdr_next(x));
- printf(" LACPDUsTx=%"PRIu32, sflowxdr_next(x));
- printf(" markerPDUsTx=%"PRIu32, sflowxdr_next(x));
- printf(" markerRespPDUsTx=%"PRIu32, sflowxdr_next(x));
+ mac = (void *)sflowxdr_str(x);
+ printf(" sysID="ETH_ADDR_FMT, ETH_ADDR_ARGS(*mac));
+ sflowxdr_skip(x, 2);
+ mac = (void *)sflowxdr_str(x);
+ printf(" partnerID="ETH_ADDR_FMT, ETH_ADDR_ARGS(*mac));
+ sflowxdr_skip(x, 2);
+ printf(" aggID=%"PRIu32, sflowxdr_next(x));
+ state.all = sflowxdr_next_n(x);
+ printf(" actorAdmin=0x%"PRIx32, state.v.actorAdmin);
+ printf(" actorOper=0x%"PRIx32, state.v.actorOper);
+ printf(" partnerAdmin=0x%"PRIx32, state.v.partnerAdmin);
+ printf(" partnerOper=0x%"PRIx32, state.v.partnerOper);
+ printf(" LACPDUsRx=%"PRIu32, sflowxdr_next(x));
+ printf(" markerPDUsRx=%"PRIu32, sflowxdr_next(x));
+ printf(" markerRespPDUsRx=%"PRIu32, sflowxdr_next(x));
+ printf(" unknownRx=%"PRIu32, sflowxdr_next(x));
+ printf(" illegalRx=%"PRIu32, sflowxdr_next(x));
+ printf(" LACPDUsTx=%"PRIu32, sflowxdr_next(x));
+ printf(" markerPDUsTx=%"PRIu32, sflowxdr_next(x));
+ printf(" markerRespPDUsTx=%"PRIu32, sflowxdr_next(x));
printf("\n");
}
if (x->offset.OPENFLOWPORT) {
printf("OPENFLOWPORT");
printf(" datapath_id=%"PRIu64, sflowxdr_next_int64(x));
printf(" port_no=%"PRIu32, sflowxdr_next(x));
- printf("\n");
+ printf("\n");
}
if (x->offset.PORTNAME) {
- uint32_t pnLen;
- const char *pnBytes;
- char portName[SFL_MAX_PORTNAME_LEN + 1];
+ uint32_t pnLen;
+ const char *pnBytes;
+ char portName[SFL_MAX_PORTNAME_LEN + 1];
sflowxdr_setc(x, x->offset.PORTNAME);
printf("PORTNAME");
- pnLen = sflowxdr_next(x);
- SFLOWXDR_assert(x, (pnLen <= SFL_MAX_PORTNAME_LEN));
- pnBytes = sflowxdr_str(x);
- memcpy(portName, pnBytes, pnLen);
- portName[pnLen] = '\0';
- printf(" portName=%s", portName);
- printf("\n");
+ pnLen = sflowxdr_next(x);
+ SFLOWXDR_assert(x, (pnLen <= SFL_MAX_PORTNAME_LEN));
+ pnBytes = sflowxdr_str(x);
+ memcpy(portName, pnBytes, pnLen);
+ portName[pnLen] = '\0';
+ printf(" portName=%s", portName);
+ printf("\n");
}
if (x->offset.ETHCOUNTERS) {
sflowxdr_setc(x, x->offset.ETHCOUNTERS);
if (x->offset.TUNNEL4_IN) {
sflowxdr_setc(x, x->offset.TUNNEL4_IN);
- print_struct_ipv4(x, "tunnel4_in");
+ print_struct_ipv4(x, "tunnel4_in");
}
if (x->offset.TUNNEL4_OUT) {
sflowxdr_setc(x, x->offset.TUNNEL4_OUT);
- print_struct_ipv4(x, "tunnel4_out");
+ print_struct_ipv4(x, "tunnel4_out");
}
if (x->offset.TUNNEL_VNI_IN) {
sflowxdr_setc(x, x->offset.TUNNEL_VNI_IN);
- printf( " tunnel_in_vni=%"PRIu32, sflowxdr_next(x));
+ printf( " tunnel_in_vni=%"PRIu32, sflowxdr_next(x));
}
if (x->offset.TUNNEL_VNI_OUT) {
sflowxdr_setc(x, x->offset.TUNNEL_VNI_OUT);
- printf( " tunnel_out_vni=%"PRIu32, sflowxdr_next(x));
+ printf( " tunnel_out_vni=%"PRIu32, sflowxdr_next(x));
}
if (x->offset.MPLS) {
sflowxdr_mark_unique(x, &x->offset.SWITCH);
break;
- case SFLOW_TAG_PKT_TUNNEL4_OUT:
+ case SFLOW_TAG_PKT_TUNNEL4_OUT:
sflowxdr_mark_unique(x, &x->offset.TUNNEL4_OUT);
break;
- case SFLOW_TAG_PKT_TUNNEL4_IN:
+ case SFLOW_TAG_PKT_TUNNEL4_IN:
sflowxdr_mark_unique(x, &x->offset.TUNNEL4_IN);
break;
- case SFLOW_TAG_PKT_TUNNEL_VNI_OUT:
+ case SFLOW_TAG_PKT_TUNNEL_VNI_OUT:
sflowxdr_mark_unique(x, &x->offset.TUNNEL_VNI_OUT);
break;
- case SFLOW_TAG_PKT_TUNNEL_VNI_IN:
+ case SFLOW_TAG_PKT_TUNNEL_VNI_IN:
sflowxdr_mark_unique(x, &x->offset.TUNNEL_VNI_IN);
break;
- case SFLOW_TAG_PKT_MPLS:
+ case SFLOW_TAG_PKT_MPLS:
sflowxdr_mark_unique(x, &x->offset.MPLS);
break;
[OFPT_ERROR (xid=0x4): NXTTMFC_TABLE_FULL
NXT_TLV_TABLE_MOD (xid=0x4):
ADD mapping table:
- class type length match field
- ----- ---- ------ -----------
- 0xffff 0x2 124 tun_metadata2
- 0xffff 0x3 124 tun_metadata3
+ class type length match field
+ ------ ---- ------ --------------
+ 0xffff 0x2 124 tun_metadata2
+ 0xffff 0x3 124 tun_metadata3
])
AT_CHECK([ovs-ofctl add-flow br0 "tun_metadata0,tun_metadata0,actions=drop"], [1], [ignore],
OFPT_ERROR (xid=0x4): NXTTMFC_INVALID_TLV_DEL
NXT_TLV_TABLE_MOD (xid=0x4):
DEL mapping table:
- class type length match field
- ----- ---- ------ -----------
- 0xffff 0x3 4 tun_metadata2
+ class type length match field
+ ------ ---- ------ --------------
+ 0xffff 0x3 4 tun_metadata2
])
AT_CHECK([ovs-ofctl del-flows br0], [0])
OFPT_ERROR (xid=0x4): NXTTMFC_INVALID_TLV_DEL
NXT_TLV_TABLE_MOD (xid=0x4):
DEL mapping table:
- class type length match field
- ----- ---- ------ -----------
- 0xffff 0x1 4 tun_metadata1
+ class type length match field
+ ------ ---- ------ --------------
+ 0xffff 0x1 4 tun_metadata1
])
AT_CHECK([ovs-ofctl del-flows br0 "tun_metadata1"])
AT_CHECK([ovs-ofctl del-tlv-map br0 "{class=0xffff,type=1,len=4}->tun_metadata1"])
OFPT_ERROR (xid=0x4): NXTTMFC_INVALID_TLV_DEL
NXT_TLV_TABLE_MOD (xid=0x4):
DEL mapping table:
- class type length match field
- ----- ---- ------ -----------
- 0xffff 0x2 4 tun_metadata2
+ class type length match field
+ ------ ---- ------ --------------
+ 0xffff 0x2 4 tun_metadata2
])
AT_CHECK([ovs-ofctl del-flows br0 "reg1=0xFF"])
AT_CHECK([ovs-ofctl del-tlv-map br0], [0])
$OVS_PKI -B 1024 init
$OVS_PKI -B 1024 req+sign ovnsb switch
$OVS_PKI -B 1024 req+sign ovnnb switch
- for i in $(seq $n_controllers); do
+ for i in $(seq $n_controllers); do
$OVS_PKI -B 1024 -u req+sign chassis-$i switch
- done
+ done
fi
fi
rungdb $gdb_ovsdb $gdb_ovsdb_ex ovsdb-server --detach --no-chdir --pidfile -vconsole:off --log-file -vsyslog:off \
local i=$1; shift
rungdb $gdb_ovsdb $gdb_ovsdb_ex ovsdb-server --detach --no-chdir \
--pidfile=$db$i.pid -vconsole:off --log-file=$db$i.log \
- -vsyslog:off \
+ -vsyslog:off \
--remote=db:$schema_name,${DB}_Global,connections \
--private-key=db:$schema_name,SSL,private_key \
--certificate=db:$schema_name,SSL,certificate \
--ovnsb-db="$OVN_SB_DB" --ovnnb-db="$OVN_NB_DB"
done
for i in $(seq $n_controllers); do
- rungdb $gdb_ovn_controller $gdb_ovn_controller_ex ovn-controller \
+ rungdb $gdb_ovn_controller $gdb_ovn_controller_ex ovn-controller \
$OVN_CTRLR_PKI --detach --no-chdir -vsyslog:off \
- --pidfile=ovn-controller$i.pid -vconsole:off --log-file
+ --pidfile=ovn-controller$i.pid -vconsole:off --log-file
done
rungdb $gdb_ovn_controller_vtep $gdb_ovn_controller_vtep_ex \
ovn-controller-vtep --detach --no-chdir --pidfile -vconsole:off \
$OVN_CTRLR_PKI --log-file -vsyslog:off \
- --ovnsb-db=unix:"$sandbox"/ovnsb_db.sock
+ --ovnsb-db=unix:"$sandbox"/ovnsb_db.sock
fi
cat <<EOF
for iface in $(cd /sys/class/net && echo *); do
if [ -d /sys/class/net/$iface ]; then
- echo Interface $iface:
- # indent tc output so it's clear which interface it pertains to
- /sbin/tc -s -d class show dev $iface | /bin/sed 's/^/ /'
+ echo Interface $iface:
+ # indent tc output so it's clear which interface it pertains to
+ /sbin/tc -s -d class show dev $iface | /bin/sed 's/^/ /'
fi
done
: nlh->nlmsg_type == RTM_GETLINK ? "RTM_GETLINK"
: nlh->nlmsg_type == RTM_SETLINK ? "RTM_SETLINK"
: "other"));
- printf("\tflags:");
+ printf(" flags:");
for (i = 0; i < ARRAY_SIZE(flags); i++) {
if (iim->ifi_flags & flags[i].flag) {
printf(" %s", flags[i].name);
}
printf("\n");
if (netnsid_is_remote(nsid)) {
- printf("\tnetns id: %d\n", nsid);
+ printf(" netns id: %d\n", nsid);
} else {
- printf("\tnetns id: local\n");
+ printf(" netns id: local\n");
}
if (attrs[IFLA_MASTER]) {
uint32_t idx = nl_attr_get_u32(attrs[IFLA_MASTER]);
if (!if_indextoname(idx, ifname)) {
strcpy(ifname, "unknown");
}
- printf("\tmaster=%"PRIu32" (%s)\n", idx, ifname);
+ printf(" master=%"PRIu32" (%s)\n", idx, ifname);
}
}
done
;;
force-reload-kmod)
- force_reload_kmod
+ force_reload_kmod
;;
load-kmod)
insert_mod_if_required
local schema_name=$(ovsdb-tool schema-name $schema)
case $model in
- standalone | backup) ;;
- clustered)
- case $servers in
- [1-9] | [1-9][0-9]) ;;
- *) echo "${db}db servers must be between 1 and 99" >&2
- exit 1
- ;;
- esac
- ;;
- *)
- echo "unknown ${db}db model \"$model\"" >&2
- exit 1
- ;;
+ standalone | backup) ;;
+ clustered)
+ case $servers in
+ [1-9] | [1-9][0-9]) ;;
+ *) echo "${db}db servers must be between 1 and 99" >&2
+ exit 1
+ ;;
+ esac
+ ;;
+ *)
+ echo "unknown ${db}db model \"$model\"" >&2
+ exit 1
+ ;;
esac
ovn_start_ovsdb_server() {
- local i=$1; shift
- as ${db}$i ovsdb-server --detach --no-chdir --pidfile=$db.pid \
- -vsyslog:off -vconsole:off --log-file="$sim_base"/$db$i/$db.log \
- --remote=db:$schema_name,${DB}_Global,connections \
- --private-key=db:$schema_name,SSL,private_key \
- --certificate=db:$schema_name,SSL,certificate \
- --ca-cert=db:$schema_name,SSL,ca_cert \
- --ssl-protocols=db:$schema_name,SSL,ssl_protocols \
- --ssl-ciphers=db:$schema_name,SSL,ssl_ciphers \
- --unixctl=${db} --remote=punix:$db.ovsdb \
- "$sim_base"/$db$i/$db.db "$@"
+ local i=$1; shift
+ as ${db}$i ovsdb-server --detach --no-chdir --pidfile=$db.pid \
+ -vsyslog:off -vconsole:off --log-file="$sim_base"/$db$i/$db.log \
+ --remote=db:$schema_name,${DB}_Global,connections \
+ --private-key=db:$schema_name,SSL,private_key \
+ --certificate=db:$schema_name,SSL,certificate \
+ --ca-cert=db:$schema_name,SSL,ca_cert \
+ --ssl-protocols=db:$schema_name,SSL,ssl_protocols \
+ --ssl-ciphers=db:$schema_name,SSL,ssl_ciphers \
+ --unixctl=${db} --remote=punix:$db.ovsdb \
+ "$sim_base"/$db$i/$db.db "$@"
}
ovn_prep_db() {
- local i=$1
- mkdir "$sim_base"/${db}$i
- touch "$sim_base"/${db}$i/.$db.db.~lock~
+ local i=$1
+ mkdir "$sim_base"/${db}$i
+ touch "$sim_base"/${db}$i/.$db.db.~lock~
}
local n_remotes=1
case $model in
- standalone)
- ovn_prep_db 1
- ovsdb-tool create "$sim_base"/${db}1/$db.db "$schema"
- ovn_start_ovsdb_server 1
- ;;
- backup)
- for i in 1 2; do
- ovn_prep_db $i
- ovsdb-tool create "$sim_base"/$db$i/$db.db "$schema"
- done
- ovn_start_ovsdb_server 1
- ovn_start_ovsdb_server 2 --sync-from=unix:"$sim_base"/${db}1/$db.ovsdb
- cat <<EOF
+ standalone)
+ ovn_prep_db 1
+ ovsdb-tool create "$sim_base"/${db}1/$db.db "$schema"
+ ovn_start_ovsdb_server 1
+ ;;
+ backup)
+ for i in 1 2; do
+ ovn_prep_db $i
+ ovsdb-tool create "$sim_base"/$db$i/$db.db "$schema"
+ done
+ ovn_start_ovsdb_server 1
+ ovn_start_ovsdb_server 2 --sync-from=unix:"$sim_base"/${db}1/$db.ovsdb
+ cat <<EOF
The backup server of OVN $DB can be accessed by:
* ovn-${db}ctl --db=unix:$sim_base/${db}2/$db.ovsdb
* ovs-appctl -t $sim_base/${db}2/${db}
The backup database file is $sim_base/${db}2/$db.db
EOF
- ;;
- clustered)
- n_remotes=$servers
- for i in $(seq $servers); do
- ovn_prep_db $i
- if test $i = 1; then
- ovsdb-tool create-cluster "$sim_base"/$db$i/$db.db "$schema" unix:"$sim_base"/$db$i/db.raft
- else
- ovsdb-tool join-cluster "$sim_base"/$db$i/$db.db $schema_name unix:"$sim_base"/$db$i/db.raft unix:"$sim_base"/${db}1/db.raft
- fi
- ovn_start_ovsdb_server $i
- done
- for i in $(seq $servers); do
- ovsdb-client wait unix:"$sim_base"/${db}$i/$db.ovsdb $schema_name connected
- done
- ;;
+ ;;
+ clustered)
+ n_remotes=$servers
+ for i in $(seq $servers); do
+ ovn_prep_db $i
+ if test $i = 1; then
+ ovsdb-tool create-cluster "$sim_base"/$db$i/$db.db "$schema" unix:"$sim_base"/$db$i/db.raft
+ else
+ ovsdb-tool join-cluster "$sim_base"/$db$i/$db.db $schema_name unix:"$sim_base"/$db$i/db.raft unix:"$sim_base"/${db}1/db.raft
+ fi
+ ovn_start_ovsdb_server $i
+ done
+ for i in $(seq $servers); do
+ ovsdb-client wait unix:"$sim_base"/${db}$i/$db.ovsdb $schema_name connected
+ done
+ ;;
esac
remote=unix:"$sim_base"/${db}1/$db.ovsdb
for i in `seq 2 $n_remotes`; do
- remote=$remote,unix:"$sim_base"/${db}$i/$db.ovsdb
+ remote=$remote,unix:"$sim_base"/${db}$i/$db.ovsdb
done
eval OVN_${DB}_DB=\$remote
eval export OVN_${DB}_DB
local sbdb_servers=3
local prev=
for option; do
- # This option-parsing mechanism borrowed from a Autoconf-generated
- # configure script under the following license:
+ # This option-parsing mechanism borrowed from a Autoconf-generated
+ # configure script under the following license:
- # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
- # 2002, 2003, 2004, 2005, 2006, 2009, 2013 Free Software Foundation, Inc.
- # This configure script is free software; the Free Software Foundation
- # gives unlimited permission to copy, distribute and modify it.
+ # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+ # 2002, 2003, 2004, 2005, 2006, 2009, 2013 Free Software Foundation, Inc.
+ # This configure script is free software; the Free Software Foundation
+ # gives unlimited permission to copy, distribute and modify it.
- # If the previous option needs an argument, assign it.
- if test -n "$prev"; then
+ # If the previous option needs an argument, assign it.
+ if test -n "$prev"; then
eval $prev=\$option
prev=
continue
- fi
- case $option in
+ fi
+ case $option in
*=*) optarg=`expr "X$option" : '[^=]*=\(.*\)'` ;;
*) optarg=yes ;;
- esac
+ esac
- case $dashdash$option in
+ case $dashdash$option in
--)
- dashdash=yes ;;
+ dashdash=yes ;;
-h|--help)
- cat <<EOF
+ cat <<EOF
$FUNCNAME: start OVN central databases and daemons
usage: $FUNCNAME [OPTION...]
--sbdb-servers=N number of servers in sbdb cluster (default: 3)
-h, --help Print this usage message.
EOF
- return
- ;;
+ return
+ ;;
--nbdb-s*=*)
- nbdb_servers=$optarg
- nbdb_model=clustered
- ;;
+ nbdb_servers=$optarg
+ nbdb_model=clustered
+ ;;
--nbdb-s*)
- prev=nbdb_servers
- nbdb_model=clustered
- ;;
+ prev=nbdb_servers
+ nbdb_model=clustered
+ ;;
--nbdb-m*=*)
- nbdb_model=$optarg
- ;;
+ nbdb_model=$optarg
+ ;;
--nbdb-m*)
- prev=nbdb_model
- ;;
+ prev=nbdb_model
+ ;;
--sbdb-s*=*)
- sbdb_servers=$optarg
- sbdb_model=clustered
- ;;
+ sbdb_servers=$optarg
+ sbdb_model=clustered
+ ;;
--sbdb-s*)
- prev=sbdb_servers
- sbdb_model=clustered
- ;;
+ prev=sbdb_servers
+ sbdb_model=clustered
+ ;;
--sbdb-m*=*)
- sbdb_model=$optarg
- ;;
+ sbdb_model=$optarg
+ ;;
--sbdb-m*)
- prev=sbdb_model
- ;;
+ prev=sbdb_model
+ ;;
-*)
- echo "unrecognized option $option (use --help for help)" >&2
- return 1
- ;;
+ echo "unrecognized option $option (use --help for help)" >&2
+ return 1
+ ;;
*)
- echo "$option: non-option arguments not supported (use --help for help)" >&2
- return 1
- ;;
- esac
- shift
+ echo "$option: non-option arguments not supported (use --help for help)" >&2
+ return 1
+ ;;
+ esac
+ shift
done
if test -d ovn-sb || test -d ovn-nb; then
}
SMAP_FOR_EACH (node, details) {
- ds_put_format(ds, "\t%s: %s\n", node->key, node->value);
+ ds_put_format(ds, " %s: %s\n", node->key, node->value);
}
error = netdev_get_queue_stats(iface->netdev, queue_id, &stats);
if (!error) {
if (stats.tx_packets != UINT64_MAX) {
- ds_put_format(ds, "\ttx_packets: %"PRIu64"\n", stats.tx_packets);
+ ds_put_format(ds, " tx_packets: %"PRIu64"\n", stats.tx_packets);
}
if (stats.tx_bytes != UINT64_MAX) {
- ds_put_format(ds, "\ttx_bytes: %"PRIu64"\n", stats.tx_bytes);
+ ds_put_format(ds, " tx_bytes: %"PRIu64"\n", stats.tx_bytes);
}
if (stats.tx_errors != UINT64_MAX) {
- ds_put_format(ds, "\ttx_errors: %"PRIu64"\n", stats.tx_errors);
+ ds_put_format(ds, " tx_errors: %"PRIu64"\n", stats.tx_errors);
}
} else {
- ds_put_format(ds, "\tFailed to get statistics for queue %u: %s",
+ ds_put_format(ds, " Failed to get statistics for queue %u: %s",
queue_id, ovs_strerror(error));
}
}
{"name": "Open_vSwitch",
- "version": "7.16.0",
- "cksum": "2403910601 23776",
+ "version": "7.16.1",
+ "cksum": "1452282319 23860",
"tables": {
"Open_vSwitch": {
"columns": {
"OpenFlow14",
"OpenFlow15",
"OpenFlow16"]]},
- "min": 0, "max": "unlimited"}},
+ "min": 0, "max": "unlimited"}},
"fail_mode": {
"type": {"key": {"type": "string",
"enum": ["set", ["standalone", "secure"]]},
"Flow_Table": {
"columns": {
"name": {
- "type": {"key": "string", "min": 0, "max": 1}},
+ "type": {"key": "string", "min": 0, "max": 1}},
"flow_limit": {
- "type": {"key": {"type": "integer", "minInteger": 0},
- "min": 0, "max": 1}},
+ "type": {"key": {"type": "integer", "minInteger": 0},
+ "min": 0, "max": 1}},
"overflow_policy": {
- "type": {"key": {"type": "string",
- "enum": ["set", ["refuse", "evict"]]},
- "min": 0, "max": 1}},
+ "type": {"key": {"type": "string",
+ "enum": ["set", ["refuse", "evict"]]},
+ "min": 0, "max": 1}},
"groups": {
- "type": {"key": "string", "min": 0, "max": "unlimited"}},
+ "type": {"key": "string", "min": 0, "max": "unlimited"}},
"prefixes": {
"type": {"key": "string", "min": 0, "max": 3}},
"external_ids": {
</ul>
<p>Some interfaces may not have a software-controllable MAC
address. This option only affects internal ports. For other type ports,
- you can change the MAC address outside Open vSwitch, using ip command.</p>
+ you can change the MAC address outside Open vSwitch, using ip command.</p>
</column>
<column name="error">
if [ "$mode" != "vswitch" ] && [ "$mode" != "openvswitch" ]; then
printf "\nThe server is not configured to run Open vSwitch. To run in\n"
printf "vswitch mode, you must run the following command:\n\n"
- printf "\txe-switch-network-backend vswitch"
+ printf " xe-switch-network-backend vswitch"
printf "\n\n"
fi
fi