1 AT_BANNER([ofproto-dpif])
3 AT_SETUP([ofproto-dpif - resubmit])
5 AT_DATA([flows.txt], [dnl
6 table=0 in_port=1 priority=1000 icmp actions=output(10),resubmit(2),output(19),resubmit(3),output(21)
7 table=0 in_port=2 priority=1500 icmp actions=output(11),resubmit(,1),output(16),resubmit(2,1),output(18)
8 table=0 in_port=3 priority=2000 icmp actions=output(20)
9 table=1 in_port=1 priority=1000 icmp actions=output(12),resubmit(4,1),output(13),resubmit(3),output(15)
10 table=1 in_port=2 priority=1500 icmp actions=output(17),resubmit(,2)
11 table=1 in_port=3 priority=1500 icmp actions=output(14),resubmit(,2)
13 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
14 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])
15 AT_CHECK([tail -1 stdout], [0],
16 [Datapath actions: 10,11,12,13,14,15,16,17,18,19,20,21
21 AT_SETUP([ofproto-dpif - registers])
23 AT_DATA([flows.txt], [dnl
24 in_port=90 actions=resubmit:2,resubmit:3,resubmit:4,resubmit:91
25 in_port=91 actions=resubmit:5,resubmit:6,resubmit:7,resubmit:92
26 in_port=92 actions=resubmit:8,resubmit:9,resubmit:10,resubmit:11,resubmit:93
27 in_port=93 actions=resubmit:12,resubmit:13,resubmit:14,resubmit:15
29 in_port=2 actions=load:0x000db000->NXM_NX_REG0[[]]
30 in_port=3 actions=load:0xdea->NXM_NX_REG0[[20..31]]
31 in_port=4 actions=load:0xeef->NXM_NX_REG0[[0..11]]
32 in_port=5 actions=move:NXM_NX_REG0[[]]->NXM_NX_REG1[[]]
33 in_port=6 actions=load:0x22222222->NXM_NX_REG2[[]]
34 in_port=7 actions=move:NXM_NX_REG1[[20..31]]->NXM_NX_REG2[[0..11]]
35 in_port=8 actions=move:NXM_NX_REG1[[0..11]]->NXM_NX_REG2[[20..31]]
36 in_port=9,reg0=0xdeadbeef actions=output:20
37 in_port=10,reg1=0xdeadbeef actions=output:21
38 in_port=11,reg2=0xeef22dea actions=output:22
40 dnl Sanilty check all registers
41 in_port=12 actions=load:0x10->NXM_NX_REG0[[]],load:0x11->NXM_NX_REG1[[]],load:0x12->NXM_NX_REG2[[]]
42 in_port=13 actions=load:0x13->NXM_NX_REG3[[]],load:0x14->NXM_NX_REG4[[]],load:0x15->NXM_NX_REG5[[]]
43 in_port=14 actions=load:0x16->NXM_NX_REG6[[]],load:0x17->NXM_NX_REG7[[]]
44 in_port=15,reg0=0x10,reg1=0x11,reg2=0x12,reg3=0x13,reg4=0x14,reg5=0x15,reg6=0x16,reg7=0x17 actions=output:33
46 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
47 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])
48 AT_CHECK([tail -1 stdout], [0],
49 [Datapath actions: 20,21,22,33
54 AT_SETUP([ofproto-dpif - output])
56 AT_DATA([flows.txt], [dnl
57 in_port=1 actions=resubmit:2,resubmit:3,resubmit:4,resubmit:5,resubmit:6,resubmit:7
58 in_port=2 actions=output:9
59 in_port=3 actions=load:55->NXM_NX_REG0[[]],output:NXM_NX_REG0[[]],load:66->NXM_NX_REG1[[]]
60 in_port=4 actions=output:10,output:NXM_NX_REG0[[]],output:NXM_NX_REG1[[]],output:11
61 in_port=5 actions=load:77->NXM_NX_REG0[[0..15]],load:88->NXM_NX_REG0[[16..31]]
62 in_port=6 actions=output:NXM_NX_REG0[[0..15]],output:NXM_NX_REG0[[16..31]]
63 in_port=7 actions=load:0x110000ff->NXM_NX_REG0[[]],output:NXM_NX_REG0[[]]
65 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
66 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])
67 AT_CHECK([tail -1 stdout], [0],
68 [Datapath actions: 9,55,10,55,66,11,77,88
73 AT_SETUP([ofproto-dpif - dec_ttl])
75 AT_DATA([flows.txt], [dnl
76 table=0 in_port=1 action=dec_ttl,output:2,resubmit(1,1),output:4
77 table=1 in_port=1 action=dec_ttl,output:3
79 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
80 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])
81 AT_CHECK([tail -3 stdout], [0],
82 [Datapath actions: set(ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=1,frag=no)),2,4
83 This flow is handled by the userspace slow path because it:
84 - Sends "packet-in" messages to the OpenFlow controller.
86 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])
87 AT_CHECK([tail -1 stdout], [0],
88 [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
90 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])
91 AT_CHECK([tail -1 stdout], [0],
92 [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
95 AT_CAPTURE_FILE([ofctl_monitor.log])
96 AT_CHECK([ovs-ofctl monitor br0 65534 invalid_ttl --detach --pidfile 2> ofctl_monitor.log])
97 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])
98 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
99 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
100 NXT_PACKET_IN (xid=0x0): table_id=1 total_len=42 in_port=1 tun_id=0x0 metadata=0x0 reg0=0x0 reg1=0x0 reg2=0x0 reg3=0x0 reg4=0x0 reg5=0x0 reg6=0x0 reg7=0x0 (via invalid_ttl) data_len=42 (unbuffered)
101 priority:0,tunnel:0,metadata:0,in_port:0000,tci(0) mac(50:54:00:00:00:05->50:54:00:00:00:07) type:0800 proto:1 tos:0 ttl:1 ip(192.168.0.1->192.168.0.2)
107 AT_SETUP([ofproto-dpif - output, OFPP_NONE ingress port])
109 [add-port br0 p1 -- set Interface p1 type=dummy --\
110 add-port br0 p2 -- set Interface p2 type=dummy])
112 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
114 # "in_port" defaults to OFPP_NONE if it's not specified.
115 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)"
116 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
117 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
120 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
122 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
127 AT_SETUP([ofproto-dpif - DSCP])
128 OVS_VSWITCHD_START([add-port br0 p1 -- set Interface p1 type=dummy])
129 AT_DATA([flows.txt], [dnl
130 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
132 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
133 AT_CHECK([ovs-vsctl -- \
134 set Port p1 qos=@newqos --\
135 --id=@newqos create QoS type=linux-htb queues=1=@q1,2=@q2 --\
136 --id=@q1 create Queue dscp=1 --\
137 --id=@q2 create Queue dscp=2], [0], [ignore])
138 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])
139 AT_CHECK([tail -1 stdout], [0],
140 [Datapath actions: dnl
142 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
143 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
145 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
146 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
147 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0x3,ttl=128,frag=no)),1,dnl
153 AT_SETUP([ofproto-dpif - output/flood flags])
154 OVS_VSWITCHD_START([dnl
155 add-port br0 p1 -- set Interface p1 type=dummy --\
156 add-port br0 p2 -- set Interface p2 type=dummy --\
157 add-port br0 p3 -- set Interface p3 type=dummy --\
158 add-port br0 p4 -- set Interface p4 type=dummy --\
159 add-port br0 p5 -- set Interface p5 type=dummy --\
160 add-port br0 p6 -- set Interface p6 type=dummy --\
161 add-port br0 p7 -- set Interface p7 type=dummy ])
163 AT_DATA([flows.txt], [dnl
164 in_port=local actions=local,flood
165 in_port=1 actions=flood
166 in_port=2 actions=all
167 in_port=3 actions=output:65534,output:1,output:2,output:3,output:4,output:5,output:6,output:7
168 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
170 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
171 AT_CHECK([ovs-ofctl mod-port br0 5 noforward])
172 AT_CHECK([ovs-ofctl mod-port br0 6 noflood])
174 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])
175 AT_CHECK([tail -1 stdout \
176 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
184 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])
185 AT_CHECK([tail -1 stdout \
186 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
194 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])
195 AT_CHECK([tail -1 stdout \
196 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
205 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])
206 AT_CHECK([tail -1 stdout], [0],
207 [Datapath actions: 0,1,2,4,6,7
210 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])
211 AT_CHECK([tail -1 stdout], [0],
212 [Datapath actions: set(priority(1)),0,1,2,set(priority(2)),3,set(priority(1)),6,7
217 AT_SETUP([ofproto-dpif - set_tunnel])
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 --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,tunnel:0,metadata:0,in_port:0000,tci(0) mac(50:54:00:00:00:05->50:54:00:00:00:07) type:0800 proto:6 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->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,tunnel:0,metadata:0,in_port:0000,tci(0) mac(50:54:00:00:00:05->50:54:00:00:00:07) type:0800 proto:6 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->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,tunnel:0,metadata:0,in_port:0000,tci(0) mac(50:54:00:00:00:05->50:54:00:00:00:07) type:0800 proto:6 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->9) tcp_csum:0
275 dnl Singleton controller action.
276 AT_CHECK([ovs-ofctl monitor -P openflow10 br0 65534 --detach --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,tunnel:0,metadata:0,in_port:0000,tci(0) mac(10:11:11:11:11:11->50:54:00:00:00:07) type:0800 proto:6 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->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,tunnel:0,metadata:0,in_port:0000,tci(0) mac(10:11:11:11:11:11->50:54:00:00:00:07) type:0800 proto:6 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->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,tunnel:0,metadata:0,in_port:0000,tci(0) mac(10:11:11:11:11:11->50:54:00:00:00:07) type:0800 proto:6 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->10) tcp_csum:0
294 dnl Modified controller action.
295 AT_CHECK([ovs-ofctl monitor -P openflow10 br0 65534 --detach --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,tunnel:0,metadata:0,in_port:0000,tci(vlan:15,pcp:0) mac(30:33:33:33:33:33->50:54:00:00:00:07) type:0800 proto:6 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->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,tunnel:0,metadata:0,in_port:0000,tci(vlan:15,pcp:0) mac(30:33:33:33:33:33->50:54:00:00:00:07) type:0800 proto:6 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->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,tunnel:0,metadata:0,in_port:0000,tci(vlan:15,pcp:0) mac(30:33:33:33:33:33->50:54:00:00:00:07) type:0800 proto:6 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->10) tcp_csum:0
314 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --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 tun_id=0x0 metadata=0x0 reg0=0x0 reg1=0x0 reg2=0x0 reg3=0x0 reg4=0x0 reg5=0x0 reg6=0x0 reg7=0x0 (via action) data_len=60 (unbuffered)
323 priority:0,tunnel:0,metadata:0,in_port:0000,tci(0) mac(20:22:22:22:22:22->50:54:00:00:00:07) type:0800 proto:6 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->11) tcp_csum:0
325 NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x3 total_len=64 in_port=1 tun_id=0x0 metadata=0x0 reg0=0x1 reg1=0x0 reg2=0x0 reg3=0x0 reg4=0x0 reg5=0x0 reg6=0x0 reg7=0x0 (via action) data_len=64 (unbuffered)
326 priority:0,tunnel:0,metadata:0,in_port:0000,tci(vlan:80,pcp:0) mac(20:22:22:22:22:22->50:54:00:00:00:07) type:0800 proto:6 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->11) tcp_csum:0
328 NXT_PACKET_IN (xid=0x0): table_id=2 cookie=0x4 total_len=64 in_port=1 tun_id=0x0 metadata=0x0 reg0=0x1 reg1=0x2 reg2=0x0 reg3=0x0 reg4=0x0 reg5=0x0 reg6=0x0 reg7=0x0 (via action) data_len=64 (unbuffered)
329 priority:0,tunnel:0,metadata:0,in_port:0000,tci(vlan:80,pcp:0) mac(80:81:81:81:81:81->50:54:00:00:00:07) type:0800 proto:6 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->11) tcp_csum:0
331 NXT_PACKET_IN (xid=0x0): table_id=3 cookie=0x5 total_len=64 in_port=1 tun_id=0x0 metadata=0x0 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x0 reg4=0x0 reg5=0x0 reg6=0x0 reg7=0x0 (via action) data_len=64 (unbuffered)
332 priority:0,tunnel:0,metadata:0,in_port:0000,tci(vlan:80,pcp:0) mac(80:81:81:81:81:81->82:82:82:82:82:82) type:0800 proto:6 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->11) tcp_csum:0
334 NXT_PACKET_IN (xid=0x0): table_id=4 cookie=0x6 total_len=64 in_port=1 tun_id=0x0 metadata=0x0 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x0 reg5=0x0 reg6=0x0 reg7=0x0 (via action) data_len=64 (unbuffered)
335 priority:0,tunnel:0,metadata:0,in_port:0000,tci(vlan:80,pcp:0) mac(80:81:81:81:81:81->82:82:82:82:82:82) type:0800 proto:6 tos:0 ttl:0 ip(83.83.83.83->192.168.0.2) port(8->11) tcp_csum:1a03
337 NXT_PACKET_IN (xid=0x0): table_id=5 cookie=0x7 total_len=64 in_port=1 tun_id=0x6 metadata=0x0 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 reg5=0x0 reg6=0x0 reg7=0x0 (via action) data_len=64 (unbuffered)
338 priority:0,tunnel:0,metadata:0,in_port:0000,tci(vlan:80,pcp:0) mac(80:81:81:81:81:81->82:82:82:82:82:82) type:0800 proto:6 tos:0 ttl:0 ip(83.83.83.83->84.84.84.84) port(8->11) tcp_csum:3205
340 NXT_PACKET_IN (xid=0x0): table_id=6 cookie=0x8 total_len=64 in_port=1 tun_id=0x6 metadata=0x0 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 reg5=0x0 reg6=0x0 reg7=0x0 (via action) data_len=64 (unbuffered)
341 priority:0,tunnel:0,metadata:0,in_port:0000,tci(vlan:80,pcp:0) mac(80:81:81:81:81:81->82:82:82:82:82:82) type:0800 proto:6 tos:0 ttl:0 ip(83.83.83.83->84.84.84.84) port(85->11) tcp_csum:31b8
343 NXT_PACKET_IN (xid=0x0): table_id=7 cookie=0x9 total_len=64 in_port=1 tun_id=0x6 metadata=0x0 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 reg5=0x0 reg6=0x0 reg7=0x0 (via action) data_len=64 (unbuffered)
344 priority:0,tunnel:0,metadata:0,in_port:0000,tci(vlan:80,pcp:0) mac(80:81:81:81:81:81->82:82:82:82:82:82) type:0800 proto:6 tos:0 ttl:0 ip(83.83.83.83->84.84.84.84) port(85->86) tcp_csum:316d
346 NXT_PACKET_IN (xid=0x0): table_id=7 cookie=0x9 total_len=64 in_port=1 tun_id=0x6 metadata=0x0 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 reg5=0x0 reg6=0x0 reg7=0x0 (via action) data_len=64 (unbuffered)
347 priority:0,tunnel:0,metadata:0,in_port:0000,tci(vlan:80,pcp:0) mac(80:81:81:81:81:81->82:82:82:82:82:82) type:0800 proto:6 tos:0 ttl:0 ip(83.83.83.83->84.84.84.84) port(85->86) tcp_csum:316d
351 AT_CHECK([ovs-ofctl monitor br0 65534 --detach --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 tun_id=0x0 metadata=0x0 reg0=0x0 reg1=0x0 reg2=0x0 reg3=0x0 reg4=0x0 reg5=0x0 reg6=0x0 reg7=0x0 (via action) data_len=60 (unbuffered)
360 priority:0,tunnel:0,metadata:0,in_port:0000,tci(0) mac(20:22:22:22:22:22->50:54:00:00:00:07) type:0800 proto:17 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->11) udp_csum:1234
362 NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x3 total_len=64 in_port=1 tun_id=0x0 metadata=0x0 reg0=0x1 reg1=0x0 reg2=0x0 reg3=0x0 reg4=0x0 reg5=0x0 reg6=0x0 reg7=0x0 (via action) data_len=64 (unbuffered)
363 priority:0,tunnel:0,metadata:0,in_port:0000,tci(vlan:80,pcp:0) mac(20:22:22:22:22:22->50:54:00:00:00:07) type:0800 proto:17 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->11) udp_csum:1234
365 NXT_PACKET_IN (xid=0x0): table_id=2 cookie=0x4 total_len=64 in_port=1 tun_id=0x0 metadata=0x0 reg0=0x1 reg1=0x2 reg2=0x0 reg3=0x0 reg4=0x0 reg5=0x0 reg6=0x0 reg7=0x0 (via action) data_len=64 (unbuffered)
366 priority:0,tunnel:0,metadata:0,in_port:0000,tci(vlan:80,pcp:0) mac(80:81:81:81:81:81->50:54:00:00:00:07) type:0800 proto:17 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->11) udp_csum:1234
368 NXT_PACKET_IN (xid=0x0): table_id=3 cookie=0x5 total_len=64 in_port=1 tun_id=0x0 metadata=0x0 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x0 reg4=0x0 reg5=0x0 reg6=0x0 reg7=0x0 (via action) data_len=64 (unbuffered)
369 priority:0,tunnel:0,metadata:0,in_port:0000,tci(vlan:80,pcp:0) mac(80:81:81:81:81:81->82:82:82:82:82:82) type:0800 proto:17 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->11) udp_csum:1234
371 NXT_PACKET_IN (xid=0x0): table_id=4 cookie=0x6 total_len=64 in_port=1 tun_id=0x0 metadata=0x0 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x0 reg5=0x0 reg6=0x0 reg7=0x0 (via action) data_len=64 (unbuffered)
372 priority:0,tunnel:0,metadata:0,in_port:0000,tci(vlan:80,pcp:0) mac(80:81:81:81:81:81->82:82:82:82:82:82) type:0800 proto:17 tos:0 ttl:0 ip(83.83.83.83->192.168.0.2) port(8->11) udp_csum:2c37
374 NXT_PACKET_IN (xid=0x0): table_id=5 cookie=0x7 total_len=64 in_port=1 tun_id=0x6 metadata=0x0 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 reg5=0x0 reg6=0x0 reg7=0x0 (via action) data_len=64 (unbuffered)
375 priority:0,tunnel:0,metadata:0,in_port:0000,tci(vlan:80,pcp:0) mac(80:81:81:81:81:81->82:82:82:82:82:82) type:0800 proto:17 tos:0 ttl:0 ip(83.83.83.83->84.84.84.84) port(8->11) udp_csum:4439
377 NXT_PACKET_IN (xid=0x0): table_id=6 cookie=0x8 total_len=64 in_port=1 tun_id=0x6 metadata=0x0 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 reg5=0x0 reg6=0x0 reg7=0x0 (via action) data_len=64 (unbuffered)
378 priority:0,tunnel:0,metadata:0,in_port:0000,tci(vlan:80,pcp:0) mac(80:81:81:81:81:81->82:82:82:82:82:82) type:0800 proto:17 tos:0 ttl:0 ip(83.83.83.83->84.84.84.84) port(85->11) udp_csum:43ec
380 NXT_PACKET_IN (xid=0x0): table_id=7 cookie=0x9 total_len=64 in_port=1 tun_id=0x6 metadata=0x0 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 reg5=0x0 reg6=0x0 reg7=0x0 (via action) data_len=64 (unbuffered)
381 priority:0,tunnel:0,metadata:0,in_port:0000,tci(vlan:80,pcp:0) mac(80:81:81:81:81:81->82:82:82:82:82:82) type:0800 proto:17 tos:0 ttl:0 ip(83.83.83.83->84.84.84.84) port(85->86) udp_csum:43a1
383 NXT_PACKET_IN (xid=0x0): table_id=7 cookie=0x9 total_len=64 in_port=1 tun_id=0x6 metadata=0x0 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 reg5=0x0 reg6=0x0 reg7=0x0 (via action) data_len=64 (unbuffered)
384 priority:0,tunnel:0,metadata:0,in_port:0000,tci(vlan:80,pcp:0) mac(80:81:81:81:81:81->82:82:82:82:82:82) type:0800 proto:17 tos:0 ttl:0 ip(83.83.83.83->84.84.84.84) port(85->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 AT_DATA([flows.txt], [dnl
541 priority=75 tcp ip_frag=no tp_dst=80 actions=output:1
542 priority=75 tcp ip_frag=first tp_dst=80 actions=output:2
543 priority=75 tcp ip_frag=later tp_dst=80 actions=output:3
544 priority=50 tcp ip_frag=no actions=output:4
545 priority=50 tcp ip_frag=first actions=output:5
546 priority=50 tcp ip_frag=later actions=output:6
548 AT_CHECK([ovs-ofctl replace-flows br0 flows.txt])
550 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"
551 no_flow="$base_flow,frag=no),tcp(src=12345,dst=80)"
552 first_flow="$base_flow,frag=first),tcp(src=12345,dst=80)"
553 later_flow="$base_flow,frag=later)"
555 # mode no first later
567 AT_CHECK([ovs-ofctl set-frags br0 $mode])
568 for type in no first later; do
569 eval flow=\$${type}_flow exp_output=\$$type
570 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
571 AT_CHECK_UNQUOTED([tail -1 stdout], [0], [Datapath actions: $exp_output
578 AT_SETUP([ofproto-dpif - exit])
580 AT_DATA([flows.txt], [dnl
581 in_port=1 actions=output:10,exit,output:11
582 in_port=2 actions=output:12,resubmit:1,output:12
583 in_port=3 actions=output:13,resubmit:2,output:14
585 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
586 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])
587 AT_CHECK([tail -1 stdout], [0],
588 [Datapath actions: 10
590 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])
591 AT_CHECK([tail -1 stdout], [0],
592 [Datapath actions: 12,10
594 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])
595 AT_CHECK([tail -1 stdout], [0],
596 [Datapath actions: 13,12,10
602 AT_SETUP([ofproto-dpif - mirroring, select_all])
604 [add-port br0 p1 -- set Interface p1 type=dummy --\
605 add-port br0 p2 -- set Interface p2 type=dummy --\
606 add-port br0 p3 -- set Interface p3 type=dummy --\
607 set Bridge br0 mirrors=@m --\
608 --id=@p3 get Port p3 --\
609 --id=@m create Mirror name=mymirror \
610 select_all=true output_port=@p3], [<0>
613 AT_DATA([flows.txt], [dnl
614 in_port=1 actions=output:2
615 in_port=2 actions=output:1
617 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
619 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)"
620 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
621 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
622 [Datapath actions: 2,3
625 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)"
626 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
627 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
628 [Datapath actions: 1,3
635 AT_SETUP([ofproto-dpif - mirroring, select_src])
637 [add-port br0 p1 -- set Interface p1 type=dummy --\
638 add-port br0 p2 -- set Interface p2 type=dummy --\
639 add-port br0 p3 -- set Interface p3 type=dummy --\
640 set Bridge br0 mirrors=@m --\
641 --id=@p1 get Port p1 -- --id=@p3 get Port p3 --\
642 --id=@m create Mirror name=mymirror \
643 select_src_port=@p1 output_port=@p3], [<0>
646 AT_DATA([flows.txt], [dnl
647 in_port=1 actions=output:2
648 in_port=2 actions=output:1
650 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
652 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)"
653 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
654 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
655 [Datapath actions: 2,3
658 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)"
659 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
660 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
666 AT_SETUP([ofproto-dpif - mirroring, OFPP_NONE ingress port])
668 [add-port br0 p1 -- set Interface p1 type=dummy --\
669 add-port br0 p2 -- set Interface p2 type=dummy --\
670 set Bridge br0 mirrors=@m --\
671 --id=@p2 get Port p2 --\
672 --id=@m create Mirror name=mymirror \
673 select_all=true output_port=@p2], [<0>
676 AT_CHECK([ovs-ofctl add-flow br0 action=output:1])
678 # "in_port" defaults to OFPP_NONE if it's not specified.
679 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)"
680 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
681 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
682 [Datapath actions: 1,2
689 AT_SETUP([ofproto-dpif - mirroring, select_dst])
691 [add-port br0 p1 -- set Interface p1 type=dummy --\
692 add-port br0 p2 -- set Interface p2 type=dummy --\
693 add-port br0 p3 -- set Interface p3 type=dummy --\
694 set Bridge br0 mirrors=@m --\
695 --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
696 --id=@m create Mirror name=mymirror \
697 select_dst_port=@p2 output_port=@p3], [<0>
700 AT_DATA([flows.txt], [dnl
701 in_port=1 actions=output:2
702 in_port=2 actions=output:1
704 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
706 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)"
707 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
708 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
709 [Datapath actions: 2,3
712 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)"
713 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
714 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
722 AT_SETUP([ofproto-dpif - mirroring, select_vlan])
724 [add-port br0 p1 -- set Interface p1 type=dummy --\
725 add-port br0 p2 -- set Interface p2 type=dummy --\
726 add-port br0 p3 -- set Interface p3 type=dummy --\
727 set Bridge br0 mirrors=@m --\
728 --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
729 --id=@m create Mirror name=mymirror \
730 select_all=true select_vlan=11 output_port=@p3], [<0>
733 AT_DATA([flows.txt], [dnl
734 in_port=1, actions=output:2
736 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
738 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)"
739 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
740 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
744 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))"
745 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
746 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
750 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))"
751 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
752 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
753 [Datapath actions: 2,3
760 AT_SETUP([ofproto-dpif - mirroring, output_port])
762 [add-port br0 p1 -- set Interface p1 type=dummy --\
763 add-port br0 p2 -- set Interface p2 type=dummy --\
764 add-port br0 p3 -- set Interface p3 type=dummy --\
765 set Bridge br0 mirrors=@m --\
766 --id=@p3 get Port p3 --\
767 --id=@m create Mirror name=mymirror \
768 select_all=true output_port=@p3], [<0>
771 AT_DATA([flows.txt], [dnl
772 in_port=1 actions=mod_vlan_vid:17,output:2
773 in_port=2 actions=output:1
775 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
777 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)"
778 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
779 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
780 [Datapath actions: push_vlan(vid=17,pcp=0),2,pop_vlan,3
783 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)"
784 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
785 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
786 [Datapath actions: 1,3
792 AT_SETUP([ofproto-dpif - mirroring, output_vlan])
794 [add-port br0 p1 -- set Interface p1 type=dummy --\
795 add-port br0 p2 -- set Interface p2 type=dummy --\
796 set Bridge br0 mirrors=@m --\
797 --id=@m create Mirror name=mymirror \
798 select_all=true output_vlan=12], [<0>
801 AT_DATA([flows.txt], [dnl
802 in_port=1 actions=output:2
803 in_port=2 actions=mod_vlan_vid:17,output:1
805 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
807 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)"
808 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
809 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
811 expected="2,push_vlan(vid=12,pcp=0),0,1,2"
812 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
814 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
816 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)"
817 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
818 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
820 expected="push_vlan(vid=17,pcp=0),1,pop_vlan,push_vlan(vid=12,pcp=0),0,1,2"
821 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
823 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
828 m4_define([OFPROTO_TRACE],
830 AT_CHECK([ovs-appctl ofproto/trace $1 "$flow" $3], [0], [stdout])
831 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
833 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" $5],
836 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" $5],
839 AT_SETUP([ofproto-dpif - MAC learning])
841 [set bridge br0 fail-mode=standalone -- \
842 add-port br0 p1 -- set Interface p1 type=dummy -- \
843 add-port br0 p2 -- set Interface p2 type=dummy -- \
844 add-port br0 p3 -- set Interface p3 type=dummy])
846 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)'
848 # Trace an ARP packet arriving on p3, to create a MAC learning entry.
851 [in_port(3),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
855 # Check for the MAC learning entry.
856 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
858 3 0 50:54:00:00:00:05 ?
861 # Trace a packet arrival destined for the learned MAC.
862 # (This will also learn a MAC.)
865 [in_port(1),eth(src=50:54:00:00:00:06,dst=50:54:00:00:00:05),$arp],
869 # Check for both MAC learning entries.
870 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
872 3 0 50:54:00:00:00:05 ?
873 1 0 50:54:00:00:00:06 ?
876 # Trace a packet arrival that updates the first learned MAC entry.
879 [in_port(2),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
883 # Check that the MAC learning entry was updated.
884 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
886 1 0 50:54:00:00:00:06 ?
887 2 0 50:54:00:00:00:05 ?
890 # Add another bridge.
894 -- set bridge br1 datapath-type=dummy \
895 -- add-port br1 p4 -- set interface p4 type=dummy \
896 -- add-port br1 p5 -- set interface p5 type=dummy])
898 # Trace some packet arrivals in br1 to create MAC learning entries there too.
901 [in_port(4),eth(src=50:54:00:00:00:06,dst=ff:ff:ff:ff:ff:ff),$arp],
906 [in_port(5),eth(src=50:54:00:00:00:07,dst=ff:ff:ff:ff:ff:ff),$arp],
910 # Check that the MAC learning entries were added.
911 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
913 4 0 50:54:00:00:00:06 ?
914 5 0 50:54:00:00:00:07 ?
917 # Delete port p1 and see that its MAC learning entry disappeared, and
918 # that the MAC learning entry for the same MAC was also deleted from br1.
919 AT_CHECK([ovs-vsctl del-port p1])
920 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
922 2 0 50:54:00:00:00:05 ?
924 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
926 5 0 50:54:00:00:00:07 ?
932 dnl Test that basic NetFlow reports flow statistics correctly:
933 dnl - The initial packet of a flow are correctly accounted.
934 dnl - Later packets within a flow are correctly accounted.
935 dnl - Flow actions changing (in this case, due to MAC learning)
936 dnl cause a record to be sent.
937 AT_SETUP([ofproto-dpif - NetFlow flow expiration])
939 AT_CHECK([perl $srcdir/choose-port.pl], [0], [stdout])
940 NETFLOW_PORT=`cat stdout`
943 [set Bridge br0 fail-mode=standalone -- \
944 add-port br0 p1 -- set Interface p1 type=dummy -- \
945 add-port br0 p2 -- set Interface p2 type=dummy -- \
946 set Bridge br0 netflow=@nf -- \
947 --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
948 engine_id=1 engine_type=2 active_timeout=30 \
949 add-id-to-interface=false], [<0>
952 AT_CHECK([test-netflow --detach --pidfile $NETFLOW_PORT:127.0.0.1 > netflow.log])AT_CAPTURE_FILE([netflow.log])
954 for delay in 1000 30000; do
955 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)'
956 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)'
958 ovs-appctl time/warp $delay
962 ovs-appctl -t test-netflow exit
964 AT_CHECK([[sed -e 's/, uptime [0-9]*//
966 s/time \([0-9]*\)\.\.\.\1$/time <moment>/
967 s/time [0-9]*\.\.\.[0-9]*/time <range>/
968 ' netflow.log]], [0],
969 [header: v5, seq 0, engine 2,1
970 rec: 192.168.0.1 > 192.168.0.2, if 1 > 65535, 1 pkts, 60 bytes, ICMP 8:0, time <moment>
972 header: v5, seq 1, engine 2,1
973 rec: 192.168.0.2 > 192.168.0.1, if 2 > 1, 2 pkts, 120 bytes, ICMP 0:0, time <range>
974 rec: 192.168.0.1 > 192.168.0.2, if 1 > 2, 1 pkts, 60 bytes, ICMP 8:0, time <moment>
978 dnl Test that basic NetFlow reports active expirations correctly.
979 AT_SETUP([ofproto-dpif - NetFlow active expiration])
981 AT_CHECK([perl $srcdir/choose-port.pl], [0], [stdout])
982 NETFLOW_PORT=`cat stdout`
985 [set Bridge br0 fail-mode=standalone -- \
986 add-port br0 p1 -- set Interface p1 type=dummy -- \
987 add-port br0 p2 -- set Interface p2 type=dummy -- \
988 set Bridge br0 netflow=@nf -- \
989 --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
990 engine_id=1 engine_type=2 active_timeout=10 \
991 add-id-to-interface=false], [<0>
994 AT_CHECK([test-netflow --detach --pidfile $NETFLOW_PORT:127.0.0.1 > netflow.log])AT_CAPTURE_FILE([netflow.log])
996 AT_CHECK([ovs-appctl time/stop])
998 while test $n -le 60; do
1001 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)'
1002 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)'
1004 ovs-appctl time/warp 1000
1007 ovs-appctl time/warp 10000
1010 ovs-appctl -t test-netflow exit
1012 # Count the number of reported packets:
1013 # - From source to destination before MAC learning kicks in (just one).
1014 # - From source to destination after that.
1015 # - From destination to source.
1023 pkts=`echo "$line" | sed 's/.*, \([[0-9]]*\) pkts,.*/\1/'`
1030 "rec: 192.168.0.1 > 192.168.0.2, if 1 > 65535, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
1033 "rec: 192.168.0.1 > 192.168.0.2, if 1 > 2, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
1036 "rec: 192.168.0.2 > 192.168.0.1, if 2 > 1, "*" pkts, "*" bytes, TCP 80 > 1234, time "*)
1043 eval $counter=\`expr \$$counter + \$pkts\`
1044 n_recs=`expr $n_recs + 1`
1047 # There should be exactly 1 MAC learning packet,
1048 # exactly 59 other packets in that direction,
1049 # and exactly 60 packets in the other direction.
1050 AT_CHECK([echo $n_learn $n_in $n_out $n_other], [0], [1 59 60 0
1053 # There should be 1 expiration for MAC learning,
1054 # at least 5 active and a final expiration in one direction,
1055 # and at least 5 active and a final expiration in the other direction.
1057 AT_CHECK([test $n_recs -ge 13])
1061 AT_SETUP([idle_age and hard_age increase over time])
1064 # get_ages DURATION HARD IDLE
1066 # Fetch the flow duration, hard age, and idle age into the variables
1067 # whose names are given as arguments. Rounds DURATION down to the
1068 # nearest integer. If hard_age doesn't appear in the output, sets
1069 # HARD to "none". If idle_age doesn't appear in the output, sets IDLE
1072 AT_CHECK([ovs-ofctl dump-flows br0], [0], [stdout])
1074 duration=`sed -n 's/.*duration=\([[0-9]]*\)\(\.[[0-9]]*\)\{0,1\}s.*/\1/p' stdout`
1075 AT_CHECK([[expr X"$duration" : 'X[0-9][0-9]*$']], [0], [ignore])
1076 AS_VAR_COPY([$1], [duration])
1078 hard=`sed -n 's/.*hard_age=\([[0-9]]*\),.*/\1/p' stdout`
1079 if test X"$hard" = X; then
1082 AT_CHECK([[expr X"$hard" : 'X[0-9][0-9]*$']], [0], [ignore])
1084 AS_VAR_COPY([$2], [hard])
1086 idle=`sed -n 's/.*idle_age=\([[0-9]]*\),.*/\1/p' stdout`
1087 if test X"$idle" = X; then
1090 AT_CHECK([[expr X"$idle" : 'X[0-9][0-9]*$']], [0], [ignore])
1092 AS_VAR_COPY([$3], [idle])
1095 # Add a flow and get its initial hard and idle age.
1096 AT_CHECK([ovs-ofctl add-flow br0 hard_timeout=199,idle_timeout=188,actions=drop])
1097 get_ages duration1 hard1 idle1
1099 # Warp time forward by 10 seconds, then modify the flow's actions.
1100 ovs-appctl time/warp 10000
1101 get_ages duration2 hard2 idle2
1102 AT_CHECK([ovs-ofctl mod-flows br0 actions=flood])
1104 # Warp time forward by 10 seconds.
1105 ovs-appctl time/warp 10000
1106 get_ages duration3 hard3 idle3
1108 # Warp time forward 10 more seconds, then pass some packets through the flow,
1109 # then warp forward a few more times because idle times are only updated
1111 ovs-appctl time/warp 10000
1112 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)'
1113 ovs-appctl time/warp 1000
1114 ovs-appctl time/warp 1000
1115 ovs-appctl time/warp 1000
1116 get_ages duration4 hard4 idle4
1118 printf "duration: %4s => %4s => %4s => %4s\n" $duration1 $duration2 $duration3 $duration4
1119 printf "hard_age: %4s => %4s => %4s => %4s\n" $hard1 $hard2 $hard3 $hard4
1120 printf "idle_age: %4s => %4s => %4s => %4s\n" $idle1 $idle2 $idle3 $idle4
1122 # Duration should increase steadily over time.
1123 AT_CHECK([test $duration1 -lt $duration2])
1124 AT_CHECK([test $duration2 -lt $duration3])
1125 AT_CHECK([test $duration3 -lt $duration4])
1127 # Hard age should be "none" initially because it's the same as flow_duration,
1128 # then it should increase.
1129 AT_CHECK([test $hard1 = none])
1130 AT_CHECK([test $hard2 = none])
1131 AT_CHECK([test $hard3 != none])
1132 AT_CHECK([test $hard4 != none])
1133 AT_CHECK([test $hard3 -lt $hard4])
1135 # Idle age should increase from 1 to 2 to 3, then decrease.
1136 AT_CHECK([test $idle1 -lt $idle2])
1137 AT_CHECK([test $idle2 -lt $idle3])
1138 AT_CHECK([test $idle3 -gt $idle4])
1140 # Check some invariant relationships.
1141 AT_CHECK([test $duration1 = $idle1])
1142 AT_CHECK([test $duration2 = $idle2])
1143 AT_CHECK([test $duration3 = $idle3])
1144 AT_CHECK([test $idle3 -gt $hard3])
1145 AT_CHECK([test $idle4 -lt $hard4])
1146 AT_CHECK([test $hard4 -lt $duration4])
1151 AT_SETUP([ofproto-dpif - fin_timeout])
1153 AT_DATA([flows.txt], [dnl
1154 in_port=1 actions=output:2
1155 in_port=2 actions=mod_vlan_vid:17,output:1
1157 AT_CHECK([ovs-ofctl add-flow br0 'idle_timeout=60,actions=fin_timeout(idle_timeout=5)'])
1158 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
1160 idle_timeout=60, actions=fin_timeout(idle_timeout=5)
1162 # Check that a TCP SYN packet does not change the timeout. (Because
1163 # flow stats updates are mainly what implements the fin_timeout
1164 # feature, we warp forward a couple of times to ensure that flow stats
1165 # run before re-checking the flow table.)
1166 AT_CHECK([ovs-appctl netdev-dummy/receive br0 0021853763af0026b98cb0f908004500003c2e2440004006465dac11370dac11370b828b0016751e267b00000000a00216d017360000020405b40402080a2d25085f0000000001030307], [0], [success
1168 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
1171 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
1173 n_packets=1, n_bytes=74, idle_timeout=60, actions=fin_timeout(idle_timeout=5)
1175 # Check that a TCP FIN packet does change the timeout.
1176 AT_CHECK([ovs-appctl netdev-dummy/receive br0 0021853763af0026b98cb0f90800451000342e3e40004006463bac11370dac11370b828b0016751e319dfc96399b801100717ae800000101080a2d250a9408579588], [0], [success
1178 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
1181 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
1183 n_packets=2, n_bytes=140, idle_timeout=5, actions=fin_timeout(idle_timeout=5)