1 AT_BANNER([learning action])
3 AT_SETUP([learning action - parsing and formatting])
4 AT_DATA([flows.txt], [[
6 actions=learn(send_flow_rem)
7 actions=learn(delete_learned)
8 actions=learn(send_flow_rem,delete_learned)
9 actions=learn(NXM_OF_VLAN_TCI[0..11], NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[], output:NXM_OF_IN_PORT[], load:10->NXM_NX_REG0[5..10])
10 actions=learn(table=1,idle_timeout=10, hard_timeout=20, fin_idle_timeout=5, fin_hard_timeout=10, priority=10, cookie=0xfedcba9876543210, in_port=99,eth_dst=eth_src,load:in_port->reg1[16..31])
11 actions=learn(limit=4096)
12 actions=learn(limit=4096,result_dst=reg0[0])
14 AT_CHECK([ovs-ofctl parse-flows flows.txt], [0],
15 [[usable protocols: any
16 chosen protocol: OpenFlow10-table_id
17 OFPT_FLOW_MOD (xid=0x1): ADD actions=learn(table=1)
18 OFPT_FLOW_MOD (xid=0x2): ADD actions=learn(table=1,send_flow_rem)
19 OFPT_FLOW_MOD (xid=0x3): ADD actions=learn(table=1,delete_learned)
20 OFPT_FLOW_MOD (xid=0x4): ADD actions=learn(table=1,send_flow_rem,delete_learned)
21 OFPT_FLOW_MOD (xid=0x5): ADD actions=learn(table=1,NXM_OF_VLAN_TCI[0..11],NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],output:NXM_OF_IN_PORT[],load:0xa->NXM_NX_REG0[5..10])
22 OFPT_FLOW_MOD (xid=0x6): ADD actions=learn(table=1,idle_timeout=10,hard_timeout=20,fin_idle_timeout=5,fin_hard_timeout=10,priority=10,cookie=0xfedcba9876543210,in_port=99,NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],load:NXM_OF_IN_PORT[]->NXM_NX_REG1[16..31])
23 OFPT_FLOW_MOD (xid=0x7): ADD actions=learn(table=1,limit=4096)
24 OFPT_FLOW_MOD (xid=0x8): ADD actions=learn(table=1,limit=4096,result_dst=NXM_NX_REG0[0])
28 AT_SETUP([learning action - parsing and formatting - illegal in_port_oxm])
29 AT_CHECK([[ovs-ofctl parse-flow 'actions=learn(table=1, in_port_oxm=123456)']],
31 AT_CHECK([sed -e 's/.*|ofp_util|WARN|//' < stderr], [0],
32 [[port 123456 is outside the supported range 0 through ffff or 0xffffff00 through 0xffffffff
33 ovs-ofctl: table=1, in_port_oxm=123456: in_port_oxm value 123456 cannot be parsed as a subfield (123456: unknown field `123456') or an immediate value (123456: port value out of range for in_port_oxm)
37 AT_SETUP([learning action - parsing and formatting - OXM])
38 AT_DATA([flows.txt], [[
39 actions=learn(output:OXM_OF_IN_PORT[])
40 actions=learn(table=1, in_port=1, load:OXM_OF_IN_PORT[]->NXM_NX_REG1[], load:0xfffffffe->OXM_OF_IN_PORT[])
42 AT_CHECK([ovs-ofctl -O OpenFlow12 parse-flows flows.txt], [0],
43 [[usable protocols: any
44 chosen protocol: OXM-OpenFlow12
45 OFPT_FLOW_MOD (OF1.2) (xid=0x1): ADD actions=learn(table=1,output:OXM_OF_IN_PORT[])
46 OFPT_FLOW_MOD (OF1.2) (xid=0x2): ADD actions=learn(table=1,in_port=1,load:OXM_OF_IN_PORT[]->NXM_NX_REG1[],load:0xfffffffe->OXM_OF_IN_PORT[])
50 AT_SETUP([learning action - examples])
51 AT_DATA([flows.txt], [[
52 # These are the examples from ofp-actions.c.
53 actions=learn(in_port=99,NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[], load:NXM_OF_IN_PORT[]->NXM_NX_REG1[16..31])
54 actions=learn(NXM_OF_VLAN_TCI[0..11], NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],output:NXM_OF_IN_PORT[])
55 table=0 actions=learn(table=1,hard_timeout=10, NXM_OF_VLAN_TCI[0..11],output:NXM_OF_IN_PORT[]), resubmit(,1)
56 table=1 priority=0 actions=flood
58 AT_CHECK([ovs-ofctl parse-flows flows.txt], [0],
59 [[usable protocols: OXM,OpenFlow10+table_id,NXM+table_id,OpenFlow11
60 chosen protocol: OpenFlow10+table_id
61 OFPT_FLOW_MOD (xid=0x1): ADD table:255 actions=learn(table=1,in_port=99,NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],load:NXM_OF_IN_PORT[]->NXM_NX_REG1[16..31])
62 OFPT_FLOW_MOD (xid=0x2): ADD table:255 actions=learn(table=1,NXM_OF_VLAN_TCI[0..11],NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],output:NXM_OF_IN_PORT[])
63 OFPT_FLOW_MOD (xid=0x3): ADD actions=learn(table=1,hard_timeout=10,NXM_OF_VLAN_TCI[0..11],output:NXM_OF_IN_PORT[]),resubmit(,1)
64 OFPT_FLOW_MOD (xid=0x4): ADD table:1 priority=0 actions=FLOOD
68 AT_SETUP([learning action - satisfied prerequisites])
70 [[actions=learn(eth_type=0x800,load:5->NXM_OF_IP_DST[])
71 ip,actions=learn(load:NXM_OF_IP_DST[]->NXM_NX_REG1[])
72 ip,actions=learn(eth_type=0x800,OXM_OF_IPV4_DST[])
74 AT_CHECK([ovs-ofctl parse-flows flows.txt], [0],
75 [[usable protocols: any
76 chosen protocol: OpenFlow10-table_id
77 OFPT_FLOW_MOD (xid=0x1): ADD actions=learn(table=1,eth_type=0x800,load:0x5->NXM_OF_IP_DST[])
78 OFPT_FLOW_MOD (xid=0x2): ADD ip actions=learn(table=1,load:NXM_OF_IP_DST[]->NXM_NX_REG1[])
79 OFPT_FLOW_MOD (xid=0x3): ADD ip actions=learn(table=1,eth_type=0x800,NXM_OF_IP_DST[])
83 AT_SETUP([learning action - invalid prerequisites])
84 AT_CHECK([[ovs-ofctl parse-flow 'actions=learn(load:5->NXM_OF_IP_DST[])']],
86 AT_CHECK([sed -e 's/.*|meta_flow|WARN|//' < stderr], [0],
87 [[destination field ip_dst lacks correct prerequisites
88 ovs-ofctl: actions are invalid with specified match (OFPBAC_MATCH_INCONSISTENT)
90 AT_CHECK([[ovs-ofctl parse-flow 'actions=learn(load:NXM_OF_IP_DST[]->NXM_NX_REG1[])']],
92 AT_CHECK([sed -e 's/.*|meta_flow|WARN|//' < stderr], [0],
93 [[source field ip_dst lacks correct prerequisites
94 ovs-ofctl: actions are invalid with specified match (OFPBAC_MATCH_INCONSISTENT)
98 AT_SETUP([learning action - too-long immediate value])
99 dnl 129 bits is too long.
100 AT_CHECK([[ovs-ofctl parse-flow 'actions=learn(load:0x1fedbca9876543210fedbca9876543210->NXM_NX_IPV6_DST[])']],
101 [1], [], [[ovs-ofctl: 0x1fedbca9876543210fedbca9876543210->NXM_NX_IPV6_DST[]: value does not fit into 128 bits
104 dnl 128 bits is merely a bad prerequisite.
105 AT_CHECK([[ovs-ofctl parse-flow 'actions=learn(load:0xfedbca9876543210fedbca9876543210->NXM_NX_IPV6_DST[])']], [1], [], [stderr])
106 AT_CHECK([sed -e 's/.*|meta_flow|WARN|//' < stderr], [0],
107 [[destination field ipv6_dst lacks correct prerequisites
108 ovs-ofctl: actions are invalid with specified match (OFPBAC_MATCH_INCONSISTENT)
112 AT_SETUP([learning action - standard VLAN+MAC learning])
114 [add-port br0 p1 -- set Interface p1 type=dummy ofport_request=1 -- \
115 add-port br0 p2 -- set Interface p2 type=dummy ofport_request=2 -- \
116 add-port br0 p3 -- set Interface p3 type=dummy ofport_request=3])
117 # Set up flow table for VLAN+MAC learning.
118 AT_DATA([flows.txt], [[
119 table=0 actions=learn(table=1, hard_timeout=60, NXM_OF_VLAN_TCI[0..11], NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[], output:NXM_OF_IN_PORT[]), resubmit(,1)
120 table=1 priority=0 actions=flood
122 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
124 # Trace an ARP packet arriving on port 3, to create a MAC learning entry.
125 flow="in_port(3),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),eth_type(0x0806),arp(sip=192.168.0.1,tip=192.168.0.2,op=1,sha=50:54:00:00:00:05,tha=00:00:00:00:00:00)"
126 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow" -generate], [0], [stdout])
127 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
130 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
132 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
134 # Check for the MAC learning entry.
135 AT_CHECK([ovs-ofctl dump-flows br0 table=1 --no-stats --sort], [0], [dnl
136 table=1, priority=0 actions=FLOOD
137 table=1, hard_timeout=60, vlan_tci=0x0000/0x0fff,dl_dst=50:54:00:00:00:05 actions=output:3
140 # Trace a packet arrival destined for the learned MAC.
141 # (This will also learn a MAC.)
142 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(1),eth(src=50:54:00:00:00:06,dst=50:54:00:00:00:05),eth_type(0x0806),arp(sip=192.168.0.2,tip=192.168.0.1,op=2,sha=50:54:00:00:00:06,tha=50:54:00:00:00:05)' -generate], [0], [stdout])
143 AT_CHECK([tail -1 stdout], [0], [Datapath actions: 3
146 # Check for both MAC learning entries.
147 AT_CHECK([ovs-ofctl dump-flows br0 table=1 --no-stats | sort], [0], [dnl
148 table=1, hard_timeout=60, vlan_tci=0x0000/0x0fff,dl_dst=50:54:00:00:00:05 actions=output:3
149 table=1, hard_timeout=60, vlan_tci=0x0000/0x0fff,dl_dst=50:54:00:00:00:06 actions=output:1
150 table=1, priority=0 actions=FLOOD
153 # Trace a packet arrival that updates the first learned MAC entry.
154 flow="in_port(2),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),eth_type(0x0806),arp(sip=192.168.0.1,tip=192.168.0.2,op=1,sha=50:54:00:00:00:05,tha=00:00:00:00:00:00)"
155 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow" -generate], [0], [stdout])
156 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
159 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
161 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
163 # Check that the MAC learning entry was updated.
164 AT_CHECK([ovs-ofctl dump-flows br0 table=1 --no-stats | sort], [0], [dnl
165 table=1, hard_timeout=60, vlan_tci=0x0000/0x0fff,dl_dst=50:54:00:00:00:05 actions=output:2
166 table=1, hard_timeout=60, vlan_tci=0x0000/0x0fff,dl_dst=50:54:00:00:00:06 actions=output:1
167 table=1, priority=0 actions=FLOOD
172 dnl This test checks that repeated uses of a "learn" action cause the
173 dnl modified time of the learned flow to advance. Otherwise, the
174 dnl learned flow will expire after its hard timeout even though it's
175 dnl supposed to be refreshed. (The expiration can be hard to see since
176 dnl it gets re-learned again the next time a packet appears, but
177 dnl sometimes the expiration can cause temporary flooding etc.)
178 AT_SETUP([learning action - learn refreshes hard_age])
180 [add-port br0 p1 -- set Interface p1 type=dummy ofport_request=1 -- \
181 add-port br0 p2 -- set Interface p2 type=dummy ofport_request=2 -- \
182 add-port br0 p3 -- set Interface p3 type=dummy ofport_request=3])
186 # Set up flow table for MAC learning.
187 AT_DATA([flows.txt], [[
188 table=0 actions=learn(table=1, hard_timeout=10, NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[], output:NXM_OF_IN_PORT[]), resubmit(,1)
189 table=1 priority=0 actions=flood
191 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
193 # Trace an ICMP packet arriving on port 3, to create a MAC learning entry.
194 flow="in_port(3),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)"
195 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow" -generate], [0], [stdout])
196 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
199 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
201 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
203 # Check that the MAC learning entry appeared.
204 AT_CHECK([ovs-ofctl dump-flows br0 table=1 --no-stats | sort], [0], [dnl
205 table=1, hard_timeout=10, dl_dst=50:54:00:00:00:07 actions=output:3
206 table=1, priority=0 actions=FLOOD
209 # For 25 seconds, make sure that the MAC learning entry doesn't
210 # disappear as long as we refresh it every second.
211 for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25; do
212 ovs-appctl time/warp 1000
213 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow" -generate], [0], [stdout])
215 # Check that the entry is there.
216 AT_CHECK([ovs-ofctl dump-flows br0 table=1], [0], [stdout])
217 AT_CHECK([ofctl_strip < stdout | sort], [0], [dnl
218 table=1, hard_timeout=10, dl_dst=50:54:00:00:00:07 actions=output:3
219 table=1, priority=0 actions=FLOOD
223 if test $i != 1; then
224 # Check that hard_age has appeared. We need to do this separately
225 # from the above check because ofctl_strip removes it. dump-flows
226 # only prints hard_age when it is different from the flow's duration
227 # (that is, the number of seconds from the time it was created),
228 # so we only check for it after we've refreshed the flow once.
229 AT_CHECK([grep dl_dst=50:54:00:00:00:07 stdout | grep -c hard_age],
235 # Make sure that 15 seconds without refreshing makes the flow time out.
236 ovs-appctl time/warp 15000 5000
238 AT_CHECK([ovs-ofctl dump-flows br0 table=1 --no-stats | sort], [0], [dnl
239 table=1, priority=0 actions=FLOOD
244 AT_SETUP([learning action - TCPv4 port learning])
246 [add-port br0 p1 -- set Interface p1 type=dummy -- \
247 add-port br0 p2 -- set Interface p2 type=dummy -- \
248 add-port br0 p3 -- set Interface p3 type=dummy])
249 # Set up flow table for TCPv4 port learning.
250 AT_CHECK([[ovs-ofctl add-flow br0 'table=0 tcp actions=learn(table=1, hard_timeout=60, eth_type=0x800, nw_proto=6, NXM_OF_IP_SRC[]=NXM_OF_IP_DST[], NXM_OF_IP_DST[]=NXM_OF_IP_SRC[], NXM_OF_TCP_SRC[]=NXM_OF_TCP_DST[], NXM_OF_TCP_DST[]=NXM_OF_TCP_SRC[]), flood']])
252 # Trace a TCPv4 packet arriving on port 3.
253 flow="in_port(3),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:06),eth_type(0x0800),ipv4(src=192.168.0.2,dst=192.168.0.1,proto=6,tos=0,ttl=64,frag=no),tcp(src=40000,dst=80)"
254 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow" -generate], [0], [stdout])
255 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
258 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
260 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
262 # Check for the learning entry.
263 AT_CHECK([ovs-ofctl dump-flows br0 table=1 --no-stats | sort], [0], [dnl
264 table=1, hard_timeout=60, tcp,nw_src=192.168.0.1,nw_dst=192.168.0.2,tp_src=80,tp_dst=40000 actions=drop
269 AT_SETUP([learning action - TCPv6 port learning])
271 [add-port br0 p1 -- set Interface p1 type=dummy -- \
272 add-port br0 p2 -- set Interface p2 type=dummy -- \
273 add-port br0 p3 -- set Interface p3 type=dummy])
274 # Set up flow table for TCPv6 port learning.
275 # Also add a 128-bit-wide "load" action and a 128-bit literal match to check
277 AT_CHECK([[ovs-ofctl add-flow br0 'table=0 tcp6 actions=learn(table=1, hard_timeout=60, eth_type=0x86dd, nw_proto=6, NXM_NX_IPV6_SRC[]=NXM_NX_IPV6_DST[], ipv6_dst=2001:0db8:85a3:0000:0000:8a2e:0370:7334, NXM_OF_TCP_SRC[]=NXM_OF_TCP_DST[], NXM_OF_TCP_DST[]=NXM_OF_TCP_SRC[], load(0x20010db885a308d313198a2e03707348->NXM_NX_IPV6_DST[])), flood']])
279 # Trace a TCPv6 packet arriving on port 3.
280 flow="in_port(3),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:06),eth_type(0x86dd),ipv6(src=fec0::2,dst=fec0::1,label=0,proto=6,tclass=0,hlimit=255,frag=no),tcp(src=40000,dst=80)"
281 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow" -generate], [0], [stdout])
282 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
285 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
287 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
289 # Check for the learning entry.
290 AT_CHECK([ovs-ofctl dump-flows br0 --no-stats | sort], [0], [dnl
291 table=1, hard_timeout=60, tcp6,ipv6_src=fec0::1,ipv6_dst=2001:db8:85a3::8a2e:370:7334,tp_src=80,tp_dst=40000 actions=load:0x13198a2e03707348->NXM_NX_IPV6_DST[[0..63]],load:0x20010db885a308d3->NXM_NX_IPV6_DST[[64..127]]
292 tcp6 actions=learn(table=1,hard_timeout=60,eth_type=0x86dd,nw_proto=6,NXM_NX_IPV6_SRC[[]]=NXM_NX_IPV6_DST[[]],ipv6_dst=2001:db8:85a3::8a2e:370:7334,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],NXM_OF_TCP_DST[[]]=NXM_OF_TCP_SRC[[]],load:0x20010db885a308d313198a2e03707348->NXM_NX_IPV6_DST[[]]),FLOOD
297 # In this use of a learn action, the first packet in the flow creates
298 # a new flow that changes the behavior of subsequent packets in the
300 AT_SETUP([learning action - self-modifying flow])
302 add_of_ports br0 1 2 3
305 # Set up flow table for TCPv4 port learning.
306 AT_CHECK([[ovs-ofctl add-flow br0 'actions=load:3->NXM_NX_REG0[0..15],learn(table=0,priority=65535,NXM_OF_ETH_SRC[],NXM_OF_VLAN_TCI[0..11],output:NXM_NX_REG0[0..15]),output:2']])
308 # Trace some packets arriving. The particular packets don't matter.
309 for i in 1 2 3 4 5 6 7 8 9 10; do
310 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=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'
311 ovs-appctl time/warp 10
312 if [[ $i -eq 1 ]]; then
317 # Check for the learning entry.
318 ovs-appctl time/warp 1000
319 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0],
320 [[ n_packets=1, n_bytes=54, actions=load:0x3->NXM_NX_REG0[0..15],learn(table=0,priority=65535,NXM_OF_ETH_SRC[],NXM_OF_VLAN_TCI[0..11],output:NXM_NX_REG0[0..15]),output:2
321 n_packets=9, n_bytes=486, priority=65535,vlan_tci=0x0000/0x0fff,dl_src=50:54:00:00:00:05 actions=output:3
325 # Check that the first packet went out port 2 and the rest out port 3.
327 [(ovs-ofctl dump-ports br0 2; ovs-ofctl dump-ports br0 3) | strip_xids], [0],
328 [OFPST_PORT reply: 1 ports
329 port 2: rx pkts=0, bytes=0, drop=?, errs=?, frame=?, over=?, crc=?
330 tx pkts=1, bytes=54, drop=?, errs=?, coll=?
331 OFPST_PORT reply: 1 ports
332 port 3: rx pkts=0, bytes=0, drop=?, errs=?, frame=?, over=?, crc=?
333 tx pkts=9, bytes=486, drop=?, errs=?, coll=?
339 # This test is much like the previous, but adds idle timeouts and sends
340 # two different flows to the bridge. This tests that the statistics are
341 # attributed correctly.
342 AT_SETUP([learning action - self-modifying flow with idle_timeout])
344 add_of_ports br0 1 2 3
347 # Set up flow table for TCPv4 port learning.
348 AT_CHECK([[ovs-ofctl add-flow br0 'actions=load:3->NXM_NX_REG0[0..15],learn(table=0,idle_timeout=5,priority=65535,NXM_OF_ETH_SRC[],NXM_OF_VLAN_TCI[0..11],output:NXM_NX_REG0[0..15]),output:2']])
350 # Trace some packets arriving. The particular packets don't matter.
351 for i in `seq 1 10`; do
352 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=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'
353 ovs-appctl time/warp 10
354 if [[ $i -eq 1 ]]; then
359 # Trace some packets arriving. This is is a different flow from the previous.
360 # Note that we advance time by 1 second between each packet here.
361 for i in `seq 1 10`; do
362 ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:06,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'
363 ovs-appctl time/warp 1000
364 # Note: netdev-dummy/receive merely queues the packet.
365 # We need to wait for other thread to process the packet
366 # and update the flow's 'used' for the packet.
367 # (i % 3 == 0) below is somehow arbitrary but chosen to ensure
368 # that we update the flow's 'used' frequently enough to prevent
370 if [[ $i -eq 1 -o $((i % 3)) -eq 0 ]]; then
375 # Check that the first packet of each flow went out port 2 and the rest out
378 [(ovs-ofctl dump-ports br0 2; ovs-ofctl dump-ports br0 3) | strip_xids], [0],
379 [OFPST_PORT reply: 1 ports
380 port 2: rx pkts=0, bytes=0, drop=?, errs=?, frame=?, over=?, crc=?
381 tx pkts=2, bytes=108, drop=?, errs=?, coll=?
382 OFPST_PORT reply: 1 ports
383 port 3: rx pkts=0, bytes=0, drop=?, errs=?, frame=?, over=?, crc=?
384 tx pkts=18, bytes=972, drop=?, errs=?, coll=?
387 # Check for the learning entry.
388 ovs-appctl time/warp 1000
389 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0],
390 [[ n_packets=2, n_bytes=108, actions=load:0x3->NXM_NX_REG0[0..15],learn(table=0,idle_timeout=5,priority=65535,NXM_OF_ETH_SRC[],NXM_OF_VLAN_TCI[0..11],output:NXM_NX_REG0[0..15]),output:2
391 n_packets=9, n_bytes=486, idle_timeout=5, priority=65535,vlan_tci=0x0000/0x0fff,dl_src=50:54:00:00:00:06 actions=output:3
397 # This test is much like the previous, but adds hard timeouts and sends
398 # two different flows to the bridge. This tests that the statistics are
399 # attributed correctly.
400 AT_SETUP([learning action - self-modifying flow with hard_timeout])
402 add_of_ports br0 1 2 3
405 # Set up flow table for TCPv4 port learning.
406 AT_CHECK([[ovs-ofctl add-flow br0 'actions=load:3->NXM_NX_REG0[0..15],learn(table=0,hard_timeout=10,priority=65535,NXM_OF_ETH_SRC[],NXM_OF_VLAN_TCI[0..11],output:NXM_NX_REG0[0..15]),output:2']])
408 # Trace some packets arriving. The particular packets don't matter.
409 for i in `seq 1 10`; do
410 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=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'
411 if [[ $i -eq 1 ]]; then
414 ovs-appctl time/warp 10
417 # Check that the first packet of each flow went out port 2 and the rest out
420 [(ovs-ofctl dump-ports br0 2; ovs-ofctl dump-ports br0 3) | strip_xids], [0],
421 [OFPST_PORT reply: 1 ports
422 port 2: rx pkts=0, bytes=0, drop=?, errs=?, frame=?, over=?, crc=?
423 tx pkts=1, bytes=54, drop=?, errs=?, coll=?
424 OFPST_PORT reply: 1 ports
425 port 3: rx pkts=0, bytes=0, drop=?, errs=?, frame=?, over=?, crc=?
426 tx pkts=9, bytes=486, drop=?, errs=?, coll=?
429 # Trace some packets arriving. This is is a different flow from the previous.
430 # Note that we advance time by 2 second between each packet here.
431 for i in `seq 1 10`; do
432 ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:06,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'
433 # Note: hard_timeout should fire immediately after #6 packet.
434 # #7 packet re-install the flow and the following 3 packets
435 # (#8, #9, #10) use the flow.
436 # it's difficult to predict the exact timing of rule expiry
437 # because it's affected by flow dumper thread via udpif_dump_seq.
438 # hard_timeout value for this test was chosen to overcome the uncertainty.
440 # receive #1 learn, install flow with hard_timeout=10
441 # sleep to ensure the flow installation
442 # (warp, timeout left 8s)
443 # receive #2 the learned flow
444 # (warp, timeout left 6s)
446 # (warp, timeout left 4s)
448 # (warp, timeout left 2s)
450 # (warp, timeout left 0s)
451 # NOTE: OVS does not consider this expired yet. cf. rule_expire()
453 # (warp, timeout left -2s)
454 # sleep to ensure flow expiration
455 # receive #7 learn, install flow with hard_timeout=10
456 # sleep to ensure the flow installation
457 # (warp, timeout left 8s)
459 # (warp, timeout left 6s)
461 # (warp, timeout left 4s)
463 # (warp, timeout left 2s)
464 if [[ $i -eq 1 -o $i -eq 7 ]]; then
467 ovs-appctl time/warp 2000
468 if [[ $i -eq 6 ]]; then
473 # Check that the first packet of each flow went out port 2 and the rest out
476 [(ovs-ofctl dump-ports br0 2; ovs-ofctl dump-ports br0 3) | strip_xids], [0],
477 [OFPST_PORT reply: 1 ports
478 port 2: rx pkts=0, bytes=0, drop=?, errs=?, frame=?, over=?, crc=?
479 tx pkts=3, bytes=162, drop=?, errs=?, coll=?
480 OFPST_PORT reply: 1 ports
481 port 3: rx pkts=0, bytes=0, drop=?, errs=?, frame=?, over=?, crc=?
482 tx pkts=17, bytes=918, drop=?, errs=?, coll=?
485 # Check for the learning entry.
486 ovs-appctl time/warp 1000
488 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0],
489 [[ n_packets=3, n_bytes=162, actions=load:0x3->NXM_NX_REG0[0..15],learn(table=0,hard_timeout=10,priority=65535,NXM_OF_ETH_SRC[],NXM_OF_VLAN_TCI[0..11],output:NXM_NX_REG0[0..15]),output:2
490 n_packets=3, n_bytes=162, hard_timeout=10, priority=65535,vlan_tci=0x0000/0x0fff,dl_src=50:54:00:00:00:06 actions=output:3
496 AT_SETUP([learning action - fin_timeout feature])
497 # This is a totally artificial use of the "learn" action. The only purpose
498 # is to check that specifying fin_idle_timeout or fin_hard_timeout causes
499 # a corresponding fin_timeout action to end up in the learned flows.
501 [add-port br0 p1 -- set Interface p1 type=dummy ofport_request=1])
502 AT_CHECK([[ovs-ofctl add-flow br0 'actions=learn(fin_hard_timeout=10, fin_idle_timeout=5, NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[], output:NXM_OF_IN_PORT[])']])
503 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(1),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),eth_type(0x0806),arp(sip=192.168.0.1,tip=192.168.0.2,op=1,sha=50:54:00:00:00:05,tha=00:00:00:00:00:00)' -generate], [0], [ignore])
504 AT_CHECK([ovs-ofctl dump-flows br0 table=1 --no-stats], [0],
505 [ table=1, dl_dst=50:54:00:00:00:05 actions=fin_timeout(idle_timeout=5,hard_timeout=10),output:1
510 AT_SETUP([learning action - delete_learned feature])
513 # Add some initial flows and check that it was successful.
514 AT_DATA([flows.txt], [dnl
515 reg0=0x1 actions=learn(delete_learned,cookie=0x123)
516 reg0=0x2 actions=learn(delete_learned,cookie=0x123)
517 cookie=0x123, table=1, reg0=0x3 actions=drop
518 cookie=0x123, table=1, reg0=0x4 actions=drop
519 cookie=0x123, table=2, reg0=0x5 actions=drop
520 cookie=0x234, table=1, reg0=0x6 actions=drop
522 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
523 AT_CHECK([ovs-ofctl dump-flows br0 --no-stats | sort], [0], [dnl
524 cookie=0x123, table=1, reg0=0x3 actions=drop
525 cookie=0x123, table=1, reg0=0x4 actions=drop
526 cookie=0x123, table=2, reg0=0x5 actions=drop
527 cookie=0x234, table=1, reg0=0x6 actions=drop
528 reg0=0x1 actions=learn(table=1,delete_learned,cookie=0x123)
529 reg0=0x2 actions=learn(table=1,delete_learned,cookie=0x123)
532 # Delete one of the learn actions. The learned flows should stay, since there
533 # is another learn action with the identical target.
534 AT_CHECK([ovs-ofctl del-flows br0 'table=0 reg0=1'])
535 AT_CHECK([ovs-ofctl dump-flows br0 --no-stats | sort], [0], [dnl
536 cookie=0x123, table=1, reg0=0x3 actions=drop
537 cookie=0x123, table=1, reg0=0x4 actions=drop
538 cookie=0x123, table=2, reg0=0x5 actions=drop
539 cookie=0x234, table=1, reg0=0x6 actions=drop
540 reg0=0x2 actions=learn(table=1,delete_learned,cookie=0x123)
543 # Change the flow with the learn action by adding a second action. The learned
544 # flows should stay because the learn action is still there.
545 AT_CHECK([ovs-ofctl mod-flows br0 'table=0 reg0=2 actions=output:1,learn(delete_learned,cookie=0x123)'])
546 AT_CHECK([ovs-ofctl dump-flows br0 --no-stats | sort], [0], [dnl
547 cookie=0x123, table=1, reg0=0x3 actions=drop
548 cookie=0x123, table=1, reg0=0x4 actions=drop
549 cookie=0x123, table=2, reg0=0x5 actions=drop
550 cookie=0x234, table=1, reg0=0x6 actions=drop
551 reg0=0x2 actions=output:1,learn(table=1,delete_learned,cookie=0x123)
554 # Change the flow with the learn action by replacing its learn action by one
555 # with a different target. The (previous) learned flows disappear.
556 AT_CHECK([ovs-ofctl mod-flows br0 'table=0 reg0=2 actions=learn(delete_learned,cookie=0x234)'])
557 AT_CHECK([ovs-ofctl dump-flows br0 --no-stats | sort], [0], [dnl
558 cookie=0x123, table=2, reg0=0x5 actions=drop
559 cookie=0x234, table=1, reg0=0x6 actions=drop
560 reg0=0x2 actions=learn(table=1,delete_learned,cookie=0x234)
563 # Use add-flow to replace the flow with the learn action by one with the
564 # same learn action and an extra action. The (new) learned flow remains.
565 AT_CHECK([ovs-ofctl add-flow br0 'table=0 reg0=2 actions=learn(delete_learned,cookie=0x234),output:2'])
566 AT_CHECK([ovs-ofctl dump-flows br0 --no-stats | sort], [0], [dnl
567 cookie=0x123, table=2, reg0=0x5 actions=drop
568 cookie=0x234, table=1, reg0=0x6 actions=drop
569 reg0=0x2 actions=learn(table=1,delete_learned,cookie=0x234),output:2
572 # Delete the flow with the learn action. The learned flow disappears too.
573 AT_CHECK([ovs-ofctl del-flows br0 table=0])
574 AT_CHECK([ovs-ofctl dump-flows br0 --no-stats | sort], [0], [dnl
575 cookie=0x123, table=2, reg0=0x5 actions=drop
578 # Add a new set of flows to check on a corner case: the learned flows
579 # contain their own learn actions which cascade to further deletions.
580 # This can't happen if the learned flows were actually created by a
581 # learn action, since the learn action has very restricted action
582 # support, but there's no restriction that the deleted flows were
583 # created by a learn action.
584 AT_DATA([flows.txt], [dnl
585 reg0=0x1 actions=learn(table=1,delete_learned,cookie=0x123)
586 reg0=0x2 actions=learn(table=2,delete_learned,cookie=0x234)
587 cookie=0x123, table=1, reg0=0x3 actions=learn(table=3,delete_learned,cookie=0x345)
588 cookie=0x234, table=2, reg0=0x3 actions=learn(table=4,delete_learned,cookie=0x456)
589 cookie=0x345, table=3, reg0=0x4 actions=learn(table=5,delete_learned,cookie=0x567)
590 cookie=0x456, table=4, reg0=0x5 actions=learn(table=5,delete_learned,cookie=0x567)
591 cookie=0x567, table=5, reg0=0x6 actions=drop
592 cookie=0x567, table=5, reg0=0x7 actions=drop
593 cookie=0x567, table=5, reg0=0x8 actions=drop
595 AT_CHECK([ovs-ofctl del-flows br0])
596 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
597 AT_CHECK([ovs-ofctl dump-flows br0 --no-stats | sort], [0], [dnl
598 cookie=0x123, table=1, reg0=0x3 actions=learn(table=3,delete_learned,cookie=0x345)
599 cookie=0x234, table=2, reg0=0x3 actions=learn(table=4,delete_learned,cookie=0x456)
600 cookie=0x345, table=3, reg0=0x4 actions=learn(table=5,delete_learned,cookie=0x567)
601 cookie=0x456, table=4, reg0=0x5 actions=learn(table=5,delete_learned,cookie=0x567)
602 cookie=0x567, table=5, reg0=0x6 actions=drop
603 cookie=0x567, table=5, reg0=0x7 actions=drop
604 cookie=0x567, table=5, reg0=0x8 actions=drop
605 reg0=0x1 actions=learn(table=1,delete_learned,cookie=0x123)
606 reg0=0x2 actions=learn(table=2,delete_learned,cookie=0x234)
609 # Deleting the flow with reg0=1 should cascade to delete a few levels
610 # of learned flows, but the ones with cookie=0x567 stick around
611 # because of the flow with cookie=0x456.
612 AT_CHECK([ovs-ofctl del-flows br0 'table=0 reg0=1'])
613 AT_CHECK([ovs-ofctl dump-flows br0 --no-stats | sort], [0], [dnl
614 cookie=0x234, table=2, reg0=0x3 actions=learn(table=4,delete_learned,cookie=0x456)
615 cookie=0x456, table=4, reg0=0x5 actions=learn(table=5,delete_learned,cookie=0x567)
616 cookie=0x567, table=5, reg0=0x6 actions=drop
617 cookie=0x567, table=5, reg0=0x7 actions=drop
618 cookie=0x567, table=5, reg0=0x8 actions=drop
619 reg0=0x2 actions=learn(table=2,delete_learned,cookie=0x234)
622 # Deleting the flow with reg0=2 should cascade to delete all the rest:
623 AT_CHECK([ovs-ofctl del-flows br0 'table=0 reg0=2'])
624 AT_CHECK([ovs-ofctl dump-flows br0 --no-stats | sort])
628 AT_SETUP([learning action - limit])
630 AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
632 AT_DATA([flows.txt], [dnl
633 table=0 in_port=1 actions=learn(table=1,dl_dst=dl_src,cookie=0x1,limit=1),2
635 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
636 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:01,dst=50:54:00:00:00:ff),eth_type(0x1234)'])
637 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:02,dst=50:54:00:00:00:ff),eth_type(0x1234)'])
639 OVS_WAIT_UNTIL([ovs-ofctl dump-ports br0 2 | grep -o 'tx pkts=2' >/dev/null])
641 AT_CHECK([ovs-ofctl dump-flows br0 table=1 --no-stats], [0], [dnl
642 cookie=0x1, table=1, dl_dst=50:54:00:00:00:01 actions=drop
645 dnl Delete the learned flow
646 AT_CHECK([ovs-ofctl del-flows br0 table=1])
648 AT_CHECK([ovs-ofctl dump-flows br0 table=1 | ofctl_strip | sort], [0], [dnl
652 ovs-appctl revalidator/wait
654 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:02,dst=50:54:00:00:00:ff),eth_type(0x1234)'])
655 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:01,dst=50:54:00:00:00:ff),eth_type(0x1234)'])
657 OVS_WAIT_UNTIL([ovs-ofctl dump-ports br0 2 | grep -o 'tx pkts=4' >/dev/null])
659 AT_CHECK([ovs-ofctl dump-flows br0 table=1 | ofctl_strip | sort], [0], [dnl
660 cookie=0x1, table=1, dl_dst=50:54:00:00:00:02 actions=drop
667 AT_SETUP([learning action - limit result_dst])
669 AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
671 AT_DATA([flows.txt], [dnl
672 table=0 in_port=1 actions=learn(table=1,dl_dst=dl_src,cookie=0x1,limit=1,result_dst=reg0[[0]]),controller
674 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
676 AT_CAPTURE_FILE([ofctl_monitor.log])
677 AT_CHECK([ovs-ofctl monitor br0 65534 invalid_ttl -P nxt_packet_in --detach --no-chdir --pidfile 2> ofctl_monitor.log])
679 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:01,dst=50:54:00:00:00:ff),eth_type(0x1234)'])
680 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:02,dst=50:54:00:00:00:ff),eth_type(0x1234)'])
682 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 4])
683 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
685 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
686 NXT_PACKET_IN (xid=0x0): cookie=0x0 total_len=14 reg0=0x1,in_port=1 (via action) data_len=14 (unbuffered)
687 vlan_tci=0x0000,dl_src=50:54:00:00:00:01,dl_dst=50:54:00:00:00:ff,dl_type=0x1234
688 NXT_PACKET_IN (xid=0x0): cookie=0x0 total_len=14 in_port=1 (via action) data_len=14 (unbuffered)
689 vlan_tci=0x0000,dl_src=50:54:00:00:00:02,dl_dst=50:54:00:00:00:ff,dl_type=0x1234
692 AT_CHECK([ovs-ofctl dump-flows br0 table=1 | ofctl_strip | sort], [0], [dnl
693 cookie=0x1, table=1, dl_dst=50:54:00:00:00:01 actions=drop
700 AT_SETUP([learning action - different limits])
702 AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
703 add_of_ports br0 1 2 3
704 AT_DATA([flows.txt], [dnl
705 table=0 in_port=1 udp,actions=learn(table=11,dl_type=0x0800,nw_proto=17,udp_src=udp_dst,limit=1,result_dst=reg0[[0]]),resubmit(,1)
706 table=0 in_port=2 udp,actions=learn(table=12,dl_type=0x0800,nw_proto=17,udp_src=udp_dst,limit=10,result_dst=reg0[[0]]),resubmit(,1)
707 table=0 in_port=3 udp,actions=learn(table=13,dl_type=0x0800,nw_proto=17,udp_src=udp_dst,limit=20,result_dst=reg0[[0]]),resubmit(,1)
709 dnl These flows simply counts the packets that executed a successful learn action:
711 table=1 cookie=1,reg0=1,in_port=1 actions=drop
712 table=1 cookie=2,reg0=1,in_port=2 actions=drop
713 table=1 cookie=3,reg0=1,in_port=3 actions=drop
715 dnl These flows simply counts the packets that didn't execute a successful learn action:
717 table=1 cookie=1,reg0=0,in_port=1 actions=drop
718 table=1 cookie=2,reg0=0,in_port=2 actions=drop
719 table=1 cookie=3,reg0=0,in_port=3 actions=drop
721 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
723 for i in `seq 1001 1030`; do
724 ovs-appctl netdev-dummy/receive p1 "in_port(1),eth(src=50:54:00:00:00:01,dst=50:54:00:00:00:ff),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=17,tos=0,ttl=64,frag=no),udp(src=1,dst=$i)"
725 ovs-appctl netdev-dummy/receive p2 "in_port(2),eth(src=50:54:00:00:00:01,dst=50:54:00:00:00:ff),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=17,tos=0,ttl=64,frag=no),udp(src=1,dst=$i)"
726 ovs-appctl netdev-dummy/receive p3 "in_port(3),eth(src=50:54:00:00:00:01,dst=50:54:00:00:00:ff),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=17,tos=0,ttl=64,frag=no),udp(src=1,dst=$i)"
729 dnl Check successful counters:
730 AT_CHECK([ovs-ofctl dump-flows br0 table=1,reg0=1 | ofctl_strip | sort], [0], [dnl
731 cookie=0x1, table=1, n_packets=1, n_bytes=42, reg0=0x1,in_port=1 actions=drop
732 cookie=0x2, table=1, n_packets=10, n_bytes=420, reg0=0x1,in_port=2 actions=drop
733 cookie=0x3, table=1, n_packets=20, n_bytes=840, reg0=0x1,in_port=3 actions=drop
737 dnl Check failed counters:
738 AT_CHECK([ovs-ofctl dump-flows br0 table=1,reg0=0 | ofctl_strip | sort], [0], [dnl
739 cookie=0x1, table=1, n_packets=29, n_bytes=1218, reg0=0,in_port=1 actions=drop
740 cookie=0x2, table=1, n_packets=20, n_bytes=840, reg0=0,in_port=2 actions=drop
741 cookie=0x3, table=1, n_packets=10, n_bytes=420, reg0=0,in_port=3 actions=drop
745 dnl Check learned flows:
747 AT_CHECK([ovs-ofctl dump-flows br0 table=13 | ofctl_strip | sort], [0], [dnl
748 table=13, udp,tp_src=1001 actions=drop
749 table=13, udp,tp_src=1002 actions=drop
750 table=13, udp,tp_src=1003 actions=drop
751 table=13, udp,tp_src=1004 actions=drop
752 table=13, udp,tp_src=1005 actions=drop
753 table=13, udp,tp_src=1006 actions=drop
754 table=13, udp,tp_src=1007 actions=drop
755 table=13, udp,tp_src=1008 actions=drop
756 table=13, udp,tp_src=1009 actions=drop
757 table=13, udp,tp_src=1010 actions=drop
758 table=13, udp,tp_src=1011 actions=drop
759 table=13, udp,tp_src=1012 actions=drop
760 table=13, udp,tp_src=1013 actions=drop
761 table=13, udp,tp_src=1014 actions=drop
762 table=13, udp,tp_src=1015 actions=drop
763 table=13, udp,tp_src=1016 actions=drop
764 table=13, udp,tp_src=1017 actions=drop
765 table=13, udp,tp_src=1018 actions=drop
766 table=13, udp,tp_src=1019 actions=drop
767 table=13, udp,tp_src=1020 actions=drop
771 AT_CHECK([ovs-ofctl dump-flows br0 table=12 | ofctl_strip | sort], [0], [dnl
772 table=12, udp,tp_src=1001 actions=drop
773 table=12, udp,tp_src=1002 actions=drop
774 table=12, udp,tp_src=1003 actions=drop
775 table=12, udp,tp_src=1004 actions=drop
776 table=12, udp,tp_src=1005 actions=drop
777 table=12, udp,tp_src=1006 actions=drop
778 table=12, udp,tp_src=1007 actions=drop
779 table=12, udp,tp_src=1008 actions=drop
780 table=12, udp,tp_src=1009 actions=drop
781 table=12, udp,tp_src=1010 actions=drop
785 AT_CHECK([ovs-ofctl dump-flows br0 table=11 | ofctl_strip | sort], [0], [dnl
786 table=11, udp,tp_src=1001 actions=drop
790 AT_CHECK([ovs-vsctl del-br br0])
792 ovs-appctl time/warp 500
793 ovs-appctl time/warp 500
794 ovs-appctl time/warp 500
795 ovs-appctl time/warp 500
797 AT_CHECK([ovs-vsctl add-br br1 -- set b br1 datapath_type=dummy])