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 AT_DATA([flows.txt], [dnl
416 in_port=1 actions=output:2
417 in_port=2 actions=output:1
419 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
421 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)"
422 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
423 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
424 [Datapath actions: $p2,$p3
427 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)"
428 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
429 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
430 [Datapath actions: $p1,$p3
437 AT_SETUP([ofproto-dpif - mirroring, select_src])
439 AT_CHECK([ovs-vsctl \
440 add-port br0 p1 -- set Interface p1 type=dummy --\
441 add-port br0 p2 -- set Interface p2 type=dummy --\
442 add-port br0 p3 -- set Interface p3 type=dummy --\
443 set Bridge br0 mirrors=@m --\
444 --id=@p1 get Port p1 -- --id=@p3 get Port p3 --\
445 --id=@m create Mirror name=mymirror \
446 select_src_port=@p1 output_port=@p3 ], [0], [stdout])
447 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [dnl
453 -- get Interface p1 ofport \
454 -- get Interface p2 ofport \
455 -- get Interface p3 ofport],
460 AT_DATA([flows.txt], [dnl
461 in_port=1 actions=output:2
462 in_port=2 actions=output:1
464 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
466 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)"
467 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
468 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
469 [Datapath actions: $p2,$p3
472 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)"
473 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
474 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
475 [Datapath actions: $p1
480 AT_SETUP([ofproto-dpif - mirroring, OFPP_NONE ingress port])
482 AT_CHECK([ovs-vsctl \
483 add-port br0 p1 -- set Interface p1 type=dummy --\
484 add-port br0 p2 -- set Interface p2 type=dummy --\
485 set Bridge br0 mirrors=@m --\
486 --id=@p2 get Port p2 --\
487 --id=@m create Mirror name=mymirror \
488 select_all=true output_port=@p2 ], [0], [stdout])
489 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [dnl
495 -- get Interface p1 ofport \
496 -- get Interface p2 ofport],
501 AT_CHECK([ovs-ofctl add-flow br0 action=output:1])
503 # "in_port" defaults to OFPP_NONE if it's not specified.
504 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)"
505 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
506 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
507 [Datapath actions: $p1,$p2
514 AT_SETUP([ofproto-dpif - mirroring, select_dst])
516 AT_CHECK([ovs-vsctl \
517 add-port br0 p1 -- set Interface p1 type=dummy --\
518 add-port br0 p2 -- set Interface p2 type=dummy --\
519 add-port br0 p3 -- set Interface p3 type=dummy --\
520 set Bridge br0 mirrors=@m --\
521 --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
522 --id=@m create Mirror name=mymirror \
523 select_dst_port=@p2 output_port=@p3 ], [0], [stdout])
524 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [dnl
530 -- get Interface p1 ofport \
531 -- get Interface p2 ofport \
532 -- get Interface p3 ofport],
537 AT_DATA([flows.txt], [dnl
538 in_port=1 actions=output:2
539 in_port=2 actions=output:1
541 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
543 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)"
544 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
545 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
546 [Datapath actions: $p2,$p3
549 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)"
550 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
551 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
552 [Datapath actions: $p1
559 AT_SETUP([ofproto-dpif - mirroring, select_vlan])
561 AT_CHECK([ovs-vsctl \
562 add-port br0 p1 -- set Interface p1 type=dummy --\
563 add-port br0 p2 -- set Interface p2 type=dummy --\
564 add-port br0 p3 -- set Interface p3 type=dummy --\
565 set Bridge br0 mirrors=@m --\
566 --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
567 --id=@m create Mirror name=mymirror \
568 select_all=true select_vlan=11 output_port=@p3 ], [0], [stdout])
569 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [dnl
575 -- get Interface p1 ofport \
576 -- get Interface p2 ofport \
577 -- get Interface p3 ofport],
582 AT_DATA([flows.txt], [dnl
583 in_port=1, actions=output:2
585 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
587 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)"
588 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
589 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
590 [Datapath actions: $p2
593 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))"
594 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
595 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
596 [Datapath actions: $p2
599 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))"
600 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
601 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
602 [Datapath actions: $p2,$p3
609 AT_SETUP([ofproto-dpif - mirroring, output_port])
611 AT_CHECK([ovs-vsctl \
612 add-port br0 p1 -- set Interface p1 type=dummy --\
613 add-port br0 p2 -- set Interface p2 type=dummy --\
614 add-port br0 p3 -- set Interface p3 type=dummy --\
615 set Bridge br0 mirrors=@m --\
616 --id=@p3 get Port p3 --\
617 --id=@m create Mirror name=mymirror \
618 select_all=true output_port=@p3 ], [0], [stdout])
619 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [dnl
625 -- get Interface p1 ofport \
626 -- get Interface p2 ofport \
627 -- get Interface p3 ofport],
632 AT_DATA([flows.txt], [dnl
633 in_port=1 actions=mod_vlan_vid:17,output:2
634 in_port=2 actions=output:1
636 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
638 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)"
639 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
640 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
641 [Datapath actions: push_vlan(vid=17,pcp=0),$p2,pop_vlan,$p3
644 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)"
645 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
646 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
647 [Datapath actions: $p1,$p3
654 AT_SETUP([ofproto-dpif - mirroring, output_vlan])
656 AT_CHECK([ovs-vsctl \
657 add-port br0 p1 -- set Interface p1 type=dummy --\
658 add-port br0 p2 -- set Interface p2 type=dummy --\
659 set Bridge br0 mirrors=@m --\
660 --id=@m create Mirror name=mymirror \
661 select_all=true output_vlan=12 ], [0], [stdout])
662 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [dnl
668 -- get Interface p1 ofport \
669 -- get Interface p2 ofport],
674 AT_DATA([flows.txt], [dnl
675 in_port=1 actions=output:2
676 in_port=2 actions=mod_vlan_vid:17,output:1
678 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
680 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)"
681 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
682 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
684 expected="$p2,push_vlan(vid=12,pcp=0),$br0,$p1,$p2"
685 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" br0=$br0 p1=$p1 p2=$p2], [0], [stdout])
687 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" br0=$br0 p1=$p1 p2=$p2], [0], [expout])
689 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)"
690 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
691 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
693 expected="push_vlan(vid=17,pcp=0),$p1,pop_vlan,push_vlan(vid=12,pcp=0),$br0,$p1,$p2"
694 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" br0=$br0 p1=$p1 p2=$p2], [0], [stdout])
696 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" br0=$br0 p1=$p1 p2=$p2], [0], [expout])
701 m4_define([OFPROTO_TRACE],
703 AT_CHECK([ovs-appctl ofproto/trace $1 "$flow" $3], [0], [stdout])
704 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
706 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" $5],
709 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" $5],
712 AT_SETUP([ofproto-dpif - MAC learning])
714 [set bridge br0 fail-mode=standalone -- \
715 add-port br0 p1 -- set Interface p1 type=dummy -- \
716 add-port br0 p2 -- set Interface p2 type=dummy -- \
717 add-port br0 p3 -- set Interface p3 type=dummy])
721 -- get Interface p1 ofport \
722 -- get Interface p2 ofport \
723 -- get Interface p3 ofport],
726 br0=0 p1=$1 p2=$2 p3=$3
727 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)'
729 # Trace an ARP packet arriving on p3, to create a MAC learning entry.
732 [in_port($p3),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
735 [br0=$br0 p1=$p1 p2=$p2 p3=$p3])
737 # Check for the MAC learning entry.
738 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]$/?/'], [0], [dnl
740 $p3 0 50:54:00:00:00:05 ?
743 # Trace a packet arrival destined for the learned MAC.
744 # (This will also learn a MAC.)
747 [in_port($p1),eth(src=50:54:00:00:00:06,dst=50:54:00:00:00:05),$arp],
750 [br0=$br0 p1=$p1 p2=$p2 p3=$p3])
752 # Check for both MAC learning entries.
753 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]$/?/'], [0], [dnl
755 $p3 0 50:54:00:00:00:05 ?
756 $p1 0 50:54:00:00:00:06 ?
759 # Trace a packet arrival that updates the first learned MAC entry.
762 [in_port($p2),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
765 [br0=$br0 p1=$p1 p2=$p2 p3=$p3])
767 # Check that the MAC learning entry was updated.
768 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]$/?/'], [0], [dnl
770 $p1 0 50:54:00:00:00:06 ?
771 $p2 0 50:54:00:00:00:05 ?
774 # Add another bridge.
778 -- set bridge br1 datapath-type=dummy \
779 -- add-port br1 p4 -- set interface p4 type=dummy \
780 -- add-port br1 p5 -- set interface p5 type=dummy])
783 -- get Interface p4 ofport \
784 -- get Interface p5 ofport],
789 # Trace some packet arrivals in br1 to create MAC learning entries there too.
792 [in_port($p4),eth(src=50:54:00:00:00:06,dst=ff:ff:ff:ff:ff:ff),$arp],
795 [br1=$br1 p4=$p4 p5=$p5])
798 [in_port($p5),eth(src=50:54:00:00:00:07,dst=ff:ff:ff:ff:ff:ff),$arp],
801 [br1=$br1 p4=$p4 p5=$p5])
803 # Check that the MAC learning entries were added.
804 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]$/?/'], [0], [dnl
806 $p4 0 50:54:00:00:00:06 ?
807 $p5 0 50:54:00:00:00:07 ?
810 # Delete port p1 and see that its MAC learning entry disappeared, and
811 # that the MAC learning entry for the same MAC was also deleted from br1.
812 AT_CHECK([ovs-vsctl del-port p1])
813 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]$/?/'], [0], [dnl
815 $p2 0 50:54:00:00:00:05 ?
817 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]$/?/'], [0], [dnl
819 $p5 0 50:54:00:00:00:07 ?