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 AT_CHECK([ovs-vsctl \
384 add-port br0 p1 -- set Interface p1 type=dummy --\
385 add-port br0 p2 -- set Interface p2 type=dummy --\
386 add-port br0 p3 -- set Interface p3 type=dummy --\
387 set Bridge br0 mirrors=@m --\
388 --id=@p3 get Port p3 --\
389 --id=@m create Mirror name=mymirror \
390 select_all=true output_port=@p3 ], [0], [stdout])
391 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [dnl
397 -- get Interface p1 ofport \
398 -- get Interface p2 ofport \
399 -- get Interface p3 ofport],
404 AT_DATA([flows.txt], [dnl
405 in_port=1 actions=output:2
406 in_port=2 actions=output:1
408 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
410 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)"
411 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
412 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
413 [Datapath actions: $p2,$p3
416 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)"
417 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
418 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
419 [Datapath actions: $p1,$p3
426 AT_SETUP([ofproto-dpif - mirroring, select_src])
428 AT_CHECK([ovs-vsctl \
429 add-port br0 p1 -- set Interface p1 type=dummy --\
430 add-port br0 p2 -- set Interface p2 type=dummy --\
431 add-port br0 p3 -- set Interface p3 type=dummy --\
432 set Bridge br0 mirrors=@m --\
433 --id=@p1 get Port p1 -- --id=@p3 get Port p3 --\
434 --id=@m create Mirror name=mymirror \
435 select_src_port=@p1 output_port=@p3 ], [0], [stdout])
436 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [dnl
442 -- get Interface p1 ofport \
443 -- get Interface p2 ofport \
444 -- get Interface p3 ofport],
449 AT_DATA([flows.txt], [dnl
450 in_port=1 actions=output:2
451 in_port=2 actions=output:1
453 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
455 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)"
456 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
457 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
458 [Datapath actions: $p2,$p3
461 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)"
462 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
463 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
464 [Datapath actions: $p1
469 AT_SETUP([ofproto-dpif - mirroring, OFPP_NONE ingress port])
471 AT_CHECK([ovs-vsctl \
472 add-port br0 p1 -- set Interface p1 type=dummy --\
473 add-port br0 p2 -- set Interface p2 type=dummy --\
474 set Bridge br0 mirrors=@m --\
475 --id=@p2 get Port p2 --\
476 --id=@m create Mirror name=mymirror \
477 select_all=true output_port=@p2 ], [0], [stdout])
478 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [dnl
484 -- get Interface p1 ofport \
485 -- get Interface p2 ofport],
490 AT_CHECK([ovs-ofctl add-flow br0 action=output:1])
492 # "in_port" defaults to OFPP_NONE if it's not specified.
493 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)"
494 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
495 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
496 [Datapath actions: $p1,$p2
503 AT_SETUP([ofproto-dpif - mirroring, select_dst])
505 AT_CHECK([ovs-vsctl \
506 add-port br0 p1 -- set Interface p1 type=dummy --\
507 add-port br0 p2 -- set Interface p2 type=dummy --\
508 add-port br0 p3 -- set Interface p3 type=dummy --\
509 set Bridge br0 mirrors=@m --\
510 --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
511 --id=@m create Mirror name=mymirror \
512 select_dst_port=@p2 output_port=@p3 ], [0], [stdout])
513 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [dnl
519 -- get Interface p1 ofport \
520 -- get Interface p2 ofport \
521 -- get Interface p3 ofport],
526 AT_DATA([flows.txt], [dnl
527 in_port=1 actions=output:2
528 in_port=2 actions=output:1
530 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
532 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)"
533 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
534 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
535 [Datapath actions: $p2,$p3
538 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)"
539 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
540 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
541 [Datapath actions: $p1
548 AT_SETUP([ofproto-dpif - mirroring, select_vlan])
550 AT_CHECK([ovs-vsctl \
551 add-port br0 p1 -- set Interface p1 type=dummy --\
552 add-port br0 p2 -- set Interface p2 type=dummy --\
553 add-port br0 p3 -- set Interface p3 type=dummy --\
554 set Bridge br0 mirrors=@m --\
555 --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
556 --id=@m create Mirror name=mymirror \
557 select_all=true select_vlan=11 output_port=@p3 ], [0], [stdout])
558 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [dnl
564 -- get Interface p1 ofport \
565 -- get Interface p2 ofport \
566 -- get Interface p3 ofport],
571 AT_DATA([flows.txt], [dnl
572 in_port=1, actions=output:2
574 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
576 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)"
577 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
578 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
579 [Datapath actions: $p2
582 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))"
583 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
584 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
585 [Datapath actions: $p2
588 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))"
589 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
590 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
591 [Datapath actions: $p2,$p3
598 AT_SETUP([ofproto-dpif - mirroring, output_port])
600 AT_CHECK([ovs-vsctl \
601 add-port br0 p1 -- set Interface p1 type=dummy --\
602 add-port br0 p2 -- set Interface p2 type=dummy --\
603 add-port br0 p3 -- set Interface p3 type=dummy --\
604 set Bridge br0 mirrors=@m --\
605 --id=@p3 get Port p3 --\
606 --id=@m create Mirror name=mymirror \
607 select_all=true output_port=@p3 ], [0], [stdout])
608 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [dnl
614 -- get Interface p1 ofport \
615 -- get Interface p2 ofport \
616 -- get Interface p3 ofport],
621 AT_DATA([flows.txt], [dnl
622 in_port=1 actions=mod_vlan_vid:17,output:2
623 in_port=2 actions=output:1
625 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
627 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)"
628 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
629 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
630 [Datapath actions: push_vlan(vid=17,pcp=0),$p2,pop_vlan,$p3
633 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)"
634 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
635 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
636 [Datapath actions: $p1,$p3
643 AT_SETUP([ofproto-dpif - mirroring, output_vlan])
645 AT_CHECK([ovs-vsctl \
646 add-port br0 p1 -- set Interface p1 type=dummy --\
647 add-port br0 p2 -- set Interface p2 type=dummy --\
648 set Bridge br0 mirrors=@m --\
649 --id=@m create Mirror name=mymirror \
650 select_all=true output_vlan=12 ], [0], [stdout])
651 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [dnl
657 -- get Interface p1 ofport \
658 -- get Interface p2 ofport],
663 AT_DATA([flows.txt], [dnl
664 in_port=1 actions=output:2
665 in_port=2 actions=mod_vlan_vid:17,output:1
667 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
669 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)"
670 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
671 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
673 expected="$p2,push_vlan(vid=12,pcp=0),$br0,$p1,$p2"
674 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" br0=$br0 p1=$p1 p2=$p2], [0], [stdout])
676 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" br0=$br0 p1=$p1 p2=$p2], [0], [expout])
678 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)"
679 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
680 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
682 expected="push_vlan(vid=17,pcp=0),$p1,pop_vlan,push_vlan(vid=12,pcp=0),$br0,$p1,$p2"
683 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" br0=$br0 p1=$p1 p2=$p2], [0], [stdout])
685 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" br0=$br0 p1=$p1 p2=$p2], [0], [expout])
690 m4_define([OFPROTO_TRACE],
692 AT_CHECK([ovs-appctl ofproto/trace $1 "$flow" $3], [0], [stdout])
693 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
695 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" $5],
698 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" $5],
701 AT_SETUP([ofproto-dpif - MAC learning])
703 [set bridge br0 fail-mode=standalone -- \
704 add-port br0 p1 -- set Interface p1 type=dummy -- \
705 add-port br0 p2 -- set Interface p2 type=dummy -- \
706 add-port br0 p3 -- set Interface p3 type=dummy])
710 -- get Interface p1 ofport \
711 -- get Interface p2 ofport \
712 -- get Interface p3 ofport],
715 br0=0 p1=$1 p2=$2 p3=$3
716 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)'
718 # Trace an ARP packet arriving on p3, to create a MAC learning entry.
721 [in_port($p3),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
724 [br0=$br0 p1=$p1 p2=$p2 p3=$p3])
726 # Check for the MAC learning entry.
727 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]$/?/'], [0], [dnl
729 $p3 0 50:54:00:00:00:05 ?
732 # Trace a packet arrival destined for the learned MAC.
733 # (This will also learn a MAC.)
736 [in_port($p1),eth(src=50:54:00:00:00:06,dst=50:54:00:00:00:05),$arp],
739 [br0=$br0 p1=$p1 p2=$p2 p3=$p3])
741 # Check for both MAC learning entries.
742 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]$/?/'], [0], [dnl
744 $p3 0 50:54:00:00:00:05 ?
745 $p1 0 50:54:00:00:00:06 ?
748 # Trace a packet arrival that updates the first learned MAC entry.
751 [in_port($p2),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
754 [br0=$br0 p1=$p1 p2=$p2 p3=$p3])
756 # Check that the MAC learning entry was updated.
757 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]$/?/'], [0], [dnl
759 $p1 0 50:54:00:00:00:06 ?
760 $p2 0 50:54:00:00:00:05 ?
763 # Add another bridge.
767 -- set bridge br1 datapath-type=dummy \
768 -- add-port br1 p4 -- set interface p4 type=dummy \
769 -- add-port br1 p5 -- set interface p5 type=dummy])
772 -- get Interface p4 ofport \
773 -- get Interface p5 ofport],
778 # Trace some packet arrivals in br1 to create MAC learning entries there too.
781 [in_port($p4),eth(src=50:54:00:00:00:06,dst=ff:ff:ff:ff:ff:ff),$arp],
784 [br1=$br1 p4=$p4 p5=$p5])
787 [in_port($p5),eth(src=50:54:00:00:00:07,dst=ff:ff:ff:ff:ff:ff),$arp],
790 [br1=$br1 p4=$p4 p5=$p5])
792 # Check that the MAC learning entries were added.
793 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]$/?/'], [0], [dnl
795 $p4 0 50:54:00:00:00:06 ?
796 $p5 0 50:54:00:00:00:07 ?
799 # Delete port p1 and see that its MAC learning entry disappeared, and
800 # that the MAC learning entry for the same MAC was also deleted from br1.
801 AT_CHECK([ovs-vsctl del-port p1])
802 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]$/?/'], [0], [dnl
804 $p2 0 50:54:00:00:00:05 ?
806 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]$/?/'], [0], [dnl
808 $p5 0 50:54:00:00:00:07 ?