diff mbox

[ovs-dev,02/10] tests: Change ADD_OF_PORTS from macro to shell function.

Message ID 1453917089-30631-3-git-send-email-blp@ovn.org
State Accepted
Headers show

Commit Message

Ben Pfaff Jan. 27, 2016, 5:51 p.m. UTC
This reduces the size of the generated testsuite and makes it possible
to pass arguments that vary at runtime instead of at the time of
translation from .at to shell script.

Signed-off-by: Ben Pfaff <blp@ovn.org>
---
 tests/bridge.at         |   2 +-
 tests/classifier.at     |  10 +--
 tests/learn.at          |   6 +-
 tests/ofproto-dpif.at   | 204 ++++++++++++++++++++++++------------------------
 tests/ofproto-macros.at |  26 +++---
 tests/ofproto.at        |  14 ++--
 tests/tunnel.at         |   2 +-
 tests/vlan-splinters.at |   2 +-
 8 files changed, 134 insertions(+), 132 deletions(-)

Comments

Jarno Rajahalme Jan. 28, 2016, 8:30 p.m. UTC | #1
Do we have an issue with the generated testsuite size?

Acked-by: Jarno Rajahalme <jarno@ovn.org>

> On Jan 27, 2016, at 9:51 AM, Ben Pfaff <blp@ovn.org> wrote:
> 
> This reduces the size of the generated testsuite and makes it possible
> to pass arguments that vary at runtime instead of at the time of
> translation from .at to shell script.
> 
> Signed-off-by: Ben Pfaff <blp@ovn.org>
> ---
> tests/bridge.at         |   2 +-
> tests/classifier.at     |  10 +--
> tests/learn.at          |   6 +-
> tests/ofproto-dpif.at   | 204 ++++++++++++++++++++++++------------------------
> tests/ofproto-macros.at |  26 +++---
> tests/ofproto.at        |  14 ++--
> tests/tunnel.at         |   2 +-
> tests/vlan-splinters.at |   2 +-
> 8 files changed, 134 insertions(+), 132 deletions(-)
> 
> diff --git a/tests/bridge.at b/tests/bridge.at
> index 817931f..c9ad1e6 100644
> --- a/tests/bridge.at
> +++ b/tests/bridge.at
> @@ -8,7 +8,7 @@ AT_SETUP([bridge - ports that disappear get added back])
> OVS_VSWITCHD_START
> 
> # Add some ports and make sure that they show up in the datapath.
> -ADD_OF_PORTS([br0], 1, 2)
> +add_of_ports br0 1 2
> AT_CHECK([ovs-appctl dpif/show], [0], [dnl
> dummy@ovs-dummy: hit:0 missed:0
> 	br0:
> diff --git a/tests/classifier.at b/tests/classifier.at
> index 3520acd..b110508 100644
> --- a/tests/classifier.at
> +++ b/tests/classifier.at
> @@ -30,7 +30,7 @@ m4_foreach(
> AT_BANNER([flow classifier lookup segmentation])
> AT_SETUP([flow classifier - lookup segmentation])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], [1], [2], [3])
> +add_of_ports br0 1 2 3
> AT_DATA([flows.txt], [dnl
> table=0 in_port=1 priority=16,tcp,nw_dst=10.1.0.0/255.255.0.0,action=output(3)
> table=0 in_port=1 priority=32,tcp,nw_dst=10.1.2.15,action=output(2)
> @@ -68,7 +68,7 @@ AT_CLEANUP
> AT_BANNER([flow classifier prefix lookup])
> AT_SETUP([flow classifier - prefix lookup])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], [1], [2], [3])
> +add_of_ports br0 1 2 3
> AT_CHECK([ovs-vsctl set Bridge br0 flow_tables:0=@N1 -- --id=@N1 create Flow_Table name=t0], [0], [ignore], [])
> AT_DATA([flows.txt], [dnl
> table=0 in_port=1 priority=16,tcp,nw_dst=10.1.0.0/255.255.0.0,action=output(3)
> @@ -133,7 +133,7 @@ AT_BANNER([conjunctive match])
> 
> AT_SETUP([single conjunctive match])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], 1, 2, 3, 4, 5)
> +add_of_ports br0 1 2 3 4 5
> AT_DATA([flows.txt], [dnl
> conj_id=1,actions=3
> priority=100,ip,ip_src=10.0.0.1,actions=conjunction(1,1/2)
> @@ -170,7 +170,7 @@ AT_CLEANUP
> 
> AT_SETUP([multiple conjunctive match])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], 1, 2, 3, 4, 5)
> +add_of_ports br0 1 2 3 4 5
> AT_DATA([flows.txt], [dnl
> conj_id=1,actions=1
> conj_id=2,actions=2
> @@ -246,7 +246,7 @@ AT_CLEANUP
> # priority flow.  This test checks this special case.
> AT_SETUP([conjunctive match priority fallback])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], 1, 2, 3, 4, 5, 6, 7)
> +add_of_ports br0 1 2 3 4 5 6 7
> AT_DATA([flows.txt], [dnl
> conj_id=1,actions=1
> conj_id=3,actions=3
> diff --git a/tests/learn.at b/tests/learn.at
> index 2b2fc28..97d78bf 100644
> --- a/tests/learn.at
> +++ b/tests/learn.at
> @@ -302,7 +302,7 @@ AT_CLEANUP
> # flow.
> AT_SETUP([learning action - self-modifying flow])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], 1, 2, 3)
> +add_of_ports br0 1 2 3
> 
> ovs-appctl time/stop
> # Set up flow table for TCPv4 port learning.
> @@ -344,7 +344,7 @@ AT_CLEANUP
> # attributed correctly.
> AT_SETUP([learning action - self-modifying flow with idle_timeout])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], 1, 2, 3)
> +add_of_ports br0 1 2 3
> 
> ovs-appctl time/stop
> # Set up flow table for TCPv4 port learning.
> @@ -402,7 +402,7 @@ AT_CLEANUP
> # attributed correctly.
> AT_SETUP([learning action - self-modifying flow with hard_timeout])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], 1, 2, 3)
> +add_of_ports br0 1 2 3
> 
> ovs-appctl time/stop
> # Set up flow table for TCPv4 port learning.
> diff --git a/tests/ofproto-dpif.at b/tests/ofproto-dpif.at
> index aa2f1bb..75db58f 100644
> --- a/tests/ofproto-dpif.at
> +++ b/tests/ofproto-dpif.at
> @@ -209,8 +209,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - resubmit])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], [1], [10], [11], [12], [13], [14], [15],
> -                    [16], [17], [18], [19], [20], [21])
> +add_of_ports br0 1 10 11 12 13 14 15 16 17 18 19 20 21
> 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)
> @@ -229,7 +228,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - goto table])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], [1], [10], [11])
> +add_of_ports br0 1 10 11
> echo "table=0 in_port=1 actions=output(10),goto_table(1)" > flows.txt
> for i in `seq 1 63`; do echo "table=$i actions=goto_table($(($i+1)))"; done >> flows.txt
> echo "table=64 actions=output(11)" >> flows.txt
> @@ -243,7 +242,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - write actions])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], [1], [10], [11], [12], [13])
> +add_of_ports br0 1 10 11 12 13
> AT_DATA([flows.txt], [dnl
> table=0 in_port=1,ip actions=output(10),write_actions(set_field:192.168.3.90->ip_src,output(12)),goto_table(1)
> table=1 ip actions=write_actions(output(13)),goto_table(2)
> @@ -260,7 +259,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - modify IPv6 Neighbor Solitication (ND)])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], [1], [10], [11], [12], [13])
> +add_of_ports br0 1 10 11 12 13
> AT_DATA([flows.txt], [dnl
> table=0 in_port=1,icmp6,icmpv6_type=135 actions=output(10),write_actions(set_field:fe80::3->nd_target,set_field:aa:aa:aa:aa:aa:aa->nd_sll,output(12)),goto_table(1)
> table=1 icmp6 actions=write_actions(output(13)),goto_table(2)
> @@ -279,7 +278,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - clear actions])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], [1], [10], [11], [12])
> +add_of_ports br0 1 10 11 12
> AT_DATA([flows.txt], [dnl
> table=0 in_port=1,ip actions=output(10),write_actions(set_field:192.168.3.90->ip_src,output(12)),goto_table(1)
> table=1 tcp actions=set_field:91->tp_src,output(11),clear_actions
> @@ -295,7 +294,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - group chaining])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], [1], [10], [11])
> +add_of_ports br0 1 10 11
> AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=all,bucket=set_field:192.168.3.90->ip_src,group:123,bucket=output:11'])
> AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=123,type=all,bucket=output:10'])
> AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=group:1234'])
> @@ -308,7 +307,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - all group in action list])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], [1], [10], [11])
> +add_of_ports br0 1 10 11
> AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=all,bucket=output:10,set_field:192.168.3.90->ip_src,bucket=output:11'])
> AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=group:1234'])
> AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
> @@ -323,7 +322,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - indirect group in action list])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], [1], [10])
> +add_of_ports br0 1 10
> AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 group_id=1234,type=indirect,bucket=output:10])
> AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=group:1234'])
> AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
> @@ -335,7 +334,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - group actions have no effect afterwards])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], [1], [10])
> +add_of_ports br0 1 10
> AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=select,bucket=set_field:192.168.3.90->ip_src,output:10'])
> AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=group:1234,output:10'])
> AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
> @@ -347,7 +346,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - all group in action set])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], [1], [10], [11])
> +add_of_ports br0 1 10 11
> AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=all,bucket=output:10,set_field:192.168.3.90->ip_src,bucket=output:11'])
> AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(group:1234)'])
> AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
> @@ -362,7 +361,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - indirect group in action set])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], [1], [10])
> +add_of_ports br0 1 10
> AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 group_id=1234,type=indirect,bucket=output:10])
> AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(group:1234)'])
> AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
> @@ -374,7 +373,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - select group])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], [1], [10], [11])
> +add_of_ports br0 1 10 11
> AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=select,bucket=output:10,bucket=output:11'])
> AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(group:1234)'])
> 
> @@ -394,7 +393,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - select group with watch port])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], [1], [10], [11])
> +add_of_ports br0 1 10 11
> AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=select,bucket=watch_port:10,output:10,bucket=output:11'])
> AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(group:1234)'])
> AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:07,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
> @@ -406,7 +405,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - select group with weight])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], [1], [10], [11], [12])
> +add_of_ports br0 1 10 11 12
> AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=select,bucket=output:10,bucket=output:11,weight=2000,bucket=output:12,weight=0'])
> AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(group:1234)'])
> AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:07,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
> @@ -418,7 +417,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - select group with hash selection method])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], [1], [10], [11])
> +add_of_ports br0 1 10 11
> AT_CHECK([ovs-ofctl -O OpenFlow15 add-group br0 'group_id=1234,type=select,selection_method=hash,fields=eth_dst,bucket=output:10,bucket=output:11'])
> AT_CHECK([ovs-ofctl -O OpenFlow15 add-flow br0 'ip actions=write_actions(group:1234)'])
> 
> @@ -451,7 +450,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - fast failover group])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], [1], [10], [11])
> +add_of_ports br0 1 10 11
> AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=ff,bucket=watch_port:10,output:10,bucket=watch_port:11,output:11'])
> AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(group:1234)'])
> AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
> @@ -463,7 +462,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - group stats single bucket])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], [1], [10], [11])
> +add_of_ports br0 1 10 11
> AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=select,bucket=output:10,weight=2000,bucket=output:11,weight=0'])
> AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(group:1234)'])
> (
> @@ -484,7 +483,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - group stats all buckets])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], [1], [10], [11])
> +add_of_ports br0 1 10 11
> AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=all,bucket=output:10,bucket=output:11'])
> AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(group:1234)'])
> (
> @@ -505,7 +504,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - registers])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], [20], [21], [22], [33], [90])
> +add_of_ports br0 20 21 22 33 90
> 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
> @@ -542,7 +541,7 @@ dnl Tests that the standardized xregs are mapped onto the legacy OVS registers
> dnl in the manner documented in ovs-ofctl(8).
> AT_SETUP([ofproto-dpif - extended registers])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], [1], [2], [3])
> +add_of_ports br0 1 2 3
> AT_DATA([flows.txt], [dnl
> table=0     actions=load:0xfedcba9876543210->OXM_OF_PKT_REG1[[]],resubmit(,1)
> table=1,reg2=0xfedcba98,reg3=0x76543210   actions=2
> @@ -561,7 +560,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - load and move order])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], [1], [10], [11])
> +add_of_ports br0 1 10 11
> AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=all,bucket=output:10,move:NXM_NX_REG1[[]]->NXM_OF_IP_SRC[[]],bucket=output:11'])
> AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(load:0xffffffff->NXM_NX_REG1[[]],move:NXM_NX_REG1[[]]->NXM_NX_REG2[[]],group:1234)'])
> AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
> @@ -575,7 +574,7 @@ AT_CLEANUP
> dnl Tests that 1.5 copy-field can copy into the standardized xregs.
> AT_SETUP([ofproto-dpif - copy-field into extended registers])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], [1], [2], [3])
> +add_of_ports br0 1 2 3
> AT_DATA([flows.txt], [dnl
> table=0     actions=move:OXM_OF_ETH_SRC[[0..47]]->OXM_OF_PKT_REG0[[0..47]],goto_table(1)
> table=1,xreg0=0x0000505400000005   actions=2
> @@ -595,7 +594,7 @@ AT_CLEANUP
> dnl Tests that 1.5 set-field with mask in the metadata register.
> AT_SETUP([ofproto-dpif - masked set-field into metadata])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], [1], [2], [3])
> +add_of_ports br0 1 2 3
> AT_DATA([flows.txt], [dnl
> table=0     actions=set_field:0xfafafafa5a5a5a5a->metadata,goto_table(1)
> table=1     actions=set_field:0x6b/0xff->metadata,goto_table(2)
> @@ -617,8 +616,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - actset_output])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS(
> -  [br0], [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12], [13])
> +add_of_ports br0 1 2 3 4 5 6 7 8 9 10 11 12 13
> AT_DATA([flows.txt], [dnl
> table=0,actset_output=unset     actions=write_actions(output(2)),goto_table(1)
> table=1     actions=move:ONFOXM_ET_ACTSET_OUTPUT[[0..31]]->OXM_OF_PKT_REG0[[0..31]],goto_table(2)
> @@ -658,7 +656,7 @@ OVS_VSWITCHD_STOP
> AT_CLEANUP
> AT_SETUP([ofproto-dpif - push-pop])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], [20], [21], [22], [33], [90])
> +add_of_ports br0 20 21 22 33 90
> AT_DATA([flows.txt], [dnl
> in_port=90           actions=load:20->NXM_NX_REG0[[0..7]],load:21->NXM_NX_REG1[[0..7]],load:22->NXM_NX_REG2[[0..7]], load:33->NXM_NX_REG3[[0..7]], push:NXM_NX_REG0[[]], push:NXM_NX_REG1[[0..7]],push:NXM_NX_REG2[[0..15]], push:NXM_NX_REG3[[]], resubmit:2, resubmit:3, resubmit:4, resubmit:5
> in_port=2            actions=pop:NXM_NX_REG0[[0..7]],output:NXM_NX_REG0[[]]
> @@ -677,7 +675,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - output])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], [1], [9], [10], [11], [55], [66], [77], [88])
> +add_of_ports br0 1 9 10 11 55 66 77 88
> AT_DATA([flows.txt], [dnl
> in_port=1 actions=resubmit:2,resubmit:3,resubmit:4,resubmit:5,resubmit:6,resubmit:7,resubmit:8
> in_port=2 actions=output:9
> @@ -698,7 +696,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - dec_ttl])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], [1], [2], [3], [4])
> +add_of_ports br0 1 2 3 4
> AT_DATA([flows.txt], [dnl
> table=0 in_port=1 action=dec_ttl,output:2,resubmit(1,1),output:4
> table=1 in_port=1 action=dec_ttl,output:3
> @@ -742,7 +740,7 @@ dnl A number of similar rules are added to try and exercise
> dnl xrealloc sufficiently that it returns a different base pointer
> AT_SETUP([ofproto-dpif - dec_ttl without arguments at offset 32 in ofpacts])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], [1])
> +add_of_ports br0 1
> (for i in `seq 0 255`; do
>   printf "dl_src=10:11:11:11:11:%02x actions=output:1,output:1,output:1,dec_ttl,controller\n" $i
>  done) > flows.txt
> @@ -759,7 +757,7 @@ dnl A number of similar rules are added to try and exercise
> dnl xrealloc sufficiently that it returns a different base pointer
> AT_SETUP([ofproto-dpif - dec_ttl with arguments at offset 32 in ofpacts])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], [1])
> +add_of_ports br0 1
> (for i in `seq 0 255`; do
>   printf "dl_src=10:11:11:11:11:%02x actions=output:1,output:1,output:1,dec_ttl(1),controller\n" $i
>  done) > flows.txt
> @@ -776,7 +774,7 @@ dnl A number of similar rules are added to try and exercise
> dnl xrealloc sufficiently that it returns a different base pointer
> AT_SETUP([ofproto-dpif - note at offset 24 in ofpacts])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], [1])
> +add_of_ports br0 1
> (for i in `seq 0 255`; do
>   printf "dl_src=10:11:11:11:11:%02x actions=output:1,output:1,note:ff,controller\n" $i
>  done) > flows.txt
> @@ -786,7 +784,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - output, OFPP_NONE ingress port])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], [1], [2])
> +add_of_ports br0 1 2
> 
> AT_CHECK([ovs-ofctl add-flow br0 action=normal])
> 
> @@ -804,7 +802,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - DSCP])
> OVS_VSWITCHD_START([add-port br0 p1 -- set Interface p1 type=dummy])
> -ADD_OF_PORTS([br0], [9])
> +add_of_ports br0 9
> AT_DATA([flows.txt], [dnl
> actions=output:LOCAL,enqueue:1:1,enqueue:1:2,enqueue:1:2,enqueue:1:1,output:1,mod_nw_tos:0,output:1,output:LOCAL
> ])
> @@ -831,7 +829,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - output/flood flags])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], [1], [2], [3], [4], [5], [6], [7])
> +add_of_ports br0 1 2 3 4 5 6 7
> 
> AT_DATA([flows.txt], [dnl
> in_port=local actions=local,flood
> @@ -3023,7 +3021,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - ARP modification slow-path])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], [1], [2])
> +add_of_ports br0 1 2
> 
> ovs-vsctl -- set Interface p2 type=dummy options:pcap=p2.pcap
> ovs-ofctl add-flow br0 'in_port=1,arp actions=load:2->OXM_OF_ARP_OP[[]],2,load:0xc0a88001->OXM_OF_ARP_SPA[[]],2,load:0x404444444441->OXM_OF_ARP_THA[[]],2'
> @@ -3694,7 +3692,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - fragment handling - trace])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], [1], [2], [3], [4], [5], [6], [90])
> +add_of_ports br0 1 2 3 4 5 6 90
> AT_DATA([flows.txt], [dnl
> priority=75 tcp ip_frag=no    tp_dst=80 actions=move:OXM_OF_TCP_DST[[]]->OXM_OF_TCP_SRC[[]],output:1
> priority=75 tcp ip_frag=first tp_dst=80 actions=move:OXM_OF_TCP_DST[[]]->OXM_OF_TCP_SRC[[]],output:2
> @@ -3743,7 +3741,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - fragment handling - upcall])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], [1], [2], [3], [4], [5], [6], [90])
> +add_of_ports br0 1 2 3 4 5 6 90
> AT_DATA([flows.txt], [dnl
> priority=75 tcp ip_frag=no    tp_dst=80 actions=set_field:81->tcp_dst,output:1
> priority=75 tcp ip_frag=first tp_dst=80 actions=set_field:81->tcp_dst,output:2
> @@ -3818,7 +3816,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - fragment handling - actions])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], [1], [2], [3], [4], [5], [6], [90])
> +add_of_ports br0 1 2 3 4 5 6 90
> 
> AT_CHECK([ovs-ofctl add-flow br0 "tcp,ip_frag=later actions=move:OXM_OF_TCP_DST[[0..7]]->OXM_OF_TCP_SRC[[0..7]],output:1"], [1], [], [stderr])
> AT_CHECK([tail -2 stderr | sed 's/^.*|WARN|//'], [0], [dnl
> @@ -3920,7 +3918,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - exit])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], [1], [2], [3], [10], [11], [12], [13], [14])
> +add_of_ports br0 1 2 3 10 11 12 13 14
> AT_DATA([flows.txt], [dnl
> in_port=1 actions=output:10,exit,output:11
> in_port=2 actions=output:12,resubmit:1,output:12
> @@ -3945,7 +3943,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - mirroring, select_all])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], 1, 2, 3)
> +add_of_ports br0 1 2 3
> ovs-vsctl \
>         set Bridge br0 mirrors=@m --\
>         --id=@p3 get Port p3 --\
> @@ -3975,7 +3973,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - mirroring, select_src])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], 1, 2, 3)
> +add_of_ports br0 1 2 3
> ovs-vsctl \
>         set Bridge br0 mirrors=@m --\
>         --id=@p1 get Port p1 -- --id=@p3 get Port p3 --\
> @@ -4003,7 +4001,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - mirroring, OFPP_NONE ingress port])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], 1, 2)
> +add_of_ports br0 1 2
> ovs-vsctl \
>         set Bridge br0 mirrors=@m --\
>         --id=@p2 get Port p2 --\
> @@ -4024,7 +4022,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - mirroring, select_dst])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], 1, 2, 3)
> +add_of_ports br0 1 2 3
> ovs-vsctl \
>         set Bridge br0 mirrors=@m --\
>         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
> @@ -4054,7 +4052,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - mirroring, select_vlan])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], 1, 2, 3)
> +add_of_ports br0 1 2 3
> ovs-vsctl \
>         set Bridge br0 mirrors=@m --\
>         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
> @@ -4089,7 +4087,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - mirroring, output_port])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], 1, 2, 3)
> +add_of_ports br0 1 2 3
> ovs-vsctl \
>         set Bridge br0 mirrors=@m --\
>         --id=@p3 get Port p3 --\
> @@ -4118,7 +4116,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - mirroring, output_vlan])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], 1, 2)
> +add_of_ports br0 1 2
> ovs-vsctl \
>         set Bridge br0 mirrors=@m --\
>         --id=@m create Mirror name=mymirror select_all=true output_vlan=12
> @@ -4156,7 +4154,7 @@ AT_CLEANUP
> # would cause the packet to be mirrored to port 3 a second time.
> AT_SETUP([ofproto-dpif - mirroring with recirculation])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], 1, 2, 3, 4)
> +add_of_ports br0 1 2 3 4
> ovs-vsctl \
>         set Bridge br0 mirrors=@m --\
>         --id=@p3 get Port p3 --\
> @@ -4183,7 +4181,7 @@ AT_CLEANUP
> # the current table rather than specifying a table).
> AT_SETUP([ofproto-dpif - resubmit with recirculation])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], [1], [2], [3])
> +add_of_ports br0 1 2 3
> 
> AT_DATA([flows.txt], [dnl
> table=0 in_port=1  actions=2,resubmit(,1)
> @@ -4208,7 +4206,7 @@ AT_CLEANUP
> # re-executed when execution continues later post-recirculation.
> AT_SETUP([ofproto-dpif - recirculation after resubmit])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], [1], [2])
> +add_of_ports br0 1 2
> 
> AT_DATA([flows.txt], [dnl
> table=0 in_port=1 actions=resubmit(,1),2
> @@ -4233,7 +4231,7 @@ AT_CLEANUP
> # ofproto/trace br_name br_flow [-generate|packet]
> AT_SETUP([ofproto-dpif - ofproto/trace command 1])
> OVS_VSWITCHD_START([set bridge br0 fail-mode=standalone])
> -ADD_OF_PORTS([br0], 1, 2, 3)
> +add_of_ports br0 1 2 3
> 
> AT_DATA([flows.txt], [dnl
> in_port=1 actions=output:2
> @@ -4374,7 +4372,7 @@ AT_CLEANUP
> # The second test tests the corner cases
> AT_SETUP([ofproto-dpif - ofproto/trace command 2])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], 1, 2)
> +add_of_ports br0 1 2
> 
> # Define flows
> odp_flow="in_port(1),eth(src=50:54:00:00:00:01,dst=50:54:00:00:00:02)"
> @@ -4538,7 +4536,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - ofproto/trace-packet-out])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], 1, 2, 3)
> +add_of_ports br0 1 2 3
> 
> AT_DATA([flows.txt], [dnl
> in_port=1 actions=output:2
> @@ -4568,7 +4566,7 @@ m4_define([OFPROTO_TRACE],
> 
> AT_SETUP([ofproto-dpif - MAC learning])
> OVS_VSWITCHD_START([set bridge br0 fail-mode=standalone])
> -ADD_OF_PORTS([br0], 1, 2, 3)
> +add_of_ports br0 1 2 3
> 
> arp='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)'
> 
> @@ -4619,7 +4617,7 @@ AT_CHECK(
>   [ovs-vsctl \
>      -- add-br br1 \
>      -- set bridge br1 datapath-type=dummy])
> -ADD_OF_PORTS([br1], 4, 5)
> +add_of_ports br1 4 5
> 
> # Trace some packet arrivals in br1 to create MAC learning entries there too.
> OFPROTO_TRACE(
> @@ -4658,7 +4656,7 @@ AT_CLEANUP
> AT_SETUP([ofproto-dpif - MAC table overflow])
> OVS_VSWITCHD_START(
>   [set bridge br0 fail-mode=standalone other-config:mac-table-size=10])
> -ADD_OF_PORTS([br0], 1, 2, 3)
> +add_of_ports br0 1 2 3
> 
> arp='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)'
> 
> @@ -4718,7 +4716,7 @@ AT_CLEANUP
> AT_SETUP([ofproto-dpif - MAC table overflow fairness])
> OVS_VSWITCHD_START(
>   [set bridge br0 fail-mode=standalone other-config:mac-table-size=10])
> -ADD_OF_PORTS([br0], 1, 2, 3, 4, 5, 6)
> +add_of_ports br0 1 2 3 4 5 6
> 
> arp='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)'
> 
> @@ -4794,7 +4792,7 @@ m4_define([CHECK_SFLOW_SAMPLING_PACKET],
>   PARSE_LISTENING_PORT([test-sflow.log], [SFLOW_PORT])
>   ovs-appctl time/stop
> 
> -  ADD_OF_PORTS([br0], 1, 2)
> +  add_of_ports br0 1 2
>   ovs-vsctl \
>      set Interface br0 options:ifindex=1002 -- \
>      set Interface p1 options:ifindex=1004 -- \
> @@ -5342,7 +5340,7 @@ AT_SETUP([ofproto-dpif - sFlow packet sampling - MPLS])
> AT_XFAIL_IF([test "$IS_WIN32" = "yes"])
> OVS_VSWITCHD_START
> AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
> -ADD_OF_PORTS([br0], [1], [2])
> +add_of_ports br0 1 2
> AT_DATA([flows.txt], [dnl
> table=0 dl_src=50:54:00:00:00:09 actions=push_mpls:0x8847,set_mpls_label:789,set_mpls_tc:4,set_mpls_ttl:32,2
> table=0 dl_src=50:54:00:00:00:0b actions=pop_mpls:0x0800,2
> @@ -5440,7 +5438,7 @@ AT_CLEANUP
> # cause a record to be sent.
> m4_define([CHECK_NETFLOW_EXPIRATION],
>   [OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
> -  ADD_OF_PORTS([br0], 1, 2)
> +  add_of_ports br0 1 2
> 
>   ovs-appctl time/stop
>   on_exit 'kill `cat test-netflow.pid`'
> @@ -5488,7 +5486,7 @@ AT_CLEANUP
> # Test that basic NetFlow reports active expirations correctly.
> m4_define([CHECK_NETFLOW_ACTIVE_EXPIRATION],
>   [OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
> -  ADD_OF_PORTS([br0], 1, 2)
> +  add_of_ports br0 1 2
> 
>   on_exit 'kill `cat test-netflow.pid`'
>   AT_CHECK([ovstest test-netflow --log-file --detach --no-chdir --pidfile 0:$1 > netflow.log], [0], [], [ignore])
> @@ -5572,7 +5570,7 @@ dnl configure IPFIX and ensure that sample action generation works at the
> dnl datapath level.
> AT_SETUP([ofproto-dpif - Basic IPFIX sanity check])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], 1, 2)
> +add_of_ports br0 1 2
> 
> dnl Sample every packet using bridge-based sampling
> AT_CHECK([ovs-vsctl -- set bridge br0 ipfix=@fix -- \
> @@ -5774,8 +5772,8 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-dps])
> OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy])
> -ADD_OF_PORTS([br0], [1], [2])
> -ADD_OF_PORTS([br1], [3])
> +add_of_ports br0 1 2
> +add_of_ports br1 3
> 
> AT_CHECK([ovs-appctl dpif/dump-dps], [0], [dnl
> dummy@br0
> @@ -5786,8 +5784,8 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - ovs-appctl dpif/show])
> OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy])
> -ADD_OF_PORTS([br0], [1], [2])
> -ADD_OF_PORTS([br1], [3])
> +add_of_ports br0 1 2
> +add_of_ports br1 3
> 
> AT_CHECK([ovs-appctl dpif/show], [0], [dnl
> dummy@ovs-dummy: hit:0 missed:0
> @@ -5807,8 +5805,8 @@ AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-flows])
> OVS_VSWITCHD_START([add-br br1 -- \
>                     set bridge br1 datapath-type=dummy fail-mode=secure -- \
>                     set Open_vSwitch . other_config:max-idle=10000])
> -ADD_OF_PORTS([br0], [1], [2])
> -ADD_OF_PORTS([br1], [3])
> +add_of_ports br0 1 2
> +add_of_ports br1 3
> 
> AT_CHECK([ovs-appctl netdev-dummy/receive p1 '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,ttl=64,frag=no),icmp(type=8,code=0)'])
> AT_CHECK([ovs-appctl netdev-dummy/receive p2 'in_port(2),eth(src=50:54:00:00:00:07,dst=50:54:00:00:00:05),eth_type(0x0800),ipv4(src=192.168.0.2,dst=192.168.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=0,code=0)'])
> @@ -5840,7 +5838,7 @@ AT_SETUP([ofproto-dpif - ovs-appctl dpif/get-flow])
> OVS_VSWITCHD_START([add-br br1 -- \
>                     set bridge br1 datapath-type=dummy fail-mode=secure -- \
>                     set Open_vSwitch . other_config:max-idle=10000])
> -ADD_OF_PORTS([br0], [1], [2])
> +add_of_ports br0 1 2
> 
> AT_CHECK([ovs-appctl netdev-dummy/receive p1 '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,ttl=64,frag=no),icmp(type=8,code=0)'])
> ovs-appctl revalidator/wait
> @@ -5934,8 +5932,8 @@ OVS_VSWITCHD_START([add-br br1 \
> -- add-port br1 pbr1 -- set int pbr1 type=patch options:peer=pbr0 \
> -- add-port br0 pbr0 -- set int pbr0 type=patch options:peer=pbr1])
> 
> -ADD_OF_PORTS([br0], [2])
> -ADD_OF_PORTS([br1], [3])
> +add_of_ports br0 2
> +add_of_ports br1 3
> 
> AT_CHECK([ovs-appctl upcall/disable-ufid], [0], [Datapath dumping tersely using UFID disabled
> ], [])
> @@ -6009,8 +6007,8 @@ OVS_VSWITCHD_START([add-br br1 \
> -- add-port br1 pbr1 -- set int pbr1 type=patch options:peer=pbr0 \
> -- add-port br0 pbr0 -- set int pbr0 type=patch options:peer=pbr1])
> 
> -ADD_OF_PORTS([br0], [2])
> -ADD_OF_PORTS([br1], [3])
> +add_of_ports br0 2
> +add_of_ports br1 3
> 
> AT_CHECK([ovs-appctl upcall/disable-ufid], [0], [Datapath dumping tersely using UFID disabled
> ], [])
> @@ -6054,7 +6052,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - port duration])
> OVS_VSWITCHD_START([set Bridge br0 protocols=OpenFlow13])
> -ADD_OF_PORTS([br0], 1, 2)
> +add_of_ports br0 1 2
> 
> ovs-appctl time/stop
> ovs-appctl time/warp 10000
> @@ -6075,7 +6073,7 @@ AT_BANNER([ofproto-dpif -- megaflows])
> AT_SETUP([ofproto-dpif megaflow - port classification])
> OVS_VSWITCHD_START
> AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
> -ADD_OF_PORTS([br0], [1], [2])
> +add_of_ports br0 1 2
> AT_DATA([flows.txt], [dnl
> table=0 in_port=1 actions=output(2)
> ])
> @@ -6093,7 +6091,7 @@ AT_CLEANUP
> AT_SETUP([ofproto-dpif megaflow - L2 classification])
> OVS_VSWITCHD_START
> AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
> -ADD_OF_PORTS([br0], [1], [2])
> +add_of_ports br0 1 2
> AT_DATA([flows.txt], [dnl
> table=0 in_port=1,dl_src=50:54:00:00:00:09 actions=output(2)
> ])
> @@ -6111,7 +6109,7 @@ AT_CLEANUP
> AT_SETUP([ofproto-dpif megaflow - L3 classification])
> OVS_VSWITCHD_START
> AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
> -ADD_OF_PORTS([br0], [1], [2])
> +add_of_ports br0 1 2
> AT_CHECK([ovs-vsctl set Bridge br0 flow_tables:0=@N1 -- --id=@N1 create Flow_Table name=t0 prefixes=nw_dst,nw_src], [0], [ignore], [])
> AT_DATA([flows.txt], [dnl
> table=0 in_port=1,icmp,nw_src=10.0.0.4 actions=output(2)
> @@ -6130,7 +6128,7 @@ AT_CLEANUP
> AT_SETUP([ofproto-dpif megaflow - IPv6 classification])
> OVS_VSWITCHD_START
> AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
> -ADD_OF_PORTS([br0], [1], [2])
> +add_of_ports br0 1 2
> AT_CHECK([ovs-vsctl set Bridge br0 flow_tables:0=@N1 -- --id=@N1 create Flow_Table name=t0 prefixes=ipv6_dst,ipv6_src], [0], [ignore], [])
> AT_DATA([flows.txt], [dnl
> table=0 in_port=1,ipv6,ipv6_src=2001:db8:3c4d:1:2:3:4:5 actions=output(2)
> @@ -6149,7 +6147,7 @@ AT_CLEANUP
> AT_SETUP([ofproto-dpif megaflow - L4 classification])
> OVS_VSWITCHD_START
> AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
> -ADD_OF_PORTS([br0], [1], [2])
> +add_of_ports br0 1 2
> AT_DATA([flows.txt], [dnl
> table=0 in_port=1,icmp,icmp_type=8 actions=output(2)
> ])
> @@ -6167,7 +6165,7 @@ AT_CLEANUP
> AT_SETUP([ofproto-dpif megaflow - normal])
> OVS_VSWITCHD_START
> AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
> -ADD_OF_PORTS([br0], [1], [2])
> +add_of_ports br0 1 2
> AT_CHECK([ovs-ofctl add-flow br0 action=normal])
> AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
> AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
> @@ -6182,7 +6180,7 @@ AT_CLEANUP
> AT_SETUP([ofproto-dpif megaflow - mpls])
> OVS_VSWITCHD_START
> AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
> -ADD_OF_PORTS([br0], [1], [2])
> +add_of_ports br0 1 2
> AT_DATA([flows.txt], [dnl
> table=0 dl_src=50:54:00:00:00:09 actions=push_mpls:0x8847,2
> table=0 dl_src=50:54:00:00:00:0b actions=pop_mpls:0x0800,2
> @@ -6202,7 +6200,7 @@ AT_CLEANUP
> m4_define([CHECK_MEGAFLOW_NETFLOW],
>   [OVS_VSWITCHD_START
>   AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
> -  ADD_OF_PORTS([br0], [1], [2])
> +  add_of_ports br0 1 2
> 
>   dnl NetFlow configuration disables wildcarding relevant fields
>   on_exit 'kill `cat test-netflow.pid`'
> @@ -6298,7 +6296,7 @@ OVS_VSWITCHD_START(
> AT_CHECK([ovs-appctl netdev-dummy/set-admin-state up], 0, [OK
> ])
> AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
> -ADD_OF_PORTS([br0], [7])
> +add_of_ports br0 7
> AT_CHECK([ovs-ofctl add-flow br0 action=normal])
> AT_CHECK([ovs-ofctl add-flow br1 action=normal])
> ovs-appctl time/stop
> @@ -6316,7 +6314,7 @@ AT_CLEANUP
> AT_SETUP([ofproto-dpif megaflow - resubmit port action])
> OVS_VSWITCHD_START
> AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
> -ADD_OF_PORTS([br0], [1], [2])
> +add_of_ports br0 1 2
> AT_DATA([flows.txt], [dnl
> table=0 in_port=1,ip actions=resubmit(90)
> table=0 in_port=90,dl_src=50:54:00:00:00:09 actions=output(2)
> @@ -6335,7 +6333,7 @@ AT_CLEANUP
> AT_SETUP([ofproto-dpif megaflow - resubmit table action])
> OVS_VSWITCHD_START
> AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
> -ADD_OF_PORTS([br0], [1], [2])
> +add_of_ports br0 1 2
> AT_DATA([flows.txt], [dnl
> table=0 in_port=1,ip actions=resubmit(,1)
> table=1 dl_src=50:54:00:00:00:09 actions=output(2)
> @@ -6355,7 +6353,7 @@ AT_CLEANUP
> AT_SETUP([ofproto-dpif megaflow - goto_table action])
> OVS_VSWITCHD_START
> AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
> -ADD_OF_PORTS([br0], [1], [2])
> +add_of_ports br0 1 2
> AT_DATA([flows.txt], [dnl
> table=0 in_port=1,ip actions=goto_table(1)
> table=1 dl_src=50:54:00:00:00:09 actions=output(2)
> @@ -6374,7 +6372,7 @@ AT_CLEANUP
> AT_SETUP([ofproto-dpif megaflow - mirroring, select_all])
> OVS_VSWITCHD_START
> AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
> -ADD_OF_PORTS([br0], [1], [2], [3])
> +add_of_ports br0 1 2 3
> ovs-vsctl \
>         set Bridge br0 mirrors=@m --\
>         --id=@p3 get Port p3 --\
> @@ -6397,7 +6395,7 @@ AT_CLEANUP
> AT_SETUP([ofproto-dpif megaflow - mirroring, select_vlan])
> OVS_VSWITCHD_START
> AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
> -ADD_OF_PORTS([br0], [1], [2], [3])
> +add_of_ports br0 1 2 3
> ovs-vsctl \
>         set Bridge br0 mirrors=@m --\
>         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
> @@ -6420,7 +6418,7 @@ AT_CLEANUP
> AT_SETUP([ofproto-dpif megaflow - move action])
> OVS_VSWITCHD_START
> AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
> -ADD_OF_PORTS([br0], [1], [2])
> +add_of_ports br0 1 2
> AT_DATA([flows.txt], [dnl
> table=0 in_port=1 ip,actions=move:NXM_OF_IP_SRC[[]]->NXM_NX_REG0[[]],resubmit(90)
> table=0 in_port=90 ip,actions=move:NXM_NX_REG0[[]]->NXM_NX_REG1[[]],resubmit(91)
> @@ -6440,7 +6438,7 @@ AT_CLEANUP
> AT_SETUP([ofproto-dpif megaflow - push action])
> OVS_VSWITCHD_START
> AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
> -ADD_OF_PORTS([br0], [1], [2])
> +add_of_ports br0 1 2
> AT_DATA([flows.txt], [dnl
> table=0 in_port=1 ip,actions=push:NXM_OF_IP_SRC[[]],output(2)
> ])
> @@ -6458,7 +6456,7 @@ AT_CLEANUP
> AT_SETUP([ofproto-dpif megaflow - learning])
> OVS_VSWITCHD_START
> AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
> -ADD_OF_PORTS([br0], [1], [2])
> +add_of_ports br0 1 2
> AT_DATA([flows.txt], [dnl
> table=0 in_port=1 actions=load:2->NXM_NX_REG0[[0..15]],learn(table=1,priority=65535,NXM_OF_ETH_SRC[[]],NXM_OF_VLAN_TCI[[0..11]],output:NXM_NX_REG0[[0..15]]),output:2
> ])
> @@ -6518,7 +6516,7 @@ AT_CLEANUP
> AT_SETUP([ofproto-dpif megaflow - dec_ttl])
> OVS_VSWITCHD_START
> AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
> -ADD_OF_PORTS([br0], [1], [2])
> +add_of_ports br0 1 2
> AT_CHECK([ovs-vsctl set Bridge br0 flow_tables:0=@N1 -- --id=@N1 create Flow_Table name=t0 prefixes=nw_dst,nw_src], [0], [ignore], [])
> AT_DATA([flows.txt], [dnl
> table=0 in_port=1,icmp,nw_src=10.0.0.4 actions=dec_ttl,output(2)
> @@ -6537,7 +6535,7 @@ AT_CLEANUP
> AT_SETUP([ofproto-dpif megaflow - set dl_dst])
> OVS_VSWITCHD_START
> AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
> -ADD_OF_PORTS([br0], [1], [2])
> +add_of_ports br0 1 2
> AT_DATA([flows.txt], [dnl
> table=0 in_port=1 actions=mod_dl_dst(50:54:00:00:00:0a),output(2)
> ])
> @@ -6558,7 +6556,7 @@ AT_CLEANUP
> AT_SETUP([ofproto-dpif megaflow - disabled])
> OVS_VSWITCHD_START
> AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
> -ADD_OF_PORTS([br0], [1], [2])
> +add_of_ports br0 1 2
> AT_DATA([flows.txt], [dnl
> table=0 in_port=1,ip,nw_dst=10.0.0.1 actions=output(2)
> table=0 in_port=1,ip,nw_dst=10.0.0.3 actions=drop
> @@ -6590,7 +6588,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - datapath port number change])
> OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
> -ADD_OF_PORTS([br0], 1)
> +add_of_ports br0 1
> 
> # Trace a flow that should output to p1.
> AT_CHECK([ovs-appctl ofproto/trace br0 in_port=LOCAL,dl_src=10:20:30:40:50:60],
> @@ -6764,7 +6762,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - exponential resubmit chain])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], 1)
> +add_of_ports br0 1
> (for i in `seq 1 64`; do
>      j=`expr $i + 1`
>      echo "in_port=$i, actions=resubmit:$j, resubmit:$j, local"
> @@ -6782,7 +6780,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - too many output actions])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], 1)
> +add_of_ports br0 1
> (for i in `seq 1 12`; do
>      j=`expr $i + 1`
>      echo "in_port=$i, actions=resubmit:$j, resubmit:$j, local"
> @@ -6800,7 +6798,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - stack too deep])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], 1)
> +add_of_ports br0 1
> (for i in `seq 1 12`; do
>      j=`expr $i + 1`
>      echo "in_port=$i, actions=resubmit:$j, resubmit:$j, local"
> @@ -6820,7 +6818,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif packet-out controller])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], 1, 2)
> +add_of_ports br0 1 2
> 
> AT_CHECK([ovs-ofctl add-flow br0 'dl_dst=50:54:00:00:00:0a actions=controller'])
> 
> @@ -6921,7 +6919,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif packet-out goto_table])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], 1, 2)
> +add_of_ports br0 1 2
> 
> AT_DATA([flows.txt], [dnl
> table=0 dl_dst=50:54:00:00:00:0a actions=goto_table(1)
> @@ -6975,7 +6973,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif packet-out table-miss (continue)])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], 1, 2)
> +add_of_ports br0 1 2
> 
> AT_CHECK([ovs-ofctl -O OpenFlow11 add-flow br0 'table=1 dl_dst=50:54:00:00:00:0a actions=controller'])
> AT_CHECK([ovs-ofctl -O OpenFlow11 mod-table br0 all continue])
> @@ -7026,7 +7024,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - ICMPv6])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], 1)
> +add_of_ports br0 1
> 
> AT_CAPTURE_FILE([ofctl_monitor.log])
> 
> @@ -7046,7 +7044,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto-dpif - Neighbor Discovery set-field with checksum update])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], 1)
> +add_of_ports br0 1
> AT_CHECK([ovs-ofctl add-flow br0 icmp6,icmpv6_type=135,action=set_field:fe80::1-\>nd_target,set_field:32:21:14:86:11:74-\>nd_sll,output:controller])
> 
> AT_CAPTURE_FILE([ofctl_monitor.log])
> diff --git a/tests/ofproto-macros.at b/tests/ofproto-macros.at
> index bace0f5..bb3e9ee 100644
> --- a/tests/ofproto-macros.at
> +++ b/tests/ofproto-macros.at
> @@ -316,6 +316,21 @@ check_logs () {
> /|ERR|/p
> /|EMER|/p" ${logs}
> }
> +
> +# add_of_ports BRIDGE PNUM...
> +#
> +# Creates dummy interfaces in BRIDGE named pPNUM, OpenFlow port number
> +# PNUM, and datapath port number PNUM (the latter is a consequence of
> +# the dummy implementation, which tries to assign datapath port
> +# numbers based on port names).
> +add_of_ports () {
> +    local args
> +    local br=$1; shift
> +    for $pnum; do
> +        AS_VAR_APPEND([args], [" -- $br p$pnum -- set Interface p$pnum type=dummy ofport_request=$pnum"])
> +    done
> +    ovs-vsctl $args
> +}
> m4_divert_pop([PREPARE_TESTS])
> 
> # OVS_VSWITCHD_STOP([WHITELIST])
> @@ -336,17 +351,6 @@ m4_define([OVS_VSWITCHD_DISABLE_TUNNEL_PUSH_POP],
> Tunnel push-pop off
> ])])
> 
> -# ADD_OF_PORTS(BRIDGE, OF_PORT[, OF_PORT...])
> -#
> -# Creates a dummy interface with an OpenFlow port number of OF_PORT and
> -# name of p{OF_PORT}.  The dummy implementation will treat the OF_PORT
> -# as the datapath port number, which as the effect of making the
> -# OpenFlow and datapath numbers the same.
> -m4_define([ADD_OF_PORTS],
> - [ovs-vsctl m4_foreach([of_port], m4_cdr($@),
> -    [ \
> -    -- add-port $1 p[]of_port -- set Interface p[]of_port type=dummy ofport_request=of_port])])
> -
> # WAIT_FOR_DUMMY_PORTS(NETDEV_DUMMY_PORT[, NETDEV_DUMMY_PORT...])
> #
> # Wait until the netdev dummy ports are connected to each other
> diff --git a/tests/ofproto.at b/tests/ofproto.at
> index 61a6be5..f206442 100644
> --- a/tests/ofproto.at
> +++ b/tests/ofproto.at
> @@ -146,7 +146,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto - port-desc stats (OpenFlow 1.5)])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], 1, 2, 3)
> +add_of_ports br0 1 2 3
> AT_CHECK([ovs-ofctl -F OXM-OpenFlow15 -O OpenFlow15 -vwarn dump-ports-desc br0], [0], [stdout])
> AT_CHECK([STRIP_XIDS stdout | sed 's/00:0./00:0x/'], [0], [dnl
> OFPST_PORT_DESC reply (OF1.5):
> @@ -230,7 +230,7 @@ dnl This is really bare-bones.
> dnl It at least checks request and reply serialization and deserialization.
> AT_SETUP([ofproto - queue configuration - (OpenFlow 1.0)])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], [1], [2])
> +add_of_ports br0 1 2
> AT_CHECK([ovs-ofctl queue-get-config br0 1], [0], [stdout])
> AT_CHECK([STRIP_XIDS stdout], [0], [dnl
> OFPT_QUEUE_GET_CONFIG_REPLY: port=1
> @@ -252,7 +252,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto - queue configuration - (OpenFlow 1.1)])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], [1], [2])
> +add_of_ports br0 1 2
> AT_CHECK([ovs-ofctl -O OpenFlow11 queue-get-config br0 1], [0], [stdout])
> AT_CHECK([STRIP_XIDS stdout], [0], [dnl
> OFPT_QUEUE_GET_CONFIG_REPLY (OF1.1): port=1
> @@ -267,7 +267,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto - queue configuration - (OpenFlow 1.2)])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], [1], [2])
> +add_of_ports br0 1 2
> AT_CHECK([ovs-ofctl -O OpenFlow12 queue-get-config br0 1], [0], [stdout])
> AT_CHECK([STRIP_XIDS stdout], [0], [dnl
> OFPT_QUEUE_GET_CONFIG_REPLY (OF1.2): port=1
> @@ -289,7 +289,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto - queue configuration - (OpenFlow 1.4)])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], [1], [2])
> +add_of_ports br0 1 2
> 
> AT_CHECK([ovs-ofctl -O OpenFlow14 queue-get-config br0 any | STRIP_XIDS], [0],
>   [OFPST_QUEUE_DESC reply (OF1.4): port=1
> @@ -3257,7 +3257,7 @@ dnl controllers despite the spec) as meaning a packet that was generated
> dnl by the controller.
> AT_SETUP([ofproto - packet-out from controller (OpenFlow 1.0)])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], [1])
> +add_of_ports br0 1
> 
> # Start a monitor listening for packet-ins.
> AT_CHECK([ovs-ofctl -P openflow10 monitor br0 --detach --no-chdir --pidfile])
> @@ -3864,7 +3864,7 @@ AT_CLEANUP
> 
> AT_SETUP([ofproto - ofport_request])
> OVS_VSWITCHD_START
> -ADD_OF_PORTS([br0], [1], [2], [3])
> +add_of_ports br0 1 2 3
> 
> set_and_check_specific_ofports () {
>     ovs-vsctl set Interface p1 ofport_request="$1" -- \
> diff --git a/tests/tunnel.at b/tests/tunnel.at
> index 2c4a971..0c033da 100644
> --- a/tests/tunnel.at
> +++ b/tests/tunnel.at
> @@ -395,7 +395,7 @@ OVS_VSWITCHD_START([dnl
>         options:remote_ip=5.5.5.5 ofport_request=5])
> 
> OVS_VSWITCHD_DISABLE_TUNNEL_PUSH_POP
> -ADD_OF_PORTS([br0], [90])
> +add_of_ports br0 90
> AT_DATA([flows.txt], [dnl
> in_port=90 actions=resubmit:1,resubmit:2,resubmit:3,resubmit:4,resubmit:5
> in_port=1 actions=set_field:42->tun_id,output:1
> diff --git a/tests/vlan-splinters.at b/tests/vlan-splinters.at
> index 883528d..bab7627 100644
> --- a/tests/vlan-splinters.at
> +++ b/tests/vlan-splinters.at
> @@ -3,7 +3,7 @@ AT_BANNER([VLAN splinters])
> AT_SETUP([VLAN splinters])
> AT_SKIP_IF([test "$IS_WIN32" = "yes"])
> OVS_VSWITCHD_START([], [], [=override])
> -ADD_OF_PORTS([br0], 1, 2, 3, 4)
> +add_of_ports br0 1 2 3 4
> AT_CHECK([ovs-vsctl \
>   -- set Bridge br0 fail-mode=standalone flood_vlans=0,9,11,15 \
>   -- set port br0 tag=0 \
> -- 
> 2.1.3
> 
> 
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
Ben Pfaff Jan. 28, 2016, 8:49 p.m. UTC | #2
On Thu, Jan 28, 2016 at 12:30:12PM -0800, Jarno Rajahalme wrote:
> Do we have an issue with the generated testsuite size?

Well, it's a 10 MB shell script, so I like to take opportunities to
reduce the size when I can.

> Acked-by: Jarno Rajahalme <jarno@ovn.org>

Thanks!

> > On Jan 27, 2016, at 9:51 AM, Ben Pfaff <blp@ovn.org> wrote:
> > 
> > This reduces the size of the generated testsuite and makes it possible
> > to pass arguments that vary at runtime instead of at the time of
> > translation from .at to shell script.
> > 
> > Signed-off-by: Ben Pfaff <blp@ovn.org>
> > ---
> > tests/bridge.at         |   2 +-
> > tests/classifier.at     |  10 +--
> > tests/learn.at          |   6 +-
> > tests/ofproto-dpif.at   | 204 ++++++++++++++++++++++++------------------------
> > tests/ofproto-macros.at |  26 +++---
> > tests/ofproto.at        |  14 ++--
> > tests/tunnel.at         |   2 +-
> > tests/vlan-splinters.at |   2 +-
> > 8 files changed, 134 insertions(+), 132 deletions(-)
> > 
> > diff --git a/tests/bridge.at b/tests/bridge.at
> > index 817931f..c9ad1e6 100644
> > --- a/tests/bridge.at
> > +++ b/tests/bridge.at
> > @@ -8,7 +8,7 @@ AT_SETUP([bridge - ports that disappear get added back])
> > OVS_VSWITCHD_START
> > 
> > # Add some ports and make sure that they show up in the datapath.
> > -ADD_OF_PORTS([br0], 1, 2)
> > +add_of_ports br0 1 2
> > AT_CHECK([ovs-appctl dpif/show], [0], [dnl
> > dummy@ovs-dummy: hit:0 missed:0
> > 	br0:
> > diff --git a/tests/classifier.at b/tests/classifier.at
> > index 3520acd..b110508 100644
> > --- a/tests/classifier.at
> > +++ b/tests/classifier.at
> > @@ -30,7 +30,7 @@ m4_foreach(
> > AT_BANNER([flow classifier lookup segmentation])
> > AT_SETUP([flow classifier - lookup segmentation])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], [1], [2], [3])
> > +add_of_ports br0 1 2 3
> > AT_DATA([flows.txt], [dnl
> > table=0 in_port=1 priority=16,tcp,nw_dst=10.1.0.0/255.255.0.0,action=output(3)
> > table=0 in_port=1 priority=32,tcp,nw_dst=10.1.2.15,action=output(2)
> > @@ -68,7 +68,7 @@ AT_CLEANUP
> > AT_BANNER([flow classifier prefix lookup])
> > AT_SETUP([flow classifier - prefix lookup])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], [1], [2], [3])
> > +add_of_ports br0 1 2 3
> > AT_CHECK([ovs-vsctl set Bridge br0 flow_tables:0=@N1 -- --id=@N1 create Flow_Table name=t0], [0], [ignore], [])
> > AT_DATA([flows.txt], [dnl
> > table=0 in_port=1 priority=16,tcp,nw_dst=10.1.0.0/255.255.0.0,action=output(3)
> > @@ -133,7 +133,7 @@ AT_BANNER([conjunctive match])
> > 
> > AT_SETUP([single conjunctive match])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], 1, 2, 3, 4, 5)
> > +add_of_ports br0 1 2 3 4 5
> > AT_DATA([flows.txt], [dnl
> > conj_id=1,actions=3
> > priority=100,ip,ip_src=10.0.0.1,actions=conjunction(1,1/2)
> > @@ -170,7 +170,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([multiple conjunctive match])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], 1, 2, 3, 4, 5)
> > +add_of_ports br0 1 2 3 4 5
> > AT_DATA([flows.txt], [dnl
> > conj_id=1,actions=1
> > conj_id=2,actions=2
> > @@ -246,7 +246,7 @@ AT_CLEANUP
> > # priority flow.  This test checks this special case.
> > AT_SETUP([conjunctive match priority fallback])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], 1, 2, 3, 4, 5, 6, 7)
> > +add_of_ports br0 1 2 3 4 5 6 7
> > AT_DATA([flows.txt], [dnl
> > conj_id=1,actions=1
> > conj_id=3,actions=3
> > diff --git a/tests/learn.at b/tests/learn.at
> > index 2b2fc28..97d78bf 100644
> > --- a/tests/learn.at
> > +++ b/tests/learn.at
> > @@ -302,7 +302,7 @@ AT_CLEANUP
> > # flow.
> > AT_SETUP([learning action - self-modifying flow])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], 1, 2, 3)
> > +add_of_ports br0 1 2 3
> > 
> > ovs-appctl time/stop
> > # Set up flow table for TCPv4 port learning.
> > @@ -344,7 +344,7 @@ AT_CLEANUP
> > # attributed correctly.
> > AT_SETUP([learning action - self-modifying flow with idle_timeout])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], 1, 2, 3)
> > +add_of_ports br0 1 2 3
> > 
> > ovs-appctl time/stop
> > # Set up flow table for TCPv4 port learning.
> > @@ -402,7 +402,7 @@ AT_CLEANUP
> > # attributed correctly.
> > AT_SETUP([learning action - self-modifying flow with hard_timeout])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], 1, 2, 3)
> > +add_of_ports br0 1 2 3
> > 
> > ovs-appctl time/stop
> > # Set up flow table for TCPv4 port learning.
> > diff --git a/tests/ofproto-dpif.at b/tests/ofproto-dpif.at
> > index aa2f1bb..75db58f 100644
> > --- a/tests/ofproto-dpif.at
> > +++ b/tests/ofproto-dpif.at
> > @@ -209,8 +209,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - resubmit])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], [1], [10], [11], [12], [13], [14], [15],
> > -                    [16], [17], [18], [19], [20], [21])
> > +add_of_ports br0 1 10 11 12 13 14 15 16 17 18 19 20 21
> > 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)
> > @@ -229,7 +228,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - goto table])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], [1], [10], [11])
> > +add_of_ports br0 1 10 11
> > echo "table=0 in_port=1 actions=output(10),goto_table(1)" > flows.txt
> > for i in `seq 1 63`; do echo "table=$i actions=goto_table($(($i+1)))"; done >> flows.txt
> > echo "table=64 actions=output(11)" >> flows.txt
> > @@ -243,7 +242,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - write actions])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], [1], [10], [11], [12], [13])
> > +add_of_ports br0 1 10 11 12 13
> > AT_DATA([flows.txt], [dnl
> > table=0 in_port=1,ip actions=output(10),write_actions(set_field:192.168.3.90->ip_src,output(12)),goto_table(1)
> > table=1 ip actions=write_actions(output(13)),goto_table(2)
> > @@ -260,7 +259,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - modify IPv6 Neighbor Solitication (ND)])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], [1], [10], [11], [12], [13])
> > +add_of_ports br0 1 10 11 12 13
> > AT_DATA([flows.txt], [dnl
> > table=0 in_port=1,icmp6,icmpv6_type=135 actions=output(10),write_actions(set_field:fe80::3->nd_target,set_field:aa:aa:aa:aa:aa:aa->nd_sll,output(12)),goto_table(1)
> > table=1 icmp6 actions=write_actions(output(13)),goto_table(2)
> > @@ -279,7 +278,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - clear actions])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], [1], [10], [11], [12])
> > +add_of_ports br0 1 10 11 12
> > AT_DATA([flows.txt], [dnl
> > table=0 in_port=1,ip actions=output(10),write_actions(set_field:192.168.3.90->ip_src,output(12)),goto_table(1)
> > table=1 tcp actions=set_field:91->tp_src,output(11),clear_actions
> > @@ -295,7 +294,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - group chaining])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], [1], [10], [11])
> > +add_of_ports br0 1 10 11
> > AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=all,bucket=set_field:192.168.3.90->ip_src,group:123,bucket=output:11'])
> > AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=123,type=all,bucket=output:10'])
> > AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=group:1234'])
> > @@ -308,7 +307,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - all group in action list])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], [1], [10], [11])
> > +add_of_ports br0 1 10 11
> > AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=all,bucket=output:10,set_field:192.168.3.90->ip_src,bucket=output:11'])
> > AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=group:1234'])
> > AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
> > @@ -323,7 +322,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - indirect group in action list])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], [1], [10])
> > +add_of_ports br0 1 10
> > AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 group_id=1234,type=indirect,bucket=output:10])
> > AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=group:1234'])
> > AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
> > @@ -335,7 +334,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - group actions have no effect afterwards])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], [1], [10])
> > +add_of_ports br0 1 10
> > AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=select,bucket=set_field:192.168.3.90->ip_src,output:10'])
> > AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=group:1234,output:10'])
> > AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
> > @@ -347,7 +346,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - all group in action set])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], [1], [10], [11])
> > +add_of_ports br0 1 10 11
> > AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=all,bucket=output:10,set_field:192.168.3.90->ip_src,bucket=output:11'])
> > AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(group:1234)'])
> > AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
> > @@ -362,7 +361,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - indirect group in action set])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], [1], [10])
> > +add_of_ports br0 1 10
> > AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 group_id=1234,type=indirect,bucket=output:10])
> > AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(group:1234)'])
> > AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
> > @@ -374,7 +373,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - select group])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], [1], [10], [11])
> > +add_of_ports br0 1 10 11
> > AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=select,bucket=output:10,bucket=output:11'])
> > AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(group:1234)'])
> > 
> > @@ -394,7 +393,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - select group with watch port])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], [1], [10], [11])
> > +add_of_ports br0 1 10 11
> > AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=select,bucket=watch_port:10,output:10,bucket=output:11'])
> > AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(group:1234)'])
> > AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:07,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
> > @@ -406,7 +405,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - select group with weight])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], [1], [10], [11], [12])
> > +add_of_ports br0 1 10 11 12
> > AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=select,bucket=output:10,bucket=output:11,weight=2000,bucket=output:12,weight=0'])
> > AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(group:1234)'])
> > AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:07,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
> > @@ -418,7 +417,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - select group with hash selection method])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], [1], [10], [11])
> > +add_of_ports br0 1 10 11
> > AT_CHECK([ovs-ofctl -O OpenFlow15 add-group br0 'group_id=1234,type=select,selection_method=hash,fields=eth_dst,bucket=output:10,bucket=output:11'])
> > AT_CHECK([ovs-ofctl -O OpenFlow15 add-flow br0 'ip actions=write_actions(group:1234)'])
> > 
> > @@ -451,7 +450,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - fast failover group])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], [1], [10], [11])
> > +add_of_ports br0 1 10 11
> > AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=ff,bucket=watch_port:10,output:10,bucket=watch_port:11,output:11'])
> > AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(group:1234)'])
> > AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
> > @@ -463,7 +462,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - group stats single bucket])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], [1], [10], [11])
> > +add_of_ports br0 1 10 11
> > AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=select,bucket=output:10,weight=2000,bucket=output:11,weight=0'])
> > AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(group:1234)'])
> > (
> > @@ -484,7 +483,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - group stats all buckets])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], [1], [10], [11])
> > +add_of_ports br0 1 10 11
> > AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=all,bucket=output:10,bucket=output:11'])
> > AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(group:1234)'])
> > (
> > @@ -505,7 +504,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - registers])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], [20], [21], [22], [33], [90])
> > +add_of_ports br0 20 21 22 33 90
> > 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
> > @@ -542,7 +541,7 @@ dnl Tests that the standardized xregs are mapped onto the legacy OVS registers
> > dnl in the manner documented in ovs-ofctl(8).
> > AT_SETUP([ofproto-dpif - extended registers])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], [1], [2], [3])
> > +add_of_ports br0 1 2 3
> > AT_DATA([flows.txt], [dnl
> > table=0     actions=load:0xfedcba9876543210->OXM_OF_PKT_REG1[[]],resubmit(,1)
> > table=1,reg2=0xfedcba98,reg3=0x76543210   actions=2
> > @@ -561,7 +560,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - load and move order])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], [1], [10], [11])
> > +add_of_ports br0 1 10 11
> > AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=all,bucket=output:10,move:NXM_NX_REG1[[]]->NXM_OF_IP_SRC[[]],bucket=output:11'])
> > AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(load:0xffffffff->NXM_NX_REG1[[]],move:NXM_NX_REG1[[]]->NXM_NX_REG2[[]],group:1234)'])
> > AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
> > @@ -575,7 +574,7 @@ AT_CLEANUP
> > dnl Tests that 1.5 copy-field can copy into the standardized xregs.
> > AT_SETUP([ofproto-dpif - copy-field into extended registers])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], [1], [2], [3])
> > +add_of_ports br0 1 2 3
> > AT_DATA([flows.txt], [dnl
> > table=0     actions=move:OXM_OF_ETH_SRC[[0..47]]->OXM_OF_PKT_REG0[[0..47]],goto_table(1)
> > table=1,xreg0=0x0000505400000005   actions=2
> > @@ -595,7 +594,7 @@ AT_CLEANUP
> > dnl Tests that 1.5 set-field with mask in the metadata register.
> > AT_SETUP([ofproto-dpif - masked set-field into metadata])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], [1], [2], [3])
> > +add_of_ports br0 1 2 3
> > AT_DATA([flows.txt], [dnl
> > table=0     actions=set_field:0xfafafafa5a5a5a5a->metadata,goto_table(1)
> > table=1     actions=set_field:0x6b/0xff->metadata,goto_table(2)
> > @@ -617,8 +616,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - actset_output])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS(
> > -  [br0], [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12], [13])
> > +add_of_ports br0 1 2 3 4 5 6 7 8 9 10 11 12 13
> > AT_DATA([flows.txt], [dnl
> > table=0,actset_output=unset     actions=write_actions(output(2)),goto_table(1)
> > table=1     actions=move:ONFOXM_ET_ACTSET_OUTPUT[[0..31]]->OXM_OF_PKT_REG0[[0..31]],goto_table(2)
> > @@ -658,7 +656,7 @@ OVS_VSWITCHD_STOP
> > AT_CLEANUP
> > AT_SETUP([ofproto-dpif - push-pop])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], [20], [21], [22], [33], [90])
> > +add_of_ports br0 20 21 22 33 90
> > AT_DATA([flows.txt], [dnl
> > in_port=90           actions=load:20->NXM_NX_REG0[[0..7]],load:21->NXM_NX_REG1[[0..7]],load:22->NXM_NX_REG2[[0..7]], load:33->NXM_NX_REG3[[0..7]], push:NXM_NX_REG0[[]], push:NXM_NX_REG1[[0..7]],push:NXM_NX_REG2[[0..15]], push:NXM_NX_REG3[[]], resubmit:2, resubmit:3, resubmit:4, resubmit:5
> > in_port=2            actions=pop:NXM_NX_REG0[[0..7]],output:NXM_NX_REG0[[]]
> > @@ -677,7 +675,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - output])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], [1], [9], [10], [11], [55], [66], [77], [88])
> > +add_of_ports br0 1 9 10 11 55 66 77 88
> > AT_DATA([flows.txt], [dnl
> > in_port=1 actions=resubmit:2,resubmit:3,resubmit:4,resubmit:5,resubmit:6,resubmit:7,resubmit:8
> > in_port=2 actions=output:9
> > @@ -698,7 +696,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - dec_ttl])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], [1], [2], [3], [4])
> > +add_of_ports br0 1 2 3 4
> > AT_DATA([flows.txt], [dnl
> > table=0 in_port=1 action=dec_ttl,output:2,resubmit(1,1),output:4
> > table=1 in_port=1 action=dec_ttl,output:3
> > @@ -742,7 +740,7 @@ dnl A number of similar rules are added to try and exercise
> > dnl xrealloc sufficiently that it returns a different base pointer
> > AT_SETUP([ofproto-dpif - dec_ttl without arguments at offset 32 in ofpacts])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], [1])
> > +add_of_ports br0 1
> > (for i in `seq 0 255`; do
> >   printf "dl_src=10:11:11:11:11:%02x actions=output:1,output:1,output:1,dec_ttl,controller\n" $i
> >  done) > flows.txt
> > @@ -759,7 +757,7 @@ dnl A number of similar rules are added to try and exercise
> > dnl xrealloc sufficiently that it returns a different base pointer
> > AT_SETUP([ofproto-dpif - dec_ttl with arguments at offset 32 in ofpacts])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], [1])
> > +add_of_ports br0 1
> > (for i in `seq 0 255`; do
> >   printf "dl_src=10:11:11:11:11:%02x actions=output:1,output:1,output:1,dec_ttl(1),controller\n" $i
> >  done) > flows.txt
> > @@ -776,7 +774,7 @@ dnl A number of similar rules are added to try and exercise
> > dnl xrealloc sufficiently that it returns a different base pointer
> > AT_SETUP([ofproto-dpif - note at offset 24 in ofpacts])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], [1])
> > +add_of_ports br0 1
> > (for i in `seq 0 255`; do
> >   printf "dl_src=10:11:11:11:11:%02x actions=output:1,output:1,note:ff,controller\n" $i
> >  done) > flows.txt
> > @@ -786,7 +784,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - output, OFPP_NONE ingress port])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], [1], [2])
> > +add_of_ports br0 1 2
> > 
> > AT_CHECK([ovs-ofctl add-flow br0 action=normal])
> > 
> > @@ -804,7 +802,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - DSCP])
> > OVS_VSWITCHD_START([add-port br0 p1 -- set Interface p1 type=dummy])
> > -ADD_OF_PORTS([br0], [9])
> > +add_of_ports br0 9
> > AT_DATA([flows.txt], [dnl
> > actions=output:LOCAL,enqueue:1:1,enqueue:1:2,enqueue:1:2,enqueue:1:1,output:1,mod_nw_tos:0,output:1,output:LOCAL
> > ])
> > @@ -831,7 +829,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - output/flood flags])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], [1], [2], [3], [4], [5], [6], [7])
> > +add_of_ports br0 1 2 3 4 5 6 7
> > 
> > AT_DATA([flows.txt], [dnl
> > in_port=local actions=local,flood
> > @@ -3023,7 +3021,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - ARP modification slow-path])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], [1], [2])
> > +add_of_ports br0 1 2
> > 
> > ovs-vsctl -- set Interface p2 type=dummy options:pcap=p2.pcap
> > ovs-ofctl add-flow br0 'in_port=1,arp actions=load:2->OXM_OF_ARP_OP[[]],2,load:0xc0a88001->OXM_OF_ARP_SPA[[]],2,load:0x404444444441->OXM_OF_ARP_THA[[]],2'
> > @@ -3694,7 +3692,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - fragment handling - trace])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], [1], [2], [3], [4], [5], [6], [90])
> > +add_of_ports br0 1 2 3 4 5 6 90
> > AT_DATA([flows.txt], [dnl
> > priority=75 tcp ip_frag=no    tp_dst=80 actions=move:OXM_OF_TCP_DST[[]]->OXM_OF_TCP_SRC[[]],output:1
> > priority=75 tcp ip_frag=first tp_dst=80 actions=move:OXM_OF_TCP_DST[[]]->OXM_OF_TCP_SRC[[]],output:2
> > @@ -3743,7 +3741,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - fragment handling - upcall])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], [1], [2], [3], [4], [5], [6], [90])
> > +add_of_ports br0 1 2 3 4 5 6 90
> > AT_DATA([flows.txt], [dnl
> > priority=75 tcp ip_frag=no    tp_dst=80 actions=set_field:81->tcp_dst,output:1
> > priority=75 tcp ip_frag=first tp_dst=80 actions=set_field:81->tcp_dst,output:2
> > @@ -3818,7 +3816,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - fragment handling - actions])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], [1], [2], [3], [4], [5], [6], [90])
> > +add_of_ports br0 1 2 3 4 5 6 90
> > 
> > AT_CHECK([ovs-ofctl add-flow br0 "tcp,ip_frag=later actions=move:OXM_OF_TCP_DST[[0..7]]->OXM_OF_TCP_SRC[[0..7]],output:1"], [1], [], [stderr])
> > AT_CHECK([tail -2 stderr | sed 's/^.*|WARN|//'], [0], [dnl
> > @@ -3920,7 +3918,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - exit])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], [1], [2], [3], [10], [11], [12], [13], [14])
> > +add_of_ports br0 1 2 3 10 11 12 13 14
> > AT_DATA([flows.txt], [dnl
> > in_port=1 actions=output:10,exit,output:11
> > in_port=2 actions=output:12,resubmit:1,output:12
> > @@ -3945,7 +3943,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - mirroring, select_all])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], 1, 2, 3)
> > +add_of_ports br0 1 2 3
> > ovs-vsctl \
> >         set Bridge br0 mirrors=@m --\
> >         --id=@p3 get Port p3 --\
> > @@ -3975,7 +3973,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - mirroring, select_src])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], 1, 2, 3)
> > +add_of_ports br0 1 2 3
> > ovs-vsctl \
> >         set Bridge br0 mirrors=@m --\
> >         --id=@p1 get Port p1 -- --id=@p3 get Port p3 --\
> > @@ -4003,7 +4001,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - mirroring, OFPP_NONE ingress port])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], 1, 2)
> > +add_of_ports br0 1 2
> > ovs-vsctl \
> >         set Bridge br0 mirrors=@m --\
> >         --id=@p2 get Port p2 --\
> > @@ -4024,7 +4022,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - mirroring, select_dst])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], 1, 2, 3)
> > +add_of_ports br0 1 2 3
> > ovs-vsctl \
> >         set Bridge br0 mirrors=@m --\
> >         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
> > @@ -4054,7 +4052,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - mirroring, select_vlan])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], 1, 2, 3)
> > +add_of_ports br0 1 2 3
> > ovs-vsctl \
> >         set Bridge br0 mirrors=@m --\
> >         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
> > @@ -4089,7 +4087,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - mirroring, output_port])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], 1, 2, 3)
> > +add_of_ports br0 1 2 3
> > ovs-vsctl \
> >         set Bridge br0 mirrors=@m --\
> >         --id=@p3 get Port p3 --\
> > @@ -4118,7 +4116,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - mirroring, output_vlan])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], 1, 2)
> > +add_of_ports br0 1 2
> > ovs-vsctl \
> >         set Bridge br0 mirrors=@m --\
> >         --id=@m create Mirror name=mymirror select_all=true output_vlan=12
> > @@ -4156,7 +4154,7 @@ AT_CLEANUP
> > # would cause the packet to be mirrored to port 3 a second time.
> > AT_SETUP([ofproto-dpif - mirroring with recirculation])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], 1, 2, 3, 4)
> > +add_of_ports br0 1 2 3 4
> > ovs-vsctl \
> >         set Bridge br0 mirrors=@m --\
> >         --id=@p3 get Port p3 --\
> > @@ -4183,7 +4181,7 @@ AT_CLEANUP
> > # the current table rather than specifying a table).
> > AT_SETUP([ofproto-dpif - resubmit with recirculation])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], [1], [2], [3])
> > +add_of_ports br0 1 2 3
> > 
> > AT_DATA([flows.txt], [dnl
> > table=0 in_port=1  actions=2,resubmit(,1)
> > @@ -4208,7 +4206,7 @@ AT_CLEANUP
> > # re-executed when execution continues later post-recirculation.
> > AT_SETUP([ofproto-dpif - recirculation after resubmit])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], [1], [2])
> > +add_of_ports br0 1 2
> > 
> > AT_DATA([flows.txt], [dnl
> > table=0 in_port=1 actions=resubmit(,1),2
> > @@ -4233,7 +4231,7 @@ AT_CLEANUP
> > # ofproto/trace br_name br_flow [-generate|packet]
> > AT_SETUP([ofproto-dpif - ofproto/trace command 1])
> > OVS_VSWITCHD_START([set bridge br0 fail-mode=standalone])
> > -ADD_OF_PORTS([br0], 1, 2, 3)
> > +add_of_ports br0 1 2 3
> > 
> > AT_DATA([flows.txt], [dnl
> > in_port=1 actions=output:2
> > @@ -4374,7 +4372,7 @@ AT_CLEANUP
> > # The second test tests the corner cases
> > AT_SETUP([ofproto-dpif - ofproto/trace command 2])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], 1, 2)
> > +add_of_ports br0 1 2
> > 
> > # Define flows
> > odp_flow="in_port(1),eth(src=50:54:00:00:00:01,dst=50:54:00:00:00:02)"
> > @@ -4538,7 +4536,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - ofproto/trace-packet-out])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], 1, 2, 3)
> > +add_of_ports br0 1 2 3
> > 
> > AT_DATA([flows.txt], [dnl
> > in_port=1 actions=output:2
> > @@ -4568,7 +4566,7 @@ m4_define([OFPROTO_TRACE],
> > 
> > AT_SETUP([ofproto-dpif - MAC learning])
> > OVS_VSWITCHD_START([set bridge br0 fail-mode=standalone])
> > -ADD_OF_PORTS([br0], 1, 2, 3)
> > +add_of_ports br0 1 2 3
> > 
> > arp='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)'
> > 
> > @@ -4619,7 +4617,7 @@ AT_CHECK(
> >   [ovs-vsctl \
> >      -- add-br br1 \
> >      -- set bridge br1 datapath-type=dummy])
> > -ADD_OF_PORTS([br1], 4, 5)
> > +add_of_ports br1 4 5
> > 
> > # Trace some packet arrivals in br1 to create MAC learning entries there too.
> > OFPROTO_TRACE(
> > @@ -4658,7 +4656,7 @@ AT_CLEANUP
> > AT_SETUP([ofproto-dpif - MAC table overflow])
> > OVS_VSWITCHD_START(
> >   [set bridge br0 fail-mode=standalone other-config:mac-table-size=10])
> > -ADD_OF_PORTS([br0], 1, 2, 3)
> > +add_of_ports br0 1 2 3
> > 
> > arp='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)'
> > 
> > @@ -4718,7 +4716,7 @@ AT_CLEANUP
> > AT_SETUP([ofproto-dpif - MAC table overflow fairness])
> > OVS_VSWITCHD_START(
> >   [set bridge br0 fail-mode=standalone other-config:mac-table-size=10])
> > -ADD_OF_PORTS([br0], 1, 2, 3, 4, 5, 6)
> > +add_of_ports br0 1 2 3 4 5 6
> > 
> > arp='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)'
> > 
> > @@ -4794,7 +4792,7 @@ m4_define([CHECK_SFLOW_SAMPLING_PACKET],
> >   PARSE_LISTENING_PORT([test-sflow.log], [SFLOW_PORT])
> >   ovs-appctl time/stop
> > 
> > -  ADD_OF_PORTS([br0], 1, 2)
> > +  add_of_ports br0 1 2
> >   ovs-vsctl \
> >      set Interface br0 options:ifindex=1002 -- \
> >      set Interface p1 options:ifindex=1004 -- \
> > @@ -5342,7 +5340,7 @@ AT_SETUP([ofproto-dpif - sFlow packet sampling - MPLS])
> > AT_XFAIL_IF([test "$IS_WIN32" = "yes"])
> > OVS_VSWITCHD_START
> > AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
> > -ADD_OF_PORTS([br0], [1], [2])
> > +add_of_ports br0 1 2
> > AT_DATA([flows.txt], [dnl
> > table=0 dl_src=50:54:00:00:00:09 actions=push_mpls:0x8847,set_mpls_label:789,set_mpls_tc:4,set_mpls_ttl:32,2
> > table=0 dl_src=50:54:00:00:00:0b actions=pop_mpls:0x0800,2
> > @@ -5440,7 +5438,7 @@ AT_CLEANUP
> > # cause a record to be sent.
> > m4_define([CHECK_NETFLOW_EXPIRATION],
> >   [OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
> > -  ADD_OF_PORTS([br0], 1, 2)
> > +  add_of_ports br0 1 2
> > 
> >   ovs-appctl time/stop
> >   on_exit 'kill `cat test-netflow.pid`'
> > @@ -5488,7 +5486,7 @@ AT_CLEANUP
> > # Test that basic NetFlow reports active expirations correctly.
> > m4_define([CHECK_NETFLOW_ACTIVE_EXPIRATION],
> >   [OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
> > -  ADD_OF_PORTS([br0], 1, 2)
> > +  add_of_ports br0 1 2
> > 
> >   on_exit 'kill `cat test-netflow.pid`'
> >   AT_CHECK([ovstest test-netflow --log-file --detach --no-chdir --pidfile 0:$1 > netflow.log], [0], [], [ignore])
> > @@ -5572,7 +5570,7 @@ dnl configure IPFIX and ensure that sample action generation works at the
> > dnl datapath level.
> > AT_SETUP([ofproto-dpif - Basic IPFIX sanity check])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], 1, 2)
> > +add_of_ports br0 1 2
> > 
> > dnl Sample every packet using bridge-based sampling
> > AT_CHECK([ovs-vsctl -- set bridge br0 ipfix=@fix -- \
> > @@ -5774,8 +5772,8 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-dps])
> > OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy])
> > -ADD_OF_PORTS([br0], [1], [2])
> > -ADD_OF_PORTS([br1], [3])
> > +add_of_ports br0 1 2
> > +add_of_ports br1 3
> > 
> > AT_CHECK([ovs-appctl dpif/dump-dps], [0], [dnl
> > dummy@br0
> > @@ -5786,8 +5784,8 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - ovs-appctl dpif/show])
> > OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy])
> > -ADD_OF_PORTS([br0], [1], [2])
> > -ADD_OF_PORTS([br1], [3])
> > +add_of_ports br0 1 2
> > +add_of_ports br1 3
> > 
> > AT_CHECK([ovs-appctl dpif/show], [0], [dnl
> > dummy@ovs-dummy: hit:0 missed:0
> > @@ -5807,8 +5805,8 @@ AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-flows])
> > OVS_VSWITCHD_START([add-br br1 -- \
> >                     set bridge br1 datapath-type=dummy fail-mode=secure -- \
> >                     set Open_vSwitch . other_config:max-idle=10000])
> > -ADD_OF_PORTS([br0], [1], [2])
> > -ADD_OF_PORTS([br1], [3])
> > +add_of_ports br0 1 2
> > +add_of_ports br1 3
> > 
> > AT_CHECK([ovs-appctl netdev-dummy/receive p1 '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,ttl=64,frag=no),icmp(type=8,code=0)'])
> > AT_CHECK([ovs-appctl netdev-dummy/receive p2 'in_port(2),eth(src=50:54:00:00:00:07,dst=50:54:00:00:00:05),eth_type(0x0800),ipv4(src=192.168.0.2,dst=192.168.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=0,code=0)'])
> > @@ -5840,7 +5838,7 @@ AT_SETUP([ofproto-dpif - ovs-appctl dpif/get-flow])
> > OVS_VSWITCHD_START([add-br br1 -- \
> >                     set bridge br1 datapath-type=dummy fail-mode=secure -- \
> >                     set Open_vSwitch . other_config:max-idle=10000])
> > -ADD_OF_PORTS([br0], [1], [2])
> > +add_of_ports br0 1 2
> > 
> > AT_CHECK([ovs-appctl netdev-dummy/receive p1 '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,ttl=64,frag=no),icmp(type=8,code=0)'])
> > ovs-appctl revalidator/wait
> > @@ -5934,8 +5932,8 @@ OVS_VSWITCHD_START([add-br br1 \
> > -- add-port br1 pbr1 -- set int pbr1 type=patch options:peer=pbr0 \
> > -- add-port br0 pbr0 -- set int pbr0 type=patch options:peer=pbr1])
> > 
> > -ADD_OF_PORTS([br0], [2])
> > -ADD_OF_PORTS([br1], [3])
> > +add_of_ports br0 2
> > +add_of_ports br1 3
> > 
> > AT_CHECK([ovs-appctl upcall/disable-ufid], [0], [Datapath dumping tersely using UFID disabled
> > ], [])
> > @@ -6009,8 +6007,8 @@ OVS_VSWITCHD_START([add-br br1 \
> > -- add-port br1 pbr1 -- set int pbr1 type=patch options:peer=pbr0 \
> > -- add-port br0 pbr0 -- set int pbr0 type=patch options:peer=pbr1])
> > 
> > -ADD_OF_PORTS([br0], [2])
> > -ADD_OF_PORTS([br1], [3])
> > +add_of_ports br0 2
> > +add_of_ports br1 3
> > 
> > AT_CHECK([ovs-appctl upcall/disable-ufid], [0], [Datapath dumping tersely using UFID disabled
> > ], [])
> > @@ -6054,7 +6052,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - port duration])
> > OVS_VSWITCHD_START([set Bridge br0 protocols=OpenFlow13])
> > -ADD_OF_PORTS([br0], 1, 2)
> > +add_of_ports br0 1 2
> > 
> > ovs-appctl time/stop
> > ovs-appctl time/warp 10000
> > @@ -6075,7 +6073,7 @@ AT_BANNER([ofproto-dpif -- megaflows])
> > AT_SETUP([ofproto-dpif megaflow - port classification])
> > OVS_VSWITCHD_START
> > AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
> > -ADD_OF_PORTS([br0], [1], [2])
> > +add_of_ports br0 1 2
> > AT_DATA([flows.txt], [dnl
> > table=0 in_port=1 actions=output(2)
> > ])
> > @@ -6093,7 +6091,7 @@ AT_CLEANUP
> > AT_SETUP([ofproto-dpif megaflow - L2 classification])
> > OVS_VSWITCHD_START
> > AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
> > -ADD_OF_PORTS([br0], [1], [2])
> > +add_of_ports br0 1 2
> > AT_DATA([flows.txt], [dnl
> > table=0 in_port=1,dl_src=50:54:00:00:00:09 actions=output(2)
> > ])
> > @@ -6111,7 +6109,7 @@ AT_CLEANUP
> > AT_SETUP([ofproto-dpif megaflow - L3 classification])
> > OVS_VSWITCHD_START
> > AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
> > -ADD_OF_PORTS([br0], [1], [2])
> > +add_of_ports br0 1 2
> > AT_CHECK([ovs-vsctl set Bridge br0 flow_tables:0=@N1 -- --id=@N1 create Flow_Table name=t0 prefixes=nw_dst,nw_src], [0], [ignore], [])
> > AT_DATA([flows.txt], [dnl
> > table=0 in_port=1,icmp,nw_src=10.0.0.4 actions=output(2)
> > @@ -6130,7 +6128,7 @@ AT_CLEANUP
> > AT_SETUP([ofproto-dpif megaflow - IPv6 classification])
> > OVS_VSWITCHD_START
> > AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
> > -ADD_OF_PORTS([br0], [1], [2])
> > +add_of_ports br0 1 2
> > AT_CHECK([ovs-vsctl set Bridge br0 flow_tables:0=@N1 -- --id=@N1 create Flow_Table name=t0 prefixes=ipv6_dst,ipv6_src], [0], [ignore], [])
> > AT_DATA([flows.txt], [dnl
> > table=0 in_port=1,ipv6,ipv6_src=2001:db8:3c4d:1:2:3:4:5 actions=output(2)
> > @@ -6149,7 +6147,7 @@ AT_CLEANUP
> > AT_SETUP([ofproto-dpif megaflow - L4 classification])
> > OVS_VSWITCHD_START
> > AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
> > -ADD_OF_PORTS([br0], [1], [2])
> > +add_of_ports br0 1 2
> > AT_DATA([flows.txt], [dnl
> > table=0 in_port=1,icmp,icmp_type=8 actions=output(2)
> > ])
> > @@ -6167,7 +6165,7 @@ AT_CLEANUP
> > AT_SETUP([ofproto-dpif megaflow - normal])
> > OVS_VSWITCHD_START
> > AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
> > -ADD_OF_PORTS([br0], [1], [2])
> > +add_of_ports br0 1 2
> > AT_CHECK([ovs-ofctl add-flow br0 action=normal])
> > AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
> > AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
> > @@ -6182,7 +6180,7 @@ AT_CLEANUP
> > AT_SETUP([ofproto-dpif megaflow - mpls])
> > OVS_VSWITCHD_START
> > AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
> > -ADD_OF_PORTS([br0], [1], [2])
> > +add_of_ports br0 1 2
> > AT_DATA([flows.txt], [dnl
> > table=0 dl_src=50:54:00:00:00:09 actions=push_mpls:0x8847,2
> > table=0 dl_src=50:54:00:00:00:0b actions=pop_mpls:0x0800,2
> > @@ -6202,7 +6200,7 @@ AT_CLEANUP
> > m4_define([CHECK_MEGAFLOW_NETFLOW],
> >   [OVS_VSWITCHD_START
> >   AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
> > -  ADD_OF_PORTS([br0], [1], [2])
> > +  add_of_ports br0 1 2
> > 
> >   dnl NetFlow configuration disables wildcarding relevant fields
> >   on_exit 'kill `cat test-netflow.pid`'
> > @@ -6298,7 +6296,7 @@ OVS_VSWITCHD_START(
> > AT_CHECK([ovs-appctl netdev-dummy/set-admin-state up], 0, [OK
> > ])
> > AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
> > -ADD_OF_PORTS([br0], [7])
> > +add_of_ports br0 7
> > AT_CHECK([ovs-ofctl add-flow br0 action=normal])
> > AT_CHECK([ovs-ofctl add-flow br1 action=normal])
> > ovs-appctl time/stop
> > @@ -6316,7 +6314,7 @@ AT_CLEANUP
> > AT_SETUP([ofproto-dpif megaflow - resubmit port action])
> > OVS_VSWITCHD_START
> > AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
> > -ADD_OF_PORTS([br0], [1], [2])
> > +add_of_ports br0 1 2
> > AT_DATA([flows.txt], [dnl
> > table=0 in_port=1,ip actions=resubmit(90)
> > table=0 in_port=90,dl_src=50:54:00:00:00:09 actions=output(2)
> > @@ -6335,7 +6333,7 @@ AT_CLEANUP
> > AT_SETUP([ofproto-dpif megaflow - resubmit table action])
> > OVS_VSWITCHD_START
> > AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
> > -ADD_OF_PORTS([br0], [1], [2])
> > +add_of_ports br0 1 2
> > AT_DATA([flows.txt], [dnl
> > table=0 in_port=1,ip actions=resubmit(,1)
> > table=1 dl_src=50:54:00:00:00:09 actions=output(2)
> > @@ -6355,7 +6353,7 @@ AT_CLEANUP
> > AT_SETUP([ofproto-dpif megaflow - goto_table action])
> > OVS_VSWITCHD_START
> > AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
> > -ADD_OF_PORTS([br0], [1], [2])
> > +add_of_ports br0 1 2
> > AT_DATA([flows.txt], [dnl
> > table=0 in_port=1,ip actions=goto_table(1)
> > table=1 dl_src=50:54:00:00:00:09 actions=output(2)
> > @@ -6374,7 +6372,7 @@ AT_CLEANUP
> > AT_SETUP([ofproto-dpif megaflow - mirroring, select_all])
> > OVS_VSWITCHD_START
> > AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
> > -ADD_OF_PORTS([br0], [1], [2], [3])
> > +add_of_ports br0 1 2 3
> > ovs-vsctl \
> >         set Bridge br0 mirrors=@m --\
> >         --id=@p3 get Port p3 --\
> > @@ -6397,7 +6395,7 @@ AT_CLEANUP
> > AT_SETUP([ofproto-dpif megaflow - mirroring, select_vlan])
> > OVS_VSWITCHD_START
> > AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
> > -ADD_OF_PORTS([br0], [1], [2], [3])
> > +add_of_ports br0 1 2 3
> > ovs-vsctl \
> >         set Bridge br0 mirrors=@m --\
> >         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
> > @@ -6420,7 +6418,7 @@ AT_CLEANUP
> > AT_SETUP([ofproto-dpif megaflow - move action])
> > OVS_VSWITCHD_START
> > AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
> > -ADD_OF_PORTS([br0], [1], [2])
> > +add_of_ports br0 1 2
> > AT_DATA([flows.txt], [dnl
> > table=0 in_port=1 ip,actions=move:NXM_OF_IP_SRC[[]]->NXM_NX_REG0[[]],resubmit(90)
> > table=0 in_port=90 ip,actions=move:NXM_NX_REG0[[]]->NXM_NX_REG1[[]],resubmit(91)
> > @@ -6440,7 +6438,7 @@ AT_CLEANUP
> > AT_SETUP([ofproto-dpif megaflow - push action])
> > OVS_VSWITCHD_START
> > AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
> > -ADD_OF_PORTS([br0], [1], [2])
> > +add_of_ports br0 1 2
> > AT_DATA([flows.txt], [dnl
> > table=0 in_port=1 ip,actions=push:NXM_OF_IP_SRC[[]],output(2)
> > ])
> > @@ -6458,7 +6456,7 @@ AT_CLEANUP
> > AT_SETUP([ofproto-dpif megaflow - learning])
> > OVS_VSWITCHD_START
> > AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
> > -ADD_OF_PORTS([br0], [1], [2])
> > +add_of_ports br0 1 2
> > AT_DATA([flows.txt], [dnl
> > table=0 in_port=1 actions=load:2->NXM_NX_REG0[[0..15]],learn(table=1,priority=65535,NXM_OF_ETH_SRC[[]],NXM_OF_VLAN_TCI[[0..11]],output:NXM_NX_REG0[[0..15]]),output:2
> > ])
> > @@ -6518,7 +6516,7 @@ AT_CLEANUP
> > AT_SETUP([ofproto-dpif megaflow - dec_ttl])
> > OVS_VSWITCHD_START
> > AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
> > -ADD_OF_PORTS([br0], [1], [2])
> > +add_of_ports br0 1 2
> > AT_CHECK([ovs-vsctl set Bridge br0 flow_tables:0=@N1 -- --id=@N1 create Flow_Table name=t0 prefixes=nw_dst,nw_src], [0], [ignore], [])
> > AT_DATA([flows.txt], [dnl
> > table=0 in_port=1,icmp,nw_src=10.0.0.4 actions=dec_ttl,output(2)
> > @@ -6537,7 +6535,7 @@ AT_CLEANUP
> > AT_SETUP([ofproto-dpif megaflow - set dl_dst])
> > OVS_VSWITCHD_START
> > AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
> > -ADD_OF_PORTS([br0], [1], [2])
> > +add_of_ports br0 1 2
> > AT_DATA([flows.txt], [dnl
> > table=0 in_port=1 actions=mod_dl_dst(50:54:00:00:00:0a),output(2)
> > ])
> > @@ -6558,7 +6556,7 @@ AT_CLEANUP
> > AT_SETUP([ofproto-dpif megaflow - disabled])
> > OVS_VSWITCHD_START
> > AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
> > -ADD_OF_PORTS([br0], [1], [2])
> > +add_of_ports br0 1 2
> > AT_DATA([flows.txt], [dnl
> > table=0 in_port=1,ip,nw_dst=10.0.0.1 actions=output(2)
> > table=0 in_port=1,ip,nw_dst=10.0.0.3 actions=drop
> > @@ -6590,7 +6588,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - datapath port number change])
> > OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
> > -ADD_OF_PORTS([br0], 1)
> > +add_of_ports br0 1
> > 
> > # Trace a flow that should output to p1.
> > AT_CHECK([ovs-appctl ofproto/trace br0 in_port=LOCAL,dl_src=10:20:30:40:50:60],
> > @@ -6764,7 +6762,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - exponential resubmit chain])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], 1)
> > +add_of_ports br0 1
> > (for i in `seq 1 64`; do
> >      j=`expr $i + 1`
> >      echo "in_port=$i, actions=resubmit:$j, resubmit:$j, local"
> > @@ -6782,7 +6780,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - too many output actions])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], 1)
> > +add_of_ports br0 1
> > (for i in `seq 1 12`; do
> >      j=`expr $i + 1`
> >      echo "in_port=$i, actions=resubmit:$j, resubmit:$j, local"
> > @@ -6800,7 +6798,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - stack too deep])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], 1)
> > +add_of_ports br0 1
> > (for i in `seq 1 12`; do
> >      j=`expr $i + 1`
> >      echo "in_port=$i, actions=resubmit:$j, resubmit:$j, local"
> > @@ -6820,7 +6818,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif packet-out controller])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], 1, 2)
> > +add_of_ports br0 1 2
> > 
> > AT_CHECK([ovs-ofctl add-flow br0 'dl_dst=50:54:00:00:00:0a actions=controller'])
> > 
> > @@ -6921,7 +6919,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif packet-out goto_table])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], 1, 2)
> > +add_of_ports br0 1 2
> > 
> > AT_DATA([flows.txt], [dnl
> > table=0 dl_dst=50:54:00:00:00:0a actions=goto_table(1)
> > @@ -6975,7 +6973,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif packet-out table-miss (continue)])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], 1, 2)
> > +add_of_ports br0 1 2
> > 
> > AT_CHECK([ovs-ofctl -O OpenFlow11 add-flow br0 'table=1 dl_dst=50:54:00:00:00:0a actions=controller'])
> > AT_CHECK([ovs-ofctl -O OpenFlow11 mod-table br0 all continue])
> > @@ -7026,7 +7024,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - ICMPv6])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], 1)
> > +add_of_ports br0 1
> > 
> > AT_CAPTURE_FILE([ofctl_monitor.log])
> > 
> > @@ -7046,7 +7044,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto-dpif - Neighbor Discovery set-field with checksum update])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], 1)
> > +add_of_ports br0 1
> > AT_CHECK([ovs-ofctl add-flow br0 icmp6,icmpv6_type=135,action=set_field:fe80::1-\>nd_target,set_field:32:21:14:86:11:74-\>nd_sll,output:controller])
> > 
> > AT_CAPTURE_FILE([ofctl_monitor.log])
> > diff --git a/tests/ofproto-macros.at b/tests/ofproto-macros.at
> > index bace0f5..bb3e9ee 100644
> > --- a/tests/ofproto-macros.at
> > +++ b/tests/ofproto-macros.at
> > @@ -316,6 +316,21 @@ check_logs () {
> > /|ERR|/p
> > /|EMER|/p" ${logs}
> > }
> > +
> > +# add_of_ports BRIDGE PNUM...
> > +#
> > +# Creates dummy interfaces in BRIDGE named pPNUM, OpenFlow port number
> > +# PNUM, and datapath port number PNUM (the latter is a consequence of
> > +# the dummy implementation, which tries to assign datapath port
> > +# numbers based on port names).
> > +add_of_ports () {
> > +    local args
> > +    local br=$1; shift
> > +    for $pnum; do
> > +        AS_VAR_APPEND([args], [" -- $br p$pnum -- set Interface p$pnum type=dummy ofport_request=$pnum"])
> > +    done
> > +    ovs-vsctl $args
> > +}
> > m4_divert_pop([PREPARE_TESTS])
> > 
> > # OVS_VSWITCHD_STOP([WHITELIST])
> > @@ -336,17 +351,6 @@ m4_define([OVS_VSWITCHD_DISABLE_TUNNEL_PUSH_POP],
> > Tunnel push-pop off
> > ])])
> > 
> > -# ADD_OF_PORTS(BRIDGE, OF_PORT[, OF_PORT...])
> > -#
> > -# Creates a dummy interface with an OpenFlow port number of OF_PORT and
> > -# name of p{OF_PORT}.  The dummy implementation will treat the OF_PORT
> > -# as the datapath port number, which as the effect of making the
> > -# OpenFlow and datapath numbers the same.
> > -m4_define([ADD_OF_PORTS],
> > - [ovs-vsctl m4_foreach([of_port], m4_cdr($@),
> > -    [ \
> > -    -- add-port $1 p[]of_port -- set Interface p[]of_port type=dummy ofport_request=of_port])])
> > -
> > # WAIT_FOR_DUMMY_PORTS(NETDEV_DUMMY_PORT[, NETDEV_DUMMY_PORT...])
> > #
> > # Wait until the netdev dummy ports are connected to each other
> > diff --git a/tests/ofproto.at b/tests/ofproto.at
> > index 61a6be5..f206442 100644
> > --- a/tests/ofproto.at
> > +++ b/tests/ofproto.at
> > @@ -146,7 +146,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto - port-desc stats (OpenFlow 1.5)])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], 1, 2, 3)
> > +add_of_ports br0 1 2 3
> > AT_CHECK([ovs-ofctl -F OXM-OpenFlow15 -O OpenFlow15 -vwarn dump-ports-desc br0], [0], [stdout])
> > AT_CHECK([STRIP_XIDS stdout | sed 's/00:0./00:0x/'], [0], [dnl
> > OFPST_PORT_DESC reply (OF1.5):
> > @@ -230,7 +230,7 @@ dnl This is really bare-bones.
> > dnl It at least checks request and reply serialization and deserialization.
> > AT_SETUP([ofproto - queue configuration - (OpenFlow 1.0)])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], [1], [2])
> > +add_of_ports br0 1 2
> > AT_CHECK([ovs-ofctl queue-get-config br0 1], [0], [stdout])
> > AT_CHECK([STRIP_XIDS stdout], [0], [dnl
> > OFPT_QUEUE_GET_CONFIG_REPLY: port=1
> > @@ -252,7 +252,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto - queue configuration - (OpenFlow 1.1)])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], [1], [2])
> > +add_of_ports br0 1 2
> > AT_CHECK([ovs-ofctl -O OpenFlow11 queue-get-config br0 1], [0], [stdout])
> > AT_CHECK([STRIP_XIDS stdout], [0], [dnl
> > OFPT_QUEUE_GET_CONFIG_REPLY (OF1.1): port=1
> > @@ -267,7 +267,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto - queue configuration - (OpenFlow 1.2)])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], [1], [2])
> > +add_of_ports br0 1 2
> > AT_CHECK([ovs-ofctl -O OpenFlow12 queue-get-config br0 1], [0], [stdout])
> > AT_CHECK([STRIP_XIDS stdout], [0], [dnl
> > OFPT_QUEUE_GET_CONFIG_REPLY (OF1.2): port=1
> > @@ -289,7 +289,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto - queue configuration - (OpenFlow 1.4)])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], [1], [2])
> > +add_of_ports br0 1 2
> > 
> > AT_CHECK([ovs-ofctl -O OpenFlow14 queue-get-config br0 any | STRIP_XIDS], [0],
> >   [OFPST_QUEUE_DESC reply (OF1.4): port=1
> > @@ -3257,7 +3257,7 @@ dnl controllers despite the spec) as meaning a packet that was generated
> > dnl by the controller.
> > AT_SETUP([ofproto - packet-out from controller (OpenFlow 1.0)])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], [1])
> > +add_of_ports br0 1
> > 
> > # Start a monitor listening for packet-ins.
> > AT_CHECK([ovs-ofctl -P openflow10 monitor br0 --detach --no-chdir --pidfile])
> > @@ -3864,7 +3864,7 @@ AT_CLEANUP
> > 
> > AT_SETUP([ofproto - ofport_request])
> > OVS_VSWITCHD_START
> > -ADD_OF_PORTS([br0], [1], [2], [3])
> > +add_of_ports br0 1 2 3
> > 
> > set_and_check_specific_ofports () {
> >     ovs-vsctl set Interface p1 ofport_request="$1" -- \
> > diff --git a/tests/tunnel.at b/tests/tunnel.at
> > index 2c4a971..0c033da 100644
> > --- a/tests/tunnel.at
> > +++ b/tests/tunnel.at
> > @@ -395,7 +395,7 @@ OVS_VSWITCHD_START([dnl
> >         options:remote_ip=5.5.5.5 ofport_request=5])
> > 
> > OVS_VSWITCHD_DISABLE_TUNNEL_PUSH_POP
> > -ADD_OF_PORTS([br0], [90])
> > +add_of_ports br0 90
> > AT_DATA([flows.txt], [dnl
> > in_port=90 actions=resubmit:1,resubmit:2,resubmit:3,resubmit:4,resubmit:5
> > in_port=1 actions=set_field:42->tun_id,output:1
> > diff --git a/tests/vlan-splinters.at b/tests/vlan-splinters.at
> > index 883528d..bab7627 100644
> > --- a/tests/vlan-splinters.at
> > +++ b/tests/vlan-splinters.at
> > @@ -3,7 +3,7 @@ AT_BANNER([VLAN splinters])
> > AT_SETUP([VLAN splinters])
> > AT_SKIP_IF([test "$IS_WIN32" = "yes"])
> > OVS_VSWITCHD_START([], [], [=override])
> > -ADD_OF_PORTS([br0], 1, 2, 3, 4)
> > +add_of_ports br0 1 2 3 4
> > AT_CHECK([ovs-vsctl \
> >   -- set Bridge br0 fail-mode=standalone flood_vlans=0,9,11,15 \
> >   -- set port br0 tag=0 \
> > -- 
> > 2.1.3
> > 
> > 
> > _______________________________________________
> > dev mailing list
> > dev@openvswitch.org
> > http://openvswitch.org/mailman/listinfo/dev
> 
> 
> 
>
diff mbox

Patch

diff --git a/tests/bridge.at b/tests/bridge.at
index 817931f..c9ad1e6 100644
--- a/tests/bridge.at
+++ b/tests/bridge.at
@@ -8,7 +8,7 @@  AT_SETUP([bridge - ports that disappear get added back])
 OVS_VSWITCHD_START
 
 # Add some ports and make sure that they show up in the datapath.
-ADD_OF_PORTS([br0], 1, 2)
+add_of_ports br0 1 2
 AT_CHECK([ovs-appctl dpif/show], [0], [dnl
 dummy@ovs-dummy: hit:0 missed:0
 	br0:
diff --git a/tests/classifier.at b/tests/classifier.at
index 3520acd..b110508 100644
--- a/tests/classifier.at
+++ b/tests/classifier.at
@@ -30,7 +30,7 @@  m4_foreach(
 AT_BANNER([flow classifier lookup segmentation])
 AT_SETUP([flow classifier - lookup segmentation])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], [1], [2], [3])
+add_of_ports br0 1 2 3
 AT_DATA([flows.txt], [dnl
 table=0 in_port=1 priority=16,tcp,nw_dst=10.1.0.0/255.255.0.0,action=output(3)
 table=0 in_port=1 priority=32,tcp,nw_dst=10.1.2.15,action=output(2)
@@ -68,7 +68,7 @@  AT_CLEANUP
 AT_BANNER([flow classifier prefix lookup])
 AT_SETUP([flow classifier - prefix lookup])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], [1], [2], [3])
+add_of_ports br0 1 2 3
 AT_CHECK([ovs-vsctl set Bridge br0 flow_tables:0=@N1 -- --id=@N1 create Flow_Table name=t0], [0], [ignore], [])
 AT_DATA([flows.txt], [dnl
 table=0 in_port=1 priority=16,tcp,nw_dst=10.1.0.0/255.255.0.0,action=output(3)
@@ -133,7 +133,7 @@  AT_BANNER([conjunctive match])
 
 AT_SETUP([single conjunctive match])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], 1, 2, 3, 4, 5)
+add_of_ports br0 1 2 3 4 5
 AT_DATA([flows.txt], [dnl
 conj_id=1,actions=3
 priority=100,ip,ip_src=10.0.0.1,actions=conjunction(1,1/2)
@@ -170,7 +170,7 @@  AT_CLEANUP
 
 AT_SETUP([multiple conjunctive match])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], 1, 2, 3, 4, 5)
+add_of_ports br0 1 2 3 4 5
 AT_DATA([flows.txt], [dnl
 conj_id=1,actions=1
 conj_id=2,actions=2
@@ -246,7 +246,7 @@  AT_CLEANUP
 # priority flow.  This test checks this special case.
 AT_SETUP([conjunctive match priority fallback])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], 1, 2, 3, 4, 5, 6, 7)
+add_of_ports br0 1 2 3 4 5 6 7
 AT_DATA([flows.txt], [dnl
 conj_id=1,actions=1
 conj_id=3,actions=3
diff --git a/tests/learn.at b/tests/learn.at
index 2b2fc28..97d78bf 100644
--- a/tests/learn.at
+++ b/tests/learn.at
@@ -302,7 +302,7 @@  AT_CLEANUP
 # flow.
 AT_SETUP([learning action - self-modifying flow])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], 1, 2, 3)
+add_of_ports br0 1 2 3
 
 ovs-appctl time/stop
 # Set up flow table for TCPv4 port learning.
@@ -344,7 +344,7 @@  AT_CLEANUP
 # attributed correctly.
 AT_SETUP([learning action - self-modifying flow with idle_timeout])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], 1, 2, 3)
+add_of_ports br0 1 2 3
 
 ovs-appctl time/stop
 # Set up flow table for TCPv4 port learning.
@@ -402,7 +402,7 @@  AT_CLEANUP
 # attributed correctly.
 AT_SETUP([learning action - self-modifying flow with hard_timeout])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], 1, 2, 3)
+add_of_ports br0 1 2 3
 
 ovs-appctl time/stop
 # Set up flow table for TCPv4 port learning.
diff --git a/tests/ofproto-dpif.at b/tests/ofproto-dpif.at
index aa2f1bb..75db58f 100644
--- a/tests/ofproto-dpif.at
+++ b/tests/ofproto-dpif.at
@@ -209,8 +209,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - resubmit])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], [1], [10], [11], [12], [13], [14], [15],
-                    [16], [17], [18], [19], [20], [21])
+add_of_ports br0 1 10 11 12 13 14 15 16 17 18 19 20 21
 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)
