test-openflowd: Remove.
authorBen Pfaff <blp@nicira.com>
Mon, 24 Oct 2011 17:36:01 +0000 (10:36 -0700)
committerBen Pfaff <blp@nicira.com>
Mon, 24 Oct 2011 17:36:01 +0000 (10:36 -0700)
Some users were still confused by its presence.

NEWS
PORTING
tests/.gitignore
tests/automake.mk
tests/learn.at
tests/ofproto-dpif.at
tests/ofproto-macros.at
tests/ofproto.at
tests/ovs-ofctl.at
tests/test-openflowd.8.in [deleted file]
tests/test-openflowd.c [deleted file]

diff --git a/NEWS b/NEWS
index 75738d08b29c868f06bca5c46d79fdb1a70bfe0e..2bd710bc166b04e3e98f5b29e481bb05c4fc5cd5 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -35,6 +35,7 @@ Post-v1.2.0
     - Added support for native VLAN tagging.  A new "vlan_mode"
       parameter can be set for "port". Possible values: "access",
       "trunk", "native-tagged" and "native-untagged".
+    - test-openflowd has been removed.  Please use ovs-vswitchd instead.
 
 v1.2.0 - 03 Aug 2011
 ------------------------
diff --git a/PORTING b/PORTING
index a6685d900fec23da16173949a558ab2fe3e645f4..5281d50cf0a37583ace4ea210da17984694d4625 100644 (file)
--- a/PORTING
+++ b/PORTING
@@ -245,11 +245,6 @@ ovs_be64 as fixed-width types in network byte order.  Each of the
 latter is equivalent to the one of the former, but the difference in
 name makes the intended use obvious.
 
-ovs-vswitchd is the most sophisticated of ofproto's clients, but
-ofproto can have other clients as well.  test-openflowd, in the
-"tests" directory, is much simpler than ovs-vswitchd.  It may be
-easier to initially bring up test-openflowd as part of a port.
-
 lib/entropy.c assumes that it can obtain high-quality random number
 seeds at startup by reading from /dev/urandom.  You will need to
 modify it if this is not true on your platform.
index 11248a623023f347fc447bb922d85634d73c494f..20e4c164312a8cedcd8affb80ebe56470e30c7c8 100644 (file)
@@ -23,8 +23,6 @@
 /test-lockfile
 /test-multipath
 /test-odp
-/test-openflowd
-/test-openflowd.8
 /test-ovsdb
 /test-packets
 /test-random
index 455fc8bb726b54660af0ededc0816c088a198718..f11e2918ca812db8043ce184ec02b64a9461fbdb 100644 (file)
@@ -143,7 +143,6 @@ valgrind_wrappers = \
        tests/valgrind/test-lockfile \
        tests/valgrind/test-multipath \
        tests/valgrind/test-odp \
-       tests/valgrind/test-openflowd \
        tests/valgrind/test-ovsdb \
        tests/valgrind/test-packets \
        tests/valgrind/test-random \
@@ -248,17 +247,6 @@ noinst_PROGRAMS += tests/test-multipath
 tests_test_multipath_SOURCES = tests/test-multipath.c
 tests_test_multipath_LDADD = lib/libopenvswitch.a
 
-noinst_PROGRAMS += tests/test-openflowd
-EXTRA_DIST += tests/test-openflowd.8.in
-DISTCLEANFILES += tests/test-openflowd.8
-noinst_man_MANS += tests/ovs-openflowd.8
-tests_test_openflowd_SOURCES = tests/test-openflowd.c
-tests_test_openflowd_LDADD = \
-       ofproto/libofproto.a \
-       lib/libsflow.a \
-       lib/libopenvswitch.a \
-       $(SSL_LIBS)
-
 noinst_PROGRAMS += tests/test-packets
 tests_test_packets_SOURCES = tests/test-packets.c
 tests_test_packets_LDADD = lib/libopenvswitch.a
index 1a34b9af317ee35a8a8cb568a8b8b1861ff56a8e..93192ab82c7f6544fee58cc7f9ed15e34190a230 100644 (file)
@@ -55,7 +55,10 @@ AT_CHECK([[ovs-ofctl parse-flow 'actions=learn(load:NXM_OF_IP_DST[]->NXM_NX_REG1
 AT_CLEANUP
 
 AT_SETUP([learning action - standard VLAN+MAC learning])
-OFPROTO_START([--ports=dummy@eth0,dummy@eth1,dummy@eth2])
+OVS_VSWITCHD_START(
+  [add-port br0 eth0 -- set Interface eth0 type=dummy -- \
+   add-port br0 eth1 -- set Interface eth1 type=dummy -- \
+   add-port br0 eth2 -- set Interface eth2 type=dummy])
 # Set up flow table for VLAN+MAC learning.
 AT_DATA([flows.txt], [[
 table=0 actions=learn(table=1, hard_timeout=60, NXM_OF_VLAN_TCI[0..11], NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[], output:NXM_OF_IN_PORT[]), resubmit(,1)
@@ -64,7 +67,7 @@ table=1 priority=0 actions=flood
 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
 
 # Trace an ARP packet arriving on port 3, to create a MAC learning entry.
-AT_CHECK([ovs-appctl -t test-openflowd ofproto/trace br0 'in_port(3),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),eth_type(0x0806),arp(sip=192.168.0.1,tip=192.168.0.2,op=1,sha=50:54:00:00:00:05,tha=00:00:00:00:00:00)' -generate], [0], [stdout])
+AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(3),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),eth_type(0x0806),arp(sip=192.168.0.1,tip=192.168.0.2,op=1,sha=50:54:00:00:00:05,tha=00:00:00:00:00:00)' -generate], [0], [stdout])
 AT_CHECK([tail -1 stdout], [0], [Datapath actions: 2,0,1
 ])
 
@@ -77,7 +80,7 @@ NXST_FLOW reply:
 
 # Trace a packet arrival destined for the learned MAC.
 # (This will also learn a MAC.)
-AT_CHECK([ovs-appctl -t test-openflowd ofproto/trace br0 'in_port(1),eth(src=50:54:00:00:00:06,dst=50:54:00:00:00:05),eth_type(0x0806),arp(sip=192.168.0.2,tip=192.168.0.1,op=2,sha=50:54:00:00:00:06,tha=50:54:00:00:00:05)' -generate], [0], [stdout])
+AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(1),eth(src=50:54:00:00:00:06,dst=50:54:00:00:00:05),eth_type(0x0806),arp(sip=192.168.0.2,tip=192.168.0.1,op=2,sha=50:54:00:00:00:06,tha=50:54:00:00:00:05)' -generate], [0], [stdout])
 AT_CHECK([tail -1 stdout], [0], [Datapath actions: 3
 ])
 
@@ -90,7 +93,7 @@ NXST_FLOW reply:
 ])
 
 # Trace a packet arrival that updates the first learned MAC entry.
-AT_CHECK([ovs-appctl -t test-openflowd ofproto/trace br0 'in_port(2),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),eth_type(0x0806),arp(sip=192.168.0.1,tip=192.168.0.2,op=1,sha=50:54:00:00:00:05,tha=00:00:00:00:00:00)' -generate], [0], [stdout])
+AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(2),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),eth_type(0x0806),arp(sip=192.168.0.1,tip=192.168.0.2,op=1,sha=50:54:00:00:00:05,tha=00:00:00:00:00:00)' -generate], [0], [stdout])
 AT_CHECK([tail -1 stdout], [0], [Datapath actions: 3,0,1
 ])
 
@@ -101,5 +104,5 @@ AT_CHECK([ovs-ofctl dump-flows br0 table=1 | STRIP_XIDS | STRIP_DURATION | sort]
  cookie=0x0, duration=?s, table=1, n_packets=0, n_bytes=0, priority=0 actions=FLOOD
 NXST_FLOW reply:
 ])
-OFPROTO_STOP
+OVS_VSWITCHD_STOP
 AT_CLEANUP
index b97fc9b1c742b62b6628d03a951571720b3a5dbf..ec5c238df7fec69606834aec961332087b1724db 100644 (file)
@@ -1,7 +1,7 @@
 AT_BANNER([ofproto-dpif])
 
 AT_SETUP([ofproto-dpif - resubmit])
-OFPROTO_START
+OVS_VSWITCHD_START
 AT_DATA([flows.txt], [dnl
 table=0 in_port=1 priority=1000 icmp actions=output(10),resubmit(2),output(19),resubmit(3),output(21)
 table=0 in_port=2 priority=1500 icmp actions=output(11),resubmit(,1),output(16),resubmit(2,1),output(18)
@@ -11,15 +11,15 @@ table=1 in_port=2 priority=1500 icmp actions=output(17),resubmit(,2)
 table=1 in_port=3 priority=1500 icmp actions=output(14),resubmit(,2)
 ])
 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
-AT_CHECK([ovs-appctl -t test-openflowd ofproto/trace br0 'in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,frag=no),icmp(type=8,code=0)'], [0], [stdout])
+AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,frag=no),icmp(type=8,code=0)'], [0], [stdout])
 AT_CHECK([tail -1 stdout], [0],
   [Datapath actions: 10,11,12,13,14,15,16,17,18,19,20,21
 ])
