ofproto-dpif: Test basic output and flooding.
[sliver-openvswitch.git] / tests / ofproto-dpif.at
1 AT_BANNER([ofproto-dpif])
2
3 AT_SETUP([ofproto-dpif - resubmit])
4 OVS_VSWITCHD_START
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)
12 ])
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
17 ])
18 OVS_VSWITCHD_STOP
19 AT_CLEANUP
20
21 AT_SETUP([ofproto-dpif - registers])
22 OVS_VSWITCHD_START
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
37 ])
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
42 ])
43 OVS_VSWITCHD_STOP
44 AT_CLEANUP
45
46 AT_SETUP([ofproto-dpif - output])
47 OVS_VSWITCHD_START
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[[]]
56 ])
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
61 ])
62 OVS_VSWITCHD_STOP
63 AT_CLEANUP
64
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
70 dnl the bridge.
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 ])
79
80 AT_DATA([flows.txt], [dnl
81 in_port=1 actions=flood
82 in_port=2 actions=all
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
85 ])
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])
89
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
93 0
94 2
95 3
96 4
97 7
98 ])
99
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
103 0
104 1
105 3
106 4
107 6
108 7
109 ])
110
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
114 ])
115
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
119 ])
120 OVS_VSWITCHD_STOP
121 AT_CLEANUP
122
123 AT_SETUP([ofproto-dpif - set_tunnel])
124 OVS_VSWITCHD_START
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
132 ])
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
137 ])
138 OVS_VSWITCHD_STOP
139 AT_CLEANUP
140
141 AT_SETUP([ofproto-dpif - VLAN handling])
142 OVS_VSWITCHD_START(
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 --])
162
163 AT_CHECK(
164   [ovs-vsctl \
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],
173   [0], [stdout])
174 set `cat stdout`
175 br0=0 p1=$1 p2=$2 p3=$3 p4=$4 p5=$5 p6=$6 p7=$7 p8=$8
176
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
179 dnl actions.
180 for tuple in \
181         "br0 none 0 drop" \
182         "br0 0    0 drop" \
183         "br0 0    1 drop" \
184         "br0 10   0 p1,p5,p6,p7,p8,pop_vlan,p2" \
185         "br0 10   1 p1,p5,p6,p7,p8,pop_vlan,p2" \
186         "br0 11   0 p5,p7" \
187         "br0 11   1 p5,p7" \
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" \
190         "p1  none 0 drop" \
191         "p1  0    0 drop" \
192         "p1  0    1 drop" \
193         "p1  10   0 br0,p5,p6,p7,p8,pop_vlan,p2" \
194         "p1  10   1 br0,p5,p6,p7,p8,pop_vlan,p2" \
195         "p1  11   0 drop" \
196         "p1  11   1 drop" \
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" \
202         "p2  10   0 drop" \
203         "p2  10   1 drop" \
204         "p2  11   0 drop" \
205         "p2  11   1 drop" \
206         "p2  12   0 drop" \
207         "p2  12   1 drop" \
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" \
211         "p3  10   0 drop" \
212         "p3  10   1 drop" \
213         "p3  11   0 drop" \
214         "p3  11   1 drop" \
215         "p3  12   0 drop" \
216         "p3  12   1 drop" \
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" \
220         "p4  10   0 drop" \
221         "p4  10   1 drop" \
222         "p4  11   0 drop" \
223         "p4  11   1 drop" \
224         "p4  12   0 drop" \
225         "p4  12   1 drop" \
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" \
231         "p5  11   0 br0,p7" \
232         "p5  11   1 br0,p7" \
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" \
240         "p6  11   0 drop" \
241         "p6  11   1 drop" \
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" \
249         "p7  11   0 br0,p5" \
250         "p7  11   1 br0,p5" \
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" \
258         "p8  11   0 drop" \
259         "p8  11   1 drop" \
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"
262 do
263   set $tuple
264   in_port=$1
265   vlan=$2
266   pcp=$3
267   expected=$4
268
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)"
272   else
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))"
274   fi
275
276   echo "----------------------------------------------------------------------"
277   echo "in_port=$in_port vlan=$vlan pcp=$pcp"
278
279   AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
280   actual=`tail -1 stdout | sed 's/Datapath actions: //'`
281
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])
283   mv stdout expout
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])
285 done
286
287 OVS_VSWITCHD_STOP
288 AT_CLEANUP
289
290 AT_SETUP([ofproto-dpif - fragment handling])
291 OVS_VSWITCHD_START
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
299 ])
300 AT_CHECK([ovs-ofctl replace-flows br0 flows.txt])
301
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)"
306
307     # mode    no  first  later
308 for tuple in \
309     'normal    1     5      6' \
310     'drop      1  drop   drop' \
311     'nx-match  1     2      6'
312 do
313   set $tuple
314   mode=$1
315   no=$2
316   first=$3
317   later=$4
318
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
324 ])
325   done
326 done
327 OVS_VSWITCHD_STOP
328 AT_CLEANUP
329
330 AT_SETUP([ofproto-dpif - exit])
331 OVS_VSWITCHD_START
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
336 ])
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
341 ])
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
345 ])
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
349 ])
350 OVS_VSWITCHD_STOP
351 AT_CLEANUP