@@ -229,7 +228,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - goto table])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], [1], [10], [11])
+add_of_ports br0 1 10 11
 echo "table=0 in_port=1 actions=output(10),goto_table(1)" > flows.txt
 for i in `seq 1 63`; do echo "table=$i actions=goto_table($(($i+1)))"; done >> flows.txt
 echo "table=64 actions=output(11)" >> flows.txt
@@ -243,7 +242,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - write actions])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], [1], [10], [11], [12], [13])
+add_of_ports br0 1 10 11 12 13
 AT_DATA([flows.txt], [dnl
 table=0 in_port=1,ip actions=output(10),write_actions(set_field:192.168.3.90->ip_src,output(12)),goto_table(1)
 table=1 ip actions=write_actions(output(13)),goto_table(2)
@@ -260,7 +259,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - modify IPv6 Neighbor Solitication (ND)])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], [1], [10], [11], [12], [13])
+add_of_ports br0 1 10 11 12 13
 AT_DATA([flows.txt], [dnl
 table=0 in_port=1,icmp6,icmpv6_type=135 actions=output(10),write_actions(set_field:fe80::3->nd_target,set_field:aa:aa:aa:aa:aa:aa->nd_sll,output(12)),goto_table(1)
 table=1 icmp6 actions=write_actions(output(13)),goto_table(2)
@@ -279,7 +278,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - clear actions])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], [1], [10], [11], [12])
+add_of_ports br0 1 10 11 12
 AT_DATA([flows.txt], [dnl
 table=0 in_port=1,ip actions=output(10),write_actions(set_field:192.168.3.90->ip_src,output(12)),goto_table(1)
 table=1 tcp actions=set_field:91->tp_src,output(11),clear_actions
@@ -295,7 +294,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - group chaining])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], [1], [10], [11])
+add_of_ports br0 1 10 11
 AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=all,bucket=set_field:192.168.3.90->ip_src,group:123,bucket=output:11'])
 AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=123,type=all,bucket=output:10'])
 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=group:1234'])
