Looks good. Ethan
On Wed, Oct 19, 2011 at 12:37, Ben Pfaff <[email protected]> wrote: > Some users were still confused by its presence. > --- > NEWS | 1 + > PORTING | 5 - > tests/.gitignore | 2 - > tests/automake.mk | 13 - > tests/learn.at | 13 +- > tests/ofproto-dpif.at | 27 ++- > tests/ofproto-macros.at | 22 +-- > tests/ofproto.at | 28 ++-- > tests/ovs-ofctl.at | 16 +- > tests/test-openflowd.8.in | 345 ---------------------------- > tests/test-openflowd.c | 545 > --------------------------------------------- > 11 files changed, 46 insertions(+), 971 deletions(-) > delete mode 100644 tests/test-openflowd.8.in > delete mode 100644 tests/test-openflowd.c > > diff --git a/NEWS b/NEWS > index ff3bc44..cbe29ae 100644 > --- a/NEWS > +++ b/NEWS > @@ -26,6 +26,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 a6685d9..5281d50 100644 > --- 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. > diff --git a/tests/.gitignore b/tests/.gitignore > index 1454dac..2463eeb 100644 > --- a/tests/.gitignore > +++ b/tests/.gitignore > @@ -23,8 +23,6 @@ > /test-lockfile > /test-multipath > /test-odp > -/test-openflowd > -/test-openflowd.8 > /test-ovsdb > /test-packets > /test-random > diff --git a/tests/automake.mk b/tests/automake.mk > index dcd7f97..1213b79 100644 > --- a/tests/automake.mk > +++ b/tests/automake.mk > @@ -141,7 +141,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 \ > @@ -245,18 +244,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 > diff --git a/tests/learn.at b/tests/learn.at > index 1a34b9a..93192ab 100644 > --- a/tests/learn.at > +++ b/tests/learn.at > @@ -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 > diff --git a/tests/ofproto-dpif.at b/tests/ofproto-dpif.at > index b5ca08c..0204cda 100644 > --- a/tests/ofproto-dpif.at > +++ b/tests/ofproto-dpif.at > @@ -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),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),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),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),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),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),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),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),icmp(type=8,code=0)'], > [0], [stdout]) > AT_CHECK([tail -1 stdout], [0], > [Datapath actions: set_tunnel(0x1),1,2,set_tunnel(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 -- \ > diff --git a/tests/ofproto-macros.at b/tests/ofproto-macros.at > index 229e014..5bc431c 100644 > --- a/tests/ofproto-macros.at > +++ b/tests/ofproto-macros.at > @@ -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], > diff --git a/tests/ofproto.at b/tests/ofproto.at > index 66a0650..71cfb14 100644 > --- a/tests/ofproto.at > +++ b/tests/ofproto.at > @@ -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 > diff --git a/tests/ovs-ofctl.at b/tests/ovs-ofctl.at > index 9dcd249..d67c11e 100644 > --- a/tests/ovs-ofctl.at > +++ b/tests/ovs-ofctl.at > @@ -488,45 +488,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 > index 135ba84..0000000 > --- a/tests/test-openflowd.8.in > +++ /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 > index 4cd9312..0000000 > --- a/tests/test-openflowd.c > +++ /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); > -} > - > -/* 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); > -} > -- > 1.7.4.4 > > _______________________________________________ > dev mailing list > [email protected] > http://openvswitch.org/mailman/listinfo/dev > _______________________________________________ dev mailing list [email protected] http://openvswitch.org/mailman/listinfo/dev
