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="icmp,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,icmp_type=8,icmp_code=0"
120 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
121 AT_CHECK([tail -1 stdout | sed 's/Datapath actions: //' | tr "," "\n" | sort -n], [0], [dnl
130 AT_SETUP([ofproto-dpif - DSCP])
131 OVS_VSWITCHD_START([add-port br0 p1 -- set Interface p1 type=dummy])
132 ADD_OF_PORTS([br0], [9])
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(skb_priority(0x1)),1,dnl
147 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0xb,ttl=128,frag=no)),set(skb_priority(0x2)),1,dnl
149 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0x7,ttl=128,frag=no)),set(skb_priority(0x1)),1,dnl
150 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0xff,ttl=128,frag=no)),set(skb_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(skb_priority(0x1)),100,1,2,set(skb_priority(0x2)),3,set(skb_priority(0x1)),6,7
215 AT_SETUP([ofproto-dpif - controller])
216 OVS_VSWITCHD_START([dnl
217 add-port br0 p1 -- set Interface p1 type=dummy
220 AT_CAPTURE_FILE([ofctl_monitor.log])
221 AT_DATA([flows.txt], [dnl
222 cookie=0x0 dl_src=10:11:11:11:11:11 actions=controller
223 cookie=0x1 dl_src=20:22:22:22:22:22 actions=controller,resubmit(80,1)
224 cookie=0x2 dl_src=30:33:33:33:33:33 actions=mod_vlan_vid:15,controller
226 cookie=0x3 table=1 in_port=80 actions=load:1->NXM_NX_REG0[[]],mod_vlan_vid:80,controller,resubmit(81,2)
227 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)
228 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)
229 cookie=0x6 table=4 in_port=83 actions=load:4->NXM_NX_REG3[[]],mod_nw_src:83.83.83.83,controller,resubmit(84,5)
230 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)
231 cookie=0x8 table=6 in_port=85 actions=mod_tp_src:85,controller,resubmit(86,7)
232 cookie=0x9 table=7 in_port=86 actions=mod_tp_dst:86,controller,controller
234 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
237 AT_CHECK([ovs-ofctl monitor -P openflow10 br0 65534 --detach --no-chdir --pidfile 2> ofctl_monitor.log])
240 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)'
243 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
244 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
245 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via no_match) data_len=60 (unbuffered)
246 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
248 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via no_match) data_len=60 (unbuffered)
249 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
251 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via no_match) data_len=60 (unbuffered)
252 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
255 dnl Singleton controller action.
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=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)'
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 action) data_len=60 (unbuffered)
265 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
267 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
268 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
270 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
271 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
274 dnl Modified 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=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)'
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=64 in_port=1 (via action) data_len=64 (unbuffered)
284 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
286 OFPT_PACKET_IN (xid=0x0): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
287 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
289 OFPT_PACKET_IN (xid=0x0): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
290 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
294 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --no-chdir --pidfile 2> ofctl_monitor.log])
297 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)'
300 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
301 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
302 NXT_PACKET_IN (xid=0x0): cookie=0x1 total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
303 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
305 NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x3 total_len=64 in_port=1 reg0=0x1 (via action) data_len=64 (unbuffered)
306 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
308 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)
309 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
311 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)
312 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
314 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)
315 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
317 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)
318 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
320 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)
321 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
323 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)
324 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
326 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)
327 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
331 AT_CHECK([ovs-ofctl monitor br0 65534 --detach --no-chdir --pidfile 2> ofctl_monitor.log])
334 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'
337 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
338 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
339 NXT_PACKET_IN (xid=0x0): cookie=0x1 total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
340 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
342 NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x3 total_len=64 in_port=1 reg0=0x1 (via action) data_len=64 (unbuffered)
343 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
345 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)
346 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
348 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)
349 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
351 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)
352 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
354 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)
355 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
357 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)
358 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
360 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)
361 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
363 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)
364 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
367 AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
368 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
369 cookie=0x1, n_packets=2, n_bytes=120, dl_src=20:22:22:22:22:22 actions=CONTROLLER:65535,resubmit(80,1)
370 cookie=0x2, n_packets=3, n_bytes=180, dl_src=30:33:33:33:33:33 actions=mod_vlan_vid:15,CONTROLLER:65535
371 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)
372 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)
373 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)
374 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)
375 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)
376 cookie=0x8, table=6, n_packets=2, n_bytes=120, in_port=85 actions=mod_tp_src:85,CONTROLLER:65535,resubmit(86,7)
377 cookie=0x9, table=7, n_packets=2, n_bytes=120, in_port=86 actions=mod_tp_dst:86,CONTROLLER:65535,CONTROLLER:65535
378 n_packets=3, n_bytes=180, dl_src=10:11:11:11:11:11 actions=CONTROLLER:65535
385 AT_SETUP([ofproto-dpif - VLAN handling])
387 [set Bridge br0 fail-mode=standalone -- \
388 add-port br0 p1 trunks=10,12 -- \
389 add-port br0 p2 tag=10 -- \
390 add-port br0 p3 tag=12 \
391 other-config:priority-tags=true -- \
392 add-port br0 p4 tag=12 -- \
393 add-port br0 p5 vlan_mode=native-tagged tag=10 -- \
394 add-port br0 p6 vlan_mode=native-tagged tag=10 trunks=10,12 -- \
395 add-port br0 p7 vlan_mode=native-untagged tag=12 -- \
396 add-port br0 p8 vlan_mode=native-untagged tag=12 trunks=10,12 \
397 other-config:priority-tags=true -- \
398 set Interface p1 type=dummy -- \
399 set Interface p2 type=dummy -- \
400 set Interface p3 type=dummy -- \
401 set Interface p4 type=dummy -- \
402 set Interface p5 type=dummy -- \
403 set Interface p6 type=dummy -- \
404 set Interface p7 type=dummy -- \
405 set Interface p8 type=dummy --])
407 dnl Each of these specifies an in_port by number, a VLAN VID (or "none"),
408 dnl a VLAN PCP (used if the VID isn't "none") and the expected set of datapath
414 "100 10 0 1,5,6,7,8,pop_vlan,2" \
415 "100 10 1 1,5,6,7,8,pop_vlan,2" \
418 "100 12 0 1,5,6,pop_vlan,3,4,7,8" \
419 "100 12 1 1,5,6,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
423 "1 10 0 5,6,7,8,100,pop_vlan,2" \
424 "1 10 1 5,6,7,8,100,pop_vlan,2" \
427 "1 12 0 5,6,100,pop_vlan,3,4,7,8" \
428 "1 12 1 5,6,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
429 "2 none 0 push_vlan(vid=10,pcp=0),1,5,6,7,8,100" \
430 "2 0 0 pop_vlan,push_vlan(vid=10,pcp=0),1,5,6,7,8,100" \
431 "2 0 1 pop_vlan,push_vlan(vid=10,pcp=1),1,5,6,7,8,100" \
438 "3 none 0 4,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
439 "3 0 0 pop_vlan,4,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
440 "3 0 1 8,pop_vlan,4,7,push_vlan(vid=12,pcp=1),1,5,6,100" \
447 "4 none 0 3,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
448 "4 0 0 pop_vlan,3,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
449 "4 0 1 3,8,pop_vlan,7,push_vlan(vid=12,pcp=1),1,5,6,100" \
456 "5 none 0 2,push_vlan(vid=10,pcp=0),1,6,7,8,100" \
457 "5 0 0 pop_vlan,2,push_vlan(vid=10,pcp=0),1,6,7,8,100" \
458 "5 0 1 pop_vlan,2,push_vlan(vid=10,pcp=1),1,6,7,8,100" \
459 "5 10 0 1,6,7,8,100,pop_vlan,2" \
460 "5 10 1 1,6,7,8,100,pop_vlan,2" \
463 "5 12 0 1,6,100,pop_vlan,3,4,7,8" \
464 "5 12 1 1,6,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
465 "6 none 0 2,push_vlan(vid=10,pcp=0),1,5,7,8,100" \
466 "6 0 0 pop_vlan,2,push_vlan(vid=10,pcp=0),1,5,7,8,100" \
467 "6 0 1 pop_vlan,2,push_vlan(vid=10,pcp=1),1,5,7,8,100" \
468 "6 10 0 1,5,7,8,100,pop_vlan,2" \
469 "6 10 1 1,5,7,8,100,pop_vlan,2" \
472 "6 12 0 1,5,100,pop_vlan,3,4,7,8" \
473 "6 12 1 1,5,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
474 "7 none 0 3,4,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
475 "7 0 0 pop_vlan,3,4,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
476 "7 0 1 3,8,pop_vlan,4,push_vlan(vid=12,pcp=1),1,5,6,100" \
477 "7 10 0 1,5,6,8,100,pop_vlan,2" \
478 "7 10 1 1,5,6,8,100,pop_vlan,2" \
481 "7 12 0 1,5,6,100,pop_vlan,3,4,8" \
482 "7 12 1 1,5,6,100,pop_vlan,4,push_vlan(vid=0,pcp=1),3,8" \
483 "8 none 0 3,4,7,push_vlan(vid=12,pcp=0),1,5,6,100" \
484 "8 0 0 pop_vlan,3,4,7,push_vlan(vid=12,pcp=0),1,5,6,100" \
485 "8 0 1 3,pop_vlan,4,7,push_vlan(vid=12,pcp=1),1,5,6,100" \
486 "8 10 0 1,5,6,7,100,pop_vlan,2" \
487 "8 10 1 1,5,6,7,100,pop_vlan,2" \
490 "8 12 0 1,5,6,100,pop_vlan,3,4,7" \
491 "8 12 1 1,5,6,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3"
499 if test $vlan = none; then
500 flow="in_port($in_port),eth(src=50:54:00:00:00:01,dst=ff:ff:ff:ff:ff:ff),eth_type(0xabcd)"
502 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))"
505 echo "----------------------------------------------------------------------"
506 echo "in_port=$in_port vlan=$vlan pcp=$pcp"
508 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
509 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
511 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
513 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
519 AT_SETUP([ofproto-dpif - fragment handling])
521 ADD_OF_PORTS([br0], [1], [2], [3], [4], [5], [6], [90])
522 AT_DATA([flows.txt], [dnl
523 priority=75 tcp ip_frag=no tp_dst=80 actions=output:1
524 priority=75 tcp ip_frag=first tp_dst=80 actions=output:2
525 priority=75 tcp ip_frag=later tp_dst=80 actions=output:3
526 priority=50 tcp ip_frag=no actions=output:4
527 priority=50 tcp ip_frag=first actions=output:5
528 priority=50 tcp ip_frag=later actions=output:6
530 AT_CHECK([ovs-ofctl replace-flows br0 flows.txt])
532 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"
533 no_flow="$base_flow,frag=no),tcp(src=12345,dst=80)"
534 first_flow="$base_flow,frag=first),tcp(src=12345,dst=80)"
535 later_flow="$base_flow,frag=later)"
537 # mode no first later
549 AT_CHECK([ovs-ofctl set-frags br0 $mode])
550 for type in no first later; do
551 eval flow=\$${type}_flow exp_output=\$$type
552 printf "\n%s\n" "----$mode $type-----"
553 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
555 if test $mode = drop && test $type != no; then
556 echo 'Packets dropped because they are IP fragments and the fragment handling mode is "drop".' >> expout
558 echo "Datapath actions: $exp_output" >> expout
559 AT_CHECK([grep 'IP fragments' stdout; tail -1 stdout], [0], [expout])
565 AT_SETUP([ofproto-dpif - exit])
567 ADD_OF_PORTS([br0], [1], [2], [3], [10], [11], [12], [13], [14])
568 AT_DATA([flows.txt], [dnl
569 in_port=1 actions=output:10,exit,output:11
570 in_port=2 actions=output:12,resubmit:1,output:12
571 in_port=3 actions=output:13,resubmit:2,output:14
573 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
574 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])
575 AT_CHECK([tail -1 stdout], [0],
576 [Datapath actions: 10
578 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])
579 AT_CHECK([tail -1 stdout], [0],
580 [Datapath actions: 12,10
582 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])
583 AT_CHECK([tail -1 stdout], [0],
584 [Datapath actions: 13,12,10
590 AT_SETUP([ofproto-dpif - mirroring, select_all])
592 ADD_OF_PORTS([br0], 1, 2, 3)
594 set Bridge br0 mirrors=@m --\
595 --id=@p3 get Port p3 --\
596 --id=@m create Mirror name=mymirror select_all=true output_port=@p3
598 AT_DATA([flows.txt], [dnl
599 in_port=1 actions=output:2
600 in_port=2 actions=output:1
602 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
604 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)"
605 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
606 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
607 [Datapath actions: 2,3
610 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)"
611 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
612 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
613 [Datapath actions: 1,3
620 AT_SETUP([ofproto-dpif - mirroring, select_src])
622 ADD_OF_PORTS([br0], 1, 2, 3)
624 set Bridge br0 mirrors=@m --\
625 --id=@p1 get Port p1 -- --id=@p3 get Port p3 --\
626 --id=@m create Mirror name=mymirror select_src_port=@p1 output_port=@p3
628 AT_DATA([flows.txt], [dnl
629 in_port=1 actions=output:2
630 in_port=2 actions=output:1
632 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
634 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)"
635 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
636 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
637 [Datapath actions: 2,3
640 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)"
641 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
642 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
648 AT_SETUP([ofproto-dpif - mirroring, OFPP_NONE ingress port])
650 ADD_OF_PORTS([br0], 1, 2)
652 set Bridge br0 mirrors=@m --\
653 --id=@p2 get Port p2 --\
654 --id=@m create Mirror name=mymirror select_all=true output_port=@p2
656 AT_CHECK([ovs-ofctl add-flow br0 action=output:1])
658 # "in_port" defaults to OFPP_NONE if it's not specified.
659 flow="icmp,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_ttl=128,icmp_type=8,icmp_code=0"
660 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
661 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
662 [Datapath actions: 1,2
669 AT_SETUP([ofproto-dpif - mirroring, select_dst])
671 ADD_OF_PORTS([br0], 1, 2, 3)
673 set Bridge br0 mirrors=@m --\
674 --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
675 --id=@m create Mirror name=mymirror select_dst_port=@p2 output_port=@p3
677 AT_DATA([flows.txt], [dnl
678 in_port=1 actions=output:2
679 in_port=2 actions=output:1
681 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
683 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)"
684 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
685 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
686 [Datapath actions: 2,3
689 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)"
690 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
691 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
699 AT_SETUP([ofproto-dpif - mirroring, select_vlan])
701 ADD_OF_PORTS([br0], 1, 2, 3)
703 set Bridge br0 mirrors=@m --\
704 --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
705 --id=@m create Mirror name=mymirror select_all=true select_vlan=11 output_port=@p3
707 AT_DATA([flows.txt], [dnl
708 in_port=1, actions=output:2
710 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
712 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)"
713 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
714 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
718 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))"
719 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
720 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
724 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))"
725 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
726 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
727 [Datapath actions: 2,3
734 AT_SETUP([ofproto-dpif - mirroring, output_port])
736 ADD_OF_PORTS([br0], 1, 2, 3)
738 set Bridge br0 mirrors=@m --\
739 --id=@p3 get Port p3 --\
740 --id=@m create Mirror name=mymirror select_all=true output_port=@p3
742 AT_DATA([flows.txt], [dnl
743 in_port=1 actions=mod_vlan_vid:17,output:2
744 in_port=2 actions=output:1
746 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
748 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)"
749 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
750 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
751 [Datapath actions: push_vlan(vid=17,pcp=0),2,pop_vlan,3
754 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)"
755 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
756 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
757 [Datapath actions: 1,3
763 AT_SETUP([ofproto-dpif - mirroring, output_vlan])
765 ADD_OF_PORTS([br0], 1, 2)
767 set Bridge br0 mirrors=@m --\
768 --id=@m create Mirror name=mymirror select_all=true output_vlan=12
770 AT_DATA([flows.txt], [dnl
771 in_port=1 actions=output:2
772 in_port=2 actions=mod_vlan_vid:17,output:1
774 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
776 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)"
777 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
778 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
780 expected="2,push_vlan(vid=12,pcp=0),1,2,100"
781 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
783 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
785 flow="in_port(2),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)"
786 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
787 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
789 expected="push_vlan(vid=17,pcp=0),1,pop_vlan,push_vlan(vid=12,pcp=0),1,2,100"
790 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
792 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
797 m4_define([OFPROTO_TRACE],
799 AT_CHECK([ovs-appctl ofproto/trace $1 "$flow" $3], [0], [stdout])
800 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
802 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" $5],
805 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" $5],
808 AT_SETUP([ofproto-dpif - MAC learning])
809 OVS_VSWITCHD_START([set bridge br0 fail-mode=standalone])
810 ADD_OF_PORTS([br0], 1, 2, 3)
812 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)'
814 # Trace an ARP packet arriving on p3, to create a MAC learning entry.
817 [in_port(3),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
821 # Check for the MAC learning entry.
822 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
824 3 0 50:54:00:00:00:05 ?
827 # Trace a packet arrival destined for the learned MAC.
828 # (This will also learn a MAC.)
831 [in_port(1),eth(src=50:54:00:00:00:06,dst=50:54:00:00:00:05),$arp],
835 # Check for both MAC learning entries.
836 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
838 3 0 50:54:00:00:00:05 ?
839 1 0 50:54:00:00:00:06 ?
842 # Trace a packet arrival that updates the first learned MAC entry.
845 [in_port(2),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
849 # Check that the MAC learning entry was updated.
850 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
852 1 0 50:54:00:00:00:06 ?
853 2 0 50:54:00:00:00:05 ?
856 # Add another bridge.
860 -- set bridge br1 datapath-type=dummy \
861 -- add-port br1 p4 -- set interface p4 type=dummy \
862 -- add-port br1 p5 -- set interface p5 type=dummy])
864 # Trace some packet arrivals in br1 to create MAC learning entries there too.
867 [in_port(4),eth(src=50:54:00:00:00:06,dst=ff:ff:ff:ff:ff:ff),$arp],
872 [in_port(5),eth(src=50:54:00:00:00:07,dst=ff:ff:ff:ff:ff:ff),$arp],
876 # Check that the MAC learning entries were added.
877 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
879 4 0 50:54:00:00:00:06 ?
880 5 0 50:54:00:00:00:07 ?
883 # Delete port p1 and see that its MAC learning entry disappeared, and
884 # that the MAC learning entry for the same MAC was also deleted from br1.
885 AT_CHECK([ovs-vsctl del-port p1])
886 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
888 2 0 50:54:00:00:00:05 ?
890 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
892 5 0 50:54:00:00:00:07 ?
898 AT_SETUP([ofproto-dpif - MAC table overflow])
900 [set bridge br0 fail-mode=standalone other-config:mac-table-size=10 -- \
901 add-port br0 p1 -- set Interface p1 type=dummy -- \
902 add-port br0 p2 -- set Interface p2 type=dummy -- \
903 add-port br0 p3 -- set Interface p3 type=dummy])
905 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)'
907 AT_CHECK([ovs-appctl time/stop])
909 # Trace 10 ARP packets arriving on p3, to create MAC learning entries.
910 for i in 0 1 2 3 4 5 6 7 8 9; do
913 [in_port(3),eth(src=50:54:00:00:00:0$i,dst=ff:ff:ff:ff:ff:ff),$arp],
916 ovs-appctl time/warp 1000
919 # Check for the MAC learning entries.
920 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/ *[[0-9]]\{1,\}$//' | sort],
922 3 0 50:54:00:00:00:00
923 3 0 50:54:00:00:00:01
924 3 0 50:54:00:00:00:02
925 3 0 50:54:00:00:00:03
926 3 0 50:54:00:00:00:04
927 3 0 50:54:00:00:00:05
928 3 0 50:54:00:00:00:06
929 3 0 50:54:00:00:00:07
930 3 0 50:54:00:00:00:08
931 3 0 50:54:00:00:00:09
935 # Trace another ARP packet on another MAC.
938 [in_port(3),eth(src=50:54:00:00:00:10,dst=ff:ff:ff:ff:ff:ff),$arp],
942 # Check that the new one chased the oldest one out of the table.
943 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/' | sort],
945 3 0 50:54:00:00:00:01 ?
946 3 0 50:54:00:00:00:02 ?
947 3 0 50:54:00:00:00:03 ?
948 3 0 50:54:00:00:00:04 ?
949 3 0 50:54:00:00:00:05 ?
950 3 0 50:54:00:00:00:06 ?
951 3 0 50:54:00:00:00:07 ?
952 3 0 50:54:00:00:00:08 ?
953 3 0 50:54:00:00:00:09 ?
954 3 0 50:54:00:00:00:10 ?
960 dnl Test that basic NetFlow reports flow statistics correctly:
961 dnl - The initial packet of a flow are correctly accounted.
962 dnl - Later packets within a flow are correctly accounted.
963 dnl - Flow actions changing (in this case, due to MAC learning)
964 dnl cause a record to be sent.
965 AT_SETUP([ofproto-dpif - NetFlow flow expiration])
967 AT_CHECK([perl $srcdir/choose-port.pl], [0], [stdout])
968 NETFLOW_PORT=`cat stdout`
970 OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
971 ADD_OF_PORTS([br0], 1, 2)
973 set Bridge br0 netflow=@nf -- \
974 --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
975 engine_id=1 engine_type=2 active_timeout=30 add-id-to-interface=false
977 ON_EXIT([kill `cat test-netflow.pid`])
978 AT_CHECK([test-netflow --detach --no-chdir --pidfile $NETFLOW_PORT:127.0.0.1 > netflow.log])
979 AT_CAPTURE_FILE([netflow.log])
981 for delay in 1000 30000; do
982 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)'
983 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)'
985 ovs-appctl time/warp $delay
990 ovs-appctl -t test-netflow exit
992 AT_CHECK([[sed -e 's/, uptime [0-9]*//
994 s/time \([0-9]*\)\.\.\.\1$/time <moment>/
995 s/time [0-9]*\.\.\.[0-9]*/time <range>/
996 ' netflow.log | sort]], [0],
998 header: v5, seq 0, engine 2,1
999 header: v5, seq 1, engine 2,1
1000 seq 0: 192.168.0.1 > 192.168.0.2, if 1 > 65535, 1 pkts, 60 bytes, ICMP 8:0, time <moment>
1001 seq 1: 192.168.0.1 > 192.168.0.2, if 1 > 2, 1 pkts, 60 bytes, ICMP 8:0, time <moment>
1002 seq 1: 192.168.0.2 > 192.168.0.1, if 2 > 1, 2 pkts, 120 bytes, ICMP 0:0, time <range>
1006 dnl Test that basic NetFlow reports active expirations correctly.
1007 AT_SETUP([ofproto-dpif - NetFlow active expiration])
1009 AT_CHECK([perl $srcdir/choose-port.pl], [0], [stdout])
1010 NETFLOW_PORT=`cat stdout`
1012 OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
1013 ADD_OF_PORTS([br0], 1, 2)
1015 set Bridge br0 netflow=@nf -- \
1016 --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
1017 engine_id=1 engine_type=2 active_timeout=10 add-id-to-interface=false
1019 ON_EXIT([kill `test-netflow.pid`])
1020 AT_CHECK([test-netflow --detach --no-chdir --pidfile $NETFLOW_PORT:127.0.0.1 > netflow.log])AT_CAPTURE_FILE([netflow.log])
1022 AT_CHECK([ovs-appctl time/stop])
1024 while test $n -le 60; do
1027 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)'
1028 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)'
1030 ovs-appctl time/warp 1000
1033 ovs-appctl time/warp 10000
1037 ovs-appctl -t test-netflow exit
1039 # Count the number of reported packets:
1040 # - From source to destination before MAC learning kicks in (just one).
1041 # - From source to destination after that.
1042 # - From destination to source.
1050 pkts=`echo "$line" | sed 's/.*, \([[0-9]]*\) pkts,.*/\1/'`
1057 "seq "*": 192.168.0.1 > 192.168.0.2, if 1 > 65535, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
1060 "seq "*": 192.168.0.1 > 192.168.0.2, if 1 > 2, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
1063 "seq "*": 192.168.0.2 > 192.168.0.1, if 2 > 1, "*" pkts, "*" bytes, TCP 80 > 1234, time "*)
1070 eval $counter=\`expr \$$counter + \$pkts\`
1071 n_recs=`expr $n_recs + 1`
1074 # There should be exactly 1 MAC learning packet,
1075 # exactly 59 other packets in that direction,
1076 # and exactly 60 packets in the other direction.
1077 AT_CHECK([echo $n_learn $n_in $n_out $n_other], [0], [1 59 60 0
1080 # There should be 1 expiration for MAC learning,
1081 # at least 5 active and a final expiration in one direction,
1082 # and at least 5 active and a final expiration in the other direction.
1084 AT_CHECK([test $n_recs -ge 13])
1088 AT_SETUP([idle_age and hard_age increase over time])
1091 # get_ages DURATION HARD IDLE
1093 # Fetch the flow duration, hard age, and idle age into the variables
1094 # whose names are given as arguments. Rounds DURATION down to the
1095 # nearest integer. If hard_age doesn't appear in the output, sets
1096 # HARD to "none". If idle_age doesn't appear in the output, sets IDLE
1099 AT_CHECK([ovs-ofctl dump-flows br0], [0], [stdout])
1101 duration=`sed -n 's/.*duration=\([[0-9]]*\)\(\.[[0-9]]*\)\{0,1\}s.*/\1/p' stdout`
1102 AT_CHECK([[expr X"$duration" : 'X[0-9][0-9]*$']], [0], [ignore])
1103 AS_VAR_COPY([$1], [duration])
1105 hard=`sed -n 's/.*hard_age=\([[0-9]]*\),.*/\1/p' stdout`
1106 if test X"$hard" = X; then
1109 AT_CHECK([[expr X"$hard" : 'X[0-9][0-9]*$']], [0], [ignore])
1111 AS_VAR_COPY([$2], [hard])
1113 idle=`sed -n 's/.*idle_age=\([[0-9]]*\),.*/\1/p' stdout`
1114 if test X"$idle" = X; then
1117 AT_CHECK([[expr X"$idle" : 'X[0-9][0-9]*$']], [0], [ignore])
1119 AS_VAR_COPY([$3], [idle])
1122 # Add a flow and get its initial hard and idle age.
1123 AT_CHECK([ovs-ofctl add-flow br0 hard_timeout=199,idle_timeout=188,actions=drop])
1124 get_ages duration1 hard1 idle1
1126 # Warp time forward by 10 seconds, then modify the flow's actions.
1127 ovs-appctl time/warp 10000
1128 get_ages duration2 hard2 idle2
1129 AT_CHECK([ovs-ofctl mod-flows br0 actions=flood])
1131 # Warp time forward by 10 seconds.
1132 ovs-appctl time/warp 10000
1133 get_ages duration3 hard3 idle3
1135 # Warp time forward 10 more seconds, then pass some packets through the flow,
1136 # then warp forward a few more times because idle times are only updated
1138 ovs-appctl time/warp 10000
1139 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)'
1140 ovs-appctl time/warp 1000
1141 ovs-appctl time/warp 1000
1142 ovs-appctl time/warp 1000
1143 get_ages duration4 hard4 idle4
1145 printf "duration: %4s => %4s => %4s => %4s\n" $duration1 $duration2 $duration3 $duration4
1146 printf "hard_age: %4s => %4s => %4s => %4s\n" $hard1 $hard2 $hard3 $hard4
1147 printf "idle_age: %4s => %4s => %4s => %4s\n" $idle1 $idle2 $idle3 $idle4
1149 # Duration should increase steadily over time.
1150 AT_CHECK([test $duration1 -lt $duration2])
1151 AT_CHECK([test $duration2 -lt $duration3])
1152 AT_CHECK([test $duration3 -lt $duration4])
1154 # Hard age should be "none" initially because it's the same as flow_duration,
1155 # then it should increase.
1156 AT_CHECK([test $hard1 = none])
1157 AT_CHECK([test $hard2 = none])
1158 AT_CHECK([test $hard3 != none])
1159 AT_CHECK([test $hard4 != none])
1160 AT_CHECK([test $hard3 -lt $hard4])
1162 # Idle age should increase from 1 to 2 to 3, then decrease.
1163 AT_CHECK([test $idle1 -lt $idle2])
1164 AT_CHECK([test $idle2 -lt $idle3])
1165 AT_CHECK([test $idle3 -gt $idle4])
1167 # Check some invariant relationships.
1168 AT_CHECK([test $duration1 = $idle1])
1169 AT_CHECK([test $duration2 = $idle2])
1170 AT_CHECK([test $duration3 = $idle3])
1171 AT_CHECK([test $idle3 -gt $hard3])
1172 AT_CHECK([test $idle4 -lt $hard4])
1173 AT_CHECK([test $hard4 -lt $duration4])
1178 AT_SETUP([ofproto-dpif - fin_timeout])
1180 AT_DATA([flows.txt], [dnl
1181 in_port=1 actions=output:2
1182 in_port=2 actions=mod_vlan_vid:17,output:1
1184 AT_CHECK([ovs-ofctl add-flow br0 'idle_timeout=60,actions=fin_timeout(idle_timeout=5)'])
1185 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
1187 idle_timeout=60, actions=fin_timeout(idle_timeout=5)
1189 # Check that a TCP SYN packet does not change the timeout. (Because
1190 # flow stats updates are mainly what implements the fin_timeout
1191 # feature, we warp forward a couple of times to ensure that flow stats
1192 # run before re-checking the flow table.)
1193 AT_CHECK([ovs-appctl netdev-dummy/receive br0 0021853763af0026b98cb0f908004500003c2e2440004006465dac11370dac11370b828b0016751e267b00000000a00216d017360000020405b40402080a2d25085f0000000001030307], [0], [success
1195 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
1198 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
1200 n_packets=1, n_bytes=74, idle_timeout=60, actions=fin_timeout(idle_timeout=5)
1202 # Check that a TCP FIN packet does change the timeout.
1203 AT_CHECK([ovs-appctl netdev-dummy/receive br0 0021853763af0026b98cb0f90800451000342e3e40004006463bac11370dac11370b828b0016751e319dfc96399b801100717ae800000101080a2d250a9408579588], [0], [success
1205 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
1208 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
1210 n_packets=2, n_bytes=140, idle_timeout=5, actions=fin_timeout(idle_timeout=5)
1215 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-dps])
1216 OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy])
1217 ADD_OF_PORTS([br0], [1], [2])
1218 ADD_OF_PORTS([br1], [3])
1220 AT_CHECK([ovs-appctl dpif/dump-dps], [0], [dnl
1227 AT_SETUP([ofproto-dpif - ovs-appctl dpif/show])
1228 OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy])
1229 ADD_OF_PORTS([br0], [1], [2])
1230 ADD_OF_PORTS([br1], [3])
1232 AT_CHECK([ovs-appctl dpif/show], [0], [dnl
1233 br0 (dummy@ovs-dummy):
1234 lookups: hit:0 missed:0
1235 flows: cur: 0, avg: 0.000, max: 0, life span: 0(ms)
1236 overall avg: add rate: 0.000/min, del rate: 0.000/min
1237 br0 65534/100: (dummy)
1240 br1 (dummy@ovs-dummy):
1241 lookups: hit:0 missed:0
1242 flows: cur: 0, avg: 0.000, max: 0, life span: 0(ms)
1243 overall avg: add rate: 0.000/min, del rate: 0.000/min
1244 br1 65534/101: (dummy)
1248 AT_CHECK([ovs-appctl dpif/show br0], [0], [dnl
1249 br0 (dummy@ovs-dummy):
1250 lookups: hit:0 missed:0
1251 flows: cur: 0, avg: 0.000, max: 0, life span: 0(ms)
1252 overall avg: add rate: 0.000/min, del rate: 0.000/min
1253 br0 65534/100: (dummy)
1260 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-flows])
1261 OVS_VSWITCHD_START([add-br br1 -- \
1262 set bridge br1 datapath-type=dummy fail-mode=secure])
1263 ADD_OF_PORTS([br0], [1], [2])
1264 ADD_OF_PORTS([br1], [3])
1266 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
1268 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
1270 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
1273 AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
1274 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:userspace(pid=0,slow_path(controller))
1275 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:userspace(pid=0,slow_path(controller))
1278 AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl
1279 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:userspace(pid=0,slow_path(controller))
1285 AT_SETUP([ofproto-dpif - ovs-appctl dpif/del-flows])
1286 OVS_VSWITCHD_START([add-br br1 -- \
1287 set bridge br1 datapath-type=dummy fail-mode=secure])
1288 ADD_OF_PORTS([br0], [1], [2])
1289 ADD_OF_PORTS([br1], [3])
1291 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
1293 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
1295 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
1298 AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
1299 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:userspace(pid=0,slow_path(controller))
1300 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:userspace(pid=0,slow_path(controller))
1303 AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl
1304 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:userspace(pid=0,slow_path(controller))
1307 AT_CHECK([ovs-appctl dpif/del-flows br0])
1308 AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
1311 AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl
1312 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:userspace(pid=0,slow_path(controller))
1318 AT_SETUP([ofproto-dpif - patch ports])
1319 OVS_VSWITCHD_START([add-br br1 \
1320 -- set bridge br1 datapath-type=dummy fail-mode=secure \
1321 -- add-port br1 pbr1 -- set int pbr1 type=patch options:peer=pbr0 \
1322 -- add-port br0 pbr0 -- set int pbr0 type=patch options:peer=pbr1])
1324 ADD_OF_PORTS([br0], [2])
1325 ADD_OF_PORTS([br1], [3])
1327 AT_CHECK([ovs-ofctl add-flow br0 actions=LOCAL,output:1,output:2])
1328 AT_CHECK([ovs-ofctl add-flow br1 actions=LOCAL,output:1,output:3])
1330 for i in $(seq 1 10); do
1331 ovs-appctl netdev-dummy/receive br0 'in_port(100),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)'
1334 for i in $(seq 1 5); do
1335 ovs-appctl netdev-dummy/receive br1 'in_port(101),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=8,code=0)'
1338 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
1342 AT_CHECK([ovs-appctl dpif/show], [0], [dnl
1343 br0 (dummy@ovs-dummy):
1344 lookups: hit:9 missed:1
1345 flows: cur: 1, avg: 1.000, max: 1, life span: 0(ms)
1346 overall avg: add rate: 0.000/min, del rate: 0.000/min
1347 br0 65534/100: (dummy)
1349 pbr0 1/none: (patch: peer=pbr1)
1350 br1 (dummy@ovs-dummy):
1351 lookups: hit:4 missed:1
1352 flows: cur: 1, avg: 1.000, max: 1, life span: 0(ms)
1353 overall avg: add rate: 0.000/min, del rate: 0.000/min
1354 br1 65534/101: (dummy)
1356 pbr1 1/none: (patch: peer=pbr0)
1359 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_USED], [0], [dnl
1360 in_port(100),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:9, bytes:540, used:0.0s, actions:101,3,2
1362 AT_CHECK([ovs-appctl dpif/dump-flows br1 | STRIP_USED], [0], [dnl
1363 in_port(101),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=8,code=0), packets:4, bytes:240, used:0.0s, actions:100,2,3
1366 AT_CHECK([ovs-ofctl dump-ports br0 pbr0], [0], [dnl
1367 OFPST_PORT reply (xid=0x4): 1 ports
1368 port 1: rx pkts=5, bytes=300, drop=0, errs=0, frame=0, over=0, crc=0
1369 tx pkts=10, bytes=600, drop=0, errs=0, coll=0
1372 AT_CHECK([ovs-ofctl dump-ports br1 pbr1], [0], [dnl
1373 OFPST_PORT reply (xid=0x4): 1 ports
1374 port 1: rx pkts=10, bytes=600, drop=0, errs=0, frame=0, over=0, crc=0
1375 tx pkts=5, bytes=300, drop=0, errs=0, coll=0
1381 AT_SETUP([ofproto-dpif - ovs-appctl dpif/show rates])
1382 OVS_VSWITCHD_START([set Bridge br0 fail-mode=secure])
1383 ADD_OF_PORTS([br0], 1, 2)
1385 AT_CHECK([ovs-ofctl add-flow br0 actions=LOCAL,output:1,output:2])
1387 for i in $(seq 1 61); do
1388 ovs-appctl netdev-dummy/receive 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=64,frag=no),icmp(type=8,code=0)'
1389 ovs-appctl time/warp 10000
1390 ovs-appctl time/warp 50000
1393 AT_CHECK([ovs-appctl time/warp 10000], [0], [warped
1396 AT_CHECK([ovs-appctl dpif/show | sed 's/ 10[[0-9]]\{3\}(ms)$/ 10000(ms)/'], [0], [dnl
1397 br0 (dummy@ovs-dummy):
1398 lookups: hit:0 missed:61
1399 flows: cur: 0, avg: 1.000, max: 1, life span: 10000(ms)
1400 hourly avg: add rate: 0.641/min, del rate: 0.641/min
1401 overall avg: add rate: 1.000/min, del rate: 1.000/min
1402 br0 65534/100: (dummy)