@@ -308,7 +307,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - all group in action list])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], [1], [10], [11])
+add_of_ports br0 1 10 11
 AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=all,bucket=output:10,set_field:192.168.3.90->ip_src,bucket=output:11'])
 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=group:1234'])
 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
@@ -323,7 +322,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - indirect group in action list])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], [1], [10])
+add_of_ports br0 1 10
 AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 group_id=1234,type=indirect,bucket=output:10])
 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=group:1234'])
 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
@@ -335,7 +334,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - group actions have no effect afterwards])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], [1], [10])
+add_of_ports br0 1 10
 AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=select,bucket=set_field:192.168.3.90->ip_src,output:10'])
 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=group:1234,output:10'])
 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
@@ -347,7 +346,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - all group in action set])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], [1], [10], [11])
+add_of_ports br0 1 10 11
 AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=all,bucket=output:10,set_field:192.168.3.90->ip_src,bucket=output:11'])
 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(group:1234)'])
 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
@@ -362,7 +361,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - indirect group in action set])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], [1], [10])
+add_of_ports br0 1 10
 AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 group_id=1234,type=indirect,bucket=output:10])
 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(group:1234)'])
 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
@@ -374,7 +373,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - select group])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], [1], [10], [11])
+add_of_ports br0 1 10 11
 AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=select,bucket=output:10,bucket=output:11'])
 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(group:1234)'])
 
