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/flood flags])
66 dnl This test assumes that OpenFlow port numbers are allocated in order
67 dnl starting from one. It does not necessarily require that they are allocated
68 dnl in the same order that they are named in the database. Just that the
69 dnl following command guarantees OpenFlow port 65534, and ports 1-7 exist in
71 OVS_VSWITCHD_START([dnl
72 add-port br0 p1 -- set Interface p1 type=dummy --\
73 add-port br0 p2 -- set Interface p2 type=dummy --\
74 add-port br0 p3 -- set Interface p3 type=dummy --\
75 add-port br0 p4 -- set Interface p4 type=dummy --\
76 add-port br0 p5 -- set Interface p5 type=dummy --\
77 add-port br0 p6 -- set Interface p6 type=dummy --\
78 add-port br0 p7 -- set Interface p7 type=dummy ])
80 AT_DATA([flows.txt], [dnl
81 in_port=1 actions=flood
83 in_port=3 actions=output:65534,output:1,output:2,output:3,output:4,output:5,output:6,output:7
84 in_port=4 actions=enqueue:65534:1,enqueue:1:1,enqueue:2:1,enqueue:3:1,enqueue:4:1,enqueue:5:1,enqueue:6:1,enqueue:7:1
86 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
87 AT_CHECK([ovs-ofctl mod-port br0 5 noforward])
88 AT_CHECK([ovs-ofctl mod-port br0 6 noflood])
90 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])
91 AT_CHECK([tail -1 stdout \
92 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
100 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])
101 AT_CHECK([tail -1 stdout \
102 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
111 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])
112 AT_CHECK([tail -1 stdout], [0],
113 [Datapath actions: 0,1,2,4,6,7
116 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])
117 AT_CHECK([tail -1 stdout], [0],
118 [Datapath actions: 0,1,2,3,6,7
123 AT_SETUP([ofproto-dpif - set_tunnel])
125 AT_DATA([flows.txt], [dnl
126 in_port=90 actions=resubmit:1,resubmit:2,resubmit:3,resubmit:4,resubmit:5
127 in_port=1 actions=set_tunnel:1,output:1
128 in_port=2 actions=set_tunnel:1,output:2
129 in_port=3 actions=set_tunnel:2,set_tunnel:3,output:3
130 in_port=4 actions=set_tunnel:4,set_tunnel:3,output:4
131 in_port=5 actions=set_tunnel:5
133 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
134 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])
135 AT_CHECK([tail -1 stdout], [0],
136 [Datapath actions: set(tun_id(0x1)),1,2,set(tun_id(0x3)),3,4
141 AT_SETUP([ofproto-dpif - VLAN handling])
143 [set Bridge br0 fail-mode=standalone -- \
144 add-port br0 p1 trunks=10,12 -- \
145 add-port br0 p2 tag=10 -- \
146 add-port br0 p3 tag=12 \
147 other-config:priority-tags=true -- \
148 add-port br0 p4 tag=12 -- \
149 add-port br0 p5 vlan_mode=native-tagged tag=10 -- \
150 add-port br0 p6 vlan_mode=native-tagged tag=10 trunks=10,12 -- \
151 add-port br0 p7 vlan_mode=native-untagged tag=12 -- \
152 add-port br0 p8 vlan_mode=native-untagged tag=12 trunks=10,12 \
153 other-config:priority-tags=true -- \
154 set Interface p1 type=dummy -- \
155 set Interface p2 type=dummy -- \
156 set Interface p3 type=dummy -- \
157 set Interface p4 type=dummy -- \
158 set Interface p5 type=dummy -- \
159 set Interface p6 type=dummy -- \
160 set Interface p7 type=dummy -- \
161 set Interface p8 type=dummy --])
165 -- get Interface p1 ofport \
166 -- get Interface p2 ofport \
167 -- get Interface p3 ofport \
168 -- get Interface p4 ofport \
169 -- get Interface p5 ofport \
170 -- get Interface p6 ofport \
171 -- get Interface p7 ofport \
172 -- get Interface p8 ofport],
175 br0=0 p1=$1 p2=$2 p3=$3 p4=$4 p5=$5 p6=$6 p7=$7 p8=$8
177 dnl Each of these specifies an in_port, a VLAN VID (or "none"), a VLAN
178 dnl PCP (used if the VID isn't "none") and the expected set of datapath
184 "br0 10 0 p1,p5,p6,p7,p8,pop_vlan,p2" \
185 "br0 10 1 p1,p5,p6,p7,p8,pop_vlan,p2" \
188 "br0 12 0 p1,p5,p6,pop_vlan,p3,p4,p7,p8" \
189 "br0 12 1 p1,p5,p6,pop_vlan,p4,p7,push_vlan(vid=0,pcp=1),p3,p8" \
193 "p1 10 0 br0,p5,p6,p7,p8,pop_vlan,p2" \
194 "p1 10 1 br0,p5,p6,p7,p8,pop_vlan,p2" \
197 "p1 12 0 br0,p5,p6,pop_vlan,p3,p4,p7,p8" \
198 "p1 12 1 br0,p5,p6,pop_vlan,p4,p7,push_vlan(vid=0,pcp=1),p3,p8" \
199 "p2 none 0 push_vlan(vid=10,pcp=0),br0,p1,p5,p6,p7,p8" \
200 "p2 0 0 pop_vlan,push_vlan(vid=10,pcp=0),br0,p1,p5,p6,p7,p8" \
201 "p2 0 1 pop_vlan,push_vlan(vid=10,pcp=1),br0,p1,p5,p6,p7,p8" \
208 "p3 none 0 p4,p7,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
209 "p3 0 0 pop_vlan,p4,p7,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
210 "p3 0 1 p8,pop_vlan,p4,p7,push_vlan(vid=12,pcp=1),br0,p1,p5,p6" \
217 "p4 none 0 p3,p7,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
218 "p4 0 0 pop_vlan,p3,p7,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
219 "p4 0 1 p3,p8,pop_vlan,p7,push_vlan(vid=12,pcp=1),br0,p1,p5,p6" \
226 "p5 none 0 p2,push_vlan(vid=10,pcp=0),br0,p1,p6,p7,p8" \
227 "p5 0 0 pop_vlan,p2,push_vlan(vid=10,pcp=0),br0,p1,p6,p7,p8" \
228 "p5 0 1 pop_vlan,p2,push_vlan(vid=10,pcp=1),br0,p1,p6,p7,p8" \
229 "p5 10 0 br0,p1,p6,p7,p8,pop_vlan,p2" \
230 "p5 10 1 br0,p1,p6,p7,p8,pop_vlan,p2" \
233 "p5 12 0 br0,p1,p6,pop_vlan,p3,p4,p7,p8" \
234 "p5 12 1 br0,p1,p6,pop_vlan,p4,p7,push_vlan(vid=0,pcp=1),p3,p8" \
235 "p6 none 0 p2,push_vlan(vid=10,pcp=0),br0,p1,p5,p7,p8" \
236 "p6 0 0 pop_vlan,p2,push_vlan(vid=10,pcp=0),br0,p1,p5,p7,p8" \
237 "p6 0 1 pop_vlan,p2,push_vlan(vid=10,pcp=1),br0,p1,p5,p7,p8" \
238 "p6 10 0 br0,p1,p5,p7,p8,pop_vlan,p2" \
239 "p6 10 1 br0,p1,p5,p7,p8,pop_vlan,p2" \
242 "p6 12 0 br0,p1,p5,pop_vlan,p3,p4,p7,p8" \
243 "p6 12 1 br0,p1,p5,pop_vlan,p4,p7,push_vlan(vid=0,pcp=1),p3,p8" \
244 "p7 none 0 p3,p4,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
245 "p7 0 0 pop_vlan,p3,p4,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
246 "p7 0 1 p3,p8,pop_vlan,p4,push_vlan(vid=12,pcp=1),br0,p1,p5,p6" \
247 "p7 10 0 br0,p1,p5,p6,p8,pop_vlan,p2" \
248 "p7 10 1 br0,p1,p5,p6,p8,pop_vlan,p2" \
251 "p7 12 0 br0,p1,p5,p6,pop_vlan,p3,p4,p8" \
252 "p7 12 1 br0,p1,p5,p6,pop_vlan,p4,push_vlan(vid=0,pcp=1),p3,p8" \
253 "p8 none 0 p3,p4,p7,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
254 "p8 0 0 pop_vlan,p3,p4,p7,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
255 "p8 0 1 p3,pop_vlan,p4,p7,push_vlan(vid=12,pcp=1),br0,p1,p5,p6" \
256 "p8 10 0 br0,p1,p5,p6,p7,pop_vlan,p2" \
257 "p8 10 1 br0,p1,p5,p6,p7,pop_vlan,p2" \
260 "p8 12 0 br0,p1,p5,p6,pop_vlan,p3,p4,p7" \
261 "p8 12 1 br0,p1,p5,p6,pop_vlan,p4,p7,push_vlan(vid=0,pcp=1),p3"
269 eval n_in_port=\$$in_port
270 if test $vlan = none; then
271 flow="in_port($n_in_port),eth(src=50:54:00:00:00:01,dst=ff:ff:ff:ff:ff:ff),eth_type(0xabcd)"
273 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))"
276 echo "----------------------------------------------------------------------"
277 echo "in_port=$in_port vlan=$vlan pcp=$pcp"
279 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
280 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
282 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])
284 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])
290 AT_SETUP([ofproto-dpif - fragment handling])
292 AT_DATA([flows.txt], [dnl
293 priority=75 tcp ip_frag=no tp_dst=80 actions=output:1
294 priority=75 tcp ip_frag=first tp_dst=80 actions=output:2
295 priority=75 tcp ip_frag=later tp_dst=80 actions=output:3
296 priority=50 tcp ip_frag=no actions=output:4
297 priority=50 tcp ip_frag=first actions=output:5
298 priority=50 tcp ip_frag=later actions=output:6
300 AT_CHECK([ovs-ofctl replace-flows br0 flows.txt])
302 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"
303 no_flow="$base_flow,frag=no),tcp(src=12345,dst=80)"
304 first_flow="$base_flow,frag=first),tcp(src=12345,dst=80)"
305 later_flow="$base_flow,frag=later)"
307 # mode no first later
319 AT_CHECK([ovs-ofctl set-frags br0 $mode])
320 for type in no first later; do
321 eval flow=\$${type}_flow exp_output=\$$type
322 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
323 AT_CHECK_UNQUOTED([tail -1 stdout], [0], [Datapath actions: $exp_output
330 AT_SETUP([ofproto-dpif - exit])
332 AT_DATA([flows.txt], [dnl
333 in_port=1 actions=output:10,exit,output:11
334 in_port=2 actions=output:12,resubmit:1,output:12
335 in_port=3 actions=output:13,resubmit:2,output:14
337 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
338 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])
339 AT_CHECK([tail -1 stdout], [0],
340 [Datapath actions: 10
342 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])
343 AT_CHECK([tail -1 stdout], [0],
344 [Datapath actions: 12,10
346 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])
347 AT_CHECK([tail -1 stdout], [0],
348 [Datapath actions: 13,12,10