datapath: Describe policy for extending flow key, implement needed changes.
[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 - set_tunnel])
66 OVS_VSWITCHD_START
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
74 ])
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
79 ])
80 OVS_VSWITCHD_STOP
81 AT_CLEANUP
82
83 AT_SETUP([ofproto-dpif - VLAN handling])
84 OVS_VSWITCHD_START(
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 --])
102
103 AT_CHECK(
104   [ovs-vsctl \
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],
113   [0], [stdout])
114 set `cat stdout`
115 br0=0 p1=$1 p2=$2 p3=$3 p4=$4 p5=$5 p6=$6 p7=$7 p8=$8
116
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
119 dnl actions.
120 dnl
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.
124 for tuple in \
125         "br0 none 0 drop" \
126         "br0 0    0 drop" \
127         "br0 0    1 drop" \
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" \
130         "br0 11   0 p5,p7" \
131         "br0 11   1 p5,p7" \
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" \
134         "p1  none 0 drop" \
135         "p1  0    0 drop" \
136         "p1  0    1 drop" \
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" \
139         "p1  11   0 drop" \
140         "p1  11   1 drop" \
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" \
146         "p2  10   0 drop" \
147         "p2  10   1 drop" \
148         "p2  11   0 drop" \
149         "p2  11   1 drop" \
150         "p2  12   0 drop" \
151         "p2  12   1 drop" \
152         "p3  none 0 p4,p7,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
153         "p3  0    0 p4,p7,p8,pop_vlan,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" \
155         "p3  10   0 drop" \
156         "p3  10   1 drop" \
157         "p3  11   0 drop" \
158         "p3  11   1 drop" \
159         "p3  12   0 drop" \
160         "p3  12   1 drop" \
161         "p4  none 0 p3,p7,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
162         "p4  0    0 p3,p7,p8,pop_vlan,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" \
164         "p4  10   0 drop" \
165         "p4  10   1 drop" \
166         "p4  11   0 drop" \
167         "p4  11   1 drop" \
168         "p4  12   0 drop" \
169         "p4  12   1 drop" \
170         "p5  none 0 p2,push_vlan(vid=10,pcp=0),br0,p1,p6,p7,p8" \
171         "p5  0    0 p2,pop_vlan,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" \
175         "p5  11   0 br0,p7" \
176         "p5  11   1 br0,p7" \
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 p2,pop_vlan,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" \
184         "p6  11   0 drop" \
185         "p6  11   1 drop" \
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 p3,p4,p8,pop_vlan,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" \
193         "p7  11   0 br0,p5" \
194         "p7  11   1 br0,p5" \
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 p3,p4,p7,pop_vlan,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" \
202         "p8  11   0 drop" \
203         "p8  11   1 drop" \
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"
206 do
207   set $tuple
208   in_port=$1
209   vlan=$2
210   pcp=$3
211   expected=$4
212
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)"
216   else
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))"
218   fi
219
220   AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
221   actual=`tail -1 stdout | sed 's/Datapath actions: //'`
222
223   AT_CHECK([echo "in_port=$in_port vlan=$vlan"
224             $PERL $srcdir/compare-odp-actions.pl "$expected" "$actual" br0=$br0 p1=$p1 p2=$p2 p3=$p3 p4=$p4 p5=$p5 p6=$p6 p7=$p7 p8=$p8], [0], [ignore])
225 done
226
227 OVS_VSWITCHD_STOP
228 AT_CLEANUP
229
230 AT_SETUP([ofproto-dpif - fragment handling])
231 OVS_VSWITCHD_START
232 AT_DATA([flows.txt], [dnl
233 priority=75 tcp ip_frag=no    tp_dst=80 actions=output:1
234 priority=75 tcp ip_frag=first tp_dst=80 actions=output:2
235 priority=75 tcp ip_frag=later tp_dst=80 actions=output:3
236 priority=50 tcp ip_frag=no              actions=output:4
237 priority=50 tcp ip_frag=first           actions=output:5
238 priority=50 tcp ip_frag=later           actions=output:6
239 ])
240 AT_CHECK([ovs-ofctl replace-flows br0 flows.txt])
241
242 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"
243 no_flow="$base_flow,frag=no),tcp(src=12345,dst=80)"
244 first_flow="$base_flow,frag=first),tcp(src=12345,dst=80)"
245 later_flow="$base_flow,frag=later)"
246
247     # mode    no  first  later
248 for tuple in \
249     'normal    1     5      6' \
250     'drop      1  drop   drop' \
251     'nx-match  1     2      6'
252 do
253   set $tuple
254   mode=$1
255   no=$2
256   first=$3
257   later=$4
258
259   AT_CHECK([ovs-ofctl set-frags br0 $mode])
260   for type in no first later; do
261     eval flow=\$${type}_flow exp_output=\$$type
262     AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
263     AT_CHECK_UNQUOTED([tail -1 stdout], [0], [Datapath actions: $exp_output
264 ])
265   done
266 done
267 OVS_VSWITCHD_STOP
268 AT_CLEANUP
269
270 AT_SETUP([ofproto-dpif - exit])
271 OVS_VSWITCHD_START
272 AT_DATA([flows.txt], [dnl
273 in_port=1 actions=output:10,exit,output:11
274 in_port=2 actions=output:12,resubmit:1,output:12
275 in_port=3 actions=output:13,resubmit:2,output:14
276 ])
277 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
278 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])
279 AT_CHECK([tail -1 stdout], [0],
280   [Datapath actions: 10
281 ])
282 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])
283 AT_CHECK([tail -1 stdout], [0],
284   [Datapath actions: 12,10
285 ])
286 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])
287 AT_CHECK([tail -1 stdout], [0],
288   [Datapath actions: 13,12,10
289 ])
290 OVS_VSWITCHD_STOP
291 AT_CLEANUP