]> Git Repo - J-linux.git/blob - tools/testing/selftests/net/forwarding/tc_flower.sh
Merge tag 'vfs-6.13-rc7.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
[J-linux.git] / tools / testing / selftests / net / forwarding / tc_flower.sh
1 #!/bin/bash
2 # SPDX-License-Identifier: GPL-2.0
3
4 ALL_TESTS="match_dst_mac_test match_src_mac_test match_dst_ip_test \
5         match_src_ip_test match_ip_flags_test match_pcp_test match_vlan_test \
6         match_ip_tos_test match_indev_test match_ip_ttl_test
7         match_mpls_label_test \
8         match_mpls_tc_test match_mpls_bos_test match_mpls_ttl_test \
9         match_mpls_lse_test"
10 NUM_NETIFS=2
11 source tc_common.sh
12 source lib.sh
13
14 tcflags="skip_hw"
15
16 h1_create()
17 {
18         simple_if_init $h1 192.0.2.1/24 198.51.100.1/24
19 }
20
21 h1_destroy()
22 {
23         simple_if_fini $h1 192.0.2.1/24 198.51.100.1/24
24 }
25
26 h2_create()
27 {
28         simple_if_init $h2 192.0.2.2/24 198.51.100.2/24
29         tc qdisc add dev $h2 clsact
30 }
31
32 h2_destroy()
33 {
34         tc qdisc del dev $h2 clsact
35         simple_if_fini $h2 192.0.2.2/24 198.51.100.2/24
36 }
37
38 match_dst_mac_test()
39 {
40         local dummy_mac=de:ad:be:ef:aa:aa
41
42         RET=0
43
44         tc filter add dev $h2 ingress protocol ip pref 1 handle 101 flower \
45                 $tcflags dst_mac $dummy_mac action drop
46         tc filter add dev $h2 ingress protocol ip pref 2 handle 102 flower \
47                 $tcflags dst_mac $h2mac action drop
48
49         $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac -A 192.0.2.1 -B 192.0.2.2 \
50                 -t ip -q
51
52         tc_check_packets "dev $h2 ingress" 101 1
53         check_fail $? "Matched on a wrong filter"
54
55         tc_check_packets "dev $h2 ingress" 102 0
56         check_fail $? "Did not match on correct filter"
57
58         tc filter del dev $h2 ingress protocol ip pref 1 handle 101 flower
59         tc filter del dev $h2 ingress protocol ip pref 2 handle 102 flower
60
61         log_test "dst_mac match ($tcflags)"
62 }
63
64 match_src_mac_test()
65 {
66         local dummy_mac=de:ad:be:ef:aa:aa
67
68         RET=0
69
70         tc filter add dev $h2 ingress protocol ip pref 1 handle 101 flower \
71                 $tcflags src_mac $dummy_mac action drop
72         tc filter add dev $h2 ingress protocol ip pref 2 handle 102 flower \
73                 $tcflags src_mac $h1mac action drop
74
75         $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac -A 192.0.2.1 -B 192.0.2.2 \
76                 -t ip -q
77
78         tc_check_packets "dev $h2 ingress" 101 1
79         check_fail $? "Matched on a wrong filter"
80
81         tc_check_packets "dev $h2 ingress" 102 0
82         check_fail $? "Did not match on correct filter"
83
84         tc filter del dev $h2 ingress protocol ip pref 1 handle 101 flower
85         tc filter del dev $h2 ingress protocol ip pref 2 handle 102 flower
86
87         log_test "src_mac match ($tcflags)"
88 }
89
90 match_dst_ip_test()
91 {
92         RET=0
93
94         tc filter add dev $h2 ingress protocol ip pref 1 handle 101 flower \
95                 $tcflags dst_ip 198.51.100.2 action drop
96         tc filter add dev $h2 ingress protocol ip pref 2 handle 102 flower \
97                 $tcflags dst_ip 192.0.2.2 action drop
98         tc filter add dev $h2 ingress protocol ip pref 3 handle 103 flower \
99                 $tcflags dst_ip 192.0.2.0/24 action drop
100
101         $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac -A 192.0.2.1 -B 192.0.2.2 \
102                 -t ip -q
103
104         tc_check_packets "dev $h2 ingress" 101 1
105         check_fail $? "Matched on a wrong filter"
106
107         tc_check_packets "dev $h2 ingress" 102 1
108         check_err $? "Did not match on correct filter"
109
110         tc filter del dev $h2 ingress protocol ip pref 2 handle 102 flower
111
112         $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac -A 192.0.2.1 -B 192.0.2.2 \
113                 -t ip -q
114
115         tc_check_packets "dev $h2 ingress" 103 1
116         check_err $? "Did not match on correct filter with mask"
117
118         tc filter del dev $h2 ingress protocol ip pref 1 handle 101 flower
119         tc filter del dev $h2 ingress protocol ip pref 3 handle 103 flower
120
121         log_test "dst_ip match ($tcflags)"
122 }
123
124 match_src_ip_test()
125 {
126         RET=0
127
128         tc filter add dev $h2 ingress protocol ip pref 1 handle 101 flower \
129                 $tcflags src_ip 198.51.100.1 action drop
130         tc filter add dev $h2 ingress protocol ip pref 2 handle 102 flower \
131                 $tcflags src_ip 192.0.2.1 action drop
132         tc filter add dev $h2 ingress protocol ip pref 3 handle 103 flower \
133                 $tcflags src_ip 192.0.2.0/24 action drop
134
135         $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac -A 192.0.2.1 -B 192.0.2.2 \
136                 -t ip -q
137
138         tc_check_packets "dev $h2 ingress" 101 1
139         check_fail $? "Matched on a wrong filter"
140
141         tc_check_packets "dev $h2 ingress" 102 1
142         check_err $? "Did not match on correct filter"
143
144         tc filter del dev $h2 ingress protocol ip pref 2 handle 102 flower
145
146         $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac -A 192.0.2.1 -B 192.0.2.2 \
147                 -t ip -q
148
149         tc_check_packets "dev $h2 ingress" 103 1
150         check_err $? "Did not match on correct filter with mask"
151
152         tc filter del dev $h2 ingress protocol ip pref 1 handle 101 flower
153         tc filter del dev $h2 ingress protocol ip pref 3 handle 103 flower
154
155         log_test "src_ip match ($tcflags)"
156 }
157
158 match_ip_flags_test()
159 {
160         RET=0
161
162         tc filter add dev $h2 ingress protocol ip pref 1 handle 101 flower \
163                 $tcflags ip_flags frag action continue
164         tc filter add dev $h2 ingress protocol ip pref 2 handle 102 flower \
165                 $tcflags ip_flags firstfrag action continue
166         tc filter add dev $h2 ingress protocol ip pref 3 handle 103 flower \
167                 $tcflags ip_flags nofirstfrag action continue
168         tc filter add dev $h2 ingress protocol ip pref 4 handle 104 flower \
169                 $tcflags ip_flags nofrag action drop
170
171         $MZ $h1 -c 1 -p 1000 -a $h1mac -b $h2mac -A 192.0.2.1 -B 192.0.2.2 \
172                 -t ip "frag=0" -q
173
174         tc_check_packets "dev $h2 ingress" 101 1
175         check_fail $? "Matched on wrong frag filter (nofrag)"
176
177         tc_check_packets "dev $h2 ingress" 102 1
178         check_fail $? "Matched on wrong firstfrag filter (nofrag)"
179
180         tc_check_packets "dev $h2 ingress" 103 1
181         check_err $? "Did not match on nofirstfrag filter (nofrag) "
182
183         tc_check_packets "dev $h2 ingress" 104 1
184         check_err $? "Did not match on nofrag filter (nofrag)"
185
186         $MZ $h1 -c 1 -p 1000 -a $h1mac -b $h2mac -A 192.0.2.1 -B 192.0.2.2 \
187                 -t ip "frag=0,mf" -q
188
189         tc_check_packets "dev $h2 ingress" 101 1
190         check_err $? "Did not match on frag filter (1stfrag)"
191
192         tc_check_packets "dev $h2 ingress" 102 1
193         check_err $? "Did not match fistfrag filter (1stfrag)"
194
195         tc_check_packets "dev $h2 ingress" 103 1
196         check_err $? "Matched on wrong nofirstfrag filter (1stfrag)"
197
198         tc_check_packets "dev $h2 ingress" 104 1
199         check_err $? "Match on wrong nofrag filter (1stfrag)"
200
201         $MZ $h1 -c 1 -p 1000 -a $h1mac -b $h2mac -A 192.0.2.1 -B 192.0.2.2 \
202                 -t ip "frag=256,mf" -q
203         $MZ $h1 -c 1 -p 1000 -a $h1mac -b $h2mac -A 192.0.2.1 -B 192.0.2.2 \
204                 -t ip "frag=256" -q
205
206         tc_check_packets "dev $h2 ingress" 101 3
207         check_err $? "Did not match on frag filter (no1stfrag)"
208
209         tc_check_packets "dev $h2 ingress" 102 1
210         check_err $? "Matched on wrong firstfrag filter (no1stfrag)"
211
212         tc_check_packets "dev $h2 ingress" 103 3
213         check_err $? "Did not match on nofirstfrag filter (no1stfrag)"
214
215         tc_check_packets "dev $h2 ingress" 104 1
216         check_err $? "Matched on nofrag filter (no1stfrag)"
217
218         tc filter del dev $h2 ingress protocol ip pref 1 handle 101 flower
219         tc filter del dev $h2 ingress protocol ip pref 2 handle 102 flower
220         tc filter del dev $h2 ingress protocol ip pref 3 handle 103 flower
221         tc filter del dev $h2 ingress protocol ip pref 4 handle 104 flower
222
223         log_test "ip_flags match ($tcflags)"
224 }
225
226 match_pcp_test()
227 {
228         RET=0
229
230         vlan_create $h2 85 v$h2 192.0.2.11/24
231
232         tc filter add dev $h2 ingress protocol 802.1q pref 1 handle 101 \
233                 flower vlan_prio 6 $tcflags dst_mac $h2mac action drop
234         tc filter add dev $h2 ingress protocol 802.1q pref 2 handle 102 \
235                 flower vlan_prio 7 $tcflags dst_mac $h2mac action drop
236
237         $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac -B 192.0.2.11 -Q 7:85 -t ip -q
238         $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac -B 192.0.2.11 -Q 0:85 -t ip -q
239
240         tc_check_packets "dev $h2 ingress" 101 0
241         check_err $? "Matched on specified PCP when should not"
242
243         tc_check_packets "dev $h2 ingress" 102 1
244         check_err $? "Did not match on specified PCP"
245
246         tc filter del dev $h2 ingress protocol 802.1q pref 2 handle 102 flower
247         tc filter del dev $h2 ingress protocol 802.1q pref 1 handle 101 flower
248
249         vlan_destroy $h2 85
250
251         log_test "PCP match ($tcflags)"
252 }
253
254 match_vlan_test()
255 {
256         RET=0
257
258         vlan_create $h2 85 v$h2 192.0.2.11/24
259         vlan_create $h2 75 v$h2 192.0.2.10/24
260
261         tc filter add dev $h2 ingress protocol 802.1q pref 1 handle 101 \
262                 flower vlan_id 75 $tcflags action drop
263         tc filter add dev $h2 ingress protocol 802.1q pref 2 handle 102 \
264                 flower vlan_id 85 $tcflags action drop
265
266         $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac -B 192.0.2.11 -Q 0:85 -t ip -q
267
268         tc_check_packets "dev $h2 ingress" 101 0
269         check_err $? "Matched on specified VLAN when should not"
270
271         tc_check_packets "dev $h2 ingress" 102 1
272         check_err $? "Did not match on specified VLAN"
273
274         tc filter del dev $h2 ingress protocol 802.1q pref 2 handle 102 flower
275         tc filter del dev $h2 ingress protocol 802.1q pref 1 handle 101 flower
276
277         vlan_destroy $h2 75
278         vlan_destroy $h2 85
279
280         log_test "VLAN match ($tcflags)"
281 }
282
283 match_ip_tos_test()
284 {
285         RET=0
286
287         tc filter add dev $h2 ingress protocol ip pref 1 handle 101 flower \
288                 $tcflags dst_ip 192.0.2.2 ip_tos 0x20 action drop
289         tc filter add dev $h2 ingress protocol ip pref 2 handle 102 flower \
290                 $tcflags dst_ip 192.0.2.2 ip_tos 0x18 action drop
291
292         $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac -A 192.0.2.1 -B 192.0.2.2 \
293                 -t ip tos=18 -q
294
295         tc_check_packets "dev $h2 ingress" 101 1
296         check_fail $? "Matched on a wrong filter (0x18)"
297
298         tc_check_packets "dev $h2 ingress" 102 1
299         check_err $? "Did not match on correct filter (0x18)"
300
301         $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac -A 192.0.2.1 -B 192.0.2.2 \
302                 -t ip tos=20 -q
303
304         tc_check_packets "dev $h2 ingress" 102 2
305         check_fail $? "Matched on a wrong filter (0x20)"
306
307         tc_check_packets "dev $h2 ingress" 101 1
308         check_err $? "Did not match on correct filter (0x20)"
309
310         tc filter del dev $h2 ingress protocol ip pref 2 handle 102 flower
311         tc filter del dev $h2 ingress protocol ip pref 1 handle 101 flower
312
313         log_test "ip_tos match ($tcflags)"
314 }
315
316 match_ip_ttl_test()
317 {
318         RET=0
319
320         tc filter add dev $h2 ingress protocol ip pref 1 handle 101 flower \
321                 $tcflags dst_ip 192.0.2.2 ip_ttl 63 action drop
322         tc filter add dev $h2 ingress protocol ip pref 2 handle 102 flower \
323                 $tcflags dst_ip 192.0.2.2 action drop
324
325         $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac -A 192.0.2.1 -B 192.0.2.2 \
326                 -t ip "ttl=63" -q
327
328         $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac -A 192.0.2.1 -B 192.0.2.2 \
329                 -t ip "ttl=63,mf,frag=256" -q
330
331         tc_check_packets "dev $h2 ingress" 102 1
332         check_fail $? "Matched on the wrong filter (no check on ttl)"
333
334         tc_check_packets "dev $h2 ingress" 101 2
335         check_err $? "Did not match on correct filter (ttl=63)"
336
337         $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac -A 192.0.2.1 -B 192.0.2.2 \
338                 -t ip "ttl=255" -q
339
340         tc_check_packets "dev $h2 ingress" 101 3
341         check_fail $? "Matched on a wrong filter (ttl=63)"
342
343         tc_check_packets "dev $h2 ingress" 102 1
344         check_err $? "Did not match on correct filter (no check on ttl)"
345
346         tc filter del dev $h2 ingress protocol ip pref 2 handle 102 flower
347         tc filter del dev $h2 ingress protocol ip pref 1 handle 101 flower
348
349         log_test "ip_ttl match ($tcflags)"
350 }
351
352 match_indev_test()
353 {
354         RET=0
355
356         tc filter add dev $h2 ingress protocol ip pref 1 handle 101 flower \
357                 $tcflags indev $h1 dst_mac $h2mac action drop
358         tc filter add dev $h2 ingress protocol ip pref 2 handle 102 flower \
359                 $tcflags indev $h2 dst_mac $h2mac action drop
360
361         $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac -A 192.0.2.1 -B 192.0.2.2 \
362                 -t ip -q
363
364         tc_check_packets "dev $h2 ingress" 101 1
365         check_fail $? "Matched on a wrong filter"
366
367         tc_check_packets "dev $h2 ingress" 102 1
368         check_err $? "Did not match on correct filter"
369
370         tc filter del dev $h2 ingress protocol ip pref 2 handle 102 flower
371         tc filter del dev $h2 ingress protocol ip pref 1 handle 101 flower
372
373         log_test "indev match ($tcflags)"
374 }
375
376 # Unfortunately, mausezahn can't build MPLS headers when used in L2
377 # mode, so we have this function to build Label Stack Entries.
378 mpls_lse()
379 {
380         local label=$1
381         local tc=$2
382         local bos=$3
383         local ttl=$4
384
385         printf "%02x %02x %02x %02x"                        \
386                 $((label >> 12))                            \
387                 $((label >> 4 & 0xff))                      \
388                 $((((label & 0xf) << 4) + (tc << 1) + bos)) \
389                 $ttl
390 }
391
392 match_mpls_label_test()
393 {
394         local ethtype="88 47"; readonly ethtype
395         local pkt
396
397         RET=0
398
399         check_tc_mpls_support $h2 || return 0
400
401         tc filter add dev $h2 ingress protocol mpls_uc pref 1 handle 101 \
402                 flower $tcflags mpls_label 0 action drop
403         tc filter add dev $h2 ingress protocol mpls_uc pref 2 handle 102 \
404                 flower $tcflags mpls_label 1048575 action drop
405
406         pkt="$ethtype $(mpls_lse 1048575 0 1 255)"
407         $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
408
409         tc_check_packets "dev $h2 ingress" 101 1
410         check_fail $? "Matched on a wrong filter (1048575)"
411
412         tc_check_packets "dev $h2 ingress" 102 1
413         check_err $? "Did not match on correct filter (1048575)"
414
415         pkt="$ethtype $(mpls_lse 0 0 1 255)"
416         $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
417
418         tc_check_packets "dev $h2 ingress" 102 2
419         check_fail $? "Matched on a wrong filter (0)"
420
421         tc_check_packets "dev $h2 ingress" 101 1
422         check_err $? "Did not match on correct filter (0)"
423
424         tc filter del dev $h2 ingress protocol mpls_uc pref 2 handle 102 flower
425         tc filter del dev $h2 ingress protocol mpls_uc pref 1 handle 101 flower
426
427         log_test "mpls_label match ($tcflags)"
428 }
429
430 match_mpls_tc_test()
431 {
432         local ethtype="88 47"; readonly ethtype
433         local pkt
434
435         RET=0
436
437         check_tc_mpls_support $h2 || return 0
438
439         tc filter add dev $h2 ingress protocol mpls_uc pref 1 handle 101 \
440                 flower $tcflags mpls_tc 0 action drop
441         tc filter add dev $h2 ingress protocol mpls_uc pref 2 handle 102 \
442                 flower $tcflags mpls_tc 7 action drop
443
444         pkt="$ethtype $(mpls_lse 0 7 1 255)"
445         $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
446
447         tc_check_packets "dev $h2 ingress" 101 1
448         check_fail $? "Matched on a wrong filter (7)"
449
450         tc_check_packets "dev $h2 ingress" 102 1
451         check_err $? "Did not match on correct filter (7)"
452
453         pkt="$ethtype $(mpls_lse 0 0 1 255)"
454         $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
455
456         tc_check_packets "dev $h2 ingress" 102 2
457         check_fail $? "Matched on a wrong filter (0)"
458
459         tc_check_packets "dev $h2 ingress" 101 1
460         check_err $? "Did not match on correct filter (0)"
461
462         tc filter del dev $h2 ingress protocol mpls_uc pref 2 handle 102 flower
463         tc filter del dev $h2 ingress protocol mpls_uc pref 1 handle 101 flower
464
465         log_test "mpls_tc match ($tcflags)"
466 }
467
468 match_mpls_bos_test()
469 {
470         local ethtype="88 47"; readonly ethtype
471         local pkt
472
473         RET=0
474
475         check_tc_mpls_support $h2 || return 0
476
477         tc filter add dev $h2 ingress protocol mpls_uc pref 1 handle 101 \
478                 flower $tcflags mpls_bos 0 action drop
479         tc filter add dev $h2 ingress protocol mpls_uc pref 2 handle 102 \
480                 flower $tcflags mpls_bos 1 action drop
481
482         pkt="$ethtype $(mpls_lse 0 0 1 255)"
483         $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
484
485         tc_check_packets "dev $h2 ingress" 101 1
486         check_fail $? "Matched on a wrong filter (1)"
487
488         tc_check_packets "dev $h2 ingress" 102 1
489         check_err $? "Did not match on correct filter (1)"
490
491         # Need to add a second label to properly mark the Bottom of Stack
492         pkt="$ethtype $(mpls_lse 0 0 0 255) $(mpls_lse 0 0 1 255)"
493         $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
494
495         tc_check_packets "dev $h2 ingress" 102 2
496         check_fail $? "Matched on a wrong filter (0)"
497
498         tc_check_packets "dev $h2 ingress" 101 1
499         check_err $? "Did not match on correct filter (0)"
500
501         tc filter del dev $h2 ingress protocol mpls_uc pref 2 handle 102 flower
502         tc filter del dev $h2 ingress protocol mpls_uc pref 1 handle 101 flower
503
504         log_test "mpls_bos match ($tcflags)"
505 }
506
507 match_mpls_ttl_test()
508 {
509         local ethtype="88 47"; readonly ethtype
510         local pkt
511
512         RET=0
513
514         check_tc_mpls_support $h2 || return 0
515
516         tc filter add dev $h2 ingress protocol mpls_uc pref 1 handle 101 \
517                 flower $tcflags mpls_ttl 0 action drop
518         tc filter add dev $h2 ingress protocol mpls_uc pref 2 handle 102 \
519                 flower $tcflags mpls_ttl 255 action drop
520
521         pkt="$ethtype $(mpls_lse 0 0 1 255)"
522         $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
523
524         tc_check_packets "dev $h2 ingress" 101 1
525         check_fail $? "Matched on a wrong filter (255)"
526
527         tc_check_packets "dev $h2 ingress" 102 1
528         check_err $? "Did not match on correct filter (255)"
529
530         pkt="$ethtype $(mpls_lse 0 0 1 0)"
531         $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
532
533         tc_check_packets "dev $h2 ingress" 102 2
534         check_fail $? "Matched on a wrong filter (0)"
535
536         tc_check_packets "dev $h2 ingress" 101 1
537         check_err $? "Did not match on correct filter (0)"
538
539         tc filter del dev $h2 ingress protocol mpls_uc pref 2 handle 102 flower
540         tc filter del dev $h2 ingress protocol mpls_uc pref 1 handle 101 flower
541
542         log_test "mpls_ttl match ($tcflags)"
543 }
544
545 match_mpls_lse_test()
546 {
547         local ethtype="88 47"; readonly ethtype
548         local pkt
549
550         RET=0
551
552         check_tc_mpls_lse_stats $h2 || return 0
553
554         # Match on first LSE (minimal values for each field)
555         tc filter add dev $h2 ingress protocol mpls_uc pref 1 handle 101 \
556                 flower $tcflags mpls lse depth 1 label 0 action continue
557         tc filter add dev $h2 ingress protocol mpls_uc pref 2 handle 102 \
558                 flower $tcflags mpls lse depth 1 tc 0 action continue
559         tc filter add dev $h2 ingress protocol mpls_uc pref 3 handle 103 \
560                 flower $tcflags mpls lse depth 1 bos 0 action continue
561         tc filter add dev $h2 ingress protocol mpls_uc pref 4 handle 104 \
562                 flower $tcflags mpls lse depth 1 ttl 0 action continue
563
564         # Match on second LSE (maximal values for each field)
565         tc filter add dev $h2 ingress protocol mpls_uc pref 5 handle 105 \
566                 flower $tcflags mpls lse depth 2 label 1048575 action continue
567         tc filter add dev $h2 ingress protocol mpls_uc pref 6 handle 106 \
568                 flower $tcflags mpls lse depth 2 tc 7 action continue
569         tc filter add dev $h2 ingress protocol mpls_uc pref 7 handle 107 \
570                 flower $tcflags mpls lse depth 2 bos 1 action continue
571         tc filter add dev $h2 ingress protocol mpls_uc pref 8 handle 108 \
572                 flower $tcflags mpls lse depth 2 ttl 255 action continue
573
574         # Match on LSE depth
575         tc filter add dev $h2 ingress protocol mpls_uc pref 9 handle 109 \
576                 flower $tcflags mpls lse depth 1 action continue
577         tc filter add dev $h2 ingress protocol mpls_uc pref 10 handle 110 \
578                 flower $tcflags mpls lse depth 2 action continue
579         tc filter add dev $h2 ingress protocol mpls_uc pref 11 handle 111 \
580                 flower $tcflags mpls lse depth 3 action continue
581
582         # Base packet, matched by all filters (except for stack depth 3)
583         pkt="$ethtype $(mpls_lse 0 0 0 0) $(mpls_lse 1048575 7 1 255)"
584         $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
585
586         # Make a variant of the above packet, with a non-matching value
587         # for each LSE field
588
589         # Wrong label at depth 1
590         pkt="$ethtype $(mpls_lse 1 0 0 0) $(mpls_lse 1048575 7 1 255)"
591         $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
592
593         # Wrong TC at depth 1
594         pkt="$ethtype $(mpls_lse 0 1 0 0) $(mpls_lse 1048575 7 1 255)"
595         $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
596
597         # Wrong BOS at depth 1 (not adding a second LSE here since BOS is set
598         # in the first label, so anything that'd follow wouldn't be considered)
599         pkt="$ethtype $(mpls_lse 0 0 1 0)"
600         $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
601
602         # Wrong TTL at depth 1
603         pkt="$ethtype $(mpls_lse 0 0 0 1) $(mpls_lse 1048575 7 1 255)"
604         $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
605
606         # Wrong label at depth 2
607         pkt="$ethtype $(mpls_lse 0 0 0 0) $(mpls_lse 1048574 7 1 255)"
608         $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
609
610         # Wrong TC at depth 2
611         pkt="$ethtype $(mpls_lse 0 0 0 0) $(mpls_lse 1048575 6 1 255)"
612         $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
613
614         # Wrong BOS at depth 2 (adding a third LSE here since BOS isn't set in
615         # the second label)
616         pkt="$ethtype $(mpls_lse 0 0 0 0) $(mpls_lse 1048575 7 0 255)"
617         pkt="$pkt $(mpls_lse 0 0 1 255)"
618         $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
619
620         # Wrong TTL at depth 2
621         pkt="$ethtype $(mpls_lse 0 0 0 0) $(mpls_lse 1048575 7 1 254)"
622         $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
623
624         # Filters working at depth 1 should match all packets but one
625
626         tc_check_packets "dev $h2 ingress" 101 8
627         check_err $? "Did not match on correct filter"
628
629         tc_check_packets "dev $h2 ingress" 102 8
630         check_err $? "Did not match on correct filter"
631
632         tc_check_packets "dev $h2 ingress" 103 8
633         check_err $? "Did not match on correct filter"
634
635         tc_check_packets "dev $h2 ingress" 104 8
636         check_err $? "Did not match on correct filter"
637
638         # Filters working at depth 2 should match all packets but two (because
639         # of the test packet where the label stack depth is just one)
640
641         tc_check_packets "dev $h2 ingress" 105 7
642         check_err $? "Did not match on correct filter"
643
644         tc_check_packets "dev $h2 ingress" 106 7
645         check_err $? "Did not match on correct filter"
646
647         tc_check_packets "dev $h2 ingress" 107 7
648         check_err $? "Did not match on correct filter"
649
650         tc_check_packets "dev $h2 ingress" 108 7
651         check_err $? "Did not match on correct filter"
652
653         # Finally, verify the filters that only match on LSE depth
654
655         tc_check_packets "dev $h2 ingress" 109 9
656         check_err $? "Did not match on correct filter"
657
658         tc_check_packets "dev $h2 ingress" 110 8
659         check_err $? "Did not match on correct filter"
660
661         tc_check_packets "dev $h2 ingress" 111 1
662         check_err $? "Did not match on correct filter"
663
664         tc filter del dev $h2 ingress protocol mpls_uc pref 11 handle 111 flower
665         tc filter del dev $h2 ingress protocol mpls_uc pref 10 handle 110 flower
666         tc filter del dev $h2 ingress protocol mpls_uc pref 9 handle 109 flower
667         tc filter del dev $h2 ingress protocol mpls_uc pref 8 handle 108 flower
668         tc filter del dev $h2 ingress protocol mpls_uc pref 7 handle 107 flower
669         tc filter del dev $h2 ingress protocol mpls_uc pref 6 handle 106 flower
670         tc filter del dev $h2 ingress protocol mpls_uc pref 5 handle 105 flower
671         tc filter del dev $h2 ingress protocol mpls_uc pref 4 handle 104 flower
672         tc filter del dev $h2 ingress protocol mpls_uc pref 3 handle 103 flower
673         tc filter del dev $h2 ingress protocol mpls_uc pref 2 handle 102 flower
674         tc filter del dev $h2 ingress protocol mpls_uc pref 1 handle 101 flower
675
676         log_test "mpls lse match ($tcflags)"
677 }
678
679 setup_prepare()
680 {
681         h1=${NETIFS[p1]}
682         h2=${NETIFS[p2]}
683         h1mac=$(mac_get $h1)
684         h2mac=$(mac_get $h2)
685
686         vrf_prepare
687
688         h1_create
689         h2_create
690 }
691
692 cleanup()
693 {
694         pre_cleanup
695
696         h2_destroy
697         h1_destroy
698
699         vrf_cleanup
700 }
701
702 trap cleanup EXIT
703
704 setup_prepare
705 setup_wait
706
707 tests_run
708
709 tc_offload_check
710 if [[ $? -ne 0 ]]; then
711         log_info "Could not test offloaded functionality"
712 else
713         tcflags="skip_sw"
714         tests_run
715 fi
716
717 exit $EXIT_STATUS
This page took 0.067946 seconds and 4 git commands to generate.