1 AT_BANNER([ofproto-dpif])
3 AT_SETUP([ofproto-dpif - resubmit])
5 ADD_OF_PORTS([br0], [1], [10], [11], [12], [13], [14], [15],
6 [16], [17], [18], [19], [20], [21])
7 AT_DATA([flows.txt], [dnl
8 table=0 in_port=1 priority=1000 icmp actions=output(10),resubmit(2),output(19),resubmit(3),output(21)
9 table=0 in_port=2 priority=1500 icmp actions=output(11),resubmit(,1),output(16),resubmit(2,1),output(18)
10 table=0 in_port=3 priority=2000 icmp actions=output(20)
11 table=1 in_port=1 priority=1000 icmp actions=output(12),resubmit(4,1),output(13),resubmit(3),output(15)
12 table=1 in_port=2 priority=1500 icmp actions=output(17),resubmit(,2)
13 table=1 in_port=3 priority=1500 icmp actions=output(14),resubmit(,2)
15 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
16 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])
17 AT_CHECK([tail -1 stdout], [0],
18 [Datapath actions: 10,11,12,13,14,15,16,17,18,19,20,21
23 AT_SETUP([ofproto-dpif - registers])
25 ADD_OF_PORTS([br0], [20], [21], [22], [33], [90])
26 AT_DATA([flows.txt], [dnl
27 in_port=90 actions=resubmit:2,resubmit:3,resubmit:4,resubmit:91
28 in_port=91 actions=resubmit:5,resubmit:6,resubmit:7,resubmit:92
29 in_port=92 actions=resubmit:8,resubmit:9,resubmit:10,resubmit:11,resubmit:93
30 in_port=93 actions=resubmit:12,resubmit:13,resubmit:14,resubmit:15
32 in_port=2 actions=load:0x000db000->NXM_NX_REG0[[]]
33 in_port=3 actions=load:0xdea->NXM_NX_REG0[[20..31]]
34 in_port=4 actions=load:0xeef->NXM_NX_REG0[[0..11]]
35 in_port=5 actions=move:NXM_NX_REG0[[]]->NXM_NX_REG1[[]]
36 in_port=6 actions=load:0x22222222->NXM_NX_REG2[[]]
37 in_port=7 actions=move:NXM_NX_REG1[[20..31]]->NXM_NX_REG2[[0..11]]
38 in_port=8 actions=move:NXM_NX_REG1[[0..11]]->NXM_NX_REG2[[20..31]]
39 in_port=9,reg0=0xdeadbeef actions=output:20
40 in_port=10,reg1=0xdeadbeef actions=output:21
41 in_port=11,reg2=0xeef22dea actions=output:22
43 dnl Sanilty check all registers
44 in_port=12 actions=load:0x10->NXM_NX_REG0[[]],load:0x11->NXM_NX_REG1[[]],load:0x12->NXM_NX_REG2[[]]
45 in_port=13 actions=load:0x13->NXM_NX_REG3[[]],load:0x14->NXM_NX_REG4[[]],load:0x15->NXM_NX_REG5[[]]
46 in_port=14 actions=load:0x16->NXM_NX_REG6[[]],load:0x17->NXM_NX_REG7[[]]
47 in_port=15,reg0=0x10,reg1=0x11,reg2=0x12,reg3=0x13,reg4=0x14,reg5=0x15,reg6=0x16,reg7=0x17 actions=output:33
49 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
50 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(90),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)'], [0], [stdout])
51 AT_CHECK([tail -1 stdout], [0],
52 [Datapath actions: 20,21,22,33
57 AT_SETUP([ofproto-dpif - output])
59 ADD_OF_PORTS([br0], [1], [9], [10], [11], [55], [66], [77], [88])
60 AT_DATA([flows.txt], [dnl
61 in_port=1 actions=resubmit:2,resubmit:3,resubmit:4,resubmit:5,resubmit:6,resubmit:7
62 in_port=2 actions=output:9
63 in_port=3 actions=load:55->NXM_NX_REG0[[]],output:NXM_NX_REG0[[]],load:66->NXM_NX_REG1[[]]
64 in_port=4 actions=output:10,output:NXM_NX_REG0[[]],output:NXM_NX_REG1[[]],output:11
65 in_port=5 actions=load:77->NXM_NX_REG0[[0..15]],load:88->NXM_NX_REG0[[16..31]]
66 in_port=6 actions=output:NXM_NX_REG0[[0..15]],output:NXM_NX_REG0[[16..31]]
67 in_port=7 actions=load:0x110000ff->NXM_NX_REG0[[]],output:NXM_NX_REG0[[]]
69 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
70 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)'], [0], [stdout])
71 AT_CHECK([tail -1 stdout], [0],
72 [Datapath actions: 9,55,10,55,66,11,77,88
77 AT_SETUP([ofproto-dpif - dec_ttl])
79 ADD_OF_PORTS([br0], [1], [2], [3], [4])
80 AT_DATA([flows.txt], [dnl
81 table=0 in_port=1 action=dec_ttl,output:2,resubmit(1,1),output:4
82 table=1 in_port=1 action=dec_ttl,output:3
84 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
85 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=2,frag=no)' -generate], [0], [stdout])
86 AT_CHECK([tail -3 stdout], [0],
87 [Datapath actions: set(ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=1,frag=no)),2,4
88 This flow is handled by the userspace slow path because it:
89 - Sends "packet-in" messages to the OpenFlow controller.
91 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=3,frag=no)'], [0], [stdout])
92 AT_CHECK([tail -1 stdout], [0],
93 [Datapath actions: set(ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=2,frag=no)),2,set(ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=1,frag=no)),3,4
95 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x86dd),ipv6(src=::1,dst=::2,label=0,proto=10,tclass=0x70,hlimit=128,frag=no)'], [0], [stdout])
96 AT_CHECK([tail -1 stdout], [0],
97 [Datapath actions: set(ipv6(src=::1,dst=::2,label=0,proto=10,tclass=0x70,hlimit=127,frag=no)),2,set(ipv6(src=::1,dst=::2,label=0,proto=10,tclass=0x70,hlimit=126,frag=no)),3,4
100 AT_CAPTURE_FILE([ofctl_monitor.log])
101 AT_CHECK([ovs-ofctl monitor br0 65534 invalid_ttl --detach --no-chdir --pidfile 2> ofctl_monitor.log])
102 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=2,frag=no)' -generate], [0], [stdout])
103 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
104 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
105 NXT_PACKET_IN (xid=0x0): table_id=1 total_len=42 in_port=1 (via invalid_ttl) data_len=42 (unbuffered)
106 priority=0,icmp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=1,icmp_type=0,icmp_code=0
112 AT_SETUP([ofproto-dpif - output, OFPP_NONE ingress port])
114 [add-port br0 p1 -- set Interface p1 type=dummy --\
115 add-port br0 p2 -- set Interface p2 type=dummy])
117 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
119 # "in_port" defaults to OFPP_NONE if it's not specified.
120 flow="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=128,frag=no),icmp(type=8,code=0)"
121 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
122 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
125 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
127 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
132 AT_SETUP([ofproto-dpif - DSCP])
133 OVS_VSWITCHD_START([add-port br0 p1 -- set Interface p1 type=dummy])
134 AT_DATA([flows.txt], [dnl
135 actions=output:65534,enqueue:1:1,enqueue:1:2,enqueue:1:2,enqueue:1:1,output:1,mod_nw_tos:0,output:1,output:65534
137 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
138 AT_CHECK([ovs-vsctl -- \
139 set Port p1 qos=@newqos --\
140 --id=@newqos create QoS type=linux-htb queues=1=@q1,2=@q2 --\
141 --id=@q1 create Queue dscp=1 --\
142 --id=@q2 create Queue dscp=2], [0], [ignore])
143 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(9),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0xff,ttl=128,frag=no),icmp(type=8,code=0)'], [0], [stdout])
144 AT_CHECK([tail -1 stdout], [0],
145 [Datapath actions: dnl
147 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0x7,ttl=128,frag=no)),set(priority(1)),1,dnl
148 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0xb,ttl=128,frag=no)),set(priority(2)),1,dnl
150 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0x7,ttl=128,frag=no)),set(priority(1)),1,dnl
151 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0xff,ttl=128,frag=no)),set(priority(0)),1,dnl
152 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0x3,ttl=128,frag=no)),1,dnl
158 AT_SETUP([ofproto-dpif - output/flood flags])
160 ADD_OF_PORTS([br0], [1], [2], [3], [4], [5], [6], [7])
162 AT_DATA([flows.txt], [dnl
163 in_port=local actions=local,flood
164 in_port=1 actions=flood
165 in_port=2 actions=all
166 in_port=3 actions=output:65534,output:1,output:2,output:3,output:4,output:5,output:6,output:7
167 in_port=4 actions=enqueue:65534:1,enqueue:1:1,enqueue:2:1,enqueue:3:2,enqueue:4:1,enqueue:5:1,enqueue:6:1,enqueue:7:1
169 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
170 AT_CHECK([ovs-ofctl mod-port br0 5 noforward])
171 AT_CHECK([ovs-ofctl mod-port br0 6 noflood])
173 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(0),eth(src=00:00:00:00:00:01,dst=00:00:00:00:00:02),eth_type(0x0900)'], [0], [stdout])
174 AT_CHECK([tail -1 stdout \
175 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
183 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(1),eth(src=00:00:00:00:00:01,dst=00:00:00:00:00:02),eth_type(0x0900)'], [0], [stdout])
184 AT_CHECK([tail -1 stdout \
185 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
193 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(2),eth(src=00:00:00:00:00:01,dst=00:00:00:00:00:02),eth_type(0x0900)'], [0], [stdout])
194 AT_CHECK([tail -1 stdout \
195 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
204 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(3),eth(src=00:00:00:00:00:01,dst=00:00:00:00:00:02),eth_type(0x0900)'], [0], [stdout])
205 AT_CHECK([tail -1 stdout], [0],
206 [Datapath actions: 0,1,2,4,6,7
209 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(4),eth(src=00:00:00:00:00:01,dst=00:00:00:00:00:02),eth_type(0x0900)'], [0], [stdout])
210 AT_CHECK([tail -1 stdout], [0],
211 [Datapath actions: set(priority(1)),0,1,2,set(priority(2)),3,set(priority(1)),6,7
216 AT_SETUP([ofproto-dpif - set_tunnel])
218 ADD_OF_PORTS([br0], [1], [2], [3], [4], [5], [90])
219 AT_DATA([flows.txt], [dnl
220 in_port=90 actions=resubmit:1,resubmit:2,resubmit:3,resubmit:4,resubmit:5
221 in_port=1 actions=set_tunnel:1,output:1
222 in_port=2 actions=set_tunnel:1,output:2
223 in_port=3 actions=set_tunnel:2,set_tunnel:3,output:3
224 in_port=4 actions=set_tunnel:4,set_tunnel:3,output:4
225 in_port=5 actions=set_tunnel:5
227 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
228 AT_CHECK([ovs-appctl ofproto/trace br0 'tun_id(0x1),in_port(90),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)'], [0], [stdout])
229 AT_CHECK([tail -1 stdout], [0],
230 [Datapath actions: set(tun_id(0x1)),1,2,set(tun_id(0x3)),3,4
235 AT_SETUP([ofproto-dpif - controller])
236 OVS_VSWITCHD_START([dnl
237 add-port br0 p1 -- set Interface p1 type=dummy
240 AT_CAPTURE_FILE([ofctl_monitor.log])
241 AT_DATA([flows.txt], [dnl
242 cookie=0x0 dl_src=10:11:11:11:11:11 actions=controller
243 cookie=0x1 dl_src=20:22:22:22:22:22 actions=controller,resubmit(80,1)
244 cookie=0x2 dl_src=30:33:33:33:33:33 actions=mod_vlan_vid:15,controller
246 cookie=0x3 table=1 in_port=80 actions=load:1->NXM_NX_REG0[[]],mod_vlan_vid:80,controller,resubmit(81,2)
247 cookie=0x4 table=2 in_port=81 actions=load:2->NXM_NX_REG1[[]],mod_dl_src:80:81:81:81:81:81,controller,resubmit(82,3)
248 cookie=0x5 table=3 in_port=82 actions=load:3->NXM_NX_REG2[[]],mod_dl_dst:82:82:82:82:82:82,controller,resubmit(83,4)
249 cookie=0x6 table=4 in_port=83 actions=load:4->NXM_NX_REG3[[]],mod_nw_src:83.83.83.83,controller,resubmit(84,5)
250 cookie=0x7 table=5 in_port=84 actions=load:5->NXM_NX_REG4[[]],load:6->NXM_NX_TUN_ID[[]],mod_nw_dst:84.84.84.84,controller,resubmit(85,6)
251 cookie=0x8 table=6 in_port=85 actions=mod_tp_src:85,controller,resubmit(86,7)
252 cookie=0x9 table=7 in_port=86 actions=mod_tp_dst:86,controller,controller
254 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
257 AT_CHECK([ovs-ofctl monitor -P openflow10 br0 65534 --detach --no-chdir --pidfile 2> ofctl_monitor.log])
260 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)'
263 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
264 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
265 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via no_match) data_len=60 (unbuffered)
266 priority=0,tcp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=9 tcp_csum:0
268 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via no_match) data_len=60 (unbuffered)
269 priority=0,tcp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=9 tcp_csum:0
271 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via no_match) data_len=60 (unbuffered)
272 priority=0,tcp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=9 tcp_csum:0
275 dnl Singleton controller action.
276 AT_CHECK([ovs-ofctl monitor -P openflow10 br0 65534 --detach --no-chdir --pidfile 2> ofctl_monitor.log])
279 ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=10:11:11:11:11:11,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=10)'
282 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
283 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
284 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
285 priority=0,tcp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=10:11:11:11:11:11,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=10 tcp_csum:0
287 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
288 priority=0,tcp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=10:11:11:11:11:11,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=10 tcp_csum:0
290 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
291 priority=0,tcp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=10:11:11:11:11:11,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=10 tcp_csum:0
294 dnl Modified controller action.
295 AT_CHECK([ovs-ofctl monitor -P openflow10 br0 65534 --detach --no-chdir --pidfile 2> ofctl_monitor.log])
298 ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=30:33:33:33:33:33,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=10)'
301 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
302 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
303 OFPT_PACKET_IN (xid=0x0): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
304 priority=0,tcp,metadata=0,in_port=0,dl_vlan=15,dl_vlan_pcp=0,dl_src=30:33:33:33:33:33,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=10 tcp_csum:0
306 OFPT_PACKET_IN (xid=0x0): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
307 priority=0,tcp,metadata=0,in_port=0,dl_vlan=15,dl_vlan_pcp=0,dl_src=30:33:33:33:33:33,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=10 tcp_csum:0
309 OFPT_PACKET_IN (xid=0x0): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
310 priority=0,tcp,metadata=0,in_port=0,dl_vlan=15,dl_vlan_pcp=0,dl_src=30:33:33:33:33:33,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=10 tcp_csum:0
314 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --no-chdir --pidfile 2> ofctl_monitor.log])
317 ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=20:22:22:22:22:22,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=11)'
320 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
321 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
322 NXT_PACKET_IN (xid=0x0): cookie=0x1 total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
323 priority=0,tcp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=20:22:22:22:22:22,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=11 tcp_csum:0
325 NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x3 total_len=64 in_port=1 reg0=0x1 (via action) data_len=64 (unbuffered)
326 priority=0,tcp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=20:22:22:22:22:22,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=11 tcp_csum:0
328 NXT_PACKET_IN (xid=0x0): table_id=2 cookie=0x4 total_len=64 in_port=1 reg0=0x1 reg1=0x2 (via action) data_len=64 (unbuffered)
329 priority=0,tcp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=11 tcp_csum:0
331 NXT_PACKET_IN (xid=0x0): table_id=3 cookie=0x5 total_len=64 in_port=1 reg0=0x1 reg1=0x2 reg2=0x3 (via action) data_len=64 (unbuffered)
332 priority=0,tcp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=11 tcp_csum:0
334 NXT_PACKET_IN (xid=0x0): table_id=4 cookie=0x6 total_len=64 in_port=1 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 (via action) data_len=64 (unbuffered)
335 priority=0,tcp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=11 tcp_csum:1a03
337 NXT_PACKET_IN (xid=0x0): table_id=5 cookie=0x7 total_len=64 in_port=1 tun_id=0x6 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 (via action) data_len=64 (unbuffered)
338 priority=0,tcp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=11 tcp_csum:3205
340 NXT_PACKET_IN (xid=0x0): table_id=6 cookie=0x8 total_len=64 in_port=1 tun_id=0x6 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 (via action) data_len=64 (unbuffered)
341 priority=0,tcp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=85,tp_dst=11 tcp_csum:31b8
343 NXT_PACKET_IN (xid=0x0): table_id=7 cookie=0x9 total_len=64 in_port=1 tun_id=0x6 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 (via action) data_len=64 (unbuffered)
344 priority=0,tcp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=85,tp_dst=86 tcp_csum:316d
346 NXT_PACKET_IN (xid=0x0): table_id=7 cookie=0x9 total_len=64 in_port=1 tun_id=0x6 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 (via action) data_len=64 (unbuffered)
347 priority=0,tcp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=85,tp_dst=86 tcp_csum:316d
351 AT_CHECK([ovs-ofctl monitor br0 65534 --detach --no-chdir --pidfile 2> ofctl_monitor.log])
354 ovs-appctl netdev-dummy/receive p1 '50 54 00 00 00 07 20 22 22 22 22 22 08 00 45 00 00 1C 00 00 00 00 00 11 00 00 C0 A8 00 01 C0 A8 00 02 00 08 00 0B 00 00 12 34 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
357 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
358 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
359 NXT_PACKET_IN (xid=0x0): cookie=0x1 total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
360 priority=0,udp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=20:22:22:22:22:22,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=8,tp_dst=11 udp_csum:1234
362 NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x3 total_len=64 in_port=1 reg0=0x1 (via action) data_len=64 (unbuffered)
363 priority=0,udp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=20:22:22:22:22:22,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=8,tp_dst=11 udp_csum:1234
365 NXT_PACKET_IN (xid=0x0): table_id=2 cookie=0x4 total_len=64 in_port=1 reg0=0x1 reg1=0x2 (via action) data_len=64 (unbuffered)
366 priority=0,udp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=8,tp_dst=11 udp_csum:1234
368 NXT_PACKET_IN (xid=0x0): table_id=3 cookie=0x5 total_len=64 in_port=1 reg0=0x1 reg1=0x2 reg2=0x3 (via action) data_len=64 (unbuffered)
369 priority=0,udp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=8,tp_dst=11 udp_csum:1234
371 NXT_PACKET_IN (xid=0x0): table_id=4 cookie=0x6 total_len=64 in_port=1 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 (via action) data_len=64 (unbuffered)
372 priority=0,udp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=8,tp_dst=11 udp_csum:2c37
374 NXT_PACKET_IN (xid=0x0): table_id=5 cookie=0x7 total_len=64 in_port=1 tun_id=0x6 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 (via action) data_len=64 (unbuffered)
375 priority=0,udp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=8,tp_dst=11 udp_csum:4439
377 NXT_PACKET_IN (xid=0x0): table_id=6 cookie=0x8 total_len=64 in_port=1 tun_id=0x6 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 (via action) data_len=64 (unbuffered)
378 priority=0,udp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=85,tp_dst=11 udp_csum:43ec
380 NXT_PACKET_IN (xid=0x0): table_id=7 cookie=0x9 total_len=64 in_port=1 tun_id=0x6 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 (via action) data_len=64 (unbuffered)
381 priority=0,udp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=85,tp_dst=86 udp_csum:43a1
383 NXT_PACKET_IN (xid=0x0): table_id=7 cookie=0x9 total_len=64 in_port=1 tun_id=0x6 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 (via action) data_len=64 (unbuffered)
384 priority=0,udp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=85,tp_dst=86 udp_csum:43a1
387 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
388 cookie=0x1, n_packets=2, n_bytes=120, dl_src=20:22:22:22:22:22 actions=CONTROLLER:65535,resubmit(80,1)
389 cookie=0x2, n_packets=3, n_bytes=180, dl_src=30:33:33:33:33:33 actions=mod_vlan_vid:15,CONTROLLER:65535
390 cookie=0x3, table=1, n_packets=2, n_bytes=120, in_port=80 actions=load:0x1->NXM_NX_REG0[[]],mod_vlan_vid:80,CONTROLLER:65535,resubmit(81,2)
391 cookie=0x4, table=2, n_packets=2, n_bytes=120, in_port=81 actions=load:0x2->NXM_NX_REG1[[]],mod_dl_src:80:81:81:81:81:81,CONTROLLER:65535,resubmit(82,3)
392 cookie=0x5, table=3, n_packets=2, n_bytes=120, in_port=82 actions=load:0x3->NXM_NX_REG2[[]],mod_dl_dst:82:82:82:82:82:82,CONTROLLER:65535,resubmit(83,4)
393 cookie=0x6, table=4, n_packets=2, n_bytes=120, in_port=83 actions=load:0x4->NXM_NX_REG3[[]],mod_nw_src:83.83.83.83,CONTROLLER:65535,resubmit(84,5)
394 cookie=0x7, table=5, n_packets=2, n_bytes=120, in_port=84 actions=load:0x5->NXM_NX_REG4[[]],load:0x6->NXM_NX_TUN_ID[[]],mod_nw_dst:84.84.84.84,CONTROLLER:65535,resubmit(85,6)
395 cookie=0x8, table=6, n_packets=2, n_bytes=120, in_port=85 actions=mod_tp_src:85,CONTROLLER:65535,resubmit(86,7)
396 cookie=0x9, table=7, n_packets=2, n_bytes=120, in_port=86 actions=mod_tp_dst:86,CONTROLLER:65535,CONTROLLER:65535
397 n_packets=3, n_bytes=180, dl_src=10:11:11:11:11:11 actions=CONTROLLER:65535
404 AT_SETUP([ofproto-dpif - VLAN handling])
406 [set Bridge br0 fail-mode=standalone -- \
407 add-port br0 p1 trunks=10,12 -- \
408 add-port br0 p2 tag=10 -- \
409 add-port br0 p3 tag=12 \
410 other-config:priority-tags=true -- \
411 add-port br0 p4 tag=12 -- \
412 add-port br0 p5 vlan_mode=native-tagged tag=10 -- \
413 add-port br0 p6 vlan_mode=native-tagged tag=10 trunks=10,12 -- \
414 add-port br0 p7 vlan_mode=native-untagged tag=12 -- \
415 add-port br0 p8 vlan_mode=native-untagged tag=12 trunks=10,12 \
416 other-config:priority-tags=true -- \
417 set Interface p1 type=dummy -- \
418 set Interface p2 type=dummy -- \
419 set Interface p3 type=dummy -- \
420 set Interface p4 type=dummy -- \
421 set Interface p5 type=dummy -- \
422 set Interface p6 type=dummy -- \
423 set Interface p7 type=dummy -- \
424 set Interface p8 type=dummy --])
426 dnl Each of these specifies an in_port by number, a VLAN VID (or "none"),
427 dnl a VLAN PCP (used if the VID isn't "none") and the expected set of datapath
433 "0 10 0 1,5,6,7,8,pop_vlan,2" \
434 "0 10 1 1,5,6,7,8,pop_vlan,2" \
437 "0 12 0 1,5,6,pop_vlan,3,4,7,8" \
438 "0 12 1 1,5,6,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
442 "1 10 0 0,5,6,7,8,pop_vlan,2" \
443 "1 10 1 0,5,6,7,8,pop_vlan,2" \
446 "1 12 0 0,5,6,pop_vlan,3,4,7,8" \
447 "1 12 1 0,5,6,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
448 "2 none 0 push_vlan(vid=10,pcp=0),0,1,5,6,7,8" \
449 "2 0 0 pop_vlan,push_vlan(vid=10,pcp=0),0,1,5,6,7,8" \
450 "2 0 1 pop_vlan,push_vlan(vid=10,pcp=1),0,1,5,6,7,8" \
457 "3 none 0 4,7,8,push_vlan(vid=12,pcp=0),0,1,5,6" \
458 "3 0 0 pop_vlan,4,7,8,push_vlan(vid=12,pcp=0),0,1,5,6" \
459 "3 0 1 8,pop_vlan,4,7,push_vlan(vid=12,pcp=1),0,1,5,6" \
466 "4 none 0 3,7,8,push_vlan(vid=12,pcp=0),0,1,5,6" \
467 "4 0 0 pop_vlan,3,7,8,push_vlan(vid=12,pcp=0),0,1,5,6" \
468 "4 0 1 3,8,pop_vlan,7,push_vlan(vid=12,pcp=1),0,1,5,6" \
475 "5 none 0 2,push_vlan(vid=10,pcp=0),0,1,6,7,8" \
476 "5 0 0 pop_vlan,2,push_vlan(vid=10,pcp=0),0,1,6,7,8" \
477 "5 0 1 pop_vlan,2,push_vlan(vid=10,pcp=1),0,1,6,7,8" \
478 "5 10 0 0,1,6,7,8,pop_vlan,2" \
479 "5 10 1 0,1,6,7,8,pop_vlan,2" \
482 "5 12 0 0,1,6,pop_vlan,3,4,7,8" \
483 "5 12 1 0,1,6,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
484 "6 none 0 2,push_vlan(vid=10,pcp=0),0,1,5,7,8" \
485 "6 0 0 pop_vlan,2,push_vlan(vid=10,pcp=0),0,1,5,7,8" \
486 "6 0 1 pop_vlan,2,push_vlan(vid=10,pcp=1),0,1,5,7,8" \
487 "6 10 0 0,1,5,7,8,pop_vlan,2" \
488 "6 10 1 0,1,5,7,8,pop_vlan,2" \
491 "6 12 0 0,1,5,pop_vlan,3,4,7,8" \
492 "6 12 1 0,1,5,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
493 "7 none 0 3,4,8,push_vlan(vid=12,pcp=0),0,1,5,6" \
494 "7 0 0 pop_vlan,3,4,8,push_vlan(vid=12,pcp=0),0,1,5,6" \
495 "7 0 1 3,8,pop_vlan,4,push_vlan(vid=12,pcp=1),0,1,5,6" \
496 "7 10 0 0,1,5,6,8,pop_vlan,2" \
497 "7 10 1 0,1,5,6,8,pop_vlan,2" \
500 "7 12 0 0,1,5,6,pop_vlan,3,4,8" \
501 "7 12 1 0,1,5,6,pop_vlan,4,push_vlan(vid=0,pcp=1),3,8" \
502 "8 none 0 3,4,7,push_vlan(vid=12,pcp=0),0,1,5,6" \
503 "8 0 0 pop_vlan,3,4,7,push_vlan(vid=12,pcp=0),0,1,5,6" \
504 "8 0 1 3,pop_vlan,4,7,push_vlan(vid=12,pcp=1),0,1,5,6" \
505 "8 10 0 0,1,5,6,7,pop_vlan,2" \
506 "8 10 1 0,1,5,6,7,pop_vlan,2" \
509 "8 12 0 0,1,5,6,pop_vlan,3,4,7" \
510 "8 12 1 0,1,5,6,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3"
518 if test $vlan = none; then
519 flow="in_port($in_port),eth(src=50:54:00:00:00:01,dst=ff:ff:ff:ff:ff:ff),eth_type(0xabcd)"
521 flow="in_port($in_port),eth(src=50:54:00:00:00:01,dst=ff:ff:ff:ff:ff:ff),eth_type(0x8100),vlan(vid=$vlan,pcp=$pcp),encap(eth_type(0xabcd))"
524 echo "----------------------------------------------------------------------"
525 echo "in_port=$in_port vlan=$vlan pcp=$pcp"
527 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
528 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
530 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
532 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
538 AT_SETUP([ofproto-dpif - fragment handling])
540 ADD_OF_PORTS([br0], [1], [2], [3], [4], [5], [6])
541 AT_DATA([flows.txt], [dnl
542 priority=75 tcp ip_frag=no tp_dst=80 actions=output:1
543 priority=75 tcp ip_frag=first tp_dst=80 actions=output:2
544 priority=75 tcp ip_frag=later tp_dst=80 actions=output:3
545 priority=50 tcp ip_frag=no actions=output:4
546 priority=50 tcp ip_frag=first actions=output:5
547 priority=50 tcp ip_frag=later actions=output:6
549 AT_CHECK([ovs-ofctl replace-flows br0 flows.txt])
551 base_flow="in_port(90),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=128"
552 no_flow="$base_flow,frag=no),tcp(src=12345,dst=80)"
553 first_flow="$base_flow,frag=first),tcp(src=12345,dst=80)"
554 later_flow="$base_flow,frag=later)"
556 # mode no first later
568 AT_CHECK([ovs-ofctl set-frags br0 $mode])
569 for type in no first later; do
570 eval flow=\$${type}_flow exp_output=\$$type
571 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
572 AT_CHECK_UNQUOTED([tail -1 stdout], [0], [Datapath actions: $exp_output
579 AT_SETUP([ofproto-dpif - exit])
581 ADD_OF_PORTS([br0], [1], [2], [3], [10], [11], [12], [13], [14])
582 AT_DATA([flows.txt], [dnl
583 in_port=1 actions=output:10,exit,output:11
584 in_port=2 actions=output:12,resubmit:1,output:12
585 in_port=3 actions=output:13,resubmit:2,output:14
587 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
588 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)'], [0], [stdout])
589 AT_CHECK([tail -1 stdout], [0],
590 [Datapath actions: 10
592 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(2),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=128,frag=no),icmp(type=8,code=0)'], [0], [stdout])
593 AT_CHECK([tail -1 stdout], [0],
594 [Datapath actions: 12,10
596 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(3),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=128,frag=no),icmp(type=8,code=0)'], [0], [stdout])
597 AT_CHECK([tail -1 stdout], [0],
598 [Datapath actions: 13,12,10
604 AT_SETUP([ofproto-dpif - mirroring, select_all])
606 [add-port br0 p1 -- set Interface p1 type=dummy --\
607 add-port br0 p2 -- set Interface p2 type=dummy --\
608 add-port br0 p3 -- set Interface p3 type=dummy --\
609 set Bridge br0 mirrors=@m --\
610 --id=@p3 get Port p3 --\
611 --id=@m create Mirror name=mymirror \
612 select_all=true output_port=@p3], [<0>
615 AT_DATA([flows.txt], [dnl
616 in_port=1 actions=output:2
617 in_port=2 actions=output:1
619 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
621 flow="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=128,frag=no),icmp(type=8,code=0)"
622 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
623 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
624 [Datapath actions: 2,3
627 flow="in_port(2),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=128,frag=no),icmp(type=8,code=0)"
628 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
629 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
630 [Datapath actions: 1,3
637 AT_SETUP([ofproto-dpif - mirroring, select_src])
639 [add-port br0 p1 -- set Interface p1 type=dummy --\
640 add-port br0 p2 -- set Interface p2 type=dummy --\
641 add-port br0 p3 -- set Interface p3 type=dummy --\
642 set Bridge br0 mirrors=@m --\
643 --id=@p1 get Port p1 -- --id=@p3 get Port p3 --\
644 --id=@m create Mirror name=mymirror \
645 select_src_port=@p1 output_port=@p3], [<0>
648 AT_DATA([flows.txt], [dnl
649 in_port=1 actions=output:2
650 in_port=2 actions=output:1
652 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
654 flow="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=128,frag=no),icmp(type=8,code=0)"
655 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
656 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
657 [Datapath actions: 2,3
660 flow="in_port(2),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=128,frag=no),icmp(type=8,code=0)"
661 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
662 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
668 AT_SETUP([ofproto-dpif - mirroring, OFPP_NONE ingress port])
670 [add-port br0 p1 -- set Interface p1 type=dummy --\
671 add-port br0 p2 -- set Interface p2 type=dummy --\
672 set Bridge br0 mirrors=@m --\
673 --id=@p2 get Port p2 --\
674 --id=@m create Mirror name=mymirror \
675 select_all=true output_port=@p2], [<0>
678 AT_CHECK([ovs-ofctl add-flow br0 action=output:1])
680 # "in_port" defaults to OFPP_NONE if it's not specified.
681 flow="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=128,frag=no),icmp(type=8,code=0)"
682 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
683 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
684 [Datapath actions: 1,2
691 AT_SETUP([ofproto-dpif - mirroring, select_dst])
693 [add-port br0 p1 -- set Interface p1 type=dummy --\
694 add-port br0 p2 -- set Interface p2 type=dummy --\
695 add-port br0 p3 -- set Interface p3 type=dummy --\
696 set Bridge br0 mirrors=@m --\
697 --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
698 --id=@m create Mirror name=mymirror \
699 select_dst_port=@p2 output_port=@p3], [<0>
702 AT_DATA([flows.txt], [dnl
703 in_port=1 actions=output:2
704 in_port=2 actions=output:1
706 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
708 flow="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=128,frag=no),icmp(type=8,code=0)"
709 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
710 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
711 [Datapath actions: 2,3
714 flow="in_port(2),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=128,frag=no),icmp(type=8,code=0)"
715 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
716 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
724 AT_SETUP([ofproto-dpif - mirroring, select_vlan])
726 [add-port br0 p1 -- set Interface p1 type=dummy --\
727 add-port br0 p2 -- set Interface p2 type=dummy --\
728 add-port br0 p3 -- set Interface p3 type=dummy --\
729 set Bridge br0 mirrors=@m --\
730 --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
731 --id=@m create Mirror name=mymirror \
732 select_all=true select_vlan=11 output_port=@p3], [<0>
735 AT_DATA([flows.txt], [dnl
736 in_port=1, actions=output:2
738 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
740 flow="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=128,frag=no),icmp(type=8,code=0)"
741 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
742 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
746 flow="in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x8100),vlan(vid=10,pcp=0),encap(eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0))"
747 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
748 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
752 flow="in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x8100),vlan(vid=11,pcp=0),encap(eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0))"
753 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
754 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
755 [Datapath actions: 2,3
762 AT_SETUP([ofproto-dpif - mirroring, output_port])
764 [add-port br0 p1 -- set Interface p1 type=dummy --\
765 add-port br0 p2 -- set Interface p2 type=dummy --\
766 add-port br0 p3 -- set Interface p3 type=dummy --\
767 set Bridge br0 mirrors=@m --\
768 --id=@p3 get Port p3 --\
769 --id=@m create Mirror name=mymirror \
770 select_all=true output_port=@p3], [<0>
773 AT_DATA([flows.txt], [dnl
774 in_port=1 actions=mod_vlan_vid:17,output:2
775 in_port=2 actions=output:1
777 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
779 flow="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=128,frag=no),icmp(type=8,code=0)"
780 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
781 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
782 [Datapath actions: push_vlan(vid=17,pcp=0),2,pop_vlan,3
785 flow="in_port(2),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=128,frag=no),icmp(type=8,code=0)"
786 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
787 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
788 [Datapath actions: 1,3
794 AT_SETUP([ofproto-dpif - mirroring, output_vlan])
796 [add-port br0 p1 -- set Interface p1 type=dummy --\
797 add-port br0 p2 -- set Interface p2 type=dummy --\
798 set Bridge br0 mirrors=@m --\
799 --id=@m create Mirror name=mymirror \
800 select_all=true output_vlan=12], [<0>
803 AT_DATA([flows.txt], [dnl
804 in_port=1 actions=output:2
805 in_port=2 actions=mod_vlan_vid:17,output:1
807 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
809 flow="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=128,frag=no),icmp(type=8,code=0)"
810 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
811 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
813 expected="2,push_vlan(vid=12,pcp=0),0,1,2"
814 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
816 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
818 flow="in_port(2),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=128,frag=no),icmp(type=8,code=0)"
819 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
820 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
822 expected="push_vlan(vid=17,pcp=0),1,pop_vlan,push_vlan(vid=12,pcp=0),0,1,2"
823 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
825 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
830 m4_define([OFPROTO_TRACE],
832 AT_CHECK([ovs-appctl ofproto/trace $1 "$flow" $3], [0], [stdout])
833 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
835 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" $5],
838 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" $5],
841 AT_SETUP([ofproto-dpif - MAC learning])
843 [set bridge br0 fail-mode=standalone -- \
844 add-port br0 p1 -- set Interface p1 type=dummy -- \
845 add-port br0 p2 -- set Interface p2 type=dummy -- \
846 add-port br0 p3 -- set Interface p3 type=dummy])
848 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)'
850 # Trace an ARP packet arriving on p3, to create a MAC learning entry.
853 [in_port(3),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
857 # Check for the MAC learning entry.
858 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
860 3 0 50:54:00:00:00:05 ?
863 # Trace a packet arrival destined for the learned MAC.
864 # (This will also learn a MAC.)
867 [in_port(1),eth(src=50:54:00:00:00:06,dst=50:54:00:00:00:05),$arp],
871 # Check for both MAC learning entries.
872 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
874 3 0 50:54:00:00:00:05 ?
875 1 0 50:54:00:00:00:06 ?
878 # Trace a packet arrival that updates the first learned MAC entry.
881 [in_port(2),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
885 # Check that the MAC learning entry was updated.
886 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
888 1 0 50:54:00:00:00:06 ?
889 2 0 50:54:00:00:00:05 ?
892 # Add another bridge.
896 -- set bridge br1 datapath-type=dummy \
897 -- add-port br1 p4 -- set interface p4 type=dummy \
898 -- add-port br1 p5 -- set interface p5 type=dummy])
900 # Trace some packet arrivals in br1 to create MAC learning entries there too.
903 [in_port(4),eth(src=50:54:00:00:00:06,dst=ff:ff:ff:ff:ff:ff),$arp],
908 [in_port(5),eth(src=50:54:00:00:00:07,dst=ff:ff:ff:ff:ff:ff),$arp],
912 # Check that the MAC learning entries were added.
913 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
915 4 0 50:54:00:00:00:06 ?
916 5 0 50:54:00:00:00:07 ?
919 # Delete port p1 and see that its MAC learning entry disappeared, and
920 # that the MAC learning entry for the same MAC was also deleted from br1.
921 AT_CHECK([ovs-vsctl del-port p1])
922 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
924 2 0 50:54:00:00:00:05 ?
926 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
928 5 0 50:54:00:00:00:07 ?
934 dnl Test that basic NetFlow reports flow statistics correctly:
935 dnl - The initial packet of a flow are correctly accounted.
936 dnl - Later packets within a flow are correctly accounted.
937 dnl - Flow actions changing (in this case, due to MAC learning)
938 dnl cause a record to be sent.
939 AT_SETUP([ofproto-dpif - NetFlow flow expiration])
941 AT_CHECK([perl $srcdir/choose-port.pl], [0], [stdout])
942 NETFLOW_PORT=`cat stdout`
945 [set Bridge br0 fail-mode=standalone -- \
946 add-port br0 p1 -- set Interface p1 type=dummy -- \
947 add-port br0 p2 -- set Interface p2 type=dummy -- \
948 set Bridge br0 netflow=@nf -- \
949 --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
950 engine_id=1 engine_type=2 active_timeout=30 \
951 add-id-to-interface=false], [<0>
954 ON_EXIT([kill `cat test-netflow.pid`])
955 AT_CHECK([test-netflow --detach --no-chdir --pidfile $NETFLOW_PORT:127.0.0.1 > netflow.log])
956 AT_CAPTURE_FILE([netflow.log])
958 for delay in 1000 30000; do
959 ovs-appctl netdev-dummy/receive p1 'in_port(2),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)'
960 ovs-appctl netdev-dummy/receive p2 'in_port(1),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)'
962 ovs-appctl time/warp $delay
967 ovs-appctl -t test-netflow exit
969 AT_CHECK([[sed -e 's/, uptime [0-9]*//
971 s/time \([0-9]*\)\.\.\.\1$/time <moment>/
972 s/time [0-9]*\.\.\.[0-9]*/time <range>/
973 ' netflow.log | sort]], [0],
975 header: v5, seq 0, engine 2,1
976 header: v5, seq 1, engine 2,1
977 seq 0: 192.168.0.1 > 192.168.0.2, if 1 > 65535, 1 pkts, 60 bytes, ICMP 8:0, time <moment>
978 seq 1: 192.168.0.1 > 192.168.0.2, if 1 > 2, 1 pkts, 60 bytes, ICMP 8:0, time <moment>
979 seq 1: 192.168.0.2 > 192.168.0.1, if 2 > 1, 2 pkts, 120 bytes, ICMP 0:0, time <range>
983 dnl Test that basic NetFlow reports active expirations correctly.
984 AT_SETUP([ofproto-dpif - NetFlow active expiration])
986 AT_CHECK([perl $srcdir/choose-port.pl], [0], [stdout])
987 NETFLOW_PORT=`cat stdout`
990 [set Bridge br0 fail-mode=standalone -- \
991 add-port br0 p1 -- set Interface p1 type=dummy -- \
992 add-port br0 p2 -- set Interface p2 type=dummy -- \
993 set Bridge br0 netflow=@nf -- \
994 --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
995 engine_id=1 engine_type=2 active_timeout=10 \
996 add-id-to-interface=false], [<0>
999 ON_EXIT([kill `test-netflow.pid`])
1000 AT_CHECK([test-netflow --detach --no-chdir --pidfile $NETFLOW_PORT:127.0.0.1 > netflow.log])AT_CAPTURE_FILE([netflow.log])
1002 AT_CHECK([ovs-appctl time/stop])
1004 while test $n -le 60; do
1007 ovs-appctl netdev-dummy/receive p1 'in_port(2),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=1234,dst=80)'
1008 ovs-appctl netdev-dummy/receive p2 'in_port(1),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=6,tos=0,ttl=64,frag=no),tcp(src=80,dst=1234)'
1010 ovs-appctl time/warp 1000
1013 ovs-appctl time/warp 10000
1017 ovs-appctl -t test-netflow exit
1019 # Count the number of reported packets:
1020 # - From source to destination before MAC learning kicks in (just one).
1021 # - From source to destination after that.
1022 # - From destination to source.
1030 pkts=`echo "$line" | sed 's/.*, \([[0-9]]*\) pkts,.*/\1/'`
1037 "seq "*": 192.168.0.1 > 192.168.0.2, if 1 > 65535, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
1040 "seq "*": 192.168.0.1 > 192.168.0.2, if 1 > 2, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
1043 "seq "*": 192.168.0.2 > 192.168.0.1, if 2 > 1, "*" pkts, "*" bytes, TCP 80 > 1234, time "*)
1050 eval $counter=\`expr \$$counter + \$pkts\`
1051 n_recs=`expr $n_recs + 1`
1054 # There should be exactly 1 MAC learning packet,
1055 # exactly 59 other packets in that direction,
1056 # and exactly 60 packets in the other direction.
1057 AT_CHECK([echo $n_learn $n_in $n_out $n_other], [0], [1 59 60 0
1060 # There should be 1 expiration for MAC learning,
1061 # at least 5 active and a final expiration in one direction,
1062 # and at least 5 active and a final expiration in the other direction.
1064 AT_CHECK([test $n_recs -ge 13])
1068 AT_SETUP([idle_age and hard_age increase over time])
1071 # get_ages DURATION HARD IDLE
1073 # Fetch the flow duration, hard age, and idle age into the variables
1074 # whose names are given as arguments. Rounds DURATION down to the
1075 # nearest integer. If hard_age doesn't appear in the output, sets
1076 # HARD to "none". If idle_age doesn't appear in the output, sets IDLE
1079 AT_CHECK([ovs-ofctl dump-flows br0], [0], [stdout])
1081 duration=`sed -n 's/.*duration=\([[0-9]]*\)\(\.[[0-9]]*\)\{0,1\}s.*/\1/p' stdout`
1082 AT_CHECK([[expr X"$duration" : 'X[0-9][0-9]*$']], [0], [ignore])
1083 AS_VAR_COPY([$1], [duration])
1085 hard=`sed -n 's/.*hard_age=\([[0-9]]*\),.*/\1/p' stdout`
1086 if test X"$hard" = X; then
1089 AT_CHECK([[expr X"$hard" : 'X[0-9][0-9]*$']], [0], [ignore])
1091 AS_VAR_COPY([$2], [hard])
1093 idle=`sed -n 's/.*idle_age=\([[0-9]]*\),.*/\1/p' stdout`
1094 if test X"$idle" = X; then
1097 AT_CHECK([[expr X"$idle" : 'X[0-9][0-9]*$']], [0], [ignore])
1099 AS_VAR_COPY([$3], [idle])
1102 # Add a flow and get its initial hard and idle age.
1103 AT_CHECK([ovs-ofctl add-flow br0 hard_timeout=199,idle_timeout=188,actions=drop])
1104 get_ages duration1 hard1 idle1
1106 # Warp time forward by 10 seconds, then modify the flow's actions.
1107 ovs-appctl time/warp 10000
1108 get_ages duration2 hard2 idle2
1109 AT_CHECK([ovs-ofctl mod-flows br0 actions=flood])
1111 # Warp time forward by 10 seconds.
1112 ovs-appctl time/warp 10000
1113 get_ages duration3 hard3 idle3
1115 # Warp time forward 10 more seconds, then pass some packets through the flow,
1116 # then warp forward a few more times because idle times are only updated
1118 ovs-appctl time/warp 10000
1119 ovs-appctl netdev-dummy/receive br0 'in_port(0),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=6,tos=0,ttl=64,frag=no),tcp(src=80,dst=1234)'
1120 ovs-appctl time/warp 1000
1121 ovs-appctl time/warp 1000
1122 ovs-appctl time/warp 1000
1123 get_ages duration4 hard4 idle4
1125 printf "duration: %4s => %4s => %4s => %4s\n" $duration1 $duration2 $duration3 $duration4
1126 printf "hard_age: %4s => %4s => %4s => %4s\n" $hard1 $hard2 $hard3 $hard4
1127 printf "idle_age: %4s => %4s => %4s => %4s\n" $idle1 $idle2 $idle3 $idle4
1129 # Duration should increase steadily over time.
1130 AT_CHECK([test $duration1 -lt $duration2])
1131 AT_CHECK([test $duration2 -lt $duration3])
1132 AT_CHECK([test $duration3 -lt $duration4])
1134 # Hard age should be "none" initially because it's the same as flow_duration,
1135 # then it should increase.
1136 AT_CHECK([test $hard1 = none])
1137 AT_CHECK([test $hard2 = none])
1138 AT_CHECK([test $hard3 != none])
1139 AT_CHECK([test $hard4 != none])
1140 AT_CHECK([test $hard3 -lt $hard4])
1142 # Idle age should increase from 1 to 2 to 3, then decrease.
1143 AT_CHECK([test $idle1 -lt $idle2])
1144 AT_CHECK([test $idle2 -lt $idle3])
1145 AT_CHECK([test $idle3 -gt $idle4])
1147 # Check some invariant relationships.
1148 AT_CHECK([test $duration1 = $idle1])
1149 AT_CHECK([test $duration2 = $idle2])
1150 AT_CHECK([test $duration3 = $idle3])
1151 AT_CHECK([test $idle3 -gt $hard3])
1152 AT_CHECK([test $idle4 -lt $hard4])
1153 AT_CHECK([test $hard4 -lt $duration4])
1158 AT_SETUP([ofproto-dpif - fin_timeout])
1160 AT_DATA([flows.txt], [dnl
1161 in_port=1 actions=output:2
1162 in_port=2 actions=mod_vlan_vid:17,output:1
1164 AT_CHECK([ovs-ofctl add-flow br0 'idle_timeout=60,actions=fin_timeout(idle_timeout=5)'])
1165 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
1167 idle_timeout=60, actions=fin_timeout(idle_timeout=5)
1169 # Check that a TCP SYN packet does not change the timeout. (Because
1170 # flow stats updates are mainly what implements the fin_timeout
1171 # feature, we warp forward a couple of times to ensure that flow stats
1172 # run before re-checking the flow table.)
1173 AT_CHECK([ovs-appctl netdev-dummy/receive br0 0021853763af0026b98cb0f908004500003c2e2440004006465dac11370dac11370b828b0016751e267b00000000a00216d017360000020405b40402080a2d25085f0000000001030307], [0], [success
1175 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
1178 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
1180 n_packets=1, n_bytes=74, idle_timeout=60, actions=fin_timeout(idle_timeout=5)
1182 # Check that a TCP FIN packet does change the timeout.
1183 AT_CHECK([ovs-appctl netdev-dummy/receive br0 0021853763af0026b98cb0f90800451000342e3e40004006463bac11370dac11370b828b0016751e319dfc96399b801100717ae800000101080a2d250a9408579588], [0], [success
1185 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
1188 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
1190 n_packets=2, n_bytes=140, idle_timeout=5, actions=fin_timeout(idle_timeout=5)