@@ -394,7 +393,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - select group with watch port])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], [1], [10], [11])
+add_of_ports br0 1 10 11
 AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=select,bucket=watch_port:10,output:10,bucket=output:11'])
 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(group:1234)'])
 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:07,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
@@ -406,7 +405,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - select group with weight])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], [1], [10], [11], [12])
+add_of_ports br0 1 10 11 12
 AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=select,bucket=output:10,bucket=output:11,weight=2000,bucket=output:12,weight=0'])
 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(group:1234)'])
 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:07,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
@@ -418,7 +417,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - select group with hash selection method])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], [1], [10], [11])
+add_of_ports br0 1 10 11
 AT_CHECK([ovs-ofctl -O OpenFlow15 add-group br0 'group_id=1234,type=select,selection_method=hash,fields=eth_dst,bucket=output:10,bucket=output:11'])
 AT_CHECK([ovs-ofctl -O OpenFlow15 add-flow br0 'ip actions=write_actions(group:1234)'])
 
@@ -451,7 +450,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - fast failover group])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], [1], [10], [11])
+add_of_ports br0 1 10 11
 AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=ff,bucket=watch_port:10,output:10,bucket=watch_port:11,output:11'])
 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(group:1234)'])
 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
@@ -463,7 +462,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - group stats single bucket])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], [1], [10], [11])
+add_of_ports br0 1 10 11
 AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=select,bucket=output:10,weight=2000,bucket=output:11,weight=0'])
 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(group:1234)'])
 (
@@ -484,7 +483,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - group stats all buckets])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], [1], [10], [11])
+add_of_ports br0 1 10 11
 AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=all,bucket=output:10,bucket=output:11'])
 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(group:1234)'])
 (
@@ -505,7 +504,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - registers])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], [20], [21], [22], [33], [90])
+add_of_ports br0 20 21 22 33 90
 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
