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 - set_tunnel])
67 AT_DATA([flows.txt], [dnl
68 in_port=90 actions=resubmit:1,resubmit:2,resubmit:3,resubmit:4,resubmit:5
69 in_port=1 actions=set_tunnel:1,output:1
70 in_port=2 actions=set_tunnel:1,output:2
71 in_port=3 actions=set_tunnel:2,set_tunnel:3,output:3
72 in_port=4 actions=set_tunnel:4,set_tunnel:3,output:4
73 in_port=5 actions=set_tunnel:5
75 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
76 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])
77 AT_CHECK([tail -1 stdout], [0],
78 [Datapath actions: set(tun_id(0x1)),1,2,set(tun_id(0x3)),3,4
83 AT_SETUP([ofproto-dpif - VLAN handling])
85 [set Bridge br0 fail-mode=standalone -- \
86 add-port br0 p1 trunks=10,12 -- \
87 add-port br0 p2 tag=10 -- \
88 add-port br0 p3 tag=12 -- \
89 add-port br0 p4 tag=12 -- \
90 add-port br0 p5 vlan_mode=native-tagged tag=10 -- \
91 add-port br0 p6 vlan_mode=native-tagged tag=10 trunks=10,12 -- \
92 add-port br0 p7 vlan_mode=native-untagged tag=12 -- \
93 add-port br0 p8 vlan_mode=native-untagged tag=12 trunks=10,12 -- \
94 set Interface p1 type=dummy -- \
95 set Interface p2 type=dummy -- \
96 set Interface p3 type=dummy -- \
97 set Interface p4 type=dummy -- \
98 set Interface p5 type=dummy -- \
99 set Interface p6 type=dummy -- \
100 set Interface p7 type=dummy -- \
101 set Interface p8 type=dummy --])
105 -- get Interface p1 ofport \
106 -- get Interface p2 ofport \
107 -- get Interface p3 ofport \
108 -- get Interface p4 ofport \
109 -- get Interface p5 ofport \
110 -- get Interface p6 ofport \
111 -- get Interface p7 ofport \
112 -- get Interface p8 ofport],
115 br0=0 p1=$1 p2=$2 p3=$3 p4=$4 p5=$5 p6=$6 p7=$7 p8=$8
117 dnl Each of these specifies an in_port, a VLAN VID (or "none"), a VLAN
118 dnl PCP (used if the VID isn't "none") and the expected set of datapath
121 dnl XXX Some of these actually output an 802.1Q header to an access port
122 dnl (see for example the actions for in_port=p3, vlan=0) to qualify the
123 dnl packet with a priority. That should be configurable.
128 "br0 10 0 p1,p5,p6,p7,p8,pop_vlan,p2" \
129 "br0 10 1 p1,p5,p6,p7,p8,pop_vlan,push_vlan(vid=0,pcp=1),p2" \
132 "br0 12 0 p1,p5,p6,pop_vlan,p3,p4,p7,p8" \
133 "br0 12 1 p1,p5,p6,pop_vlan,push_vlan(vid=0,pcp=1),p3,p4,p7,p8" \
137 "p1 10 0 br0,p5,p6,p7,p8,pop_vlan,p2" \
138 "p1 10 1 br0,p5,p6,p7,p8,pop_vlan,push_vlan(vid=0,pcp=1),p2" \
141 "p1 12 0 br0,p5,p6,pop_vlan,p3,p4,p7,p8" \
142 "p1 12 1 br0,p5,p6,pop_vlan,push_vlan(vid=0,pcp=1),p3,p4,p7,p8" \
143 "p2 none 0 push_vlan(vid=10,pcp=0),br0,p1,p5,p6,p7,p8" \
144 "p2 0 0 pop_vlan,push_vlan(vid=10,pcp=0),br0,p1,p5,p6,p7,p8" \
145 "p2 0 1 pop_vlan,push_vlan(vid=10,pcp=1),br0,p1,p5,p6,p7,p8" \
152 "p3 none 0 p4,p7,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
153 "p3 0 0 pop_vlan,p4,p7,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
154 "p3 0 1 p4,p7,p8,pop_vlan,push_vlan(vid=12,pcp=1),br0,p1,p5,p6" \
161 "p4 none 0 p3,p7,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
162 "p4 0 0 pop_vlan,p3,p7,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
163 "p4 0 1 p3,p7,p8,pop_vlan,push_vlan(vid=12,pcp=1),br0,p1,p5,p6" \
170 "p5 none 0 p2,push_vlan(vid=10,pcp=0),br0,p1,p6,p7,p8" \
171 "p5 0 0 pop_vlan,p2,push_vlan(vid=10,pcp=0),br0,p1,p6,p7,p8" \
172 "p5 0 1 p2,pop_vlan,push_vlan(vid=10,pcp=1),br0,p1,p6,p7,p8" \
173 "p5 10 0 br0,p1,p6,p7,p8,pop_vlan,p2" \
174 "p5 10 1 br0,p1,p6,p7,p8,pop_vlan,push_vlan(vid=0,pcp=1),p2" \
177 "p5 12 0 br0,p1,p6,pop_vlan,p3,p4,p7,p8" \
178 "p5 12 1 br0,p1,p6,pop_vlan,push_vlan(vid=0,pcp=1),p3,p4,p7,p8" \
179 "p6 none 0 p2,push_vlan(vid=10,pcp=0),br0,p1,p5,p7,p8" \
180 "p6 0 0 pop_vlan,p2,push_vlan(vid=10,pcp=0),br0,p1,p5,p7,p8" \
181 "p6 0 1 p2,pop_vlan,push_vlan(vid=10,pcp=1),br0,p1,p5,p7,p8" \
182 "p6 10 0 br0,p1,p5,p7,p8,pop_vlan,p2" \
183 "p6 10 1 br0,p1,p5,p7,p8,pop_vlan,push_vlan(vid=0,pcp=1),p2" \
186 "p6 12 0 br0,p1,p5,pop_vlan,p3,p4,p7,p8" \
187 "p6 12 1 br0,p1,p5,pop_vlan,push_vlan(vid=0,pcp=1),p3,p4,p7,p8" \
188 "p7 none 0 p3,p4,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
189 "p7 0 0 pop_vlan,p3,p4,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
190 "p7 0 1 p3,p4,p8,pop_vlan,push_vlan(vid=12,pcp=1),br0,p1,p5,p6" \
191 "p7 10 0 br0,p1,p5,p6,p8,pop_vlan,p2" \
192 "p7 10 1 br0,p1,p5,p6,p8,pop_vlan,push_vlan(vid=0,pcp=1),p2" \
195 "p7 12 0 br0,p1,p5,p6,pop_vlan,p3,p4,p8" \
196 "p7 12 1 br0,p1,p5,p6,pop_vlan,push_vlan(vid=0,pcp=1),p3,p4,p8" \
197 "p8 none 0 p3,p4,p7,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
198 "p8 0 0 pop_vlan,p3,p4,p7,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
199 "p8 0 1 p3,p4,p7,pop_vlan,push_vlan(vid=12,pcp=1),br0,p1,p5,p6" \
200 "p8 10 0 br0,p1,p5,p6,p7,pop_vlan,p2" \
201 "p8 10 1 br0,p1,p5,p6,p7,pop_vlan,push_vlan(vid=0,pcp=1),p2" \
204 "p8 12 0 br0,p1,p5,p6,pop_vlan,p3,p4,p7" \
205 "p8 12 1 br0,p1,p5,p6,pop_vlan,push_vlan(vid=0,pcp=1),p3,p4,p7"
213 eval n_in_port=\$$in_port
214 if test $vlan = none; then
215 flow="in_port($n_in_port),eth(src=50:54:00:00:00:01,dst=ff:ff:ff:ff:ff:ff),eth_type(0xabcd)"
217 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))"
220 echo "----------------------------------------------------------------------"
221 echo "in_port=$in_port vlan=$vlan pcp=$pcp"
223 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
224 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
226 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])
228 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])
234 AT_SETUP([ofproto-dpif - fragment handling])
236 AT_DATA([flows.txt], [dnl
237 priority=75 tcp ip_frag=no tp_dst=80 actions=output:1
238 priority=75 tcp ip_frag=first tp_dst=80 actions=output:2
239 priority=75 tcp ip_frag=later tp_dst=80 actions=output:3
240 priority=50 tcp ip_frag=no actions=output:4
241 priority=50 tcp ip_frag=first actions=output:5
242 priority=50 tcp ip_frag=later actions=output:6
244 AT_CHECK([ovs-ofctl replace-flows br0 flows.txt])
246 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"
247 no_flow="$base_flow,frag=no),tcp(src=12345,dst=80)"
248 first_flow="$base_flow,frag=first),tcp(src=12345,dst=80)"
249 later_flow="$base_flow,frag=later)"
251 # mode no first later
263 AT_CHECK([ovs-ofctl set-frags br0 $mode])
264 for type in no first later; do
265 eval flow=\$${type}_flow exp_output=\$$type
266 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
267 AT_CHECK_UNQUOTED([tail -1 stdout], [0], [Datapath actions: $exp_output
274 AT_SETUP([ofproto-dpif - exit])
276 AT_DATA([flows.txt], [dnl
277 in_port=1 actions=output:10,exit,output:11
278 in_port=2 actions=output:12,resubmit:1,output:12
279 in_port=3 actions=output:13,resubmit:2,output:14
281 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
282 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])
283 AT_CHECK([tail -1 stdout], [0],
284 [Datapath actions: 10
286 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])
287 AT_CHECK([tail -1 stdout], [0],
288 [Datapath actions: 12,10
290 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])
291 AT_CHECK([tail -1 stdout], [0],
292 [Datapath actions: 13,12,10