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 - output, OFPP_NONE ingress port])
67 [add-port br0 p1 -- set Interface p1 type=dummy --\
68 add-port br0 p2 -- set Interface p2 type=dummy])
72 -- get Interface p1 ofport \
73 -- get Interface p2 ofport],
78 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
80 # "in_port" defaults to OFPP_NONE if it's not specified.
81 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)"
82 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
83 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
85 expected="$br0,$p1,$p2"
86 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" br0=$br0 p1=$p1 p2=$p2], [0], [stdout])
88 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" br0=$br0 p1=$p1 p2=$p2], [0], [expout])
93 AT_SETUP([ofproto-dpif - DSCP])
94 dnl This test assumes port p1 is allocated OpenFlow port number 1.
95 OVS_VSWITCHD_START([add-port br0 p1 -- set Interface p1 type=dummy])
96 AT_DATA([flows.txt], [dnl
97 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
99 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
100 AT_CHECK([ovs-vsctl -- \
101 set Port p1 qos=@newqos --\
102 --id=@newqos create QoS type=linux-htb queues=1=@q1,2=@q2 --\
103 --id=@q1 create Queue dscp=1 --\
104 --id=@q2 create Queue dscp=2], [0], [ignore])
105 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])
106 AT_CHECK([tail -1 stdout], [0],
107 [Datapath actions: dnl
109 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
110 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
112 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
113 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
114 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0x3,ttl=128,frag=no)),1,dnl
120 AT_SETUP([ofproto-dpif - output/flood flags])
121 dnl This test assumes that OpenFlow port numbers are allocated in order
122 dnl starting from one. It does not necessarily require that they are allocated
123 dnl in the same order that they are named in the database. Just that the
124 dnl following command guarantees OpenFlow port 65534, and ports 1-7 exist in
126 OVS_VSWITCHD_START([dnl
127 add-port br0 p1 -- set Interface p1 type=dummy --\
128 add-port br0 p2 -- set Interface p2 type=dummy --\
129 add-port br0 p3 -- set Interface p3 type=dummy --\
130 add-port br0 p4 -- set Interface p4 type=dummy --\
131 add-port br0 p5 -- set Interface p5 type=dummy --\
132 add-port br0 p6 -- set Interface p6 type=dummy --\
133 add-port br0 p7 -- set Interface p7 type=dummy ])
135 AT_DATA([flows.txt], [dnl
136 in_port=1 actions=flood
137 in_port=2 actions=all
138 in_port=3 actions=output:65534,output:1,output:2,output:3,output:4,output:5,output:6,output:7
139 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
141 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
142 AT_CHECK([ovs-ofctl mod-port br0 5 noforward])
143 AT_CHECK([ovs-ofctl mod-port br0 6 noflood])
145 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])
146 AT_CHECK([tail -1 stdout \
147 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
155 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])
156 AT_CHECK([tail -1 stdout \
157 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
166 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])
167 AT_CHECK([tail -1 stdout], [0],
168 [Datapath actions: 0,1,2,4,6,7
171 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])
172 AT_CHECK([tail -1 stdout], [0],
173 [Datapath actions: set(priority(1)),0,1,2,set(priority(2)),3,set(priority(1)),6,7
178 AT_SETUP([ofproto-dpif - set_tunnel])
180 AT_DATA([flows.txt], [dnl
181 in_port=90 actions=resubmit:1,resubmit:2,resubmit:3,resubmit:4,resubmit:5
182 in_port=1 actions=set_tunnel:1,output:1
183 in_port=2 actions=set_tunnel:1,output:2
184 in_port=3 actions=set_tunnel:2,set_tunnel:3,output:3
185 in_port=4 actions=set_tunnel:4,set_tunnel:3,output:4
186 in_port=5 actions=set_tunnel:5
188 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
189 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])
190 AT_CHECK([tail -1 stdout], [0],
191 [Datapath actions: set(tun_id(0x1)),1,2,set(tun_id(0x3)),3,4
196 AT_SETUP([ofproto-dpif - VLAN handling])
198 [set Bridge br0 fail-mode=standalone -- \
199 add-port br0 p1 trunks=10,12 -- \
200 add-port br0 p2 tag=10 -- \
201 add-port br0 p3 tag=12 \
202 other-config:priority-tags=true -- \
203 add-port br0 p4 tag=12 -- \
204 add-port br0 p5 vlan_mode=native-tagged tag=10 -- \
205 add-port br0 p6 vlan_mode=native-tagged tag=10 trunks=10,12 -- \
206 add-port br0 p7 vlan_mode=native-untagged tag=12 -- \
207 add-port br0 p8 vlan_mode=native-untagged tag=12 trunks=10,12 \
208 other-config:priority-tags=true -- \
209 set Interface p1 type=dummy -- \
210 set Interface p2 type=dummy -- \
211 set Interface p3 type=dummy -- \
212 set Interface p4 type=dummy -- \
213 set Interface p5 type=dummy -- \
214 set Interface p6 type=dummy -- \
215 set Interface p7 type=dummy -- \
216 set Interface p8 type=dummy --])
220 -- get Interface p1 ofport \
221 -- get Interface p2 ofport \
222 -- get Interface p3 ofport \
223 -- get Interface p4 ofport \
224 -- get Interface p5 ofport \
225 -- get Interface p6 ofport \
226 -- get Interface p7 ofport \
227 -- get Interface p8 ofport],
230 br0=0 p1=$1 p2=$2 p3=$3 p4=$4 p5=$5 p6=$6 p7=$7 p8=$8
232 dnl Each of these specifies an in_port, a VLAN VID (or "none"), a VLAN
233 dnl PCP (used if the VID isn't "none") and the expected set of datapath
239 "br0 10 0 p1,p5,p6,p7,p8,pop_vlan,p2" \
240 "br0 10 1 p1,p5,p6,p7,p8,pop_vlan,p2" \
243 "br0 12 0 p1,p5,p6,pop_vlan,p3,p4,p7,p8" \
244 "br0 12 1 p1,p5,p6,pop_vlan,p4,p7,push_vlan(vid=0,pcp=1),p3,p8" \
248 "p1 10 0 br0,p5,p6,p7,p8,pop_vlan,p2" \
249 "p1 10 1 br0,p5,p6,p7,p8,pop_vlan,p2" \
252 "p1 12 0 br0,p5,p6,pop_vlan,p3,p4,p7,p8" \
253 "p1 12 1 br0,p5,p6,pop_vlan,p4,p7,push_vlan(vid=0,pcp=1),p3,p8" \
254 "p2 none 0 push_vlan(vid=10,pcp=0),br0,p1,p5,p6,p7,p8" \
255 "p2 0 0 pop_vlan,push_vlan(vid=10,pcp=0),br0,p1,p5,p6,p7,p8" \
256 "p2 0 1 pop_vlan,push_vlan(vid=10,pcp=1),br0,p1,p5,p6,p7,p8" \
263 "p3 none 0 p4,p7,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
264 "p3 0 0 pop_vlan,p4,p7,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
265 "p3 0 1 p8,pop_vlan,p4,p7,push_vlan(vid=12,pcp=1),br0,p1,p5,p6" \
272 "p4 none 0 p3,p7,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
273 "p4 0 0 pop_vlan,p3,p7,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
274 "p4 0 1 p3,p8,pop_vlan,p7,push_vlan(vid=12,pcp=1),br0,p1,p5,p6" \
281 "p5 none 0 p2,push_vlan(vid=10,pcp=0),br0,p1,p6,p7,p8" \
282 "p5 0 0 pop_vlan,p2,push_vlan(vid=10,pcp=0),br0,p1,p6,p7,p8" \
283 "p5 0 1 pop_vlan,p2,push_vlan(vid=10,pcp=1),br0,p1,p6,p7,p8" \
284 "p5 10 0 br0,p1,p6,p7,p8,pop_vlan,p2" \
285 "p5 10 1 br0,p1,p6,p7,p8,pop_vlan,p2" \
288 "p5 12 0 br0,p1,p6,pop_vlan,p3,p4,p7,p8" \
289 "p5 12 1 br0,p1,p6,pop_vlan,p4,p7,push_vlan(vid=0,pcp=1),p3,p8" \
290 "p6 none 0 p2,push_vlan(vid=10,pcp=0),br0,p1,p5,p7,p8" \
291 "p6 0 0 pop_vlan,p2,push_vlan(vid=10,pcp=0),br0,p1,p5,p7,p8" \
292 "p6 0 1 pop_vlan,p2,push_vlan(vid=10,pcp=1),br0,p1,p5,p7,p8" \
293 "p6 10 0 br0,p1,p5,p7,p8,pop_vlan,p2" \
294 "p6 10 1 br0,p1,p5,p7,p8,pop_vlan,p2" \
297 "p6 12 0 br0,p1,p5,pop_vlan,p3,p4,p7,p8" \
298 "p6 12 1 br0,p1,p5,pop_vlan,p4,p7,push_vlan(vid=0,pcp=1),p3,p8" \
299 "p7 none 0 p3,p4,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
300 "p7 0 0 pop_vlan,p3,p4,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
301 "p7 0 1 p3,p8,pop_vlan,p4,push_vlan(vid=12,pcp=1),br0,p1,p5,p6" \
302 "p7 10 0 br0,p1,p5,p6,p8,pop_vlan,p2" \
303 "p7 10 1 br0,p1,p5,p6,p8,pop_vlan,p2" \
306 "p7 12 0 br0,p1,p5,p6,pop_vlan,p3,p4,p8" \
307 "p7 12 1 br0,p1,p5,p6,pop_vlan,p4,push_vlan(vid=0,pcp=1),p3,p8" \
308 "p8 none 0 p3,p4,p7,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
309 "p8 0 0 pop_vlan,p3,p4,p7,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
310 "p8 0 1 p3,pop_vlan,p4,p7,push_vlan(vid=12,pcp=1),br0,p1,p5,p6" \
311 "p8 10 0 br0,p1,p5,p6,p7,pop_vlan,p2" \
312 "p8 10 1 br0,p1,p5,p6,p7,pop_vlan,p2" \
315 "p8 12 0 br0,p1,p5,p6,pop_vlan,p3,p4,p7" \
316 "p8 12 1 br0,p1,p5,p6,pop_vlan,p4,p7,push_vlan(vid=0,pcp=1),p3"
324 eval n_in_port=\$$in_port
325 if test $vlan = none; then
326 flow="in_port($n_in_port),eth(src=50:54:00:00:00:01,dst=ff:ff:ff:ff:ff:ff),eth_type(0xabcd)"
328 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))"
331 echo "----------------------------------------------------------------------"
332 echo "in_port=$in_port vlan=$vlan pcp=$pcp"
334 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
335 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
337 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])
339 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])
345 AT_SETUP([ofproto-dpif - fragment handling])
347 AT_DATA([flows.txt], [dnl
348 priority=75 tcp ip_frag=no tp_dst=80 actions=output:1
349 priority=75 tcp ip_frag=first tp_dst=80 actions=output:2
350 priority=75 tcp ip_frag=later tp_dst=80 actions=output:3
351 priority=50 tcp ip_frag=no actions=output:4
352 priority=50 tcp ip_frag=first actions=output:5
353 priority=50 tcp ip_frag=later actions=output:6
355 AT_CHECK([ovs-ofctl replace-flows br0 flows.txt])
357 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"
358 no_flow="$base_flow,frag=no),tcp(src=12345,dst=80)"
359 first_flow="$base_flow,frag=first),tcp(src=12345,dst=80)"
360 later_flow="$base_flow,frag=later)"
362 # mode no first later
374 AT_CHECK([ovs-ofctl set-frags br0 $mode])
375 for type in no first later; do
376 eval flow=\$${type}_flow exp_output=\$$type
377 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
378 AT_CHECK_UNQUOTED([tail -1 stdout], [0], [Datapath actions: $exp_output
385 AT_SETUP([ofproto-dpif - exit])
387 AT_DATA([flows.txt], [dnl
388 in_port=1 actions=output:10,exit,output:11
389 in_port=2 actions=output:12,resubmit:1,output:12
390 in_port=3 actions=output:13,resubmit:2,output:14
392 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
393 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])
394 AT_CHECK([tail -1 stdout], [0],
395 [Datapath actions: 10
397 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])
398 AT_CHECK([tail -1 stdout], [0],
399 [Datapath actions: 12,10
401 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])
402 AT_CHECK([tail -1 stdout], [0],
403 [Datapath actions: 13,12,10
409 AT_SETUP([ofproto-dpif - mirroring, select_all])
411 [add-port br0 p1 -- set Interface p1 type=dummy --\
412 add-port br0 p2 -- set Interface p2 type=dummy --\
413 add-port br0 p3 -- set Interface p3 type=dummy --\
414 set Bridge br0 mirrors=@m --\
415 --id=@p3 get Port p3 --\
416 --id=@m create Mirror name=mymirror \
417 select_all=true output_port=@p3], [<0>
422 -- get Interface p1 ofport \
423 -- get Interface p2 ofport \
424 -- get Interface p3 ofport],
429 AT_DATA([flows.txt], [dnl
430 in_port=1 actions=output:2
431 in_port=2 actions=output:1
433 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
435 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)"
436 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
437 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
438 [Datapath actions: $p2,$p3
441 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)"
442 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
443 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
444 [Datapath actions: $p1,$p3
451 AT_SETUP([ofproto-dpif - mirroring, select_src])
453 [add-port br0 p1 -- set Interface p1 type=dummy --\
454 add-port br0 p2 -- set Interface p2 type=dummy --\
455 add-port br0 p3 -- set Interface p3 type=dummy --\
456 set Bridge br0 mirrors=@m --\
457 --id=@p1 get Port p1 -- --id=@p3 get Port p3 --\
458 --id=@m create Mirror name=mymirror \
459 select_src_port=@p1 output_port=@p3], [<0>
464 -- get Interface p1 ofport \
465 -- get Interface p2 ofport \
466 -- get Interface p3 ofport],
471 AT_DATA([flows.txt], [dnl
472 in_port=1 actions=output:2
473 in_port=2 actions=output:1
475 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
477 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)"
478 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
479 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
480 [Datapath actions: $p2,$p3
483 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)"
484 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
485 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
486 [Datapath actions: $p1
491 AT_SETUP([ofproto-dpif - mirroring, OFPP_NONE ingress port])
493 [add-port br0 p1 -- set Interface p1 type=dummy --\
494 add-port br0 p2 -- set Interface p2 type=dummy --\
495 set Bridge br0 mirrors=@m --\
496 --id=@p2 get Port p2 --\
497 --id=@m create Mirror name=mymirror \
498 select_all=true output_port=@p2], [<0>
503 -- get Interface p1 ofport \
504 -- get Interface p2 ofport],
509 AT_CHECK([ovs-ofctl add-flow br0 action=output:1])
511 # "in_port" defaults to OFPP_NONE if it's not specified.
512 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)"
513 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
514 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
515 [Datapath actions: $p1,$p2
522 AT_SETUP([ofproto-dpif - mirroring, select_dst])
524 [add-port br0 p1 -- set Interface p1 type=dummy --\
525 add-port br0 p2 -- set Interface p2 type=dummy --\
526 add-port br0 p3 -- set Interface p3 type=dummy --\
527 set Bridge br0 mirrors=@m --\
528 --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
529 --id=@m create Mirror name=mymirror \
530 select_dst_port=@p2 output_port=@p3], [<0>
535 -- get Interface p1 ofport \
536 -- get Interface p2 ofport \
537 -- get Interface p3 ofport],
542 AT_DATA([flows.txt], [dnl
543 in_port=1 actions=output:2
544 in_port=2 actions=output:1
546 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
548 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)"
549 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
550 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
551 [Datapath actions: $p2,$p3
554 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)"
555 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
556 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
557 [Datapath actions: $p1
564 AT_SETUP([ofproto-dpif - mirroring, select_vlan])
566 [add-port br0 p1 -- set Interface p1 type=dummy --\
567 add-port br0 p2 -- set Interface p2 type=dummy --\
568 add-port br0 p3 -- set Interface p3 type=dummy --\
569 set Bridge br0 mirrors=@m --\
570 --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
571 --id=@m create Mirror name=mymirror \
572 select_all=true select_vlan=11 output_port=@p3], [<0>
577 -- get Interface p1 ofport \
578 -- get Interface p2 ofport \
579 -- get Interface p3 ofport],
584 AT_DATA([flows.txt], [dnl
585 in_port=1, actions=output:2
587 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
589 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)"
590 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
591 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
592 [Datapath actions: $p2
595 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))"
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=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))"
602 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
603 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
604 [Datapath actions: $p2,$p3
611 AT_SETUP([ofproto-dpif - mirroring, output_port])
613 [add-port br0 p1 -- set Interface p1 type=dummy --\
614 add-port br0 p2 -- set Interface p2 type=dummy --\
615 add-port br0 p3 -- set Interface p3 type=dummy --\
616 set Bridge br0 mirrors=@m --\
617 --id=@p3 get Port p3 --\
618 --id=@m create Mirror name=mymirror \
619 select_all=true output_port=@p3], [<0>
624 -- get Interface p1 ofport \
625 -- get Interface p2 ofport \
626 -- get Interface p3 ofport],
631 AT_DATA([flows.txt], [dnl
632 in_port=1 actions=mod_vlan_vid:17,output:2
633 in_port=2 actions=output:1
635 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
637 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)"
638 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
639 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
640 [Datapath actions: push_vlan(vid=17,pcp=0),$p2,pop_vlan,$p3
643 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)"
644 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
645 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
646 [Datapath actions: $p1,$p3
652 AT_SETUP([ofproto-dpif - mirroring, output_vlan])
654 [add-port br0 p1 -- set Interface p1 type=dummy --\
655 add-port br0 p2 -- set Interface p2 type=dummy --\
656 set Bridge br0 mirrors=@m --\
657 --id=@m create Mirror name=mymirror \
658 select_all=true output_vlan=12], [<0>
663 -- get Interface p1 ofport \
664 -- get Interface p2 ofport],
669 AT_DATA([flows.txt], [dnl
670 in_port=1 actions=output:2
671 in_port=2 actions=mod_vlan_vid:17,output:1
673 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
675 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)"
676 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
677 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
679 expected="$p2,push_vlan(vid=12,pcp=0),$br0,$p1,$p2"
680 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" br0=$br0 p1=$p1 p2=$p2], [0], [stdout])
682 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" br0=$br0 p1=$p1 p2=$p2], [0], [expout])
684 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)"
685 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
686 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
688 expected="push_vlan(vid=17,pcp=0),$p1,pop_vlan,push_vlan(vid=12,pcp=0),$br0,$p1,$p2"
689 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" br0=$br0 p1=$p1 p2=$p2], [0], [stdout])
691 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" br0=$br0 p1=$p1 p2=$p2], [0], [expout])
696 m4_define([OFPROTO_TRACE],
698 AT_CHECK([ovs-appctl ofproto/trace $1 "$flow" $3], [0], [stdout])
699 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
701 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" $5],
704 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" $5],
707 AT_SETUP([ofproto-dpif - MAC learning])
709 [set bridge br0 fail-mode=standalone -- \
710 add-port br0 p1 -- set Interface p1 type=dummy -- \
711 add-port br0 p2 -- set Interface p2 type=dummy -- \
712 add-port br0 p3 -- set Interface p3 type=dummy])
716 -- get Interface p1 ofport \
717 -- get Interface p2 ofport \
718 -- get Interface p3 ofport],
721 br0=0 p1=$1 p2=$2 p3=$3
722 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)'
724 # Trace an ARP packet arriving on p3, to create a MAC learning entry.
727 [in_port($p3),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
730 [br0=$br0 p1=$p1 p2=$p2 p3=$p3])
732 # Check for the MAC learning entry.
733 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]$/?/'], [0], [dnl
735 $p3 0 50:54:00:00:00:05 ?
738 # Trace a packet arrival destined for the learned MAC.
739 # (This will also learn a MAC.)
742 [in_port($p1),eth(src=50:54:00:00:00:06,dst=50:54:00:00:00:05),$arp],
745 [br0=$br0 p1=$p1 p2=$p2 p3=$p3])
747 # Check for both MAC learning entries.
748 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]$/?/'], [0], [dnl
750 $p3 0 50:54:00:00:00:05 ?
751 $p1 0 50:54:00:00:00:06 ?
754 # Trace a packet arrival that updates the first learned MAC entry.
757 [in_port($p2),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
760 [br0=$br0 p1=$p1 p2=$p2 p3=$p3])
762 # Check that the MAC learning entry was updated.
763 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]$/?/'], [0], [dnl
765 $p1 0 50:54:00:00:00:06 ?
766 $p2 0 50:54:00:00:00:05 ?
769 # Add another bridge.
773 -- set bridge br1 datapath-type=dummy \
774 -- add-port br1 p4 -- set interface p4 type=dummy \
775 -- add-port br1 p5 -- set interface p5 type=dummy])
778 -- get Interface p4 ofport \
779 -- get Interface p5 ofport],
784 # Trace some packet arrivals in br1 to create MAC learning entries there too.
787 [in_port($p4),eth(src=50:54:00:00:00:06,dst=ff:ff:ff:ff:ff:ff),$arp],
790 [br1=$br1 p4=$p4 p5=$p5])
793 [in_port($p5),eth(src=50:54:00:00:00:07,dst=ff:ff:ff:ff:ff:ff),$arp],
796 [br1=$br1 p4=$p4 p5=$p5])
798 # Check that the MAC learning entries were added.
799 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]$/?/'], [0], [dnl
801 $p4 0 50:54:00:00:00:06 ?
802 $p5 0 50:54:00:00:00:07 ?
805 # Delete port p1 and see that its MAC learning entry disappeared, and
806 # that the MAC learning entry for the same MAC was also deleted from br1.
807 AT_CHECK([ovs-vsctl del-port p1])
808 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]$/?/'], [0], [dnl
810 $p2 0 50:54:00:00:00:05 ?
812 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]$/?/'], [0], [dnl
814 $p5 0 50:54:00:00:00:07 ?
820 dnl Test that basic NetFlow reports flow statistics correctly:
821 dnl - The initial packet of a flow are correctly accounted.
822 dnl - Later packets within a flow are correctly accounted.
823 dnl - Flow actions changing (in this case, due to MAC learning)
824 dnl cause a record to be sent.
825 AT_SETUP([ofproto-dpif - NetFlow flow expiration])
827 AT_SKIP_IF([test "x$RANDOM" = x])
828 NETFLOW_PORT=`expr 32767 + \( $RANDOM % 32767 \)`
831 [set Bridge br0 fail-mode=standalone -- \
832 add-port br0 p1 -- set Interface p1 type=dummy -- \
833 add-port br0 p2 -- set Interface p2 type=dummy -- \
834 set Bridge br0 netflow=@nf -- \
835 --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
836 engine_id=1 engine_type=2 active_timeout=30 \
837 add-id-to-interface=false], [<0>
840 AT_CHECK([test-netflow --detach --pidfile $NETFLOW_PORT:127.0.0.1 > netflow.log])AT_CAPTURE_FILE([netflow.log])
842 for delay in 1000 30000; do
843 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)'
844 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)'
846 ovs-appctl time/warp $delay
850 ovs-appctl -t test-netflow exit
852 AT_CHECK([[sed -e 's/, uptime [0-9]*//
854 s/time \([0-9]*\)\.\.\.\1\b/time <moment>/
855 s/time [0-9]*\.\.\.[0-9]*/time <range>/
856 ' netflow.log]], [0],
857 [header: v5, seq 0, engine 2,1
858 rec: 192.168.0.1 > 192.168.0.2, if 1 > 65535, 1 pkts, 60 bytes, ICMP 8:0, time <moment>
860 header: v5, seq 1, engine 2,1
861 rec: 192.168.0.2 > 192.168.0.1, if 2 > 1, 2 pkts, 120 bytes, ICMP 0:0, time <range>
862 rec: 192.168.0.1 > 192.168.0.2, if 1 > 2, 1 pkts, 60 bytes, ICMP 8:0, time <moment>
866 dnl Test that basic NetFlow reports active expirations correctly.
867 AT_SETUP([ofproto-dpif - NetFlow active expiration])
869 AT_SKIP_IF([test "x$RANDOM" = x])
870 NETFLOW_PORT=`expr 32767 + \( $RANDOM % 32767 \)`
873 [set Bridge br0 fail-mode=standalone -- \
874 add-port br0 p1 -- set Interface p1 type=dummy -- \
875 add-port br0 p2 -- set Interface p2 type=dummy -- \
876 set Bridge br0 netflow=@nf -- \
877 --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
878 engine_id=1 engine_type=2 active_timeout=10 \
879 add-id-to-interface=false], [<0>
882 AT_CHECK([test-netflow --detach --pidfile $NETFLOW_PORT:127.0.0.1 > netflow.log])AT_CAPTURE_FILE([netflow.log])
885 while test $n -le 60; do
888 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)'
889 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)'
891 ovs-appctl time/warp 1000
894 ovs-appctl time/warp 10000
897 ovs-appctl -t test-netflow exit
899 # Count the number of reported packets:
900 # - From source to destination before MAC learning kicks in (just one).
901 # - From source to destination after that.
902 # - From destination to source.
910 pkts=`echo "$line" | sed 's/.*, \([[0-9]]*\) pkts,.*/\1/'`
917 "rec: 192.168.0.1 > 192.168.0.2, if 1 > 65535, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
920 "rec: 192.168.0.1 > 192.168.0.2, if 1 > 2, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
923 "rec: 192.168.0.2 > 192.168.0.1, if 2 > 1, "*" pkts, "*" bytes, TCP 80 > 1234, time "*)
930 eval $counter=\`expr \$$counter + \$pkts\`
931 n_recs=`expr $n_recs + 1`
934 # There should be exactly 1 MAC learning packet,
935 # exactly 59 other packets in that direction,
936 # and exactly 60 packets in the other direction.
937 AT_CHECK([echo $n_learn $n_in $n_out $n_other], [0], [1 59 60 0
940 # There should be 1 expiration for MAC learning,
941 # at least 5 active and a final expiration in one direction,
942 # and at least 5 active and a final expiration in the other direction.
944 AT_CHECK([test $n_recs -ge 13])