@@ -542,7 +541,7 @@  dnl Tests that the standardized xregs are mapped onto the legacy OVS registers
 dnl in the manner documented in ovs-ofctl(8).
 AT_SETUP([ofproto-dpif - extended registers])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], [1], [2], [3])
+add_of_ports br0 1 2 3
 AT_DATA([flows.txt], [dnl
 table=0     actions=load:0xfedcba9876543210->OXM_OF_PKT_REG1[[]],resubmit(,1)
 table=1,reg2=0xfedcba98,reg3=0x76543210   actions=2
@@ -561,7 +560,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - load and move order])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], [1], [10], [11])
+add_of_ports br0 1 10 11
 AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=all,bucket=output:10,move:NXM_NX_REG1[[]]->NXM_OF_IP_SRC[[]],bucket=output:11'])
 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(load:0xffffffff->NXM_NX_REG1[[]],move:NXM_NX_REG1[[]]->NXM_NX_REG2[[]],group:1234)'])
 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
@@ -575,7 +574,7 @@  AT_CLEANUP
 dnl Tests that 1.5 copy-field can copy into the standardized xregs.
 AT_SETUP([ofproto-dpif - copy-field into extended registers])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], [1], [2], [3])
+add_of_ports br0 1 2 3
 AT_DATA([flows.txt], [dnl
 table=0     actions=move:OXM_OF_ETH_SRC[[0..47]]->OXM_OF_PKT_REG0[[0..47]],goto_table(1)
 table=1,xreg0=0x0000505400000005   actions=2
@@ -595,7 +594,7 @@  AT_CLEANUP
 dnl Tests that 1.5 set-field with mask in the metadata register.
 AT_SETUP([ofproto-dpif - masked set-field into metadata])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], [1], [2], [3])
