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
464 AT_SETUP([ofproto-dpif - mirroring, select_dst])
466 [add-port br0 p1 -- set Interface p1 type=dummy --\
467 add-port br0 p2 -- set Interface p2 type=dummy --\
468 add-port br0 p3 -- set Interface p3 type=dummy --\
469 set Bridge br0 mirrors=@m --\
470 --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
471 --id=@m create Mirror name=mymirror \
472 select_dst_port=@p2 output_port=@p3], [<0>
477 -- get Interface p1 ofport \
478 -- get Interface p2 ofport \
479 -- get Interface p3 ofport],
484 AT_DATA([flows.txt], [dnl
485 in_port=1 actions=output:2
486 in_port=2 actions=output:1
488 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
490 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)"
491 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
492 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
493 [Datapath actions: $p2,$p3
496 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)"
497 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
498 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
499 [Datapath actions: $p1
506 AT_SETUP([ofproto-dpif - mirroring, select_vlan])
508 [add-port br0 p1 -- set Interface p1 type=dummy --\
509 add-port br0 p2 -- set Interface p2 type=dummy --\
510 add-port br0 p3 -- set Interface p3 type=dummy --\
511 set Bridge br0 mirrors=@m --\
512 --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
513 --id=@m create Mirror name=mymirror \
514 select_all=true select_vlan=11 output_port=@p3], [<0>
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
529 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
531 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)"
532 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
533 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
534 [Datapath actions: $p2
537 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))"
538 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
539 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
540 [Datapath actions: $p2
543 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))"
544 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
545 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
546 [Datapath actions: $p2,$p3
553 AT_SETUP([ofproto-dpif - mirroring, output_port])
555 [add-port br0 p1 -- set Interface p1 type=dummy --\
556 add-port br0 p2 -- set Interface p2 type=dummy --\
557 add-port br0 p3 -- set Interface p3 type=dummy --\
558 set Bridge br0 mirrors=@m --\
559 --id=@p3 get Port p3 --\
560 --id=@m create Mirror name=mymirror \
561 select_all=true output_port=@p3], [<0>
566 -- get Interface p1 ofport \
567 -- get Interface p2 ofport \
568 -- get Interface p3 ofport],
573 AT_DATA([flows.txt], [dnl
574 in_port=1 actions=mod_vlan_vid:17,output:2
575 in_port=2 actions=output:1
577 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
579 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)"
580 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
581 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
582 [Datapath actions: push_vlan(vid=17,pcp=0),$p2,pop_vlan,$p3
585 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)"
586 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
587 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
588 [Datapath actions: $p1,$p3
594 AT_SETUP([ofproto-dpif - mirroring, output_vlan])
596 [add-port br0 p1 -- set Interface p1 type=dummy --\
597 add-port br0 p2 -- set Interface p2 type=dummy --\
598 set Bridge br0 mirrors=@m --\
599 --id=@m create Mirror name=mymirror \
600 select_all=true output_vlan=12], [<0>
605 -- get Interface p1 ofport \
606 -- get Interface p2 ofport],
611 AT_DATA([flows.txt], [dnl
612 in_port=1 actions=output:2
613 in_port=2 actions=mod_vlan_vid:17,output:1
615 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
617 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)"
618 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
619 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
621 expected="$p2,push_vlan(vid=12,pcp=0),$br0,$p1,$p2"
622 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" br0=$br0 p1=$p1 p2=$p2], [0], [stdout])
624 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" br0=$br0 p1=$p1 p2=$p2], [0], [expout])
626 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)"
627 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
628 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
630 expected="push_vlan(vid=17,pcp=0),$p1,pop_vlan,push_vlan(vid=12,pcp=0),$br0,$p1,$p2"
631 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" br0=$br0 p1=$p1 p2=$p2], [0], [stdout])
633 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" br0=$br0 p1=$p1 p2=$p2], [0], [expout])
638 m4_define([OFPROTO_TRACE],
640 AT_CHECK([ovs-appctl ofproto/trace $1 "$flow" $3], [0], [stdout])
641 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
643 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" $5],
646 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" $5],
649 AT_SETUP([ofproto-dpif - MAC learning])
651 [set bridge br0 fail-mode=standalone -- \
652 add-port br0 p1 -- set Interface p1 type=dummy -- \
653 add-port br0 p2 -- set Interface p2 type=dummy -- \
654 add-port br0 p3 -- set Interface p3 type=dummy])
658 -- get Interface p1 ofport \
659 -- get Interface p2 ofport \
660 -- get Interface p3 ofport],
663 br0=0 p1=$1 p2=$2 p3=$3
664 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)'
666 # Trace an ARP packet arriving on p3, to create a MAC learning entry.
669 [in_port($p3),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
672 [br0=$br0 p1=$p1 p2=$p2 p3=$p3])
674 # Check for the MAC learning entry.
675 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]$/?/'], [0], [dnl
677 $p3 0 50:54:00:00:00:05 ?
680 # Trace a packet arrival destined for the learned MAC.
681 # (This will also learn a MAC.)
684 [in_port($p1),eth(src=50:54:00:00:00:06,dst=50:54:00:00:00:05),$arp],
687 [br0=$br0 p1=$p1 p2=$p2 p3=$p3])
689 # Check for both MAC learning entries.
690 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]$/?/'], [0], [dnl
692 $p3 0 50:54:00:00:00:05 ?
693 $p1 0 50:54:00:00:00:06 ?
696 # Trace a packet arrival that updates the first learned MAC entry.
699 [in_port($p2),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 that the MAC learning entry was updated.
705 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]$/?/'], [0], [dnl
707 $p1 0 50:54:00:00:00:06 ?
708 $p2 0 50:54:00:00:00:05 ?
711 # Add another bridge.
715 -- set bridge br1 datapath-type=dummy \
716 -- add-port br1 p4 -- set interface p4 type=dummy \
717 -- add-port br1 p5 -- set interface p5 type=dummy])
720 -- get Interface p4 ofport \
721 -- get Interface p5 ofport],
726 # Trace some packet arrivals in br1 to create MAC learning entries there too.
729 [in_port($p4),eth(src=50:54:00:00:00:06,dst=ff:ff:ff:ff:ff:ff),$arp],
732 [br1=$br1 p4=$p4 p5=$p5])
735 [in_port($p5),eth(src=50:54:00:00:00:07,dst=ff:ff:ff:ff:ff:ff),$arp],
738 [br1=$br1 p4=$p4 p5=$p5])
740 # Check that the MAC learning entries were added.
741 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]$/?/'], [0], [dnl
743 $p4 0 50:54:00:00:00:06 ?
744 $p5 0 50:54:00:00:00:07 ?
747 # Delete port p1 and see that its MAC learning entry disappeared, and
748 # that the MAC learning entry for the same MAC was also deleted from br1.
749 AT_CHECK([ovs-vsctl del-port p1])
750 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]$/?/'], [0], [dnl
752 $p2 0 50:54:00:00:00:05 ?
754 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]$/?/'], [0], [dnl
756 $p5 0 50:54:00:00:00:07 ?
762 dnl Test that basic NetFlow reports flow statistics correctly:
763 dnl - The initial packet of a flow are correctly accounted.
764 dnl - Later packets within a flow are correctly accounted.
765 dnl - Flow actions changing (in this case, due to MAC learning)
766 dnl cause a record to be sent.
767 AT_SETUP([ofproto-dpif - NetFlow flow expiration])
769 AT_SKIP_IF([test "x$RANDOM" = x])
770 NETFLOW_PORT=`expr 32767 + \( $RANDOM % 32767 \)`
773 [set Bridge br0 fail-mode=standalone -- \
774 add-port br0 p1 -- set Interface p1 type=dummy -- \
775 add-port br0 p2 -- set Interface p2 type=dummy -- \
776 set Bridge br0 netflow=@nf -- \
777 --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
778 engine_id=1 engine_type=2 active_timeout=30 \
779 add-id-to-interface=false], [<0>
782 AT_CHECK([test-netflow --detach --pidfile $NETFLOW_PORT:127.0.0.1 > netflow.log])AT_CAPTURE_FILE([netflow.log])
784 for delay in 1000 30000; do
785 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)'
786 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)'
788 ovs-appctl time/warp $delay
792 ovs-appctl -t test-netflow exit
794 AT_CHECK([[sed -e 's/, uptime [0-9]*//
796 s/time \([0-9]*\)\.\.\.\1/time <moment>/
797 s/time [0-9]*\.\.\.[0-9]*/time <range>/
798 ' netflow.log]], [0],
799 [header: v5, seq 0, engine 2,1
800 rec: 192.168.0.1 > 192.168.0.2, if 1 > 65535, 1 pkts, 60 bytes, ICMP 8:0, time <moment>
802 header: v5, seq 1, engine 2,1
803 rec: 192.168.0.2 > 192.168.0.1, if 2 > 1, 2 pkts, 120 bytes, ICMP 0:0, time <range>
804 rec: 192.168.0.1 > 192.168.0.2, if 1 > 2, 1 pkts, 60 bytes, ICMP 8:0, time <moment>
808 dnl Test that basic NetFlow reports active expirations correctly.
809 AT_SETUP([ofproto-dpif - NetFlow active expiration])
811 AT_SKIP_IF([test "x$RANDOM" = x])
812 NETFLOW_PORT=`expr 32767 + \( $RANDOM % 32767 \)`
815 [set Bridge br0 fail-mode=standalone -- \
816 add-port br0 p1 -- set Interface p1 type=dummy -- \
817 add-port br0 p2 -- set Interface p2 type=dummy -- \
818 set Bridge br0 netflow=@nf -- \
819 --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
820 engine_id=1 engine_type=2 active_timeout=10 \
821 add-id-to-interface=false], [<0>
824 AT_CHECK([test-netflow --detach --pidfile $NETFLOW_PORT:127.0.0.1 > netflow.log])AT_CAPTURE_FILE([netflow.log])
827 while test $n -le 60; do
830 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)'
831 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)'
833 ovs-appctl time/warp 1000
836 ovs-appctl time/warp 10000
839 ovs-appctl -t test-netflow exit
841 # Count the number of reported packets:
842 # - From source to destination before MAC learning kicks in (just one).
843 # - From source to destination after that.
844 # - From destination to source.
852 pkts=`echo "$line" | sed 's/.*, \([[0-9]]*\) pkts,.*/\1/'`
859 "rec: 192.168.0.1 > 192.168.0.2, if 1 > 65535, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
862 "rec: 192.168.0.1 > 192.168.0.2, if 1 > 2, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
865 "rec: 192.168.0.2 > 192.168.0.1, if 2 > 1, "*" pkts, "*" bytes, TCP 80 > 1234, time "*)
872 eval $counter=\`expr \$$counter + \$pkts\`
873 n_recs=`expr $n_recs + 1`
876 # There should be exactly 1 MAC learning packet,
877 # exactly 59 other packets in that direction,
878 # and exactly 60 packets in the other direction.
879 AT_CHECK([echo $n_learn $n_in $n_out $n_other], [0], [1 59 60 0
882 # There should be 1 expiration for MAC learning,
883 # at least 5 active and a final expiration in one direction,
884 # and at least 5 active and a final expiration in the other direction.
886 AT_CHECK([test $n_recs -ge 13])