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=local actions=local,flood
109 in_port=1 actions=flood
110 in_port=2 actions=all
111 in_port=3 actions=output:65534,output:1,output:2,output:3,output:4,output:5,output:6,output:7
112 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
114 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
115 AT_CHECK([ovs-ofctl mod-port br0 5 noforward])
116 AT_CHECK([ovs-ofctl mod-port br0 6 noflood])
118 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(0),eth(src=00:00:00:00:00:01,dst=00:00:00:00:00:02),eth_type(0x0900)'], [0], [stdout])
119 AT_CHECK([tail -1 stdout \
120 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
128 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])
129 AT_CHECK([tail -1 stdout \
130 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
138 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])
139 AT_CHECK([tail -1 stdout \
140 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
149 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])
150 AT_CHECK([tail -1 stdout], [0],
151 [Datapath actions: 0,1,2,4,6,7
154 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])
155 AT_CHECK([tail -1 stdout], [0],
156 [Datapath actions: set(priority(1)),0,1,2,set(priority(2)),3,set(priority(1)),6,7
161 AT_SETUP([ofproto-dpif - set_tunnel])
163 AT_DATA([flows.txt], [dnl
164 in_port=90 actions=resubmit:1,resubmit:2,resubmit:3,resubmit:4,resubmit:5
165 in_port=1 actions=set_tunnel:1,output:1
166 in_port=2 actions=set_tunnel:1,output:2
167 in_port=3 actions=set_tunnel:2,set_tunnel:3,output:3
168 in_port=4 actions=set_tunnel:4,set_tunnel:3,output:4
169 in_port=5 actions=set_tunnel:5
171 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
172 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])
173 AT_CHECK([tail -1 stdout], [0],
174 [Datapath actions: set(tun_id(0x1)),1,2,set(tun_id(0x3)),3,4
179 AT_SETUP([ofproto-dpif - VLAN handling])
181 [set Bridge br0 fail-mode=standalone -- \
182 add-port br0 p1 trunks=10,12 -- \
183 add-port br0 p2 tag=10 -- \
184 add-port br0 p3 tag=12 \
185 other-config:priority-tags=true -- \
186 add-port br0 p4 tag=12 -- \
187 add-port br0 p5 vlan_mode=native-tagged tag=10 -- \
188 add-port br0 p6 vlan_mode=native-tagged tag=10 trunks=10,12 -- \
189 add-port br0 p7 vlan_mode=native-untagged tag=12 -- \
190 add-port br0 p8 vlan_mode=native-untagged tag=12 trunks=10,12 \
191 other-config:priority-tags=true -- \
192 set Interface p1 type=dummy -- \
193 set Interface p2 type=dummy -- \
194 set Interface p3 type=dummy -- \
195 set Interface p4 type=dummy -- \
196 set Interface p5 type=dummy -- \
197 set Interface p6 type=dummy -- \
198 set Interface p7 type=dummy -- \
199 set Interface p8 type=dummy --])
203 -- get Interface p1 ofport \
204 -- get Interface p2 ofport \
205 -- get Interface p3 ofport \
206 -- get Interface p4 ofport \
207 -- get Interface p5 ofport \
208 -- get Interface p6 ofport \
209 -- get Interface p7 ofport \
210 -- get Interface p8 ofport],
213 br0=0 p1=$1 p2=$2 p3=$3 p4=$4 p5=$5 p6=$6 p7=$7 p8=$8
215 dnl Each of these specifies an in_port, a VLAN VID (or "none"), a VLAN
216 dnl PCP (used if the VID isn't "none") and the expected set of datapath
222 "br0 10 0 p1,p5,p6,p7,p8,pop_vlan,p2" \
223 "br0 10 1 p1,p5,p6,p7,p8,pop_vlan,p2" \
226 "br0 12 0 p1,p5,p6,pop_vlan,p3,p4,p7,p8" \
227 "br0 12 1 p1,p5,p6,pop_vlan,p4,p7,push_vlan(vid=0,pcp=1),p3,p8" \
231 "p1 10 0 br0,p5,p6,p7,p8,pop_vlan,p2" \
232 "p1 10 1 br0,p5,p6,p7,p8,pop_vlan,p2" \
235 "p1 12 0 br0,p5,p6,pop_vlan,p3,p4,p7,p8" \
236 "p1 12 1 br0,p5,p6,pop_vlan,p4,p7,push_vlan(vid=0,pcp=1),p3,p8" \
237 "p2 none 0 push_vlan(vid=10,pcp=0),br0,p1,p5,p6,p7,p8" \
238 "p2 0 0 pop_vlan,push_vlan(vid=10,pcp=0),br0,p1,p5,p6,p7,p8" \
239 "p2 0 1 pop_vlan,push_vlan(vid=10,pcp=1),br0,p1,p5,p6,p7,p8" \
246 "p3 none 0 p4,p7,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
247 "p3 0 0 pop_vlan,p4,p7,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
248 "p3 0 1 p8,pop_vlan,p4,p7,push_vlan(vid=12,pcp=1),br0,p1,p5,p6" \
255 "p4 none 0 p3,p7,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
256 "p4 0 0 pop_vlan,p3,p7,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
257 "p4 0 1 p3,p8,pop_vlan,p7,push_vlan(vid=12,pcp=1),br0,p1,p5,p6" \
264 "p5 none 0 p2,push_vlan(vid=10,pcp=0),br0,p1,p6,p7,p8" \
265 "p5 0 0 pop_vlan,p2,push_vlan(vid=10,pcp=0),br0,p1,p6,p7,p8" \
266 "p5 0 1 pop_vlan,p2,push_vlan(vid=10,pcp=1),br0,p1,p6,p7,p8" \
267 "p5 10 0 br0,p1,p6,p7,p8,pop_vlan,p2" \
268 "p5 10 1 br0,p1,p6,p7,p8,pop_vlan,p2" \
271 "p5 12 0 br0,p1,p6,pop_vlan,p3,p4,p7,p8" \
272 "p5 12 1 br0,p1,p6,pop_vlan,p4,p7,push_vlan(vid=0,pcp=1),p3,p8" \
273 "p6 none 0 p2,push_vlan(vid=10,pcp=0),br0,p1,p5,p7,p8" \
274 "p6 0 0 pop_vlan,p2,push_vlan(vid=10,pcp=0),br0,p1,p5,p7,p8" \
275 "p6 0 1 pop_vlan,p2,push_vlan(vid=10,pcp=1),br0,p1,p5,p7,p8" \
276 "p6 10 0 br0,p1,p5,p7,p8,pop_vlan,p2" \
277 "p6 10 1 br0,p1,p5,p7,p8,pop_vlan,p2" \
280 "p6 12 0 br0,p1,p5,pop_vlan,p3,p4,p7,p8" \
281 "p6 12 1 br0,p1,p5,pop_vlan,p4,p7,push_vlan(vid=0,pcp=1),p3,p8" \
282 "p7 none 0 p3,p4,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
283 "p7 0 0 pop_vlan,p3,p4,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
284 "p7 0 1 p3,p8,pop_vlan,p4,push_vlan(vid=12,pcp=1),br0,p1,p5,p6" \
285 "p7 10 0 br0,p1,p5,p6,p8,pop_vlan,p2" \
286 "p7 10 1 br0,p1,p5,p6,p8,pop_vlan,p2" \
289 "p7 12 0 br0,p1,p5,p6,pop_vlan,p3,p4,p8" \
290 "p7 12 1 br0,p1,p5,p6,pop_vlan,p4,push_vlan(vid=0,pcp=1),p3,p8" \
291 "p8 none 0 p3,p4,p7,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
292 "p8 0 0 pop_vlan,p3,p4,p7,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
293 "p8 0 1 p3,pop_vlan,p4,p7,push_vlan(vid=12,pcp=1),br0,p1,p5,p6" \
294 "p8 10 0 br0,p1,p5,p6,p7,pop_vlan,p2" \
295 "p8 10 1 br0,p1,p5,p6,p7,pop_vlan,p2" \
298 "p8 12 0 br0,p1,p5,p6,pop_vlan,p3,p4,p7" \
299 "p8 12 1 br0,p1,p5,p6,pop_vlan,p4,p7,push_vlan(vid=0,pcp=1),p3"
307 eval n_in_port=\$$in_port
308 if test $vlan = none; then
309 flow="in_port($n_in_port),eth(src=50:54:00:00:00:01,dst=ff:ff:ff:ff:ff:ff),eth_type(0xabcd)"
311 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))"
314 echo "----------------------------------------------------------------------"
315 echo "in_port=$in_port vlan=$vlan pcp=$pcp"
317 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
318 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
320 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])
322 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])
328 AT_SETUP([ofproto-dpif - fragment handling])
330 AT_DATA([flows.txt], [dnl
331 priority=75 tcp ip_frag=no tp_dst=80 actions=output:1
332 priority=75 tcp ip_frag=first tp_dst=80 actions=output:2
333 priority=75 tcp ip_frag=later tp_dst=80 actions=output:3
334 priority=50 tcp ip_frag=no actions=output:4
335 priority=50 tcp ip_frag=first actions=output:5
336 priority=50 tcp ip_frag=later actions=output:6
338 AT_CHECK([ovs-ofctl replace-flows br0 flows.txt])
340 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"
341 no_flow="$base_flow,frag=no),tcp(src=12345,dst=80)"
342 first_flow="$base_flow,frag=first),tcp(src=12345,dst=80)"
343 later_flow="$base_flow,frag=later)"
345 # mode no first later
357 AT_CHECK([ovs-ofctl set-frags br0 $mode])
358 for type in no first later; do
359 eval flow=\$${type}_flow exp_output=\$$type
360 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
361 AT_CHECK_UNQUOTED([tail -1 stdout], [0], [Datapath actions: $exp_output
368 AT_SETUP([ofproto-dpif - exit])
370 AT_DATA([flows.txt], [dnl
371 in_port=1 actions=output:10,exit,output:11
372 in_port=2 actions=output:12,resubmit:1,output:12
373 in_port=3 actions=output:13,resubmit:2,output:14
375 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
376 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])
377 AT_CHECK([tail -1 stdout], [0],
378 [Datapath actions: 10
380 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])
381 AT_CHECK([tail -1 stdout], [0],
382 [Datapath actions: 12,10
384 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])
385 AT_CHECK([tail -1 stdout], [0],
386 [Datapath actions: 13,12,10
392 AT_SETUP([ofproto-dpif - mirroring, select_all])
394 AT_CHECK([ovs-vsctl \
395 add-port br0 p1 -- set Interface p1 type=dummy --\
396 add-port br0 p2 -- set Interface p2 type=dummy --\
397 add-port br0 p3 -- set Interface p3 type=dummy --\
398 set Bridge br0 mirrors=@m --\
399 --id=@p3 get Port p3 --\
400 --id=@m create Mirror name=mymirror \
401 select_all=true output_port=@p3 ], [0], [stdout])
402 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [dnl
408 -- get Interface p1 ofport \
409 -- get Interface p2 ofport \
410 -- get Interface p3 ofport],
415 cat > flows.txt <<EOF
416 in_port=$p1 actions=output:$p2
417 in_port=$p2 actions=output:$p1
420 AT_CAPTURE_FILE([flows.txt])
421 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
423 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)"
424 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
425 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
426 [Datapath actions: $p2,$p3
429 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)"
430 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
431 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
432 [Datapath actions: $p1,$p3
439 AT_SETUP([ofproto-dpif - mirroring, select_src])
441 AT_CHECK([ovs-vsctl \
442 add-port br0 p1 -- set Interface p1 type=dummy --\
443 add-port br0 p2 -- set Interface p2 type=dummy --\
444 add-port br0 p3 -- set Interface p3 type=dummy --\
445 set Bridge br0 mirrors=@m --\
446 --id=@p1 get Port p1 -- --id=@p3 get Port p3 --\
447 --id=@m create Mirror name=mymirror \
448 select_src_port=@p1 output_port=@p3 ], [0], [stdout])
449 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [dnl
455 -- get Interface p1 ofport \
456 -- get Interface p2 ofport \
457 -- get Interface p3 ofport],
462 cat > flows.txt <<EOF
463 in_port=$p1 actions=output:$p2
464 in_port=$p2 actions=output:$p1
467 AT_CAPTURE_FILE([flows.txt])
468 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
470 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)"
471 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
472 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
473 [Datapath actions: $p2,$p3
476 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)"
477 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
478 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
479 [Datapath actions: $p1
484 AT_SETUP([ofproto-dpif - mirroring, OFPP_NONE ingress port])
486 AT_CHECK([ovs-vsctl \
487 add-port br0 p1 -- set Interface p1 type=dummy --\
488 add-port br0 p2 -- set Interface p2 type=dummy --\
489 set Bridge br0 mirrors=@m --\
490 --id=@p2 get Port p2 --\
491 --id=@m create Mirror name=mymirror \
492 select_all=true output_port=@p2 ], [0], [stdout])
493 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [dnl
499 -- get Interface p1 ofport \
500 -- get Interface p2 ofport],
505 AT_CHECK([ovs-ofctl add-flow br0 action=output:$p1])
507 # "in_port" defaults to OFPP_NONE if it's not specified.
508 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)"
509 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
510 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
511 [Datapath actions: $p1,$p2
518 AT_SETUP([ofproto-dpif - mirroring, select_dst])
520 AT_CHECK([ovs-vsctl \
521 add-port br0 p1 -- set Interface p1 type=dummy --\
522 add-port br0 p2 -- set Interface p2 type=dummy --\
523 add-port br0 p3 -- set Interface p3 type=dummy --\
524 set Bridge br0 mirrors=@m --\
525 --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
526 --id=@m create Mirror name=mymirror \
527 select_dst_port=@p2 output_port=@p3 ], [0], [stdout])
528 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [dnl
534 -- get Interface p1 ofport \
535 -- get Interface p2 ofport \
536 -- get Interface p3 ofport],
541 cat > flows.txt <<EOF
542 in_port=$p1 actions=output:$p2
543 in_port=$p2 actions=output:$p1
546 AT_CAPTURE_FILE([flows.txt])
547 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
549 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)"
550 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
551 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
552 [Datapath actions: $p2,$p3
555 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)"
556 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
557 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
558 [Datapath actions: $p1
565 AT_SETUP([ofproto-dpif - mirroring, select_vlan])
567 AT_CHECK([ovs-vsctl \
568 add-port br0 p1 -- set Interface p1 type=dummy --\
569 add-port br0 p2 -- set Interface p2 type=dummy --\
570 add-port br0 p3 -- set Interface p3 type=dummy --\
571 set Bridge br0 mirrors=@m --\
572 --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
573 --id=@m create Mirror name=mymirror \
574 select_all=true select_vlan=11 output_port=@p3 ], [0], [stdout])
575 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [dnl
581 -- get Interface p1 ofport \
582 -- get Interface p2 ofport \
583 -- get Interface p3 ofport],
588 cat > flows.txt <<EOF
589 in_port=$p1 actions=output:$p2
592 AT_CAPTURE_FILE([flows.txt])
593 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
595 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)"
596 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
597 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
598 [Datapath actions: $p2
601 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))"
602 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
603 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
604 [Datapath actions: $p2
607 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))"
608 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
609 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
610 [Datapath actions: $p2,$p3
617 AT_SETUP([ofproto-dpif - mirroring, output_port])
619 AT_CHECK([ovs-vsctl \
620 add-port br0 p1 -- set Interface p1 type=dummy --\
621 add-port br0 p2 -- set Interface p2 type=dummy --\
622 add-port br0 p3 -- set Interface p3 type=dummy --\
623 set Bridge br0 mirrors=@m --\
624 --id=@p3 get Port p3 --\
625 --id=@m create Mirror name=mymirror \
626 select_all=true output_port=@p3 ], [0], [stdout])
627 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [dnl
633 -- get Interface p1 ofport \
634 -- get Interface p2 ofport \
635 -- get Interface p3 ofport],
640 cat > flows.txt <<EOF
641 in_port=$p1 actions=mod_vlan_vid:17,output:$p2
642 in_port=$p2 actions=output:$p1
645 AT_CAPTURE_FILE([flows.txt])
646 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
648 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)"
649 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
650 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
651 [Datapath actions: push_vlan(vid=17,pcp=0),$p2,pop_vlan,$p3
654 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)"
655 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
656 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
657 [Datapath actions: $p1,$p3
664 AT_SETUP([ofproto-dpif - mirroring, output_vlan])
666 AT_CHECK([ovs-vsctl \
667 add-port br0 p1 -- set Interface p1 type=dummy --\
668 add-port br0 p2 -- set Interface p2 type=dummy --\
669 set Bridge br0 mirrors=@m --\
670 --id=@m create Mirror name=mymirror \
671 select_all=true output_vlan=12 ], [0], [stdout])
672 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [dnl
678 -- get Interface p1 ofport \
679 -- get Interface p2 ofport],
684 cat > flows.txt <<EOF
685 in_port=$p1 actions=output:$p2
686 in_port=$p2 actions=mod_vlan_vid:17,output:$p1
689 AT_CAPTURE_FILE([flows.txt])
690 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
692 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)"
693 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
694 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
696 expected="$p2,push_vlan(vid=12,pcp=0),$br0,$p1,$p2"
697 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" br0=$br0 p1=$p1 p2=$p2], [0], [stdout])
699 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" br0=$br0 p1=$p1 p2=$p2], [0], [expout])
701 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)"
702 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
703 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
705 expected="push_vlan(vid=17,pcp=0),$p1,pop_vlan,push_vlan(vid=12,pcp=0),$br0,$p1,$p2"
706 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" br0=$br0 p1=$p1 p2=$p2], [0], [stdout])
708 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" br0=$br0 p1=$p1 p2=$p2], [0], [expout])
713 m4_define([OFPROTO_TRACE],
715 AT_CHECK([ovs-appctl ofproto/trace $1 "$flow" $3], [0], [stdout])
716 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
718 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" $5],
721 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" $5],
724 AT_SETUP([ofproto-dpif - MAC learning])
726 [set bridge br0 fail-mode=standalone -- \
727 add-port br0 p1 -- set Interface p1 type=dummy -- \
728 add-port br0 p2 -- set Interface p2 type=dummy -- \
729 add-port br0 p3 -- set Interface p3 type=dummy])
733 -- get Interface p1 ofport \
734 -- get Interface p2 ofport \
735 -- get Interface p3 ofport],
738 br0=0 p1=$1 p2=$2 p3=$3
739 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)'
741 # Trace an ARP packet arriving on p3, to create a MAC learning entry.
744 [in_port($p3),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
747 [br0=$br0 p1=$p1 p2=$p2 p3=$p3])
749 # Check for the MAC learning entry.
750 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]$/?/'], [0], [dnl
752 $p3 0 50:54:00:00:00:05 ?
755 # Trace a packet arrival destined for the learned MAC.
756 # (This will also learn a MAC.)
759 [in_port($p1),eth(src=50:54:00:00:00:06,dst=50:54:00:00:00:05),$arp],
762 [br0=$br0 p1=$p1 p2=$p2 p3=$p3])
764 # Check for both MAC learning entries.
765 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]$/?/'], [0], [dnl
767 $p3 0 50:54:00:00:00:05 ?
768 $p1 0 50:54:00:00:00:06 ?
771 # Trace a packet arrival that updates the first learned MAC entry.
774 [in_port($p2),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
777 [br0=$br0 p1=$p1 p2=$p2 p3=$p3])
779 # Check that the MAC learning entry was updated.
780 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]$/?/'], [0], [dnl
782 $p1 0 50:54:00:00:00:06 ?
783 $p2 0 50:54:00:00:00:05 ?
786 # Add another bridge.
790 -- set bridge br1 datapath-type=dummy \
791 -- add-port br1 p4 -- set interface p4 type=dummy \
792 -- add-port br1 p5 -- set interface p5 type=dummy])
795 -- get Interface p4 ofport \
796 -- get Interface p5 ofport],
801 # Trace some packet arrivals in br1 to create MAC learning entries there too.
804 [in_port($p4),eth(src=50:54:00:00:00:06,dst=ff:ff:ff:ff:ff:ff),$arp],
807 [br1=$br1 p4=$p4 p5=$p5])
810 [in_port($p5),eth(src=50:54:00:00:00:07,dst=ff:ff:ff:ff:ff:ff),$arp],
813 [br1=$br1 p4=$p4 p5=$p5])
815 # Check that the MAC learning entries were added.
816 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]$/?/'], [0], [dnl
818 $p4 0 50:54:00:00:00:06 ?
819 $p5 0 50:54:00:00:00:07 ?
822 # Delete port p1 and see that its MAC learning entry disappeared, and
823 # that the MAC learning entry for the same MAC was also deleted from br1.
824 AT_CHECK([ovs-vsctl del-port p1])
825 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]$/?/'], [0], [dnl
827 $p2 0 50:54:00:00:00:05 ?
829 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]$/?/'], [0], [dnl
831 $p5 0 50:54:00:00:00:07 ?