+add_of_ports br0 1 2 3
 AT_DATA([flows.txt], [dnl
 table=0     actions=set_field:0xfafafafa5a5a5a5a->metadata,goto_table(1)
 table=1     actions=set_field:0x6b/0xff->metadata,goto_table(2)
@@ -617,8 +616,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - actset_output])
 OVS_VSWITCHD_START
-ADD_OF_PORTS(
-  [br0], [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12], [13])
+add_of_ports br0 1 2 3 4 5 6 7 8 9 10 11 12 13
 AT_DATA([flows.txt], [dnl
 table=0,actset_output=unset     actions=write_actions(output(2)),goto_table(1)
 table=1     actions=move:ONFOXM_ET_ACTSET_OUTPUT[[0..31]]->OXM_OF_PKT_REG0[[0..31]],goto_table(2)
@@ -658,7 +656,7 @@  OVS_VSWITCHD_STOP
 AT_CLEANUP
 AT_SETUP([ofproto-dpif - push-pop])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], [20], [21], [22], [33], [90])
+add_of_ports br0 20 21 22 33 90
 AT_DATA([flows.txt], [dnl
 in_port=90           actions=load:20->NXM_NX_REG0[[0..7]],load:21->NXM_NX_REG1[[0..7]],load:22->NXM_NX_REG2[[0..7]], load:33->NXM_NX_REG3[[0..7]], push:NXM_NX_REG0[[]], push:NXM_NX_REG1[[0..7]],push:NXM_NX_REG2[[0..15]], push:NXM_NX_REG3[[]], resubmit:2, resubmit:3, resubmit:4, resubmit:5
 in_port=2            actions=pop:NXM_NX_REG0[[0..7]],output:NXM_NX_REG0[[]]
@@ -677,7 +675,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - output])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], [1], [9], [10], [11], [55], [66], [77], [88])
+add_of_ports br0 1 9 10 11 55 66 77 88
 AT_DATA([flows.txt], [dnl
 in_port=1 actions=resubmit:2,resubmit:3,resubmit:4,resubmit:5,resubmit:6,resubmit:7,resubmit:8
 in_port=2 actions=output:9
@@ -698,7 +696,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - dec_ttl])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], [1], [2], [3], [4])
+add_of_ports br0 1 2 3 4
 AT_DATA([flows.txt], [dnl
 table=0 in_port=1 action=dec_ttl,output:2,resubmit(1,1),output:4
 table=1 in_port=1 action=dec_ttl,output:3
@@ -742,7 +740,7 @@  dnl A number of similar rules are added to try and exercise
 dnl xrealloc sufficiently that it returns a different base pointer
 AT_SETUP([ofproto-dpif - dec_ttl without arguments at offset 32 in ofpacts])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], [1])