-OFPROTO_STOP
+OVS_VSWITCHD_STOP
 AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - registers])
-OFPROTO_START
+OVS_VSWITCHD_START
 AT_DATA([flows.txt], [dnl
 in_port=90                 actions=resubmit:2,resubmit:3,resubmit:4,resubmit:91
 in_port=91                 actions=resubmit:5,resubmit:6,resubmit:7,resubmit:92
@@ -36,15 +36,15 @@ in_port=10,reg1=0xdeadbeef actions=output:21
 in_port=11,reg2=0xeef22dea actions=output:22
 ])
 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
-AT_CHECK([ovs-appctl -t test-openflowd ofproto/trace br0 'in_port(90),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,frag=no),icmp(type=8,code=0)'], [0], [stdout])
+AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(90),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,frag=no),icmp(type=8,code=0)'], [0], [stdout])
 AT_CHECK([tail -1 stdout], [0],
   [Datapath actions: 20,21,22
 ])
-OFPROTO_STOP
+OVS_VSWITCHD_STOP
 AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - output])
-OFPROTO_START
+OVS_VSWITCHD_START
 AT_DATA([flows.txt], [dnl
 in_port=1 actions=resubmit:2,resubmit:3,resubmit:4,resubmit:5,resubmit:6,resubmit:7
 in_port=2 actions=output:9
@@ -55,15 +55,15 @@ in_port=6 actions=output:NXM_NX_REG0[[0..15]],output:NXM_NX_REG0[[16..31]]
 in_port=7 actions=load:0x110000ff->NXM_NX_REG0[[]],output:NXM_NX_REG0[[]]
 ])
 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
-AT_CHECK([ovs-appctl -t test-openflowd ofproto/trace br0 'in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,frag=no),icmp(type=8,code=0)'], [0], [stdout])
+AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,frag=no),icmp(type=8,code=0)'], [0], [stdout])
 AT_CHECK([tail -1 stdout], [0],
   [Datapath actions: 9,55,10,55,66,11,77,88
 ])
-OFPROTO_STOP
+OVS_VSWITCHD_STOP
 AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - set_tunnel])
-OFPROTO_START
+OVS_VSWITCHD_START
 AT_DATA([flows.txt], [dnl
 in_port=90 actions=resubmit:1,resubmit:2,resubmit:3,resubmit:4,resubmit:5
 in_port=1 actions=set_tunnel:1,output:1
@@ -73,16 +73,17 @@ in_port=4 actions=set_tunnel:4,set_tunnel:3,output:4
 in_port=5 actions=set_tunnel:5
 ])
 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
-AT_CHECK([ovs-appctl -t test-openflowd ofproto/trace br0 'tun_id(0x1),in_port(90),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,frag=no),icmp(type=8,code=0)'], [0], [stdout])
+AT_CHECK([ovs-appctl ofproto/trace br0 'tun_id(0x1),in_port(90),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,frag=no),icmp(type=8,code=0)'], [0], [stdout])
 AT_CHECK([tail -1 stdout], [0],
   [Datapath actions: set(tun_id(0x1)),1,2,set(tun_id(0x3)),3,4
 ])
