1 AT_BANNER([ofproto-dpif])
3 AT_SETUP([ofproto-dpif - resubmit])
5 AT_DATA([flows.txt], [dnl
6 table=0 in_port=1 priority=1000 icmp actions=output(10),resubmit(2),output(19),resubmit(3),output(21)
7 table=0 in_port=2 priority=1500 icmp actions=output(11),resubmit(,1),output(16),resubmit(2,1),output(18)
8 table=0 in_port=3 priority=2000 icmp actions=output(20)
9 table=1 in_port=1 priority=1000 icmp actions=output(12),resubmit(4,1),output(13),resubmit(3),output(15)
10 table=1 in_port=2 priority=1500 icmp actions=output(17),resubmit(,2)
11 table=1 in_port=3 priority=1500 icmp actions=output(14),resubmit(,2)
13 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
14 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(1),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])
15 AT_CHECK([tail -1 stdout], [0],
16 [Datapath actions: 10,11,12,13,14,15,16,17,18,19,20,21
21 AT_SETUP([ofproto-dpif - registers])
23 AT_DATA([flows.txt], [dnl
24 in_port=90 actions=resubmit:2,resubmit:3,resubmit:4,resubmit:91
25 in_port=91 actions=resubmit:5,resubmit:6,resubmit:7,resubmit:92
26 in_port=92 actions=resubmit:8,resubmit:9,resubmit:10,resubmit:11
27 in_port=2 actions=load:0x000db000->NXM_NX_REG0[[]]
28 in_port=3 actions=load:0xdea->NXM_NX_REG0[[20..31]]
29 in_port=4 actions=load:0xeef->NXM_NX_REG0[[0..11]]
30 in_port=5 actions=move:NXM_NX_REG0[[]]->NXM_NX_REG1[[]]
31 in_port=6 actions=load:0x22222222->NXM_NX_REG2[[]]
32 in_port=7 actions=move:NXM_NX_REG1[[20..31]]->NXM_NX_REG2[[0..11]]
33 in_port=8 actions=move:NXM_NX_REG1[[0..11]]->NXM_NX_REG2[[20..31]]
34 in_port=9,reg0=0xdeadbeef actions=output:20
35 in_port=10,reg1=0xdeadbeef actions=output:21
36 in_port=11,reg2=0xeef22dea actions=output:22
38 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
39 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])
40 AT_CHECK([tail -1 stdout], [0],
41 [Datapath actions: 20,21,22
46 AT_SETUP([ofproto-dpif - output])
48 AT_DATA([flows.txt], [dnl
49 in_port=1 actions=resubmit:2,resubmit:3,resubmit:4,resubmit:5,resubmit:6,resubmit:7
50 in_port=2 actions=output:9
51 in_port=3 actions=load:55->NXM_NX_REG0[[]],output:NXM_NX_REG0[[]],load:66->NXM_NX_REG1[[]]
52 in_port=4 actions=output:10,output:NXM_NX_REG0[[]],output:NXM_NX_REG1[[]],output:11
53 in_port=5 actions=load:77->NXM_NX_REG0[[0..15]],load:88->NXM_NX_REG0[[16..31]]
54 in_port=6 actions=output:NXM_NX_REG0[[0..15]],output:NXM_NX_REG0[[16..31]]
55 in_port=7 actions=load:0x110000ff->NXM_NX_REG0[[]],output:NXM_NX_REG0[[]]
57 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
58 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])
59 AT_CHECK([tail -1 stdout], [0],
60 [Datapath actions: 9,55,10,55,66,11,77,88
65 AT_SETUP([ofproto-dpif - DSCP])
66 dnl This test assumes port p1 is allocated OpenFlow port number 1.
67 OVS_VSWITCHD_START([add-port br0 p1 -- set Interface p1 type=dummy])
68 AT_DATA([flows.txt], [dnl
69 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
71 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
72 AT_CHECK([ovs-vsctl -- \
73 set Port p1 qos=@newqos --\
74 --id=@newqos create QoS type=linux-htb queues=1=@q1,2=@q2 --\
75 --id=@q1 create Queue dscp=1 --\
76 --id=@q2 create Queue dscp=2], [0], [ignore])
77 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])
78 AT_CHECK([tail -1 stdout], [0],
79 [Datapath actions: dnl
81 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
82 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
84 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
85 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
86 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0x3,ttl=128,frag=no)),1,dnl
92 AT_SETUP([ofproto-dpif - output/flood flags])
93 dnl This test assumes that OpenFlow port numbers are allocated in order
94 dnl starting from one. It does not necessarily require that they are allocated
95 dnl in the same order that they are named in the database. Just that the
96 dnl following command guarantees OpenFlow port 65534, and ports 1-7 exist in
98 OVS_VSWITCHD_START([dnl
99 add-port br0 p1 -- set Interface p1 type=dummy --\
100 add-port br0 p2 -- set Interface p2 type=dummy --\
101 add-port br0 p3 -- set Interface p3 type=dummy --\
102 add-port br0 p4 -- set Interface p4 type=dummy --\
103 add-port br0 p5 -- set Interface p5 type=dummy --\
104 add-port br0 p6 -- set Interface p6 type=dummy --\
105 add-port br0 p7 -- set Interface p7 type=dummy ])
107 AT_DATA([flows.txt], [dnl
108 in_port=1 actions=flood
109 in_port=2 actions=all
110 in_port=3 actions=output:65534,output:1,output:2,output:3,output:4,output:5,output:6,output:7
111 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
113 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
114 AT_CHECK([ovs-ofctl mod-port br0 5 noforward])
115 AT_CHECK([ovs-ofctl mod-port br0 6 noflood])
117 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])
118 AT_CHECK([tail -1 stdout \
119 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
127 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])
128 AT_CHECK([tail -1 stdout \
129 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
138 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])
139 AT_CHECK([tail -1 stdout], [0],
140 [Datapath actions: 0,1,2,4,6,7
143 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])
144 AT_CHECK([tail -1 stdout], [0],
145 [Datapath actions: set(priority(1)),0,1,2,set(priority(2)),3,set(priority(1)),6,7
150 AT_SETUP([ofproto-dpif - set_tunnel])
152 AT_DATA([flows.txt], [dnl
153 in_port=90 actions=resubmit:1,resubmit:2,resubmit:3,resubmit:4,resubmit:5
154 in_port=1 actions=set_tunnel:1,output:1
155 in_port=2 actions=set_tunnel:1,output:2
156 in_port=3 actions=set_tunnel:2,set_tunnel:3,output:3
157 in_port=4 actions=set_tunnel:4,set_tunnel:3,output:4
158 in_port=5 actions=set_tunnel:5
160 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
161 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])
162 AT_CHECK([tail -1 stdout], [0],
163 [Datapath actions: set(tun_id(0x1)),1,2,set(tun_id(0x3)),3,4
168 AT_SETUP([ofproto-dpif - VLAN handling])
170 [set Bridge br0 fail-mode=standalone -- \
171 add-port br0 p1 trunks=10,12 -- \
172 add-port br0 p2 tag=10 -- \
173 add-port br0 p3 tag=12 \
174 other-config:priority-tags=true -- \
175 add-port br0 p4 tag=12 -- \
176 add-port br0 p5 vlan_mode=native-tagged tag=10 -- \
177 add-port br0 p6 vlan_mode=native-tagged tag=10 trunks=10,12 -- \
178 add-port br0 p7 vlan_mode=native-untagged tag=12 -- \
179 add-port br0 p8 vlan_mode=native-untagged tag=12 trunks=10,12 \
180 other-config:priority-tags=true -- \
181 set Interface p1 type=dummy -- \
182 set Interface p2 type=dummy -- \
183 set Interface p3 type=dummy -- \
184 set Interface p4 type=dummy -- \
185 set Interface p5 type=dummy -- \
186 set Interface p6 type=dummy -- \
187 set Interface p7 type=dummy -- \
188 set Interface p8 type=dummy --])
192 -- get Interface p1 ofport \
193 -- get Interface p2 ofport \
194 -- get Interface p3 ofport \
195 -- get Interface p4 ofport \
196 -- get Interface p5 ofport \
197 -- get Interface p6 ofport \
198 -- get Interface p7 ofport \
199 -- get Interface p8 ofport],
202 br0=0 p1=$1 p2=$2 p3=$3 p4=$4 p5=$5 p6=$6 p7=$7 p8=$8
204 dnl Each of these specifies an in_port, a VLAN VID (or "none"), a VLAN
205 dnl PCP (used if the VID isn't "none") and the expected set of datapath
211 "br0 10 0 p1,p5,p6,p7,p8,pop_vlan,p2" \
212 "br0 10 1 p1,p5,p6,p7,p8,pop_vlan,p2" \
215 "br0 12 0 p1,p5,p6,pop_vlan,p3,p4,p7,p8" \
216 "br0 12 1 p1,p5,p6,pop_vlan,p4,p7,push_vlan(vid=0,pcp=1),p3,p8" \
220 "p1 10 0 br0,p5,p6,p7,p8,pop_vlan,p2" \
221 "p1 10 1 br0,p5,p6,p7,p8,pop_vlan,p2" \
224 "p1 12 0 br0,p5,p6,pop_vlan,p3,p4,p7,p8" \
225 "p1 12 1 br0,p5,p6,pop_vlan,p4,p7,push_vlan(vid=0,pcp=1),p3,p8" \
226 "p2 none 0 push_vlan(vid=10,pcp=0),br0,p1,p5,p6,p7,p8" \
227 "p2 0 0 pop_vlan,push_vlan(vid=10,pcp=0),br0,p1,p5,p6,p7,p8" \
228 "p2 0 1 pop_vlan,push_vlan(vid=10,pcp=1),br0,p1,p5,p6,p7,p8" \
235 "p3 none 0 p4,p7,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
236 "p3 0 0 pop_vlan,p4,p7,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
237 "p3 0 1 p8,pop_vlan,p4,p7,push_vlan(vid=12,pcp=1),br0,p1,p5,p6" \
244 "p4 none 0 p3,p7,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
245 "p4 0 0 pop_vlan,p3,p7,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
246 "p4 0 1 p3,p8,pop_vlan,p7,push_vlan(vid=12,pcp=1),br0,p1,p5,p6" \
253 "p5 none 0 p2,push_vlan(vid=10,pcp=0),br0,p1,p6,p7,p8" \
254 "p5 0 0 pop_vlan,p2,push_vlan(vid=10,pcp=0),br0,p1,p6,p7,p8" \
255 "p5 0 1 pop_vlan,p2,push_vlan(vid=10,pcp=1),br0,p1,p6,p7,p8" \
256 "p5 10 0 br0,p1,p6,p7,p8,pop_vlan,p2" \
257 "p5 10 1 br0,p1,p6,p7,p8,pop_vlan,p2" \
260 "p5 12 0 br0,p1,p6,pop_vlan,p3,p4,p7,p8" \
261 "p5 12 1 br0,p1,p6,pop_vlan,p4,p7,push_vlan(vid=0,pcp=1),p3,p8" \
262 "p6 none 0 p2,push_vlan(vid=10,pcp=0),br0,p1,p5,p7,p8" \
263 "p6 0 0 pop_vlan,p2,push_vlan(vid=10,pcp=0),br0,p1,p5,p7,p8" \
264 "p6 0 1 pop_vlan,p2,push_vlan(vid=10,pcp=1),br0,p1,p5,p7,p8" \
265 "p6 10 0 br0,p1,p5,p7,p8,pop_vlan,p2" \
266 "p6 10 1 br0,p1,p5,p7,p8,pop_vlan,p2" \
269 "p6 12 0 br0,p1,p5,pop_vlan,p3,p4,p7,p8" \
270 "p6 12 1 br0,p1,p5,pop_vlan,p4,p7,push_vlan(vid=0,pcp=1),p3,p8" \
271 "p7 none 0 p3,p4,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
272 "p7 0 0 pop_vlan,p3,p4,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
273 "p7 0 1 p3,p8,pop_vlan,p4,push_vlan(vid=12,pcp=1),br0,p1,p5,p6" \
274 "p7 10 0 br0,p1,p5,p6,p8,pop_vlan,p2" \
275 "p7 10 1 br0,p1,p5,p6,p8,pop_vlan,p2" \
278 "p7 12 0 br0,p1,p5,p6,pop_vlan,p3,p4,p8" \
279 "p7 12 1 br0,p1,p5,p6,pop_vlan,p4,push_vlan(vid=0,pcp=1),p3,p8" \
280 "p8 none 0 p3,p4,p7,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
281 "p8 0 0 pop_vlan,p3,p4,p7,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
282 "p8 0 1 p3,pop_vlan,p4,p7,push_vlan(vid=12,pcp=1),br0,p1,p5,p6" \
283 "p8 10 0 br0,p1,p5,p6,p7,pop_vlan,p2" \
284 "p8 10 1 br0,p1,p5,p6,p7,pop_vlan,p2" \
287 "p8 12 0 br0,p1,p5,p6,pop_vlan,p3,p4,p7" \
288 "p8 12 1 br0,p1,p5,p6,pop_vlan,p4,p7,push_vlan(vid=0,pcp=1),p3"
296 eval n_in_port=\$$in_port
297 if test $vlan = none; then
298 flow="in_port($n_in_port),eth(src=50:54:00:00:00:01,dst=ff:ff:ff:ff:ff:ff),eth_type(0xabcd)"
300 flow="in_port($n_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))"
303 echo "----------------------------------------------------------------------"
304 echo "in_port=$in_port vlan=$vlan pcp=$pcp"
306 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
307 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
309 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" br0=$br0 p1=$p1 p2=$p2 p3=$p3 p4=$p4 p5=$p5 p6=$p6 p7=$p7 p8=$p8], [0], [stdout])
311 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" br0=$br0 p1=$p1 p2=$p2 p3=$p3 p4=$p4 p5=$p5 p6=$p6 p7=$p7 p8=$p8], [0], [expout])
317 AT_SETUP([ofproto-dpif - fragment handling])
319 AT_DATA([flows.txt], [dnl
320 priority=75 tcp ip_frag=no tp_dst=80 actions=output:1
321 priority=75 tcp ip_frag=first tp_dst=80 actions=output:2
322 priority=75 tcp ip_frag=later tp_dst=80 actions=output:3
323 priority=50 tcp ip_frag=no actions=output:4
324 priority=50 tcp ip_frag=first actions=output:5
325 priority=50 tcp ip_frag=later actions=output:6
327 AT_CHECK([ovs-ofctl replace-flows br0 flows.txt])
329 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"
330 no_flow="$base_flow,frag=no),tcp(src=12345,dst=80)"
331 first_flow="$base_flow,frag=first),tcp(src=12345,dst=80)"
332 later_flow="$base_flow,frag=later)"
334 # mode no first later
346 AT_CHECK([ovs-ofctl set-frags br0 $mode])
347 for type in no first later; do
348 eval flow=\$${type}_flow exp_output=\$$type
349 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
350 AT_CHECK_UNQUOTED([tail -1 stdout], [0], [Datapath actions: $exp_output
357 AT_SETUP([ofproto-dpif - exit])
359 AT_DATA([flows.txt], [dnl
360 in_port=1 actions=output:10,exit,output:11
361 in_port=2 actions=output:12,resubmit:1,output:12
362 in_port=3 actions=output:13,resubmit:2,output:14
364 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
365 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])
366 AT_CHECK([tail -1 stdout], [0],
367 [Datapath actions: 10
369 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])
370 AT_CHECK([tail -1 stdout], [0],
371 [Datapath actions: 12,10
373 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])
374 AT_CHECK([tail -1 stdout], [0],
375 [Datapath actions: 13,12,10
381 AT_SETUP([ofproto-dpif - mirroring, select_all])
383 [add-port br0 p1 -- set Interface p1 type=dummy --\
384 add-port br0 p2 -- set Interface p2 type=dummy --\
385 add-port br0 p3 -- set Interface p3 type=dummy --\
386 set Bridge br0 mirrors=@m --\
387 --id=@p3 get Port p3 --\
388 --id=@m create Mirror name=mymirror \
389 select_all=true output_port=@p3], [<0>
394 -- get Interface p1 ofport \
395 -- get Interface p2 ofport \
396 -- get Interface p3 ofport],
401 AT_DATA([flows.txt], [dnl
402 in_port=1 actions=output:2
403 in_port=2 actions=output:1
405 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
407 flow="in_port($p1),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)"
408 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
409 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
410 [Datapath actions: $p2,$p3
413 flow="in_port($p2),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)"
414 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
415 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
416 [Datapath actions: $p1,$p3
423 AT_SETUP([ofproto-dpif - mirroring, select_src])
425 [add-port br0 p1 -- set Interface p1 type=dummy --\
426 add-port br0 p2 -- set Interface p2 type=dummy --\
427 add-port br0 p3 -- set Interface p3 type=dummy --\
428 set Bridge br0 mirrors=@m --\
429 --id=@p1 get Port p1 -- --id=@p3 get Port p3 --\
430 --id=@m create Mirror name=mymirror \
431 select_src_port=@p1 output_port=@p3], [<0>
436 -- get Interface p1 ofport \
437 -- get Interface p2 ofport \
438 -- get Interface p3 ofport],
443 AT_DATA([flows.txt], [dnl
444 in_port=1 actions=output:2
445 in_port=2 actions=output:1
447 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
449 flow="in_port($p1),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)"
450 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
451 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
452 [Datapath actions: $p2,$p3
455 flow="in_port($p2),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)"
456 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
457 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
458 [Datapath actions: $p1
463 AT_SETUP([ofproto-dpif - mirroring, OFPP_NONE ingress port])
465 [add-port br0 p1 -- set Interface p1 type=dummy --\
466 add-port br0 p2 -- set Interface p2 type=dummy --\
467 set Bridge br0 mirrors=@m --\
468 --id=@p2 get Port p2 --\
469 --id=@m create Mirror name=mymirror \
470 select_all=true output_port=@p2], [<0>
475 -- get Interface p1 ofport \
476 -- get Interface p2 ofport],
481 AT_CHECK([ovs-ofctl add-flow br0 action=output:1])
483 # "in_port" defaults to OFPP_NONE if it's not specified.
484 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)"
485 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
486 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
487 [Datapath actions: $p1,$p2
494 AT_SETUP([ofproto-dpif - mirroring, select_dst])
496 [add-port br0 p1 -- set Interface p1 type=dummy --\
497 add-port br0 p2 -- set Interface p2 type=dummy --\
498 add-port br0 p3 -- set Interface p3 type=dummy --\
499 set Bridge br0 mirrors=@m --\
500 --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
501 --id=@m create Mirror name=mymirror \
502 select_dst_port=@p2 output_port=@p3], [<0>
507 -- get Interface p1 ofport \
508 -- get Interface p2 ofport \
509 -- get Interface p3 ofport],
514 AT_DATA([flows.txt], [dnl
515 in_port=1 actions=output:2
516 in_port=2 actions=output:1
518 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
520 flow="in_port($p1),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)"
521 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
522 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
523 [Datapath actions: $p2,$p3
526 flow="in_port($p2),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)"
527 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
528 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
529 [Datapath actions: $p1
536 AT_SETUP([ofproto-dpif - mirroring, select_vlan])
538 [add-port br0 p1 -- set Interface p1 type=dummy --\
539 add-port br0 p2 -- set Interface p2 type=dummy --\
540 add-port br0 p3 -- set Interface p3 type=dummy --\
541 set Bridge br0 mirrors=@m --\
542 --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
543 --id=@m create Mirror name=mymirror \
544 select_all=true select_vlan=11 output_port=@p3], [<0>
549 -- get Interface p1 ofport \
550 -- get Interface p2 ofport \
551 -- get Interface p3 ofport],
556 AT_DATA([flows.txt], [dnl
557 in_port=1, actions=output:2
559 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
561 flow="in_port($p1),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)"
562 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
563 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
564 [Datapath actions: $p2
567 flow="in_port($p1),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))"
568 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
569 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
570 [Datapath actions: $p2
573 flow="in_port($p1),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))"
574 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
575 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
576 [Datapath actions: $p2,$p3
583 AT_SETUP([ofproto-dpif - mirroring, output_port])
585 [add-port br0 p1 -- set Interface p1 type=dummy --\
586 add-port br0 p2 -- set Interface p2 type=dummy --\
587 add-port br0 p3 -- set Interface p3 type=dummy --\
588 set Bridge br0 mirrors=@m --\
589 --id=@p3 get Port p3 --\
590 --id=@m create Mirror name=mymirror \
591 select_all=true output_port=@p3], [<0>
596 -- get Interface p1 ofport \
597 -- get Interface p2 ofport \
598 -- get Interface p3 ofport],
603 AT_DATA([flows.txt], [dnl
604 in_port=1 actions=mod_vlan_vid:17,output:2
605 in_port=2 actions=output:1
607 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
609 flow="in_port($p1),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)"
610 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
611 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
612 [Datapath actions: push_vlan(vid=17,pcp=0),$p2,pop_vlan,$p3
615 flow="in_port($p2),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)"
616 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
617 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
618 [Datapath actions: $p1,$p3
624 AT_SETUP([ofproto-dpif - mirroring, output_vlan])
626 [add-port br0 p1 -- set Interface p1 type=dummy --\
627 add-port br0 p2 -- set Interface p2 type=dummy --\
628 set Bridge br0 mirrors=@m --\
629 --id=@m create Mirror name=mymirror \
630 select_all=true output_vlan=12], [<0>
635 -- get Interface p1 ofport \
636 -- get Interface p2 ofport],
641 AT_DATA([flows.txt], [dnl
642 in_port=1 actions=output:2
643 in_port=2 actions=mod_vlan_vid:17,output:1
645 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
647 flow="in_port($p1),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)"
648 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
649 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
651 expected="$p2,push_vlan(vid=12,pcp=0),$br0,$p1,$p2"
652 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" br0=$br0 p1=$p1 p2=$p2], [0], [stdout])
654 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" br0=$br0 p1=$p1 p2=$p2], [0], [expout])
656 flow="in_port($p2),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)"
657 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
658 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
660 expected="push_vlan(vid=17,pcp=0),$p1,pop_vlan,push_vlan(vid=12,pcp=0),$br0,$p1,$p2"
661 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" br0=$br0 p1=$p1 p2=$p2], [0], [stdout])
663 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" br0=$br0 p1=$p1 p2=$p2], [0], [expout])
668 m4_define([OFPROTO_TRACE],
670 AT_CHECK([ovs-appctl ofproto/trace $1 "$flow" $3], [0], [stdout])
671 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
673 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" $5],
676 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" $5],
679 AT_SETUP([ofproto-dpif - MAC learning])
681 [set bridge br0 fail-mode=standalone -- \
682 add-port br0 p1 -- set Interface p1 type=dummy -- \
683 add-port br0 p2 -- set Interface p2 type=dummy -- \
684 add-port br0 p3 -- set Interface p3 type=dummy])
688 -- get Interface p1 ofport \
689 -- get Interface p2 ofport \
690 -- get Interface p3 ofport],
693 br0=0 p1=$1 p2=$2 p3=$3
694 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)'
696 # Trace an ARP packet arriving on p3, to create a MAC learning entry.
699 [in_port($p3),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
702 [br0=$br0 p1=$p1 p2=$p2 p3=$p3])
704 # Check for the MAC learning entry.
705 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]$/?/'], [0], [dnl
707 $p3 0 50:54:00:00:00:05 ?
710 # Trace a packet arrival destined for the learned MAC.
711 # (This will also learn a MAC.)
714 [in_port($p1),eth(src=50:54:00:00:00:06,dst=50:54:00:00:00:05),$arp],
717 [br0=$br0 p1=$p1 p2=$p2 p3=$p3])
719 # Check for both MAC learning entries.
720 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]$/?/'], [0], [dnl
722 $p3 0 50:54:00:00:00:05 ?
723 $p1 0 50:54:00:00:00:06 ?
726 # Trace a packet arrival that updates the first learned MAC entry.
729 [in_port($p2),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
732 [br0=$br0 p1=$p1 p2=$p2 p3=$p3])
734 # Check that the MAC learning entry was updated.
735 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]$/?/'], [0], [dnl
737 $p1 0 50:54:00:00:00:06 ?
738 $p2 0 50:54:00:00:00:05 ?
741 # Add another bridge.
745 -- set bridge br1 datapath-type=dummy \
746 -- add-port br1 p4 -- set interface p4 type=dummy \
747 -- add-port br1 p5 -- set interface p5 type=dummy])
750 -- get Interface p4 ofport \
751 -- get Interface p5 ofport],
756 # Trace some packet arrivals in br1 to create MAC learning entries there too.
759 [in_port($p4),eth(src=50:54:00:00:00:06,dst=ff:ff:ff:ff:ff:ff),$arp],
762 [br1=$br1 p4=$p4 p5=$p5])
765 [in_port($p5),eth(src=50:54:00:00:00:07,dst=ff:ff:ff:ff:ff:ff),$arp],
768 [br1=$br1 p4=$p4 p5=$p5])
770 # Check that the MAC learning entries were added.
771 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]$/?/'], [0], [dnl
773 $p4 0 50:54:00:00:00:06 ?
774 $p5 0 50:54:00:00:00:07 ?
777 # Delete port p1 and see that its MAC learning entry disappeared, and
778 # that the MAC learning entry for the same MAC was also deleted from br1.
779 AT_CHECK([ovs-vsctl del-port p1])
780 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]$/?/'], [0], [dnl
782 $p2 0 50:54:00:00:00:05 ?
784 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]$/?/'], [0], [dnl
786 $p5 0 50:54:00:00:00:07 ?
792 dnl Test that basic NetFlow reports flow statistics correctly:
793 dnl - The initial packet of a flow are correctly accounted.
794 dnl - Later packets within a flow are correctly accounted.
795 dnl - Flow actions changing (in this case, due to MAC learning)
796 dnl cause a record to be sent.
797 AT_SETUP([ofproto-dpif - NetFlow flow expiration])
799 AT_SKIP_IF([test "x$RANDOM" = x])
800 NETFLOW_PORT=`expr 32767 + \( $RANDOM % 32767 \)`
803 [set Bridge br0 fail-mode=standalone -- \
804 add-port br0 p1 -- set Interface p1 type=dummy -- \
805 add-port br0 p2 -- set Interface p2 type=dummy -- \
806 set Bridge br0 netflow=@nf -- \
807 --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
808 engine_id=1 engine_type=2 active_timeout=30 \
809 add-id-to-interface=false], [<0>
812 AT_CHECK([test-netflow --detach --pidfile $NETFLOW_PORT:127.0.0.1 > netflow.log])AT_CAPTURE_FILE([netflow.log])
814 for delay in 1000 30000; do
815 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)'
816 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)'
818 ovs-appctl time/warp $delay
822 ovs-appctl -t test-netflow exit
824 AT_CHECK([[sed -e 's/, uptime [0-9]*//
826 s/time \([0-9]*\)\.\.\.\1/time <moment>/
827 s/time [0-9]*\.\.\.[0-9]*/time <range>/
828 ' netflow.log]], [0],
829 [header: v5, seq 0, engine 2,1
830 rec: 192.168.0.1 > 192.168.0.2, if 1 > 65535, 1 pkts, 60 bytes, ICMP 8:0, time <moment>
832 header: v5, seq 1, engine 2,1
833 rec: 192.168.0.2 > 192.168.0.1, if 2 > 1, 2 pkts, 120 bytes, ICMP 0:0, time <range>
834 rec: 192.168.0.1 > 192.168.0.2, if 1 > 2, 1 pkts, 60 bytes, ICMP 8:0, time <moment>
838 dnl Test that basic NetFlow reports active expirations correctly.
839 AT_SETUP([ofproto-dpif - NetFlow active expiration])
841 AT_SKIP_IF([test "x$RANDOM" = x])
842 NETFLOW_PORT=`expr 32767 + \( $RANDOM % 32767 \)`
845 [set Bridge br0 fail-mode=standalone -- \
846 add-port br0 p1 -- set Interface p1 type=dummy -- \
847 add-port br0 p2 -- set Interface p2 type=dummy -- \
848 set Bridge br0 netflow=@nf -- \
849 --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
850 engine_id=1 engine_type=2 active_timeout=10 \
851 add-id-to-interface=false], [<0>
854 AT_CHECK([test-netflow --detach --pidfile $NETFLOW_PORT:127.0.0.1 > netflow.log])AT_CAPTURE_FILE([netflow.log])
857 while test $n -le 60; do
860 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)'
861 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)'
863 ovs-appctl time/warp 1000
866 ovs-appctl time/warp 10000
869 ovs-appctl -t test-netflow exit
871 # Count the number of reported packets:
872 # - From source to destination before MAC learning kicks in (just one).
873 # - From source to destination after that.
874 # - From destination to source.
882 pkts=`echo "$line" | sed 's/.*, \([[0-9]]*\) pkts,.*/\1/'`
889 "rec: 192.168.0.1 > 192.168.0.2, if 1 > 65535, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
892 "rec: 192.168.0.1 > 192.168.0.2, if 1 > 2, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
895 "rec: 192.168.0.2 > 192.168.0.1, if 2 > 1, "*" pkts, "*" bytes, TCP 80 > 1234, time "*)
902 eval $counter=\`expr \$$counter + \$pkts\`
903 n_recs=`expr $n_recs + 1`
906 # There should be exactly 1 MAC learning packet,
907 # exactly 59 other packets in that direction,
908 # and exactly 60 packets in the other direction.
909 AT_CHECK([echo $n_learn $n_in $n_out $n_other], [0], [1 59 60 0
912 # There should be 1 expiration for MAC learning,
913 # at least 5 active and a final expiration in one direction,
914 # and at least 5 active and a final expiration in the other direction.
916 AT_CHECK([test $n_recs -ge 13])