+add_of_ports br0 1
 (for i in `seq 0 255`; do
   printf "dl_src=10:11:11:11:11:%02x actions=output:1,output:1,output:1,dec_ttl,controller\n" $i
  done) > flows.txt
@@ -759,7 +757,7 @@  dnl A number of similar rules are added to try and exercise
 dnl xrealloc sufficiently that it returns a different base pointer
 AT_SETUP([ofproto-dpif - dec_ttl with arguments at offset 32 in ofpacts])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], [1])
+add_of_ports br0 1
 (for i in `seq 0 255`; do
   printf "dl_src=10:11:11:11:11:%02x actions=output:1,output:1,output:1,dec_ttl(1),controller\n" $i
  done) > flows.txt
@@ -776,7 +774,7 @@  dnl A number of similar rules are added to try and exercise
 dnl xrealloc sufficiently that it returns a different base pointer
 AT_SETUP([ofproto-dpif - note at offset 24 in ofpacts])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], [1])
+add_of_ports br0 1
 (for i in `seq 0 255`; do
   printf "dl_src=10:11:11:11:11:%02x actions=output:1,output:1,note:ff,controller\n" $i
  done) > flows.txt
@@ -786,7 +784,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - output, OFPP_NONE ingress port])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], [1], [2])
+add_of_ports br0 1 2
 
 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
 
@@ -804,7 +802,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - DSCP])
 OVS_VSWITCHD_START([add-port br0 p1 -- set Interface p1 type=dummy])
-ADD_OF_PORTS([br0], [9])
+add_of_ports br0 9
 AT_DATA([flows.txt], [dnl
 actions=output:LOCAL,enqueue:1:1,enqueue:1:2,enqueue:1:2,enqueue:1:1,output:1,mod_nw_tos:0,output:1,output:LOCAL
 ])
@@ -831,7 +829,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - output/flood flags])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], [1], [2], [3], [4], [5], [6], [7])
+add_of_ports br0 1 2 3 4 5 6 7
 
 AT_DATA([flows.txt], [dnl
 in_port=local actions=local,flood
@@ -3023,7 +3021,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - ARP modification slow-path])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], [1], [2])
+add_of_ports br0 1 2
 
 ovs-vsctl -- set Interface p2 type=dummy options:pcap=p2.pcap
 ovs-ofctl add-flow br0 'in_port=1,arp actions=load:2->OXM_OF_ARP_OP[[]],2,load:0xc0a88001->OXM_OF_ARP_SPA[[]],2,load:0x404444444441->OXM_OF_ARP_THA[[]],2'
@@ -3694,7 +3692,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - fragment handling - trace])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], [1], [2], [3], [4], [5], [6], [90])
+add_of_ports br0 1 2 3 4 5 6 90
 AT_DATA([flows.txt], [dnl
 priority=75 tcp ip_frag=no    tp_dst=80 actions=move:OXM_OF_TCP_DST[[]]->OXM_OF_TCP_SRC[[]],output:1
 priority=75 tcp ip_frag=first tp_dst=80 actions=move:OXM_OF_TCP_DST[[]]->OXM_OF_TCP_SRC[[]],output:2
@@ -3743,7 +3741,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - fragment handling - upcall])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], [1], [2], [3], [4], [5], [6], [90])
+add_of_ports br0 1 2 3 4 5 6 90
 AT_DATA([flows.txt], [dnl
 priority=75 tcp ip_frag=no    tp_dst=80 actions=set_field:81->tcp_dst,output:1
 priority=75 tcp ip_frag=first tp_dst=80 actions=set_field:81->tcp_dst,output:2
@@ -3818,7 +3816,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - fragment handling - actions])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], [1], [2], [3], [4], [5], [6], [90])
+add_of_ports br0 1 2 3 4 5 6 90
 
 AT_CHECK([ovs-ofctl add-flow br0 "tcp,ip_frag=later actions=move:OXM_OF_TCP_DST[[0..7]]->OXM_OF_TCP_SRC[[0..7]],output:1"], [1], [], [stderr])
 AT_CHECK([tail -2 stderr | sed 's/^.*|WARN|//'], [0], [dnl
@@ -3920,7 +3918,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - exit])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], [1], [2], [3], [10], [11], [12], [13], [14])
+add_of_ports br0 1 2 3 10 11 12 13 14
 AT_DATA([flows.txt], [dnl
 in_port=1 actions=output:10,exit,output:11
 in_port=2 actions=output:12,resubmit:1,output:12
@@ -3945,7 +3943,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - mirroring, select_all])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], 1, 2, 3)
+add_of_ports br0 1 2 3
 ovs-vsctl \
         set Bridge br0 mirrors=@m --\
         --id=@p3 get Port p3 --\
@@ -3975,7 +3973,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - mirroring, select_src])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], 1, 2, 3)
+add_of_ports br0 1 2 3
 ovs-vsctl \
         set Bridge br0 mirrors=@m --\
         --id=@p1 get Port p1 -- --id=@p3 get Port p3 --\
@@ -4003,7 +4001,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - mirroring, OFPP_NONE ingress port])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], 1, 2)
+add_of_ports br0 1 2
 ovs-vsctl \
         set Bridge br0 mirrors=@m --\
         --id=@p2 get Port p2 --\
@@ -4024,7 +4022,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - mirroring, select_dst])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], 1, 2, 3)
+add_of_ports br0 1 2 3
 ovs-vsctl \
         set Bridge br0 mirrors=@m --\
         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
@@ -4054,7 +4052,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - mirroring, select_vlan])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], 1, 2, 3)
+add_of_ports br0 1 2 3
 ovs-vsctl \
         set Bridge br0 mirrors=@m --\
         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
@@ -4089,7 +4087,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - mirroring, output_port])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], 1, 2, 3)
+add_of_ports br0 1 2 3
 ovs-vsctl \
         set Bridge br0 mirrors=@m --\
         --id=@p3 get Port p3 --\
@@ -4118,7 +4116,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - mirroring, output_vlan])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], 1, 2)
+add_of_ports br0 1 2
 ovs-vsctl \
         set Bridge br0 mirrors=@m --\
         --id=@m create Mirror name=mymirror select_all=true output_vlan=12
@@ -4156,7 +4154,7 @@  AT_CLEANUP
 # would cause the packet to be mirrored to port 3 a second time.
 AT_SETUP([ofproto-dpif - mirroring with recirculation])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], 1, 2, 3, 4)
+add_of_ports br0 1 2 3 4
 ovs-vsctl \
         set Bridge br0 mirrors=@m --\
         --id=@p3 get Port p3 --\
@@ -4183,7 +4181,7 @@  AT_CLEANUP
 # the current table rather than specifying a table).
 AT_SETUP([ofproto-dpif - resubmit with recirculation])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], [1], [2], [3])
+add_of_ports br0 1 2 3
 
 AT_DATA([flows.txt], [dnl
 table=0 in_port=1  actions=2,resubmit(,1)
@@ -4208,7 +4206,7 @@  AT_CLEANUP
 # re-executed when execution continues later post-recirculation.
 AT_SETUP([ofproto-dpif - recirculation after resubmit])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], [1], [2])