-OFPROTO_STOP
+OVS_VSWITCHD_STOP
 AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - VLAN handling])
 OVS_VSWITCHD_START(
-  [add-port br0 p1                                  trunks=10,12 -- \
+  [set Bridge br0 fail-mode=standalone -- \
+   add-port br0 p1                                  trunks=10,12 -- \
    add-port br0 p2                           tag=10              -- \
    add-port br0 p3                           tag=12              -- \
    add-port br0 p4                           tag=12              -- \
@@ -227,7 +228,7 @@ OVS_VSWITCHD_STOP
 AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - fragment handling])
-OFPROTO_START
+OVS_VSWITCHD_START
 AT_DATA([flows.txt], [dnl
 priority=75 tcp ip_frag=no    tp_dst=80 actions=output:1
 priority=75 tcp ip_frag=first tp_dst=80 actions=output:2
@@ -258,11 +259,10 @@ do
   AT_CHECK([ovs-ofctl set-frags br0 $mode])
   for type in no first later; do
     eval flow=\$${type}_flow exp_output=\$$type
-    AT_CHECK([ovs-appctl -t test-openflowd ofproto/trace br0 "$flow"],
-             [0], [stdout])
+    AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
     AT_CHECK_UNQUOTED([tail -1 stdout], [0], [Datapath actions: $exp_output
 ])
   done
 done
-OFPROTO_STOP
+OVS_VSWITCHD_STOP
 AT_CLEANUP
index 229e014b3d9a8acafd7d1031464035b2a946f4a2..5bc431c1356dc81c3036670010a57a6feade75e3 100644 (file)
@@ -2,26 +2,6 @@ m4_define([STRIP_XIDS], [[sed 's/ (xid=0x[0-9a-fA-F]*)//']])
 m4_define([STRIP_DURATION], [[sed 's/\bduration=[0-9.]*s/duration=?s/']])
 m4_define([TESTABLE_LOG], [-vPATTERN:ANY:'%c|%p|%m'])
 
-m4_define([OFPROTO_START],
-  [OVS_RUNDIR=$PWD; export OVS_RUNDIR
-   OVS_LOGDIR=$PWD; export OVS_LOGDIR
-   trap 'kill `cat test-openflowd.pid`' 0
-   AT_CAPTURE_FILE([test-openflowd.log])
-   AT_CHECK(
-     [test-openflowd --detach --pidfile --enable-dummy --log-file --fail=closed dummy@br0 none --datapath-id=fedcba9876543210 $1],
-     [0], [], [stderr])
-   AT_CHECK([[sed < stderr '
-/vlog|INFO|opened log file/d
-/openflowd|INFO|Open vSwitch version/d
-/openflowd|INFO|OpenFlow protocol version/d
-/ofproto|INFO|using datapath ID/d
-/ofproto|INFO|datapath ID changed to fedcba9876543210/d']])
-])
-
-m4_define([OFPROTO_STOP],
-  [AT_CHECK([ovs-appctl -t test-openflowd exit])
-   trap '' 0])
-
 m4_define([OVS_VSWITCHD_START],
   [dnl Skip this test if running as root.  Otherwise ovs-vswitchd will tear
    dnl down any existing datapaths if the kernel module is loaded.
@@ -57,7 +37,7 @@ m4_define([OVS_VSWITCHD_START],
 /ofproto|INFO|datapath ID changed to fedcba9876543210/d']])
 
    dnl Add bridges, ports, etc.
-   AT_CHECK([ovs-vsctl -- add-br br0 -- set bridge br0 datapath-type=dummy other-config:datapath-id=fedcba9876543210 -- $1])
+   AT_CHECK([ovs-vsctl -- add-br br0 -- set bridge br0 datapath-type=dummy other-config:datapath-id=fedcba9876543210 other-config:hwaddr=aa:55:aa:55:00:00 fail-mode=secure -- $1])
 ])
 
 m4_define([OVS_VSWITCHD_STOP],
index 66a0650b6834f92428ba07114ad5a060ccd71667..71cfb1415c9cccb7882fe2088c5c3ad7e1ca1b77 100644 (file)
@@ -1,13 +1,13 @@
 AT_BANNER([ofproto])
 
 AT_SETUP([ofproto - echo request])
-OFPROTO_START
+OVS_VSWITCHD_START
 AT_CHECK([ovs-ofctl -vANY:ANY:WARN probe br0])
-OFPROTO_STOP
+OVS_VSWITCHD_STOP
 AT_CLEANUP
 
 AT_SETUP([ofproto - feature request, config request])
-OFPROTO_START
+OVS_VSWITCHD_START
 AT_CHECK([ovs-ofctl -vANY:ANY:WARN show br0], [0], [stdout])
 AT_CHECK([STRIP_XIDS stdout], [0], [dnl
 OFPT_FEATURES_REPLY: ver:0x1, dpid:fedcba9876543210
@@ -18,35 +18,35 @@ features: capabilities:0x87, actions:0xfff
      state:      LINK_DOWN
 OFPT_GET_CONFIG_REPLY: frags=normal miss_send_len=0
 ])
-OFPROTO_STOP
+OVS_VSWITCHD_STOP
 AT_CLEANUP
 
 dnl This is really bare-bones.
 dnl It at least checks request and reply serialization and deserialization.
 AT_SETUP([ofproto - port stats])
-OFPROTO_START
+OVS_VSWITCHD_START
 AT_CHECK([ovs-ofctl -vANY:ANY:WARN dump-ports br0], [0], [stdout])
 AT_CHECK([STRIP_XIDS stdout], [0], [dnl
 OFPST_PORT reply: 1 ports
   port 65534: rx pkts=0, bytes=0, drop=0, errs=0, frame=0, over=0, crc=0
            tx pkts=0, bytes=0, drop=0, errs=0, coll=0
 ])
-OFPROTO_STOP
+OVS_VSWITCHD_STOP
 AT_CLEANUP
 
 dnl This is really bare-bones.
 dnl It at least checks request and reply serialization and deserialization.
 AT_SETUP([ofproto - queue stats])
-OFPROTO_START
+OVS_VSWITCHD_START
 AT_CHECK([ovs-ofctl -vANY:ANY:WARN queue-stats br0], [0], [stdout])
 AT_CHECK([STRIP_XIDS stdout], [0], [dnl
 OFPST_QUEUE reply: 0 queues
 ])
-OFPROTO_STOP
+OVS_VSWITCHD_STOP
 AT_CLEANUP
 
 AT_SETUP([ofproto - mod-port])
-OFPROTO_START
+OVS_VSWITCHD_START
 for command_config_state in \
     'up 0 0' \
     'noflood NO_FLOOD 0' \
@@ -67,11 +67,11 @@ features: capabilities:0x87, actions:0xfff
 OFPT_GET_CONFIG_REPLY: frags=normal miss_send_len=0
 ])
 done
-OFPROTO_STOP
+OVS_VSWITCHD_STOP
 AT_CLEANUP
 
 AT_SETUP([ofproto - basic flow_mod commands (NXM)])
-OFPROTO_START
+OVS_VSWITCHD_START
 AT_CHECK([ovs-ofctl dump-flows br0 | STRIP_XIDS], [0], [NXST_FLOW reply:
 ])
 AT_CHECK([echo 'in_port=1,actions=0' | ovs-ofctl add-flows br0 -])
@@ -89,11 +89,11 @@ NXST_AGGREGATE reply: packet_count=0 byte_count=0 flow_count=2
 AT_CHECK([ovs-ofctl del-flows br0])
 AT_CHECK([ovs-ofctl dump-flows br0 | STRIP_XIDS], [0], [NXST_FLOW reply:
 ])
-OFPROTO_STOP
+OVS_VSWITCHD_STOP
 AT_CLEANUP
 
 AT_SETUP([ofproto - basic flow_mod commands (OpenFlow 1.0)])
-OFPROTO_START
+OVS_VSWITCHD_START
 AT_CHECK([ovs-ofctl -F openflow10 dump-flows br0 | STRIP_XIDS], [0], [OFPST_FLOW reply:
 ])
 AT_CHECK([echo 'in_port=1,actions=0' | ovs-ofctl -F openflow10 add-flows br0 -])
@@ -111,5 +111,5 @@ OFPST_AGGREGATE reply: packet_count=0 byte_count=0 flow_count=2
 AT_CHECK([ovs-ofctl -F openflow10 del-flows br0])
 AT_CHECK([ovs-ofctl -F openflow10 dump-flows br0 | STRIP_XIDS], [0], [OFPST_FLOW reply:
 ])
-OFPROTO_STOP
+OVS_VSWITCHD_STOP
 AT_CLEANUP
index f3feff36f84323e88057510fa051d74263f682fc..25207f62840b30dd6af5421d777433fcf906131a 100644 (file)
@@ -540,45 +540,45 @@ dnl (If it doesn't, then either the tun_id won't show up at all, or it will
 dnl additionally show up as the top 32 bits of the cookie.)  This checks
 dnl for regression against bug #4566.
 AT_SETUP([ovs-ofctl -F option with flow_mods])
-OFPROTO_START
+OVS_VSWITCHD_START
 AT_CHECK([ovs-ofctl -F nxm add-flow br0 tun_id=0x12345678,actions=drop])
 AT_CHECK([ovs-ofctl dump-flows br0 | STRIP_XIDS | STRIP_DURATION], [0], [dnl
 NXST_FLOW reply:
  cookie=0x0, duration=?s, table=0, n_packets=0, n_bytes=0, tun_id=0x12345678 actions=drop
 ])
-OFPROTO_STOP
+OVS_VSWITCHD_STOP
 AT_CLEANUP
 
 dnl Check that "-F openflow10" is really honored on dump-flows.
 dnl (If it isn't, then dump-flows will show the register match.)
 AT_SETUP([ovs-ofctl dump-flows honors -F option])
-OFPROTO_START
+OVS_VSWITCHD_START
 AT_CHECK([ovs-ofctl add-flow br0 reg0=0x12345,actions=drop])
 AT_CHECK([ovs-ofctl -F openflow10 dump-flows br0 | STRIP_XIDS | STRIP_DURATION], [0], [dnl
 OFPST_FLOW reply:
  cookie=0x0, duration=?s, table=0, n_packets=0, n_bytes=0, actions=drop
 ])
-OFPROTO_STOP
+OVS_VSWITCHD_STOP
 AT_CLEANUP
 
 dnl Check that "-F openflow10" fails on dump-flows if the requested match
 dnl can't be represented in OpenFlow 1.0.
 AT_SETUP([ovs-ofctl dump-flows rejects bad -F option])
-OFPROTO_START
+OVS_VSWITCHD_START
 AT_CHECK([ovs-ofctl -F openflow10 dump-flows unix:br0.mgmt reg0=0xabcdef], [1], [],
   [ovs-ofctl: unix:br0.mgmt: cannot use requested flow format nxm for specified flow
 ])
-OFPROTO_STOP
+OVS_VSWITCHD_STOP
 AT_CLEANUP
 
 dnl Check that add-flow reports non-normalized flows (feature #5029).
 AT_SETUP([ovs-ofctl add-flow reports non-normalized flows])
-OFPROTO_START
+OVS_VSWITCHD_START
 AT_CHECK([ovs-ofctl TESTABLE_LOG add-flow br0 nw_src=1.2.3.4,actions=5],
   [0], [], [dnl
 ofp_util|INFO|normalization changed ofp_match, details:
 ofp_util|INFO| pre: nw_src=1.2.3.4
 ofp_util|INFO|post: @&t@
 ])
-OFPROTO_STOP
+OVS_VSWITCHD_STOP
 AT_CLEANUP
diff --git a/tests/test-openflowd.8.in b/tests/test-openflowd.8.in
deleted file mode 100644 (file)
index 135ba84..0000000
+++ /dev/null
@@ -1,345 +0,0 @@
-.TH test\-openflowd 8 "March 2009" "Open vSwitch" "Open vSwitch Manual"
-.\" This program's name:
-.ds PN test\-openflowd
-.\" SSL peer program's name:
-.ds SN ovs\-controller
-.
-.SH NAME
-test\-openflowd \- OpenFlow switch implementation
-.
-.SH SYNOPSIS
-.B test\-openflowd
-[\fIoptions\fR] \fIdatapath\fR \fIcontroller\fR\&...
-.
-.SH DESCRIPTION
-The \fBtest\-openflowd\fR program implements an OpenFlow switch using a
-flow-based datapath.  \fBtest\-openflowd\fR connects to one or more
-OpenFlow controllers over TCP or SSL.
-.PP
-For a more powerful alternative to \fBtest\-openflowd\fR, see
-\fBovs\-vswitchd\fR(8).  Do not run both daemons at the same time.
-.PP
-The mandatory \fIdatapath\fR argument argument specifies the local
-datapath to relay.  It takes the form [\fItype\fB@\fR]\fIname\fR,
-where \fIname\fR is the network device associated with the datapath's
-local port.  If \fItype\fR is given, it specifies the datapath
-provider of \fIname\fR, otherwise the default provider \fBsystem\fR is
-assumed.
-.
-.PP
-The optional \fIcontroller\fR arguments specify how to connect to the
-OpenFlow controller or controllers.  Each takes one of the following
-forms:
-.
-.so lib/vconn-active.man
-.IP "\fBnone\fR"
-Run without actively maintaining a connection to a remote OpenFlow
-controller.  (See the \fB\-\-listen\fR option, under \fBNetworking
-Options\fR below, for another way to make OpenFlow connections to the
-switch.)
-.
-.PP
-When multiple controllers are configured, \fBtest\-openflowd\fR
-connects to all of them simultaneously.  OpenFlow 1.0 does not specify
-how multiple controllers coordinate in interacting with a single
-switch, so more than one controller should be specified only if the
-controllers are themselves designed to coordinate with each other.
-(The Nicira-defined \fBNXT_ROLE\fR OpenFlow vendor extension may be
-useful for this.)
-.
-.SS "Contacting Controllers"
-The OpenFlow switch must be able to contact the OpenFlow controllers
-over the network.  It can do so in one of two ways:
-.
-.IP out-of-band
-In this configuration, OpenFlow traffic uses a network separate from
-the data traffic that it controls, that is, the switch does not use
-any of the network devices added to the datapath with \fBovs\-dpctl
-add\-if\fR in its communication with the controller.
-.IP
-To use \fBtest\-openflowd\fR in a network with out-of-band control, specify
-\fB\-\-out\-of\-band\fR on the \fBtest\-openflowd\fR command line.  The control
-network must be configured separately, before or after \fBtest\-openflowd\fR
-is started.
-.
-.IP in-band
-In this configuration, a single network is used for OpenFlow traffic
-and other data traffic, that is, the switch contacts the controller
-over one of the network devices added to the datapath with \fBovs\-dpctl
-add\-if\fR.  This configuration is often more convenient than
-out-of-band control, because it is not necessary to maintain two
-independent networks.
-.IP
-In-band control is the default for \fBtest\-openflowd\fR, so no special
-command-line option is required.
-
-Specify the location of the
-controller on the \fBtest\-openflowd\fR command line as the \fIcontroller\fR
-argument.  You must also configure the network device for the OpenFlow
-``local port'' to allow \fBtest\-openflowd\fR to connect to that controller.
-The OpenFlow local port is a virtual network port that \fBtest\-openflowd\fR
-bridges to the physical switch ports.  The name of the local port for
-a given \fIdatapath\fR may be seen by running \fBovs\-dpctl show
-\fIdatapath\fR; the local port is listed as port 0 in \fBshow\fR's
-output.
-.
-.IP
-Before \fBtest\-openflowd\fR starts, the local port network device is not
-bridged to any physical network, so the next step depends on whether
-connectivity is required to configure the device's IP address.  If the
-switch has a static IP address, you may configure its IP address now
-with a command such as 
-.B ifconfig of0 192.168.1.1
-and then invoke \fBtest\-openflowd\fR.
-.IP
-On the other hand, if the switch does not have a static IP address,
-e.g. it obtains its IP address dynamically via DHCP, the DHCP client
-will not be able to contact the DHCP server until the OpenFlow switch
-has started up.  Thus, start \fBtest\-openflowd\fR without configuring
-the local port network device, and start the DHCP client afterward.
-.RE
-.
-.SH OPTIONS
-.SS "OpenFlow Options"
-.TP
-\fB\-\-datapath\-id=\fIdpid\fR
-Sets \fIdpid\fR, which must consist of exactly 16 hexadecimal digits
-and may not be all-zero,
-as the datapath ID that the switch will use to identify itself to
-OpenFlow controllers.
-.IP
-If this option is omitted, the default datapath ID is taken from the
-Ethernet address of the datapath's local port (which is typically
-randomly generated) in the lower 48 bits and zeros in the upper 16.
-.
-.TP
-\fB\-\-mfr\-desc=\fIdesc\fR
-Set the description of the switch's manufacturer to \fIdesc\fR, which
-may contain up to 255 ASCII characters.
-.
-.TP
-\fB\-\-hw\-desc=\fIdesc\fR
-Set the description of the switch's hardware revision to \fIdesc\fR, which
-may contain up to 255 ASCII characters.
-.
-.TP
-\fB\-\-sw\-desc=\fIdesc\fR
-Set the description of the switch's software revision to \fIdesc\fR, which
-may contain up to 255 ASCII characters.
-.
-.TP
-\fB\-\-serial\-desc=\fIdesc\fR
-Set the description of the switch's serial number to \fIdesc\fR, which
-may contain up to 31 ASCII characters.
-.
-.TP
-\fB\-\-dp\-desc=\fIdesc\fR
-Set the description of the datapath to \fIdesc\fR, which may contain up to
-255 ASCII characters.  Note that this field is intended for debugging
-purposes and is not guaranteed to be unique and should not be used as
-the primary identifier of the datapath.
-.
-.SS "Networking Options"
-.TP
-\fB\-\-datapath\-id=\fIdpid\fR
-Sets \fIdpid\fR, which must consist of exactly 16 hexadecimal digits,
-as the datapath ID that the switch will use to identify itself to the
-OpenFlow controller.
-.IP
-If this option is omitted, the default datapath ID is taken from the
-Ethernet address of the datapath's local port (which is typically
-randomly generated) in the lower 48 bits and zeros in the upper 16.
-.
-.TP
-\fB\-\-fail=\fR[\fBstandalone\fR|\fBsecure\fR]
-The controller is, ordinarily, responsible for setting up all flows on
-the OpenFlow switch.  Thus, if the connection to the controller fails,
-no new network connections can be set up.  If the connection to the
-controller stays down long enough, no packets can pass through the
-switch at all.
-.IP
-If this option is set to \fBstandalone\fR (the default),
-\fBtest\-openflowd\fR will
-take over responsibility for setting up flows in the local datapath
-when no message has been received from the controller for three times
-the inactivity probe interval (see below), or 45 seconds by default.
-In this ``fail open'' mode, \fBtest\-openflowd\fR causes the datapath to act
-like an ordinary MAC-learning switch.  \fBtest\-openflowd\fR will continue to
-retry connection to the controller in the background and, when the
-connection succeeds, it discontinues its standalone switching behavior.
-.IP
-If this option is set to \fBsecure\fR, then \fBtest\-openflowd\fR will not
-set up flows on its own when the controller connection fails.
-.
-.TP
-\fB\-\-inactivity\-probe=\fIsecs\fR
-When the OpenFlow switch is connected to the controller, the
-switch waits for a message to be received from the controller for
-\fIsecs\fR seconds before it sends a inactivity probe to the
-controller.  After sending the inactivity probe, if no response is
-received for an additional \fIsecs\fR seconds, the switch
-assumes that the connection has been broken and attempts to reconnect.
-The default and the minimum value are both 5 seconds.
-.IP
-When fail-open mode is configured, changing the inactivity probe
-interval also changes the interval before entering fail-open mode (see
-above).
-.
-.TP
-\fB\-\-max\-idle=\fIsecs\fR|\fBpermanent\fR
-Sets \fIsecs\fR as the number of seconds that a flow set up by the
-OpenFlow switch will remain in the switch's flow table without any
-matching packets being seen.  If \fBpermanent\fR is specified, which
-is not recommended, flows set up by the switch will never
-expire.  The default is 15 seconds.
-.IP
-Most flows are set up by the OpenFlow controller, not by the
-switch.  This option affects only the following flows, which the
-OpenFlow switch sets up itself:
-.
-.RS
-.IP \(bu
-When \fB\-\-fail=open\fR is specified, flows set up when the
-switch has not been able to contact the controller for the configured
-fail-open delay.
-.
-.IP \(bu
-When in-band control is in use, flows set up to bootstrap contacting
-the controller (see \fBContacting the Controller\fR, above, for
-more information about in-band control).
-.RE
-.
-.IP
-As a result, when both \fB\-\-fail=secure\fR and \fB\-\-out\-of\-band\fR are
-specified, this option has no effect.
-.
-.TP
-\fB\-\-max\-backoff=\fIsecs\fR
-Sets the maximum time between attempts to connect to the controller to
-\fIsecs\fR, which must be at least 1.  The actual interval between
-connection attempts starts at 1 second and doubles on each failing
-attempt until it reaches the maximum.  The default maximum backoff
-time is 8 seconds.
-.
-.TP
-\fB\-l\fR, \fB\-\-listen=\fImethod\fR
-By default, the switch listens for OpenFlow management connections on a
-Unix domain socket named \fB@RUNDIR@/\fIdatapath\fB.mgmt\fR.  This socket 
-can be used to perform local OpenFlow monitoring and administration with
-tools such as \fBovs\-ofctl\fR.  
-.IP
-This option may be used to override the default listener.  The \fImethod\fR
-must be given as one of the passive OpenFlow connection methods listed
-below.  This option may be specified multiple times to listen to
-multiple connection methods.  If a single \fImethod\fR of \fBnone\fR is
-used, no listeners will be created.
-.
-.RS
-.so lib/vconn-passive.man
-.RE
-.
-.TP
-\fB\-\-snoop=\fImethod\fR
-Configures the switch to additionally listen for incoming OpenFlow
-connections for controller connection snooping.  The \fImethod\fR must
-be given as one of the passive OpenFlow connection methods listed
-under the \fB\-\-listen\fR option above.  This option may be specified
-multiple times to listen to multiple connection methods.
-.IP
-If \fBovs\-ofctl monitor\fR is used to connect to \fImethod\fR specified on
-\fB\-\-snoop\fR, it will display all the OpenFlow messages traveling
-between the switch and its controller on the primary OpenFlow
-connection.  This can be useful for debugging switch and controller
-problems.
-.
-.TP
-\fB\-\-in\-band\fR, \fB\-\-out\-of\-band\fR
-Configures \fBtest\-openflowd\fR to operate in in-band or out-of-band control
-mode (see \fBContacting the Controller\fR above).  When neither option
-is given, the default is in-band control.
-.
-.TP
-\fB\-\-netflow=\fIip\fB:\fIport\fR
-Configures the given UDP \fIport\fR on the specified IP \fIip\fR as
-a recipient of NetFlow messages for expired flows.  The \fIip\fR must
-be specified numerically, not as a DNS name.
-.IP
-This option may be specified multiple times to configure additional
-NetFlow collectors.
-.
-.SS "Rate-Limiting Options"
-.
-These options configure how the switch applies a ``token bucket'' to
-limit the rate at which packets in unknown flows are forwarded to an
-OpenFlow controller for flow-setup processing.  This feature prevents
-a single OpenFlow switch from overwhelming a controller.
-.
-.TP
-\fB\-\-rate\-limit\fR[\fB=\fIrate\fR]
-.
-Limits the maximum rate at which packets will be forwarded to the
-OpenFlow controller to \fIrate\fR packets per second.  If \fIrate\fR
-is not specified then the default of 1,000 packets per second is used.
-.IP
-If \fB\-\-rate\-limit\fR is not used, then the switch does not limit the
-rate at which packets are forwarded to the controller.
-.
-.TP
-\fB\-\-burst\-limit=\fIburst\fR
-.
-Sets the maximum number of unused packet credits that the switch will
-allow to accumulate during time in which no packets are being
-forwarded to the OpenFlow controller to \fIburst\fR (measured in
-packets).  The default \fIburst\fR is one-quarter of the \fIrate\fR
-specified on \fB\-\-rate\-limit\fR.
-.
-This option takes effect only when \fB\-\-rate\-limit\fR is also specified.
-.
-.SS "Datapath Options"
-.
-.IP "\fB\-\-ports=\fIport\fR[\fB,\fIport\fR...]"
-Ordinarily, \fBtest\-openflowd\fR expects the administrator to create
-the specified \fIdatapath\fR and add ports to it externally with a
-utility such as \fBovs\-dpctl\fR.  However, the userspace switch
-datapath is implemented inside \fBtest\-openflowd\fR itself and does
-not (currently) have any external interface for \fBovs\-dpctl\fR to
-access.  As a stopgap measure, this option specifies one or more ports
-to add to the datapath at \fBtest\-openflowd\fR startup time.  Multiple
-ports may be specified as a comma-separated list or by specifying
-\fB\-\-ports\fR multiple times.
-.IP
-See \fBINSTALL.userspace\fR for more information about userspace
-switching.
-.
-.SS "Daemon Options"
-.so lib/daemon.man
-.
-.SS "Public Key Infrastructure Options"
-.so lib/ssl.man
-.so lib/ssl-bootstrap.man
-.
-.SS "Logging Options"
-.so lib/vlog.man
-.SS "Other Options"
-.so lib/unixctl.man
-.so lib/common.man
-.so lib/leak-checker.man
-.
-.SH "RUNTIME MANAGEMENT COMMANDS"
-\fBovs\-appctl\fR(8) can send commands to a running
-\fBtest\-openflowd\fR process.  The currently supported commands are
-described below.
-.SS "TEST\-OPENFLOWD COMMANDS"
-These commands are specific to \fBtest\-openflowd\fR.
-.IP "\fBexit\fR"
-Causes \fBtest\-openflowd\fR to gracefully terminate.
-.so ofproto/ofproto-unixctl.man
-.so lib/vlog-unixctl.man
-.
-.SH "SEE ALSO"
-.
-.BR ovs\-appctl (8),
-.BR ovs\-controller (8),
-.BR ovs\-dpctl (8),
-.BR ovs\-ofctl (8),
-.BR ovs\-pki (8)
diff --git a/tests/test-openflowd.c b/tests/test-openflowd.c
deleted file mode 100644 (file)
index 4cd9312..0000000
+++ /dev/null
@@ -1,545 +0,0 @@
-/*
- * Copyright (c) 2008, 2009, 2010, 2011 Nicira Networks.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <config.h>
-#include <assert.h>
-#include <errno.h>
-#include <getopt.h>
-#include <inttypes.h>
-#include <netinet/in.h>
-#include <stdlib.h>
-#include <signal.h>
-#include <string.h>
-
-#include "command-line.h"
-#include "compiler.h"
-#include "daemon.h"
-#include "dirs.h"
-#include "dummy.h"
-#include "leak-checker.h"
-#include "list.h"
-#include "netdev.h"
-#include "ofpbuf.h"
-#include "ofproto/ofproto.h"
-#include "openflow/openflow.h"
-#include "packets.h"
-#include "poll-loop.h"
-#include "rconn.h"
-#include "stream-ssl.h"
-#include "timeval.h"
-#include "unixctl.h"
-#include "util.h"
-#include "vconn.h"
-#include "vlog.h"
-
-VLOG_DEFINE_THIS_MODULE(openflowd);
-
-/* Settings that may be configured by the user. */
-struct ofsettings {
-    const char *unixctl_path;   /* File name for unixctl socket. */
-
-    /* Controller configuration. */
-    struct ofproto_controller *controllers;
-    size_t n_controllers;
-    enum ofproto_fail_mode fail_mode;
-    bool run_forever;           /* Continue running even with no controller? */
-
-    /* Datapath. */
-    uint64_t datapath_id;       /* Datapath ID. */
-    char *dp_name;              /* Name of local datapath. */
-    char *dp_type;              /* Type of local datapath. */
-    struct sset ports;          /* Set of ports to add to datapath (if any). */
-
-    /* Description strings. */
-    const char *mfr_desc;       /* Manufacturer. */
-    const char *hw_desc;        /* Hardware. */
-    const char *sw_desc;        /* Software version. */
-    const char *serial_desc;    /* Serial number. */
-    const char *dp_desc;        /* Datapath description. */
-
-    /* Related vconns and network devices. */
-    struct sset snoops;          /* Listen for controller snooping conns. */
-
-    /* Failure behavior. */
-    int max_idle;             /* Idle time for flows in fail-open mode. */
-
-    /* NetFlow. */
-    struct sset netflow;        /* NetFlow targets. */
-};
-
-static unixctl_cb_func test_openflowd_exit;
-
-static void parse_options(int argc, char *argv[], struct ofsettings *);
-static void usage(void) NO_RETURN;
-
-int
-main(int argc, char *argv[])
-{
-    struct unixctl_server *unixctl;
-    struct ofproto *ofproto;
-    struct ofsettings s;
-    int error;
-    struct netflow_options nf_options;
-    const char *port;
-    bool exiting;
-
-    proctitle_init(argc, argv);
-    set_program_name(argv[0]);
-    parse_options(argc, argv, &s);
-    signal(SIGPIPE, SIG_IGN);
-
-    daemonize_start();
-
-    /* Start listening for ovs-appctl requests. */
-    error = unixctl_server_create(s.unixctl_path, &unixctl);
-    if (error) {
-        exit(EXIT_FAILURE);
-    }
-
-    unixctl_command_register("exit", "", test_openflowd_exit, &exiting);
-
-    VLOG_INFO("Open vSwitch version %s", VERSION BUILDNR);
-    VLOG_INFO("OpenFlow protocol version 0x%02x", OFP_VERSION);
-
-    error = ofproto_create(s.dp_name, s.dp_type, &ofproto);
-    if (error) {
-        VLOG_FATAL("could not initialize OpenFlow switch (%s)",
-                   strerror(error));
-    }
-
-    /* Add ports to the datapath if requested by the user. */
-    SSET_FOR_EACH (port, &s.ports) {
-        struct netdev *netdev;
-        char *name, *type;
-
-        netdev_parse_name(port, &name, &type);
-        error = netdev_open(name, type, &netdev);
-        if (error) {
-            VLOG_FATAL("%s: failed to open network device (%s)",
-                       port, strerror(error));
-        }
-        free(name);
-        free(type);
-
-        error = ofproto_port_add(ofproto, netdev, NULL);
-        if (error) {
-            VLOG_FATAL("failed to add %s as a port (%s)",
-                       port, strerror(error));
-        }
-
-        netdev_close(netdev);
-    }
-
-    /* Configure OpenFlow switch. */
-    if (s.datapath_id) {
-        ofproto_set_datapath_id(ofproto, s.datapath_id);
-    }
-    ofproto_set_desc(ofproto, s.mfr_desc, s.hw_desc, s.sw_desc,
-                     s.serial_desc, s.dp_desc);
-    error = ofproto_set_snoops(ofproto, &s.snoops);
-    if (error) {
-        VLOG_FATAL("failed to configure controller snooping connections (%s)",
-                   strerror(error));
-    }
-    memset(&nf_options, 0, sizeof nf_options);
-    nf_options.collectors = s.netflow;
-    error = ofproto_set_netflow(ofproto, &nf_options);
-    if (error) {
-        VLOG_FATAL("failed to configure NetFlow collectors (%s)",
-                   strerror(error));
-    }
-    ofproto_set_controllers(ofproto, s.controllers, s.n_controllers);
-    ofproto_set_fail_mode(ofproto, s.fail_mode);
-
-    daemonize_complete();
-
-    exiting = false;
-    while (!exiting && (s.run_forever || ofproto_is_alive(ofproto))) {
-        error = ofproto_run(ofproto);
-        if (error) {
-            VLOG_FATAL("unrecoverable datapath error (%s)", strerror(error));
-        }
-        unixctl_server_run(unixctl);
-        netdev_run();
-
-        ofproto_wait(ofproto);
-        unixctl_server_wait(unixctl);
-        netdev_wait();
-        if (exiting) {
-            poll_immediate_wake();
-        }
-        poll_block();
-    }
-
-    ofproto_destroy(ofproto);
-
-    return 0;
-}
-
-static void
-test_openflowd_exit(struct unixctl_conn *conn, const char *args OVS_UNUSED,
-                   void *exiting_)
-{
-    bool *exiting = exiting_;
-    *exiting = true;
-    unixctl_command_reply(conn, 200, NULL);
-}
-\f
-/* User interface. */
-
-/* Breaks 'ports' apart at commas and adds each resulting word to 'ports'. */
-static void
-parse_ports(const char *s_, struct sset *ports)
-{
-    char *s = xstrdup(s_);
-    char *save_ptr = NULL;
-    char *token;
-
-    for (token = strtok_r(s, ",", &save_ptr); token != NULL;
-         token = strtok_r(NULL, ",", &save_ptr)) {
-        sset_add(ports, token);
-    }
-    free(s);
-}
-
-static void
-parse_options(int argc, char *argv[], struct ofsettings *s)
-{
-    enum {
-        OPT_DATAPATH_ID = UCHAR_MAX + 1,
-        OPT_MFR_DESC,
-        OPT_HW_DESC,
-        OPT_SW_DESC,
-        OPT_SERIAL_DESC,
-        OPT_DP_DESC,
-        OPT_BR_NAME,
-        OPT_FAIL_MODE,
-        OPT_INACTIVITY_PROBE,
-        OPT_MAX_IDLE,
-        OPT_MAX_BACKOFF,
-        OPT_SNOOP,
-        OPT_RATE_LIMIT,
-        OPT_BURST_LIMIT,
-        OPT_BOOTSTRAP_CA_CERT,
-        OPT_OUT_OF_BAND,
-        OPT_IN_BAND,
-        OPT_NETFLOW,
-        OPT_PORTS,
-        OPT_UNIXCTL,
-        OPT_ENABLE_DUMMY,
-        VLOG_OPTION_ENUMS,
-        LEAK_CHECKER_OPTION_ENUMS,
-        DAEMON_OPTION_ENUMS
-    };
-    static struct option long_options[] = {
-        {"datapath-id", required_argument, NULL, OPT_DATAPATH_ID},
-        {"mfr-desc", required_argument, NULL, OPT_MFR_DESC},
-        {"hw-desc", required_argument, NULL, OPT_HW_DESC},
-        {"sw-desc", required_argument, NULL, OPT_SW_DESC},
-        {"serial-desc", required_argument, NULL, OPT_SERIAL_DESC},
-        {"dp-desc", required_argument, NULL, OPT_DP_DESC},
-        {"config",      required_argument, NULL, 'F'},
-        {"br-name",     required_argument, NULL, OPT_BR_NAME},
-        {"fail",        required_argument, NULL, OPT_FAIL_MODE},
-        {"inactivity-probe", required_argument, NULL, OPT_INACTIVITY_PROBE},
-        {"max-idle",    required_argument, NULL, OPT_MAX_IDLE},
-        {"max-backoff", required_argument, NULL, OPT_MAX_BACKOFF},
-        {"listen",      required_argument, NULL, 'l'},
-        {"snoop",      required_argument, NULL, OPT_SNOOP},
-        {"rate-limit",  optional_argument, NULL, OPT_RATE_LIMIT},
-        {"burst-limit", required_argument, NULL, OPT_BURST_LIMIT},
-        {"out-of-band", no_argument, NULL, OPT_OUT_OF_BAND},
-        {"in-band",     no_argument, NULL, OPT_IN_BAND},
-        {"netflow",     required_argument, NULL, OPT_NETFLOW},
-        {"ports",       required_argument, NULL, OPT_PORTS},
-        {"unixctl",     required_argument, NULL, OPT_UNIXCTL},
-        {"enable-dummy", no_argument, NULL, OPT_ENABLE_DUMMY},
-        {"verbose",     optional_argument, NULL, 'v'},
-        {"help",        no_argument, NULL, 'h'},
-        {"version",     no_argument, NULL, 'V'},
-        DAEMON_LONG_OPTIONS,
-        VLOG_LONG_OPTIONS,
-        LEAK_CHECKER_LONG_OPTIONS,
-        STREAM_SSL_LONG_OPTIONS,
-        {"bootstrap-ca-cert", required_argument, NULL, OPT_BOOTSTRAP_CA_CERT},
-        {NULL, 0, NULL, 0},
-    };
-    char *short_options = long_options_to_short_options(long_options);
-    struct ofproto_controller controller_opts;
-    struct sset controllers;
-    const char *name;
-    int i;
-
-    /* Set defaults that we can figure out before parsing options. */
-    controller_opts.target = NULL;
-    controller_opts.max_backoff = 8;
-    controller_opts.probe_interval = 5;
-    controller_opts.band = OFPROTO_IN_BAND;
-    controller_opts.rate_limit = 0;
-    controller_opts.burst_limit = 0;
-    s->unixctl_path = NULL;
-    s->fail_mode = OFPROTO_FAIL_STANDALONE;
-    s->datapath_id = 0;
-    s->mfr_desc = NULL;
-    s->hw_desc = NULL;
-    s->sw_desc = NULL;
-    s->serial_desc = NULL;
-    s->dp_desc = NULL;
-    sset_init(&controllers);
-    sset_init(&s->snoops);
-    s->max_idle = 0;
-    sset_init(&s->netflow);
-    sset_init(&s->ports);
-    for (;;) {
-        int c;
-
-        c = getopt_long(argc, argv, short_options, long_options, NULL);
-        if (c == -1) {
-            break;
-        }
-
-        switch (c) {
-        case OPT_DATAPATH_ID:
-            if (!dpid_from_string(optarg, &s->datapath_id)) {
-                VLOG_FATAL("argument to --datapath-id must be exactly 16 hex "
-                           "digits and may not be all-zero");
-            }
-            break;
-
-        case OPT_MFR_DESC:
-            s->mfr_desc = optarg;
-            break;
-
-        case OPT_HW_DESC:
-            s->hw_desc = optarg;
-            break;
-
-        case OPT_SW_DESC:
-            s->sw_desc = optarg;
-            break;
-
-        case OPT_SERIAL_DESC:
-            s->serial_desc = optarg;
-            break;
-
-        case OPT_DP_DESC:
-            s->dp_desc = optarg;
-            break;
-
-        case OPT_FAIL_MODE:
-            if (!strcmp(optarg, "open") || !strcmp(optarg, "standalone")) {
-                s->fail_mode = OFPROTO_FAIL_STANDALONE;
-            } else if (!strcmp(optarg, "closed")
-                       || !strcmp(optarg, "secure")) {
-                s->fail_mode = OFPROTO_FAIL_SECURE;
-            } else {
-                VLOG_FATAL("--fail argument must be \"standalone\" "
-                           "or \"secure\"");
-            }
-            break;
-
-        case OPT_INACTIVITY_PROBE:
-            controller_opts.probe_interval = atoi(optarg);
-            if (controller_opts.probe_interval < 5) {
-                VLOG_FATAL("--inactivity-probe argument must be at least 5");
-            }
-            break;
-
-        case OPT_MAX_IDLE:
-            if (!strcmp(optarg, "permanent")) {
-                s->max_idle = OFP_FLOW_PERMANENT;
-            } else {
-                s->max_idle = atoi(optarg);
-                if (s->max_idle < 1 || s->max_idle > 65535) {
-                    VLOG_FATAL("--max-idle argument must be between 1 and "
-                               "65535 or the word 'permanent'");
-                }
-            }
-            break;
-
-        case OPT_MAX_BACKOFF:
-            controller_opts.max_backoff = atoi(optarg);
-            if (controller_opts.max_backoff < 1) {
-                VLOG_FATAL("--max-backoff argument must be at least 1");
-            } else if (controller_opts.max_backoff > 3600) {
-                controller_opts.max_backoff = 3600;
-            }
-            break;
-
-        case OPT_RATE_LIMIT:
-            if (optarg) {
-                controller_opts.rate_limit = atoi(optarg);
-                if (controller_opts.rate_limit < 1) {
-                    VLOG_FATAL("--rate-limit argument must be at least 1");
-                }
-            } else {
-                controller_opts.rate_limit = 1000;
-            }
-            break;
-
-        case OPT_BURST_LIMIT:
-            controller_opts.burst_limit = atoi(optarg);
-            if (controller_opts.burst_limit < 1) {
-                VLOG_FATAL("--burst-limit argument must be at least 1");
-            }
-            break;
-
-        case OPT_OUT_OF_BAND:
-            controller_opts.band = OFPROTO_OUT_OF_BAND;
-            break;
-
-        case OPT_IN_BAND:
-            controller_opts.band = OFPROTO_IN_BAND;
-            break;
-
-        case OPT_NETFLOW:
-            sset_add(&s->netflow, optarg);
-            break;
-
-        case 'l':
-            sset_add(&controllers, optarg);
-            break;
-
-        case OPT_SNOOP:
-            sset_add(&s->snoops, optarg);
-            break;
-
-        case OPT_PORTS:
-            parse_ports(optarg, &s->ports);
-            break;
-
-        case OPT_UNIXCTL:
-            s->unixctl_path = optarg;
-            break;
-
-        case OPT_ENABLE_DUMMY:
-            dummy_enable();
-            break;
-
-        case 'h':
-            usage();
-
-        case 'V':
-            ovs_print_version(OFP_VERSION, OFP_VERSION);
-            exit(EXIT_SUCCESS);
-
-        DAEMON_OPTION_HANDLERS
-
-        VLOG_OPTION_HANDLERS
-
-        LEAK_CHECKER_OPTION_HANDLERS
-
-        STREAM_SSL_OPTION_HANDLERS
-
-        case OPT_BOOTSTRAP_CA_CERT:
-            stream_ssl_set_ca_cert_file(optarg, true);
-            break;
-
-        case '?':
-            exit(EXIT_FAILURE);
-
-        default:
-            abort();
-        }
-    }
-    free(short_options);
-
-    argc -= optind;
-    argv += optind;
-    if (argc < 2) {
-        VLOG_FATAL("need at least two non-option arguments; "
-                   "use --help for usage");
-    }
-
-    /* Rate limiting. */
-    if (controller_opts.rate_limit && controller_opts.rate_limit < 100) {
-        VLOG_WARN("Rate limit set to unusually low value %d",
-                  controller_opts.rate_limit);
-    }
-
-    /* Local vconns. */
-    ofproto_parse_name(argv[0], &s->dp_name, &s->dp_type);
-
-    /* Figure out controller names. */
-    s->run_forever = false;
-    if (sset_is_empty(&controllers)) {
-        sset_add_and_free(&controllers, xasprintf("punix:%s/%s.mgmt",
-                                                  ovs_rundir(), s->dp_name));
-    }
-    for (i = 1; i < argc; i++) {
-        if (!strcmp(argv[i], "none")) {
-            s->run_forever = true;
-        } else {
-            sset_add(&controllers, argv[i]);
-        }
-    }
-
-    /* Set up controllers. */
-    s->n_controllers = sset_count(&controllers);
-    s->controllers = xmalloc(s->n_controllers * sizeof *s->controllers);
-    i = 0;
-    SSET_FOR_EACH (name, &controllers) {
-        s->controllers[i] = controller_opts;
-        s->controllers[i].target = xstrdup(name);
-        i++;
-    }
-    sset_destroy(&controllers);
-}
-
-static void
-usage(void)
-{
-    printf("%s: an OpenFlow switch implementation.\n"
-           "usage: %s [OPTIONS] [TYPE@]DATAPATH CONTROLLER...\n"
-           "where DATAPATH is a local datapath (e.g. \"dp0\")\n"
-           "optionally with an explicit TYPE (default: \"system\").\n"
-           "Each CONTROLLER is an active OpenFlow connection method.\n",
-           program_name, program_name);
-    vconn_usage(true, true, true);
-    printf("\nOpenFlow options:\n"
-           "  -d, --datapath-id=ID    Use ID as the OpenFlow switch ID\n"
-           "                          (ID must consist of 16 hex digits)\n"
-           "  --mfr-desc=MFR          Identify manufacturer as MFR\n"
-           "  --hw-desc=HW            Identify hardware as HW\n"
-           "  --sw-desc=SW            Identify software as SW\n"
-           "  --serial-desc=SERIAL    Identify serial number as SERIAL\n"
-           "  --dp-desc=DP_DESC       Identify dp description as DP_DESC\n"
-           "\nNetworking options:\n"
-           "  --fail=open|closed      when controller connection fails:\n"
-           "                            closed: drop all packets\n"
-           "                            open (default): act as learning switch\n"
-           "  --inactivity-probe=SECS time between inactivity probes\n"
-           "  --max-idle=SECS         max idle for flows set up by switch\n"
-           "  --max-backoff=SECS      max time between controller connection\n"
-           "                          attempts (default: 8 seconds)\n"
-           "  -l, --listen=METHOD     allow management connections on METHOD\n"
-           "                          (a passive OpenFlow connection method)\n"
-           "  --snoop=METHOD          allow controller snooping on METHOD\n"
-           "                          (a passive OpenFlow connection method)\n"
-           "  --out-of-band           controller connection is out-of-band\n"
-           "  --netflow=HOST:PORT     configure NetFlow output target\n"
-           "\nRate-limiting of \"packet-in\" messages to the controller:\n"
-           "  --rate-limit[=PACKETS]  max rate, in packets/s (default: 1000)\n"
-           "  --burst-limit=BURST     limit on packet credit for idle time\n");
-    daemon_usage();
-    vlog_usage();
-    printf("\nOther options:\n"
-           "  --unixctl=SOCKET        override default control socket name\n"
-           "  -h, --help              display this help message\n"
-           "  -V, --version           display version information\n");
-    leak_checker_usage();
-    exit(EXIT_SUCCESS);
-}