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 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_OF_PORTS([br0], [1], [2])
116 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
118 # "in_port" defaults to OFPP_NONE if it's not specified.
119 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)"
120 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
121 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
124 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
126 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
131 AT_SETUP([ofproto-dpif - DSCP])
132 OVS_VSWITCHD_START([add-port br0 p1 -- set Interface p1 type=dummy])
133 AT_DATA([flows.txt], [dnl
134 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
136 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
137 AT_CHECK([ovs-vsctl -- \
138 set Port p1 qos=@newqos --\
139 --id=@newqos create QoS type=linux-htb queues=1=@q1,2=@q2 --\
140 --id=@q1 create Queue dscp=1 --\
141 --id=@q2 create Queue dscp=2], [0], [ignore])
142 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])
143 AT_CHECK([tail -1 stdout], [0],
144 [Datapath actions: dnl
146 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
147 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
149 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
150 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
151 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0x3,ttl=128,frag=no)),1,dnl
157 AT_SETUP([ofproto-dpif - output/flood flags])
159 ADD_OF_PORTS([br0], [1], [2], [3], [4], [5], [6], [7])
161 AT_DATA([flows.txt], [dnl
162 in_port=local actions=local,flood
163 in_port=1 actions=flood
164 in_port=2 actions=all
165 in_port=3 actions=output:65534,output:1,output:2,output:3,output:4,output:5,output:6,output:7
166 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
168 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
169 AT_CHECK([ovs-ofctl mod-port br0 5 noforward])
170 AT_CHECK([ovs-ofctl mod-port br0 6 noflood])
172 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(100),eth(src=00:00:00:00:00:01,dst=00:00:00:00:00:02),eth_type(0x0900)'], [0], [stdout])
173 AT_CHECK([tail -1 stdout \
174 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
182 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])
183 AT_CHECK([tail -1 stdout \
184 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
192 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])
193 AT_CHECK([tail -1 stdout \
194 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
203 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])
204 AT_CHECK([tail -1 stdout], [0],
205 [Datapath actions: 100,1,2,4,6,7
208 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])
209 AT_CHECK([tail -1 stdout], [0],
210 [Datapath actions: set(priority(1)),100,1,2,set(priority(2)),3,set(priority(1)),6,7
215 AT_SETUP([ofproto-dpif - set_tunnel])
217 ADD_OF_PORTS([br0], [1], [2], [3], [4], [5], [90])
218 AT_DATA([flows.txt], [dnl
219 in_port=90 actions=resubmit:1,resubmit:2,resubmit:3,resubmit:4,resubmit:5
220 in_port=1 actions=set_tunnel:1,output:1
221 in_port=2 actions=set_tunnel:1,output:2
222 in_port=3 actions=set_tunnel:2,set_tunnel:3,output:3
223 in_port=4 actions=set_tunnel:4,set_tunnel:3,output:4
224 in_port=5 actions=set_tunnel:5
226 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
227 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])
228 AT_CHECK([tail -1 stdout], [0],
229 [Datapath actions: set(tun_id(0x1)),1,2,set(tun_id(0x3)),3,4
234 AT_SETUP([ofproto-dpif - controller])
235 OVS_VSWITCHD_START([dnl
236 add-port br0 p1 -- set Interface p1 type=dummy
239 AT_CAPTURE_FILE([ofctl_monitor.log])
240 AT_DATA([flows.txt], [dnl
241 cookie=0x0 dl_src=10:11:11:11:11:11 actions=controller
242 cookie=0x1 dl_src=20:22:22:22:22:22 actions=controller,resubmit(80,1)
243 cookie=0x2 dl_src=30:33:33:33:33:33 actions=mod_vlan_vid:15,controller
245 cookie=0x3 table=1 in_port=80 actions=load:1->NXM_NX_REG0[[]],mod_vlan_vid:80,controller,resubmit(81,2)
246 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)
247 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)
248 cookie=0x6 table=4 in_port=83 actions=load:4->NXM_NX_REG3[[]],mod_nw_src:83.83.83.83,controller,resubmit(84,5)
249 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)
250 cookie=0x8 table=6 in_port=85 actions=mod_tp_src:85,controller,resubmit(86,7)
251 cookie=0x9 table=7 in_port=86 actions=mod_tp_dst:86,controller,controller
253 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
256 AT_CHECK([ovs-ofctl monitor -P openflow10 br0 65534 --detach --no-chdir --pidfile 2> ofctl_monitor.log])
259 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)'
262 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
263 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
264 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via no_match) data_len=60 (unbuffered)
265 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
267 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via no_match) data_len=60 (unbuffered)
268 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
270 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via no_match) data_len=60 (unbuffered)
271 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
274 dnl Singleton controller action.
275 AT_CHECK([ovs-ofctl monitor -P openflow10 br0 65534 --detach --no-chdir --pidfile 2> ofctl_monitor.log])
278 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)'
281 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
282 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
283 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
284 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
286 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
287 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
289 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
290 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
293 dnl Modified controller action.
294 AT_CHECK([ovs-ofctl monitor -P openflow10 br0 65534 --detach --no-chdir --pidfile 2> ofctl_monitor.log])
297 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)'
300 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
301 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
302 OFPT_PACKET_IN (xid=0x0): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
303 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
305 OFPT_PACKET_IN (xid=0x0): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
306 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
308 OFPT_PACKET_IN (xid=0x0): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
309 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
313 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --no-chdir --pidfile 2> ofctl_monitor.log])
316 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)'
319 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
320 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
321 NXT_PACKET_IN (xid=0x0): cookie=0x1 total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
322 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
324 NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x3 total_len=64 in_port=1 reg0=0x1 (via action) data_len=64 (unbuffered)
325 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
327 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)
328 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
330 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)
331 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
333 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)
334 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
336 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)
337 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
339 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)
340 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
342 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)
343 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
345 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)
346 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
350 AT_CHECK([ovs-ofctl monitor br0 65534 --detach --no-chdir --pidfile 2> ofctl_monitor.log])
353 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'
356 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
357 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
358 NXT_PACKET_IN (xid=0x0): cookie=0x1 total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
359 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
361 NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x3 total_len=64 in_port=1 reg0=0x1 (via action) data_len=64 (unbuffered)
362 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
364 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)
365 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
367 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)
368 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
370 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)
371 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
373 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)
374 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
376 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)
377 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
379 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)
380 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
382 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)
383 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
386 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
387 cookie=0x1, n_packets=2, n_bytes=120, dl_src=20:22:22:22:22:22 actions=CONTROLLER:65535,resubmit(80,1)
388 cookie=0x2, n_packets=3, n_bytes=180, dl_src=30:33:33:33:33:33 actions=mod_vlan_vid:15,CONTROLLER:65535
389 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)
390 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)
391 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)
392 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)
393 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)
394 cookie=0x8, table=6, n_packets=2, n_bytes=120, in_port=85 actions=mod_tp_src:85,CONTROLLER:65535,resubmit(86,7)
395 cookie=0x9, table=7, n_packets=2, n_bytes=120, in_port=86 actions=mod_tp_dst:86,CONTROLLER:65535,CONTROLLER:65535
396 n_packets=3, n_bytes=180, dl_src=10:11:11:11:11:11 actions=CONTROLLER:65535
403 AT_SETUP([ofproto-dpif - VLAN handling])
405 [set Bridge br0 fail-mode=standalone -- \
406 add-port br0 p1 trunks=10,12 -- \
407 add-port br0 p2 tag=10 -- \
408 add-port br0 p3 tag=12 \
409 other-config:priority-tags=true -- \
410 add-port br0 p4 tag=12 -- \
411 add-port br0 p5 vlan_mode=native-tagged tag=10 -- \
412 add-port br0 p6 vlan_mode=native-tagged tag=10 trunks=10,12 -- \
413 add-port br0 p7 vlan_mode=native-untagged tag=12 -- \
414 add-port br0 p8 vlan_mode=native-untagged tag=12 trunks=10,12 \
415 other-config:priority-tags=true -- \
416 set Interface p1 type=dummy -- \
417 set Interface p2 type=dummy -- \
418 set Interface p3 type=dummy -- \
419 set Interface p4 type=dummy -- \
420 set Interface p5 type=dummy -- \
421 set Interface p6 type=dummy -- \
422 set Interface p7 type=dummy -- \
423 set Interface p8 type=dummy --])
425 dnl Each of these specifies an in_port by number, a VLAN VID (or "none"),
426 dnl a VLAN PCP (used if the VID isn't "none") and the expected set of datapath
432 "100 10 0 1,5,6,7,8,pop_vlan,2" \
433 "100 10 1 1,5,6,7,8,pop_vlan,2" \
436 "100 12 0 1,5,6,pop_vlan,3,4,7,8" \
437 "100 12 1 1,5,6,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
441 "1 10 0 5,6,7,8,100,pop_vlan,2" \
442 "1 10 1 5,6,7,8,100,pop_vlan,2" \
445 "1 12 0 5,6,100,pop_vlan,3,4,7,8" \
446 "1 12 1 5,6,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
447 "2 none 0 push_vlan(vid=10,pcp=0),1,5,6,7,8,100" \
448 "2 0 0 pop_vlan,push_vlan(vid=10,pcp=0),1,5,6,7,8,100" \
449 "2 0 1 pop_vlan,push_vlan(vid=10,pcp=1),1,5,6,7,8,100" \
456 "3 none 0 4,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
457 "3 0 0 pop_vlan,4,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
458 "3 0 1 8,pop_vlan,4,7,push_vlan(vid=12,pcp=1),1,5,6,100" \
465 "4 none 0 3,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
466 "4 0 0 pop_vlan,3,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
467 "4 0 1 3,8,pop_vlan,7,push_vlan(vid=12,pcp=1),1,5,6,100" \
474 "5 none 0 2,push_vlan(vid=10,pcp=0),1,6,7,8,100" \
475 "5 0 0 pop_vlan,2,push_vlan(vid=10,pcp=0),1,6,7,8,100" \
476 "5 0 1 pop_vlan,2,push_vlan(vid=10,pcp=1),1,6,7,8,100" \
477 "5 10 0 1,6,7,8,100,pop_vlan,2" \
478 "5 10 1 1,6,7,8,100,pop_vlan,2" \
481 "5 12 0 1,6,100,pop_vlan,3,4,7,8" \
482 "5 12 1 1,6,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
483 "6 none 0 2,push_vlan(vid=10,pcp=0),1,5,7,8,100" \
484 "6 0 0 pop_vlan,2,push_vlan(vid=10,pcp=0),1,5,7,8,100" \
485 "6 0 1 pop_vlan,2,push_vlan(vid=10,pcp=1),1,5,7,8,100" \
486 "6 10 0 1,5,7,8,100,pop_vlan,2" \
487 "6 10 1 1,5,7,8,100,pop_vlan,2" \
490 "6 12 0 1,5,100,pop_vlan,3,4,7,8" \
491 "6 12 1 1,5,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
492 "7 none 0 3,4,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
493 "7 0 0 pop_vlan,3,4,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
494 "7 0 1 3,8,pop_vlan,4,push_vlan(vid=12,pcp=1),1,5,6,100" \
495 "7 10 0 1,5,6,8,100,pop_vlan,2" \
496 "7 10 1 1,5,6,8,100,pop_vlan,2" \
499 "7 12 0 1,5,6,100,pop_vlan,3,4,8" \
500 "7 12 1 1,5,6,100,pop_vlan,4,push_vlan(vid=0,pcp=1),3,8" \
501 "8 none 0 3,4,7,push_vlan(vid=12,pcp=0),1,5,6,100" \
502 "8 0 0 pop_vlan,3,4,7,push_vlan(vid=12,pcp=0),1,5,6,100" \
503 "8 0 1 3,pop_vlan,4,7,push_vlan(vid=12,pcp=1),1,5,6,100" \
504 "8 10 0 1,5,6,7,100,pop_vlan,2" \
505 "8 10 1 1,5,6,7,100,pop_vlan,2" \
508 "8 12 0 1,5,6,100,pop_vlan,3,4,7" \
509 "8 12 1 1,5,6,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3"
517 if test $vlan = none; then
518 flow="in_port($in_port),eth(src=50:54:00:00:00:01,dst=ff:ff:ff:ff:ff:ff),eth_type(0xabcd)"
520 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))"
523 echo "----------------------------------------------------------------------"
524 echo "in_port=$in_port vlan=$vlan pcp=$pcp"
526 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
527 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
529 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
531 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
537 AT_SETUP([ofproto-dpif - fragment handling])
539 ADD_OF_PORTS([br0], [1], [2], [3], [4], [5], [6])
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 ADD_OF_PORTS([br0], [1], [2], [3], [10], [11], [12], [13], [14])
581 AT_DATA([flows.txt], [dnl
582 in_port=1 actions=output:10,exit,output:11
583 in_port=2 actions=output:12,resubmit:1,output:12
584 in_port=3 actions=output:13,resubmit:2,output:14
586 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
587 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])
588 AT_CHECK([tail -1 stdout], [0],
589 [Datapath actions: 10
591 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])
592 AT_CHECK([tail -1 stdout], [0],
593 [Datapath actions: 12,10
595 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])
596 AT_CHECK([tail -1 stdout], [0],
597 [Datapath actions: 13,12,10
603 AT_SETUP([ofproto-dpif - mirroring, select_all])
605 [add-port br0 p1 -- set Interface p1 type=dummy --\
606 add-port br0 p2 -- set Interface p2 type=dummy --\
607 add-port br0 p3 -- set Interface p3 type=dummy --\
608 set Bridge br0 mirrors=@m --\
609 --id=@p3 get Port p3 --\
610 --id=@m create Mirror name=mymirror \
611 select_all=true output_port=@p3], [<0>
614 AT_DATA([flows.txt], [dnl
615 in_port=1 actions=output:2
616 in_port=2 actions=output:1
618 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
620 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)"
621 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
622 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
623 [Datapath actions: 2,3
626 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)"
627 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
628 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
629 [Datapath actions: 1,3
636 AT_SETUP([ofproto-dpif - mirroring, select_src])
638 [add-port br0 p1 -- set Interface p1 type=dummy --\
639 add-port br0 p2 -- set Interface p2 type=dummy --\
640 add-port br0 p3 -- set Interface p3 type=dummy --\
641 set Bridge br0 mirrors=@m --\
642 --id=@p1 get Port p1 -- --id=@p3 get Port p3 --\
643 --id=@m create Mirror name=mymirror \
644 select_src_port=@p1 output_port=@p3], [<0>
647 AT_DATA([flows.txt], [dnl
648 in_port=1 actions=output:2
649 in_port=2 actions=output:1
651 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
653 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)"
654 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
655 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
656 [Datapath actions: 2,3
659 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)"
660 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
661 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
667 AT_SETUP([ofproto-dpif - mirroring, OFPP_NONE ingress port])
669 [add-port br0 p1 -- set Interface p1 type=dummy --\
670 add-port br0 p2 -- set Interface p2 type=dummy --\
671 set Bridge br0 mirrors=@m --\
672 --id=@p2 get Port p2 --\
673 --id=@m create Mirror name=mymirror \
674 select_all=true output_port=@p2], [<0>
677 AT_CHECK([ovs-ofctl add-flow br0 action=output:1])
679 # "in_port" defaults to OFPP_NONE if it's not specified.
680 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)"
681 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
682 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
683 [Datapath actions: 1,2
690 AT_SETUP([ofproto-dpif - mirroring, select_dst])
692 [add-port br0 p1 -- set Interface p1 type=dummy ofport_request=1 --\
693 add-port br0 p2 -- set Interface p2 type=dummy ofport_request=2 --\
694 add-port br0 p3 -- set Interface p3 type=dummy ofport_request=3 --\
695 set Bridge br0 mirrors=@m --\
696 --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
697 --id=@m create Mirror name=mymirror \
698 select_dst_port=@p2 output_port=@p3], [<0>
701 AT_DATA([flows.txt], [dnl
702 in_port=1 actions=output:2
703 in_port=2 actions=output:1
705 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
707 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)"
708 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
709 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
710 [Datapath actions: 2,3
713 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)"
714 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
715 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
723 AT_SETUP([ofproto-dpif - mirroring, select_vlan])
725 [add-port br0 p1 -- set Interface p1 type=dummy --\
726 add-port br0 p2 -- set Interface p2 type=dummy --\
727 add-port br0 p3 -- set Interface p3 type=dummy --\
728 set Bridge br0 mirrors=@m --\
729 --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
730 --id=@m create Mirror name=mymirror \
731 select_all=true select_vlan=11 output_port=@p3], [<0>
734 AT_DATA([flows.txt], [dnl
735 in_port=1, actions=output:2
737 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
739 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)"
740 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
741 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
745 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))"
746 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
747 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
751 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))"
752 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
753 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
754 [Datapath actions: 2,3
761 AT_SETUP([ofproto-dpif - mirroring, output_port])
763 [add-port br0 p1 -- set Interface p1 type=dummy --\
764 add-port br0 p2 -- set Interface p2 type=dummy --\
765 add-port br0 p3 -- set Interface p3 type=dummy --\
766 set Bridge br0 mirrors=@m --\
767 --id=@p3 get Port p3 --\
768 --id=@m create Mirror name=mymirror \
769 select_all=true output_port=@p3], [<0>
772 AT_DATA([flows.txt], [dnl
773 in_port=1 actions=mod_vlan_vid:17,output:2
774 in_port=2 actions=output:1
776 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
778 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)"
779 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
780 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
781 [Datapath actions: push_vlan(vid=17,pcp=0),2,pop_vlan,3
784 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)"
785 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
786 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
787 [Datapath actions: 1,3
793 AT_SETUP([ofproto-dpif - mirroring, output_vlan])
795 [add-port br0 p1 -- set Interface p1 type=dummy --\
796 add-port br0 p2 -- set Interface p2 type=dummy --\
797 set Bridge br0 mirrors=@m --\
798 --id=@m create Mirror name=mymirror \
799 select_all=true output_vlan=12], [<0>
802 AT_DATA([flows.txt], [dnl
803 in_port=1 actions=output:2
804 in_port=2 actions=mod_vlan_vid:17,output:1
806 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
808 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)"
809 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
810 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
812 expected="2,push_vlan(vid=12,pcp=0),1,2,100"
813 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
815 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
817 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)"
818 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
819 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
821 expected="push_vlan(vid=17,pcp=0),1,pop_vlan,push_vlan(vid=12,pcp=0),1,2,100"
822 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
824 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
829 m4_define([OFPROTO_TRACE],
831 AT_CHECK([ovs-appctl ofproto/trace $1 "$flow" $3], [0], [stdout])
832 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
834 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" $5],
837 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" $5],
840 AT_SETUP([ofproto-dpif - MAC learning])
842 [set bridge br0 fail-mode=standalone -- \
843 add-port br0 p1 -- set Interface p1 type=dummy -- \
844 add-port br0 p2 -- set Interface p2 type=dummy -- \
845 add-port br0 p3 -- set Interface p3 type=dummy])
847 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)'
849 # Trace an ARP packet arriving on p3, to create a MAC learning entry.
852 [in_port(3),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
856 # Check for the MAC learning entry.
857 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
859 3 0 50:54:00:00:00:05 ?
862 # Trace a packet arrival destined for the learned MAC.
863 # (This will also learn a MAC.)
866 [in_port(1),eth(src=50:54:00:00:00:06,dst=50:54:00:00:00:05),$arp],
870 # Check for both MAC learning entries.
871 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
873 3 0 50:54:00:00:00:05 ?
874 1 0 50:54:00:00:00:06 ?
877 # Trace a packet arrival that updates the first learned MAC entry.
880 [in_port(2),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
884 # Check that the MAC learning entry was updated.
885 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
887 1 0 50:54:00:00:00:06 ?
888 2 0 50:54:00:00:00:05 ?
891 # Add another bridge.
895 -- set bridge br1 datapath-type=dummy \
896 -- add-port br1 p4 -- set interface p4 type=dummy \
897 -- add-port br1 p5 -- set interface p5 type=dummy])
899 # Trace some packet arrivals in br1 to create MAC learning entries there too.
902 [in_port(4),eth(src=50:54:00:00:00:06,dst=ff:ff:ff:ff:ff:ff),$arp],
907 [in_port(5),eth(src=50:54:00:00:00:07,dst=ff:ff:ff:ff:ff:ff),$arp],
911 # Check that the MAC learning entries were added.
912 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
914 4 0 50:54:00:00:00:06 ?
915 5 0 50:54:00:00:00:07 ?
918 # Delete port p1 and see that its MAC learning entry disappeared, and
919 # that the MAC learning entry for the same MAC was also deleted from br1.
920 AT_CHECK([ovs-vsctl del-port p1])
921 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
923 2 0 50:54:00:00:00:05 ?
925 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
927 5 0 50:54:00:00:00:07 ?
933 AT_SETUP([ofproto-dpif - MAC table overflow])
935 [set bridge br0 fail-mode=standalone other-config:mac-table-size=10 -- \
936 add-port br0 p1 -- set Interface p1 type=dummy -- \
937 add-port br0 p2 -- set Interface p2 type=dummy -- \
938 add-port br0 p3 -- set Interface p3 type=dummy])
940 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)'
942 AT_CHECK([ovs-appctl time/stop])
944 # Trace 10 ARP packets arriving on p3, to create MAC learning entries.
945 for i in 0 1 2 3 4 5 6 7 8 9; do
948 [in_port(3),eth(src=50:54:00:00:00:0$i,dst=ff:ff:ff:ff:ff:ff),$arp],
951 ovs-appctl time/warp 1000
954 # Check for the MAC learning entries.
955 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/ *[[0-9]]\{1,\}$//' | sort],
957 3 0 50:54:00:00:00:00
958 3 0 50:54:00:00:00:01
959 3 0 50:54:00:00:00:02
960 3 0 50:54:00:00:00:03
961 3 0 50:54:00:00:00:04
962 3 0 50:54:00:00:00:05
963 3 0 50:54:00:00:00:06
964 3 0 50:54:00:00:00:07
965 3 0 50:54:00:00:00:08
966 3 0 50:54:00:00:00:09
970 # Trace another ARP packet on another MAC.
973 [in_port(3),eth(src=50:54:00:00:00:10,dst=ff:ff:ff:ff:ff:ff),$arp],
977 # Check that the new one chased the oldest one out of the table.
978 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/' | sort],
980 3 0 50:54:00:00:00:01 ?
981 3 0 50:54:00:00:00:02 ?
982 3 0 50:54:00:00:00:03 ?
983 3 0 50:54:00:00:00:04 ?
984 3 0 50:54:00:00:00:05 ?
985 3 0 50:54:00:00:00:06 ?
986 3 0 50:54:00:00:00:07 ?
987 3 0 50:54:00:00:00:08 ?
988 3 0 50:54:00:00:00:09 ?
989 3 0 50:54:00:00:00:10 ?
995 dnl Test that basic NetFlow reports flow statistics correctly:
996 dnl - The initial packet of a flow are correctly accounted.
997 dnl - Later packets within a flow are correctly accounted.
998 dnl - Flow actions changing (in this case, due to MAC learning)
999 dnl cause a record to be sent.
1000 AT_SETUP([ofproto-dpif - NetFlow flow expiration])
1002 AT_CHECK([perl $srcdir/choose-port.pl], [0], [stdout])
1003 NETFLOW_PORT=`cat stdout`
1006 [set Bridge br0 fail-mode=standalone -- \
1007 add-port br0 p1 -- set Interface p1 type=dummy -- \
1008 add-port br0 p2 -- set Interface p2 type=dummy -- \
1009 set Bridge br0 netflow=@nf -- \
1010 --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
1011 engine_id=1 engine_type=2 active_timeout=30 \
1012 add-id-to-interface=false], [<0>
1015 ON_EXIT([kill `cat test-netflow.pid`])
1016 AT_CHECK([test-netflow --detach --no-chdir --pidfile $NETFLOW_PORT:127.0.0.1 > netflow.log])
1017 AT_CAPTURE_FILE([netflow.log])
1019 for delay in 1000 30000; do
1020 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)'
1021 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)'
1023 ovs-appctl time/warp $delay
1028 ovs-appctl -t test-netflow exit
1030 AT_CHECK([[sed -e 's/, uptime [0-9]*//
1032 s/time \([0-9]*\)\.\.\.\1$/time <moment>/
1033 s/time [0-9]*\.\.\.[0-9]*/time <range>/
1034 ' netflow.log | sort]], [0],
1036 header: v5, seq 0, engine 2,1
1037 header: v5, seq 1, engine 2,1
1038 seq 0: 192.168.0.1 > 192.168.0.2, if 1 > 65535, 1 pkts, 60 bytes, ICMP 8:0, time <moment>
1039 seq 1: 192.168.0.1 > 192.168.0.2, if 1 > 2, 1 pkts, 60 bytes, ICMP 8:0, time <moment>
1040 seq 1: 192.168.0.2 > 192.168.0.1, if 2 > 1, 2 pkts, 120 bytes, ICMP 0:0, time <range>
1044 dnl Test that basic NetFlow reports active expirations correctly.
1045 AT_SETUP([ofproto-dpif - NetFlow active expiration])
1047 AT_CHECK([perl $srcdir/choose-port.pl], [0], [stdout])
1048 NETFLOW_PORT=`cat stdout`
1051 [set Bridge br0 fail-mode=standalone -- \
1052 add-port br0 p1 -- set Interface p1 type=dummy -- \
1053 add-port br0 p2 -- set Interface p2 type=dummy -- \
1054 set Bridge br0 netflow=@nf -- \
1055 --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
1056 engine_id=1 engine_type=2 active_timeout=10 \
1057 add-id-to-interface=false], [<0>
1060 ON_EXIT([kill `test-netflow.pid`])
1061 AT_CHECK([test-netflow --detach --no-chdir --pidfile $NETFLOW_PORT:127.0.0.1 > netflow.log])AT_CAPTURE_FILE([netflow.log])
1063 AT_CHECK([ovs-appctl time/stop])
1065 while test $n -le 60; do
1068 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)'
1069 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)'
1071 ovs-appctl time/warp 1000
1074 ovs-appctl time/warp 10000
1078 ovs-appctl -t test-netflow exit
1080 # Count the number of reported packets:
1081 # - From source to destination before MAC learning kicks in (just one).
1082 # - From source to destination after that.
1083 # - From destination to source.
1091 pkts=`echo "$line" | sed 's/.*, \([[0-9]]*\) pkts,.*/\1/'`
1098 "seq "*": 192.168.0.1 > 192.168.0.2, if 1 > 65535, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
1101 "seq "*": 192.168.0.1 > 192.168.0.2, if 1 > 2, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
1104 "seq "*": 192.168.0.2 > 192.168.0.1, if 2 > 1, "*" pkts, "*" bytes, TCP 80 > 1234, time "*)
1111 eval $counter=\`expr \$$counter + \$pkts\`
1112 n_recs=`expr $n_recs + 1`
1115 # There should be exactly 1 MAC learning packet,
1116 # exactly 59 other packets in that direction,
1117 # and exactly 60 packets in the other direction.
1118 AT_CHECK([echo $n_learn $n_in $n_out $n_other], [0], [1 59 60 0
1121 # There should be 1 expiration for MAC learning,
1122 # at least 5 active and a final expiration in one direction,
1123 # and at least 5 active and a final expiration in the other direction.
1125 AT_CHECK([test $n_recs -ge 13])
1129 AT_SETUP([idle_age and hard_age increase over time])
1132 # get_ages DURATION HARD IDLE
1134 # Fetch the flow duration, hard age, and idle age into the variables
1135 # whose names are given as arguments. Rounds DURATION down to the
1136 # nearest integer. If hard_age doesn't appear in the output, sets
1137 # HARD to "none". If idle_age doesn't appear in the output, sets IDLE
1140 AT_CHECK([ovs-ofctl dump-flows br0], [0], [stdout])
1142 duration=`sed -n 's/.*duration=\([[0-9]]*\)\(\.[[0-9]]*\)\{0,1\}s.*/\1/p' stdout`
1143 AT_CHECK([[expr X"$duration" : 'X[0-9][0-9]*$']], [0], [ignore])
1144 AS_VAR_COPY([$1], [duration])
1146 hard=`sed -n 's/.*hard_age=\([[0-9]]*\),.*/\1/p' stdout`
1147 if test X"$hard" = X; then
1150 AT_CHECK([[expr X"$hard" : 'X[0-9][0-9]*$']], [0], [ignore])
1152 AS_VAR_COPY([$2], [hard])
1154 idle=`sed -n 's/.*idle_age=\([[0-9]]*\),.*/\1/p' stdout`
1155 if test X"$idle" = X; then
1158 AT_CHECK([[expr X"$idle" : 'X[0-9][0-9]*$']], [0], [ignore])
1160 AS_VAR_COPY([$3], [idle])
1163 # Add a flow and get its initial hard and idle age.
1164 AT_CHECK([ovs-ofctl add-flow br0 hard_timeout=199,idle_timeout=188,actions=drop])
1165 get_ages duration1 hard1 idle1
1167 # Warp time forward by 10 seconds, then modify the flow's actions.
1168 ovs-appctl time/warp 10000
1169 get_ages duration2 hard2 idle2
1170 AT_CHECK([ovs-ofctl mod-flows br0 actions=flood])
1172 # Warp time forward by 10 seconds.
1173 ovs-appctl time/warp 10000
1174 get_ages duration3 hard3 idle3
1176 # Warp time forward 10 more seconds, then pass some packets through the flow,
1177 # then warp forward a few more times because idle times are only updated
1179 ovs-appctl time/warp 10000
1180 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)'
1181 ovs-appctl time/warp 1000
1182 ovs-appctl time/warp 1000
1183 ovs-appctl time/warp 1000
1184 get_ages duration4 hard4 idle4
1186 printf "duration: %4s => %4s => %4s => %4s\n" $duration1 $duration2 $duration3 $duration4
1187 printf "hard_age: %4s => %4s => %4s => %4s\n" $hard1 $hard2 $hard3 $hard4
1188 printf "idle_age: %4s => %4s => %4s => %4s\n" $idle1 $idle2 $idle3 $idle4
1190 # Duration should increase steadily over time.
1191 AT_CHECK([test $duration1 -lt $duration2])
1192 AT_CHECK([test $duration2 -lt $duration3])
1193 AT_CHECK([test $duration3 -lt $duration4])
1195 # Hard age should be "none" initially because it's the same as flow_duration,
1196 # then it should increase.
1197 AT_CHECK([test $hard1 = none])
1198 AT_CHECK([test $hard2 = none])
1199 AT_CHECK([test $hard3 != none])
1200 AT_CHECK([test $hard4 != none])
1201 AT_CHECK([test $hard3 -lt $hard4])
1203 # Idle age should increase from 1 to 2 to 3, then decrease.
1204 AT_CHECK([test $idle1 -lt $idle2])
1205 AT_CHECK([test $idle2 -lt $idle3])
1206 AT_CHECK([test $idle3 -gt $idle4])
1208 # Check some invariant relationships.
1209 AT_CHECK([test $duration1 = $idle1])
1210 AT_CHECK([test $duration2 = $idle2])
1211 AT_CHECK([test $duration3 = $idle3])
1212 AT_CHECK([test $idle3 -gt $hard3])
1213 AT_CHECK([test $idle4 -lt $hard4])
1214 AT_CHECK([test $hard4 -lt $duration4])
1219 AT_SETUP([ofproto-dpif - fin_timeout])
1221 AT_DATA([flows.txt], [dnl
1222 in_port=1 actions=output:2
1223 in_port=2 actions=mod_vlan_vid:17,output:1
1225 AT_CHECK([ovs-ofctl add-flow br0 'idle_timeout=60,actions=fin_timeout(idle_timeout=5)'])
1226 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
1228 idle_timeout=60, actions=fin_timeout(idle_timeout=5)
1230 # Check that a TCP SYN packet does not change the timeout. (Because
1231 # flow stats updates are mainly what implements the fin_timeout
1232 # feature, we warp forward a couple of times to ensure that flow stats
1233 # run before re-checking the flow table.)
1234 AT_CHECK([ovs-appctl netdev-dummy/receive br0 0021853763af0026b98cb0f908004500003c2e2440004006465dac11370dac11370b828b0016751e267b00000000a00216d017360000020405b40402080a2d25085f0000000001030307], [0], [success
1236 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
1239 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
1241 n_packets=1, n_bytes=74, idle_timeout=60, actions=fin_timeout(idle_timeout=5)
1243 # Check that a TCP FIN packet does change the timeout.
1244 AT_CHECK([ovs-appctl netdev-dummy/receive br0 0021853763af0026b98cb0f90800451000342e3e40004006463bac11370dac11370b828b0016751e319dfc96399b801100717ae800000101080a2d250a9408579588], [0], [success
1246 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
1249 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
1251 n_packets=2, n_bytes=140, idle_timeout=5, actions=fin_timeout(idle_timeout=5)
1256 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-dps])
1257 OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy])
1258 ADD_OF_PORTS([br0], [1], [2])
1259 ADD_OF_PORTS([br1], [3])
1261 AT_CHECK([ovs-appctl dpif/dump-dps], [0], [dnl
1268 AT_SETUP([ofproto-dpif - ovs-appctl dpif/show])
1269 OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy])
1270 ADD_OF_PORTS([br0], [1], [2])
1271 ADD_OF_PORTS([br1], [3])
1273 AT_CHECK([ovs-appctl dpif/show], [0], [dnl
1274 br0 (dummy@ovs-dummy):
1275 lookups: hit:0 missed:0 lost:0
1277 br0 65534/100: (dummy)
1280 br1 (dummy@ovs-dummy):
1281 lookups: hit:0 missed:0 lost:0
1283 br1 65534/101: (dummy)
1287 AT_CHECK([ovs-appctl dpif/show br0], [0], [dnl
1288 br0 (dummy@ovs-dummy):
1289 lookups: hit:0 missed:0 lost:0
1291 br0 65534/100: (dummy)
1298 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-flows])
1299 OVS_VSWITCHD_START([add-br br1 -- \
1300 set bridge br1 datapath-type=dummy fail-mode=secure])
1301 ADD_OF_PORTS([br0], [1], [2])
1302 ADD_OF_PORTS([br1], [3])
1304 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'], [0], [success
1306 AT_CHECK([ovs-appctl netdev-dummy/receive p2 'in_port(2),eth(src=50:54:00:00:00:07,dst=50:54:00:00:00:05),eth_type(0x0800),ipv4(src=192.168.0.2,dst=192.168.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=0,code=0)'], [0], [success
1308 AT_CHECK([ovs-appctl netdev-dummy/receive p3 'in_port(3),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'], [0], [success
1311 AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
1312 in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0), packets:0, bytes:0, used:0.0s, actions:drop
1313 in_port(2),eth(src=50:54:00:00:00:07,dst=50:54:00:00:00:05),eth_type(0x0800),ipv4(src=192.168.0.2,dst=192.168.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=0,code=0), packets:0, bytes:0, used:0.0s, actions:drop
1316 AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl
1317 in_port(3),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0), packets:0, bytes:0, used:0.0s, actions:drop
1323 AT_SETUP([ofproto-dpif - ovs-appctl dpif/del-flows])
1324 OVS_VSWITCHD_START([add-br br1 -- \
1325 set bridge br1 datapath-type=dummy fail-mode=secure])
1326 ADD_OF_PORTS([br0], [1], [2])
1327 ADD_OF_PORTS([br1], [3])
1329 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'], [0], [success
1331 AT_CHECK([ovs-appctl netdev-dummy/receive p2 'in_port(2),eth(src=50:54:00:00:00:07,dst=50:54:00:00:00:05),eth_type(0x0800),ipv4(src=192.168.0.2,dst=192.168.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=0,code=0)'], [0], [success
1333 AT_CHECK([ovs-appctl netdev-dummy/receive p3 'in_port(3),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'], [0], [success
1336 AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
1337 in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0), packets:0, bytes:0, used:0.0s, actions:drop
1338 in_port(2),eth(src=50:54:00:00:00:07,dst=50:54:00:00:00:05),eth_type(0x0800),ipv4(src=192.168.0.2,dst=192.168.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=0,code=0), packets:0, bytes:0, used:0.0s, actions:drop
1341 AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl
1342 in_port(3),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0), packets:0, bytes:0, used:0.0s, actions:drop
1345 AT_CHECK([ovs-appctl dpif/del-flows br0])
1346 AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
1349 AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl
1350 in_port(3),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0), packets:0, bytes:0, used:0.0s, actions:drop