+add_of_ports br0 1 2
 
 AT_DATA([flows.txt], [dnl
 table=0 in_port=1 actions=resubmit(,1),2
@@ -4233,7 +4231,7 @@  AT_CLEANUP
 # ofproto/trace br_name br_flow [-generate|packet]
 AT_SETUP([ofproto-dpif - ofproto/trace command 1])
 OVS_VSWITCHD_START([set bridge br0 fail-mode=standalone])
-ADD_OF_PORTS([br0], 1, 2, 3)
+add_of_ports br0 1 2 3
 
 AT_DATA([flows.txt], [dnl
 in_port=1 actions=output:2
@@ -4374,7 +4372,7 @@  AT_CLEANUP
 # The second test tests the corner cases
 AT_SETUP([ofproto-dpif - ofproto/trace command 2])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], 1, 2)
+add_of_ports br0 1 2
 
 # Define flows
 odp_flow="in_port(1),eth(src=50:54:00:00:00:01,dst=50:54:00:00:00:02)"
@@ -4538,7 +4536,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - ofproto/trace-packet-out])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], 1, 2, 3)
+add_of_ports br0 1 2 3
 
 AT_DATA([flows.txt], [dnl
 in_port=1 actions=output:2
@@ -4568,7 +4566,7 @@  m4_define([OFPROTO_TRACE],
 
 AT_SETUP([ofproto-dpif - MAC learning])
 OVS_VSWITCHD_START([set bridge br0 fail-mode=standalone])
-ADD_OF_PORTS([br0], 1, 2, 3)
+add_of_ports br0 1 2 3
 
 arp='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)'
 
@@ -4619,7 +4617,7 @@  AT_CHECK(
   [ovs-vsctl \
      -- add-br br1 \
      -- set bridge br1 datapath-type=dummy])
-ADD_OF_PORTS([br1], 4, 5)
+add_of_ports br1 4 5
 
 # Trace some packet arrivals in br1 to create MAC learning entries there too.
 OFPROTO_TRACE(
@@ -4658,7 +4656,7 @@  AT_CLEANUP
 AT_SETUP([ofproto-dpif - MAC table overflow])
 OVS_VSWITCHD_START(
   [set bridge br0 fail-mode=standalone other-config:mac-table-size=10])
-ADD_OF_PORTS([br0], 1, 2, 3)
+add_of_ports br0 1 2 3
 
 arp='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)'
 
@@ -4718,7 +4716,7 @@  AT_CLEANUP
 AT_SETUP([ofproto-dpif - MAC table overflow fairness])
 OVS_VSWITCHD_START(
   [set bridge br0 fail-mode=standalone other-config:mac-table-size=10])
-ADD_OF_PORTS([br0], 1, 2, 3, 4, 5, 6)
+add_of_ports br0 1 2 3 4 5 6
 
 arp='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)'
 
@@ -4794,7 +4792,7 @@  m4_define([CHECK_SFLOW_SAMPLING_PACKET],
   PARSE_LISTENING_PORT([test-sflow.log], [SFLOW_PORT])
   ovs-appctl time/stop
 
-  ADD_OF_PORTS([br0], 1, 2)
+  add_of_ports br0 1 2
   ovs-vsctl \
      set Interface br0 options:ifindex=1002 -- \
      set Interface p1 options:ifindex=1004 -- \
@@ -5342,7 +5340,7 @@  AT_SETUP([ofproto-dpif - sFlow packet sampling - MPLS])
 AT_XFAIL_IF([test "$IS_WIN32" = "yes"])
 OVS_VSWITCHD_START
 AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
-ADD_OF_PORTS([br0], [1], [2])
+add_of_ports br0 1 2
 AT_DATA([flows.txt], [dnl
 table=0 dl_src=50:54:00:00:00:09 actions=push_mpls:0x8847,set_mpls_label:789,set_mpls_tc:4,set_mpls_ttl:32,2
 table=0 dl_src=50:54:00:00:00:0b actions=pop_mpls:0x0800,2
@@ -5440,7 +5438,7 @@  AT_CLEANUP
 # cause a record to be sent.
 m4_define([CHECK_NETFLOW_EXPIRATION],
   [OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
-  ADD_OF_PORTS([br0], 1, 2)
+  add_of_ports br0 1 2
 
   ovs-appctl time/stop
   on_exit 'kill `cat test-netflow.pid`'
@@ -5488,7 +5486,7 @@  AT_CLEANUP
 # Test that basic NetFlow reports active expirations correctly.
 m4_define([CHECK_NETFLOW_ACTIVE_EXPIRATION],
   [OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
-  ADD_OF_PORTS([br0], 1, 2)
+  add_of_ports br0 1 2
 
   on_exit 'kill `cat test-netflow.pid`'
   AT_CHECK([ovstest test-netflow --log-file --detach --no-chdir --pidfile 0:$1 > netflow.log], [0], [], [ignore])
@@ -5572,7 +5570,7 @@  dnl configure IPFIX and ensure that sample action generation works at the
 dnl datapath level.
 AT_SETUP([ofproto-dpif - Basic IPFIX sanity check])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], 1, 2)
+add_of_ports br0 1 2
 
 dnl Sample every packet using bridge-based sampling
 AT_CHECK([ovs-vsctl -- set bridge br0 ipfix=@fix -- \
@@ -5774,8 +5772,8 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-dps])
 OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy])
-ADD_OF_PORTS([br0], [1], [2])
-ADD_OF_PORTS([br1], [3])
+add_of_ports br0 1 2
+add_of_ports br1 3
 
 AT_CHECK([ovs-appctl dpif/dump-dps], [0], [dnl
 dummy@br0
@@ -5786,8 +5784,8 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - ovs-appctl dpif/show])
 OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy])
-ADD_OF_PORTS([br0], [1], [2])
-ADD_OF_PORTS([br1], [3])
+add_of_ports br0 1 2
+add_of_ports br1 3
 
 AT_CHECK([ovs-appctl dpif/show], [0], [dnl
 dummy@ovs-dummy: hit:0 missed:0
@@ -5807,8 +5805,8 @@  AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-flows])
 OVS_VSWITCHD_START([add-br br1 -- \
                     set bridge br1 datapath-type=dummy fail-mode=secure -- \
                     set Open_vSwitch . other_config:max-idle=10000])
-ADD_OF_PORTS([br0], [1], [2])
-ADD_OF_PORTS([br1], [3])
+add_of_ports br0 1 2
+add_of_ports br1 3
 
 AT_CHECK([ovs-appctl netdev-dummy/receive p1 '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,ttl=64,frag=no),icmp(type=8,code=0)'])
 AT_CHECK([ovs-appctl netdev-dummy/receive p2 'in_port(2),eth(src=50:54:00:00:00:07,dst=50:54:00:00:00:05),eth_type(0x0800),ipv4(src=192.168.0.2,dst=192.168.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=0,code=0)'])
@@ -5840,7 +5838,7 @@  AT_SETUP([ofproto-dpif - ovs-appctl dpif/get-flow])
 OVS_VSWITCHD_START([add-br br1 -- \
                     set bridge br1 datapath-type=dummy fail-mode=secure -- \
                     set Open_vSwitch . other_config:max-idle=10000])
-ADD_OF_PORTS([br0], [1], [2])
+add_of_ports br0 1 2
 
 AT_CHECK([ovs-appctl netdev-dummy/receive p1 '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,ttl=64,frag=no),icmp(type=8,code=0)'])
 ovs-appctl revalidator/wait
@@ -5934,8 +5932,8 @@  OVS_VSWITCHD_START([add-br br1 \
 -- add-port br1 pbr1 -- set int pbr1 type=patch options:peer=pbr0 \
 -- add-port br0 pbr0 -- set int pbr0 type=patch options:peer=pbr1])
 
-ADD_OF_PORTS([br0], [2])
-ADD_OF_PORTS([br1], [3])
+add_of_ports br0 2
+add_of_ports br1 3
 
 AT_CHECK([ovs-appctl upcall/disable-ufid], [0], [Datapath dumping tersely using UFID disabled
 ], [])
@@ -6009,8 +6007,8 @@  OVS_VSWITCHD_START([add-br br1 \
 -- add-port br1 pbr1 -- set int pbr1 type=patch options:peer=pbr0 \
 -- add-port br0 pbr0 -- set int pbr0 type=patch options:peer=pbr1])
 
-ADD_OF_PORTS([br0], [2])
-ADD_OF_PORTS([br1], [3])
+add_of_ports br0 2
+add_of_ports br1 3
 
 AT_CHECK([ovs-appctl upcall/disable-ufid], [0], [Datapath dumping tersely using UFID disabled
 ], [])
@@ -6054,7 +6052,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - port duration])
 OVS_VSWITCHD_START([set Bridge br0 protocols=OpenFlow13])
-ADD_OF_PORTS([br0], 1, 2)
+add_of_ports br0 1 2
 
 ovs-appctl time/stop
 ovs-appctl time/warp 10000
@@ -6075,7 +6073,7 @@  AT_BANNER([ofproto-dpif -- megaflows])
 AT_SETUP([ofproto-dpif megaflow - port classification])
 OVS_VSWITCHD_START
 AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
-ADD_OF_PORTS([br0], [1], [2])
+add_of_ports br0 1 2
 AT_DATA([flows.txt], [dnl
 table=0 in_port=1 actions=output(2)
 ])
@@ -6093,7 +6091,7 @@  AT_CLEANUP
 AT_SETUP([ofproto-dpif megaflow - L2 classification])
 OVS_VSWITCHD_START
 AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
-ADD_OF_PORTS([br0], [1], [2])
+add_of_ports br0 1 2
 AT_DATA([flows.txt], [dnl
 table=0 in_port=1,dl_src=50:54:00:00:00:09 actions=output(2)
 ])
@@ -6111,7 +6109,7 @@  AT_CLEANUP
 AT_SETUP([ofproto-dpif megaflow - L3 classification])
 OVS_VSWITCHD_START
 AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
-ADD_OF_PORTS([br0], [1], [2])
+add_of_ports br0 1 2
 AT_CHECK([ovs-vsctl set Bridge br0 flow_tables:0=@N1 -- --id=@N1 create Flow_Table name=t0 prefixes=nw_dst,nw_src], [0], [ignore], [])
 AT_DATA([flows.txt], [dnl
 table=0 in_port=1,icmp,nw_src=10.0.0.4 actions=output(2)
@@ -6130,7 +6128,7 @@  AT_CLEANUP
 AT_SETUP([ofproto-dpif megaflow - IPv6 classification])
 OVS_VSWITCHD_START
 AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
-ADD_OF_PORTS([br0], [1], [2])
+add_of_ports br0 1 2
 AT_CHECK([ovs-vsctl set Bridge br0 flow_tables:0=@N1 -- --id=@N1 create Flow_Table name=t0 prefixes=ipv6_dst,ipv6_src], [0], [ignore], [])
 AT_DATA([flows.txt], [dnl
 table=0 in_port=1,ipv6,ipv6_src=2001:db8:3c4d:1:2:3:4:5 actions=output(2)
@@ -6149,7 +6147,7 @@  AT_CLEANUP
 AT_SETUP([ofproto-dpif megaflow - L4 classification])
 OVS_VSWITCHD_START
 AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
-ADD_OF_PORTS([br0], [1], [2])
+add_of_ports br0 1 2
 AT_DATA([flows.txt], [dnl
 table=0 in_port=1,icmp,icmp_type=8 actions=output(2)
 ])
@@ -6167,7 +6165,7 @@  AT_CLEANUP
 AT_SETUP([ofproto-dpif megaflow - normal])
 OVS_VSWITCHD_START
 AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
-ADD_OF_PORTS([br0], [1], [2])
+add_of_ports br0 1 2
 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
@@ -6182,7 +6180,7 @@  AT_CLEANUP
 AT_SETUP([ofproto-dpif megaflow - mpls])
 OVS_VSWITCHD_START
 AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
-ADD_OF_PORTS([br0], [1], [2])
+add_of_ports br0 1 2
 AT_DATA([flows.txt], [dnl
 table=0 dl_src=50:54:00:00:00:09 actions=push_mpls:0x8847,2
 table=0 dl_src=50:54:00:00:00:0b actions=pop_mpls:0x0800,2
@@ -6202,7 +6200,7 @@  AT_CLEANUP
 m4_define([CHECK_MEGAFLOW_NETFLOW],
   [OVS_VSWITCHD_START
   AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
-  ADD_OF_PORTS([br0], [1], [2])
+  add_of_ports br0 1 2
 
   dnl NetFlow configuration disables wildcarding relevant fields
   on_exit 'kill `cat test-netflow.pid`'
@@ -6298,7 +6296,7 @@  OVS_VSWITCHD_START(
 AT_CHECK([ovs-appctl netdev-dummy/set-admin-state up], 0, [OK
 ])
 AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
-ADD_OF_PORTS([br0], [7])
+add_of_ports br0 7
 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
 AT_CHECK([ovs-ofctl add-flow br1 action=normal])
 ovs-appctl time/stop
@@ -6316,7 +6314,7 @@  AT_CLEANUP
 AT_SETUP([ofproto-dpif megaflow - resubmit port action])
 OVS_VSWITCHD_START
 AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
-ADD_OF_PORTS([br0], [1], [2])
+add_of_ports br0 1 2
 AT_DATA([flows.txt], [dnl
 table=0 in_port=1,ip actions=resubmit(90)
 table=0 in_port=90,dl_src=50:54:00:00:00:09 actions=output(2)
@@ -6335,7 +6333,7 @@  AT_CLEANUP
 AT_SETUP([ofproto-dpif megaflow - resubmit table action])
 OVS_VSWITCHD_START
 AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
-ADD_OF_PORTS([br0], [1], [2])
+add_of_ports br0 1 2
 AT_DATA([flows.txt], [dnl
 table=0 in_port=1,ip actions=resubmit(,1)
 table=1 dl_src=50:54:00:00:00:09 actions=output(2)
@@ -6355,7 +6353,7 @@  AT_CLEANUP
 AT_SETUP([ofproto-dpif megaflow - goto_table action])
 OVS_VSWITCHD_START
 AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
-ADD_OF_PORTS([br0], [1], [2])
+add_of_ports br0 1 2
 AT_DATA([flows.txt], [dnl
 table=0 in_port=1,ip actions=goto_table(1)
 table=1 dl_src=50:54:00:00:00:09 actions=output(2)
@@ -6374,7 +6372,7 @@  AT_CLEANUP
 AT_SETUP([ofproto-dpif megaflow - mirroring, select_all])
 OVS_VSWITCHD_START
 AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
-ADD_OF_PORTS([br0], [1], [2], [3])
+add_of_ports br0 1 2 3
 ovs-vsctl \
         set Bridge br0 mirrors=@m --\
         --id=@p3 get Port p3 --\
@@ -6397,7 +6395,7 @@  AT_CLEANUP
 AT_SETUP([ofproto-dpif megaflow - mirroring, select_vlan])
 OVS_VSWITCHD_START
 AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
-ADD_OF_PORTS([br0], [1], [2], [3])
+add_of_ports br0 1 2 3
 ovs-vsctl \
         set Bridge br0 mirrors=@m --\
         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
@@ -6420,7 +6418,7 @@  AT_CLEANUP
 AT_SETUP([ofproto-dpif megaflow - move action])
 OVS_VSWITCHD_START
 AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
-ADD_OF_PORTS([br0], [1], [2])
+add_of_ports br0 1 2
 AT_DATA([flows.txt], [dnl
 table=0 in_port=1 ip,actions=move:NXM_OF_IP_SRC[[]]->NXM_NX_REG0[[]],resubmit(90)
 table=0 in_port=90 ip,actions=move:NXM_NX_REG0[[]]->NXM_NX_REG1[[]],resubmit(91)
@@ -6440,7 +6438,7 @@  AT_CLEANUP
 AT_SETUP([ofproto-dpif megaflow - push action])
 OVS_VSWITCHD_START
 AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
-ADD_OF_PORTS([br0], [1], [2])
+add_of_ports br0 1 2
 AT_DATA([flows.txt], [dnl
 table=0 in_port=1 ip,actions=push:NXM_OF_IP_SRC[[]],output(2)
 ])
@@ -6458,7 +6456,7 @@  AT_CLEANUP
 AT_SETUP([ofproto-dpif megaflow - learning])
 OVS_VSWITCHD_START
 AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
-ADD_OF_PORTS([br0], [1], [2])
+add_of_ports br0 1 2
 AT_DATA([flows.txt], [dnl
 table=0 in_port=1 actions=load:2->NXM_NX_REG0[[0..15]],learn(table=1,priority=65535,NXM_OF_ETH_SRC[[]],NXM_OF_VLAN_TCI[[0..11]],output:NXM_NX_REG0[[0..15]]),output:2
 ])
@@ -6518,7 +6516,7 @@  AT_CLEANUP
 AT_SETUP([ofproto-dpif megaflow - dec_ttl])
 OVS_VSWITCHD_START
 AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
-ADD_OF_PORTS([br0], [1], [2])
+add_of_ports br0 1 2
 AT_CHECK([ovs-vsctl set Bridge br0 flow_tables:0=@N1 -- --id=@N1 create Flow_Table name=t0 prefixes=nw_dst,nw_src], [0], [ignore], [])
 AT_DATA([flows.txt], [dnl
 table=0 in_port=1,icmp,nw_src=10.0.0.4 actions=dec_ttl,output(2)
@@ -6537,7 +6535,7 @@  AT_CLEANUP
 AT_SETUP([ofproto-dpif megaflow - set dl_dst])
 OVS_VSWITCHD_START
 AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
-ADD_OF_PORTS([br0], [1], [2])
+add_of_ports br0 1 2
 AT_DATA([flows.txt], [dnl
 table=0 in_port=1 actions=mod_dl_dst(50:54:00:00:00:0a),output(2)
 ])
@@ -6558,7 +6556,7 @@  AT_CLEANUP
 AT_SETUP([ofproto-dpif megaflow - disabled])
 OVS_VSWITCHD_START
 AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
-ADD_OF_PORTS([br0], [1], [2])
+add_of_ports br0 1 2
 AT_DATA([flows.txt], [dnl
 table=0 in_port=1,ip,nw_dst=10.0.0.1 actions=output(2)
 table=0 in_port=1,ip,nw_dst=10.0.0.3 actions=drop
@@ -6590,7 +6588,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - datapath port number change])
 OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
-ADD_OF_PORTS([br0], 1)
+add_of_ports br0 1
 
 # Trace a flow that should output to p1.
 AT_CHECK([ovs-appctl ofproto/trace br0 in_port=LOCAL,dl_src=10:20:30:40:50:60],
@@ -6764,7 +6762,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - exponential resubmit chain])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], 1)
+add_of_ports br0 1
 (for i in `seq 1 64`; do
      j=`expr $i + 1`
      echo "in_port=$i, actions=resubmit:$j, resubmit:$j, local"
@@ -6782,7 +6780,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - too many output actions])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], 1)
+add_of_ports br0 1
 (for i in `seq 1 12`; do
      j=`expr $i + 1`
      echo "in_port=$i, actions=resubmit:$j, resubmit:$j, local"
@@ -6800,7 +6798,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - stack too deep])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], 1)
+add_of_ports br0 1
 (for i in `seq 1 12`; do
      j=`expr $i + 1`
      echo "in_port=$i, actions=resubmit:$j, resubmit:$j, local"
@@ -6820,7 +6818,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif packet-out controller])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], 1, 2)
+add_of_ports br0 1 2
 
 AT_CHECK([ovs-ofctl add-flow br0 'dl_dst=50:54:00:00:00:0a actions=controller'])
 
@@ -6921,7 +6919,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif packet-out goto_table])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], 1, 2)
+add_of_ports br0 1 2
 
 AT_DATA([flows.txt], [dnl
 table=0 dl_dst=50:54:00:00:00:0a actions=goto_table(1)
@@ -6975,7 +6973,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif packet-out table-miss (continue)])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], 1, 2)
+add_of_ports br0 1 2
 
 AT_CHECK([ovs-ofctl -O OpenFlow11 add-flow br0 'table=1 dl_dst=50:54:00:00:00:0a actions=controller'])
 AT_CHECK([ovs-ofctl -O OpenFlow11 mod-table br0 all continue])
@@ -7026,7 +7024,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - ICMPv6])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], 1)
+add_of_ports br0 1
 
 AT_CAPTURE_FILE([ofctl_monitor.log])
 
@@ -7046,7 +7044,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto-dpif - Neighbor Discovery set-field with checksum update])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], 1)
+add_of_ports br0 1
 AT_CHECK([ovs-ofctl add-flow br0 icmp6,icmpv6_type=135,action=set_field:fe80::1-\>nd_target,set_field:32:21:14:86:11:74-\>nd_sll,output:controller])
 
 AT_CAPTURE_FILE([ofctl_monitor.log])
diff --git a/tests/ofproto-macros.at b/tests/ofproto-macros.at
index bace0f5..bb3e9ee 100644
--- a/tests/ofproto-macros.at
+++ b/tests/ofproto-macros.at
@@ -316,6 +316,21 @@  check_logs () {
 /|ERR|/p
 /|EMER|/p" ${logs}
 }
+
+# add_of_ports BRIDGE PNUM...
+#
+# Creates dummy interfaces in BRIDGE named pPNUM, OpenFlow port number
+# PNUM, and datapath port number PNUM (the latter is a consequence of
+# the dummy implementation, which tries to assign datapath port
+# numbers based on port names).
+add_of_ports () {
+    local args
+    local br=$1; shift
+    for $pnum; do
+        AS_VAR_APPEND([args], [" -- $br p$pnum -- set Interface p$pnum type=dummy ofport_request=$pnum"])
+    done
+    ovs-vsctl $args
+}
 m4_divert_pop([PREPARE_TESTS])
 
 # OVS_VSWITCHD_STOP([WHITELIST])
@@ -336,17 +351,6 @@  m4_define([OVS_VSWITCHD_DISABLE_TUNNEL_PUSH_POP],
 Tunnel push-pop off
 ])])
 
-# ADD_OF_PORTS(BRIDGE, OF_PORT[, OF_PORT...])
-#
-# Creates a dummy interface with an OpenFlow port number of OF_PORT and
-# name of p{OF_PORT}.  The dummy implementation will treat the OF_PORT
-# as the datapath port number, which as the effect of making the
-# OpenFlow and datapath numbers the same.
-m4_define([ADD_OF_PORTS],
- [ovs-vsctl m4_foreach([of_port], m4_cdr($@),
-    [ \
-    -- add-port $1 p[]of_port -- set Interface p[]of_port type=dummy ofport_request=of_port])])
-
 # WAIT_FOR_DUMMY_PORTS(NETDEV_DUMMY_PORT[, NETDEV_DUMMY_PORT...])
 #
 # Wait until the netdev dummy ports are connected to each other
diff --git a/tests/ofproto.at b/tests/ofproto.at
index 61a6be5..f206442 100644
--- a/tests/ofproto.at
+++ b/tests/ofproto.at
@@ -146,7 +146,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto - port-desc stats (OpenFlow 1.5)])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], 1, 2, 3)
+add_of_ports br0 1 2 3
 AT_CHECK([ovs-ofctl -F OXM-OpenFlow15 -O OpenFlow15 -vwarn dump-ports-desc br0], [0], [stdout])
 AT_CHECK([STRIP_XIDS stdout | sed 's/00:0./00:0x/'], [0], [dnl
 OFPST_PORT_DESC reply (OF1.5):
@@ -230,7 +230,7 @@  dnl This is really bare-bones.
 dnl It at least checks request and reply serialization and deserialization.
 AT_SETUP([ofproto - queue configuration - (OpenFlow 1.0)])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], [1], [2])
+add_of_ports br0 1 2
 AT_CHECK([ovs-ofctl queue-get-config br0 1], [0], [stdout])
 AT_CHECK([STRIP_XIDS stdout], [0], [dnl
 OFPT_QUEUE_GET_CONFIG_REPLY: port=1
@@ -252,7 +252,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto - queue configuration - (OpenFlow 1.1)])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], [1], [2])
+add_of_ports br0 1 2
 AT_CHECK([ovs-ofctl -O OpenFlow11 queue-get-config br0 1], [0], [stdout])
 AT_CHECK([STRIP_XIDS stdout], [0], [dnl
 OFPT_QUEUE_GET_CONFIG_REPLY (OF1.1): port=1
@@ -267,7 +267,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto - queue configuration - (OpenFlow 1.2)])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], [1], [2])
+add_of_ports br0 1 2
 AT_CHECK([ovs-ofctl -O OpenFlow12 queue-get-config br0 1], [0], [stdout])
 AT_CHECK([STRIP_XIDS stdout], [0], [dnl
 OFPT_QUEUE_GET_CONFIG_REPLY (OF1.2): port=1
@@ -289,7 +289,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto - queue configuration - (OpenFlow 1.4)])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], [1], [2])
+add_of_ports br0 1 2
 
 AT_CHECK([ovs-ofctl -O OpenFlow14 queue-get-config br0 any | STRIP_XIDS], [0],
   [OFPST_QUEUE_DESC reply (OF1.4): port=1
@@ -3257,7 +3257,7 @@  dnl controllers despite the spec) as meaning a packet that was generated
 dnl by the controller.
 AT_SETUP([ofproto - packet-out from controller (OpenFlow 1.0)])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], [1])
+add_of_ports br0 1
 
 # Start a monitor listening for packet-ins.
 AT_CHECK([ovs-ofctl -P openflow10 monitor br0 --detach --no-chdir --pidfile])
@@ -3864,7 +3864,7 @@  AT_CLEANUP
 
 AT_SETUP([ofproto - ofport_request])
 OVS_VSWITCHD_START
-ADD_OF_PORTS([br0], [1], [2], [3])
+add_of_ports br0 1 2 3
 
 set_and_check_specific_ofports () {
     ovs-vsctl set Interface p1 ofport_request="$1" -- \
diff --git a/tests/tunnel.at b/tests/tunnel.at
index 2c4a971..0c033da 100644
--- a/tests/tunnel.at
+++ b/tests/tunnel.at
@@ -395,7 +395,7 @@  OVS_VSWITCHD_START([dnl
         options:remote_ip=5.5.5.5 ofport_request=5])
 
 OVS_VSWITCHD_DISABLE_TUNNEL_PUSH_POP
-ADD_OF_PORTS([br0], [90])
+add_of_ports br0 90
 AT_DATA([flows.txt], [dnl
 in_port=90 actions=resubmit:1,resubmit:2,resubmit:3,resubmit:4,resubmit:5
 in_port=1 actions=set_field:42->tun_id,output:1
diff --git a/tests/vlan-splinters.at b/tests/vlan-splinters.at
index 883528d..bab7627 100644
--- a/tests/vlan-splinters.at
+++ b/tests/vlan-splinters.at
@@ -3,7 +3,7 @@  AT_BANNER([VLAN splinters])
 AT_SETUP([VLAN splinters])
 AT_SKIP_IF([test "$IS_WIN32" = "yes"])
 OVS_VSWITCHD_START([], [], [=override])
-ADD_OF_PORTS([br0], 1, 2, 3, 4)
+add_of_ports br0 1 2 3 4
 AT_CHECK([ovs-vsctl \
   -- set Bridge br0 fail-mode=standalone flood_vlans=0,9,11,15 \
   -- set port br0 tag=0 \