Merge branch 'irq-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[sfrench/cifs-2.6.git] / tools / testing / selftests / drivers / net / mlxsw / vxlan.sh
1 #!/bin/bash
2 # SPDX-License-Identifier: GPL-2.0
3 #
4 # Test various aspects of VxLAN offloading which are specific to mlxsw, such
5 # as sanitization of invalid configurations and offload indication.
6
7 lib_dir=$(dirname $0)/../../../net/forwarding
8
9 ALL_TESTS="sanitization_test offload_indication_test \
10         sanitization_vlan_aware_test offload_indication_vlan_aware_test"
11 NUM_NETIFS=2
12 source $lib_dir/lib.sh
13
14 setup_prepare()
15 {
16         swp1=${NETIFS[p1]}
17         swp2=${NETIFS[p2]}
18
19         ip link set dev $swp1 up
20         ip link set dev $swp2 up
21 }
22
23 cleanup()
24 {
25         pre_cleanup
26
27         ip link set dev $swp2 down
28         ip link set dev $swp1 down
29 }
30
31 sanitization_single_dev_test_pass()
32 {
33         ip link set dev $swp1 master br0
34         check_err $?
35         ip link set dev vxlan0 master br0
36         check_err $?
37
38         ip link set dev $swp1 nomaster
39
40         ip link set dev $swp1 master br0
41         check_err $?
42 }
43
44 sanitization_single_dev_test_fail()
45 {
46         ip link set dev $swp1 master br0
47         check_err $?
48         ip link set dev vxlan0 master br0 &> /dev/null
49         check_fail $?
50
51         ip link set dev $swp1 nomaster
52
53         ip link set dev vxlan0 master br0
54         check_err $?
55         ip link set dev $swp1 master br0 &> /dev/null
56         check_fail $?
57 }
58
59 sanitization_single_dev_valid_test()
60 {
61         RET=0
62
63         ip link add dev br0 type bridge mcast_snooping 0
64
65         ip link add name vxlan0 up type vxlan id 10 nolearning noudpcsum \
66                 ttl 20 tos inherit local 198.51.100.1 dstport 4789
67
68         sanitization_single_dev_test_pass
69
70         ip link del dev vxlan0
71         ip link del dev br0
72
73         log_test "vxlan device - valid configuration"
74 }
75
76 sanitization_single_dev_vlan_aware_test()
77 {
78         RET=0
79
80         ip link add dev br0 type bridge mcast_snooping 0 vlan_filtering 1
81
82         ip link add name vxlan0 up type vxlan id 10 nolearning noudpcsum \
83                 ttl 20 tos inherit local 198.51.100.1 dstport 4789
84
85         sanitization_single_dev_test_pass
86
87         ip link del dev vxlan0
88         ip link del dev br0
89
90         log_test "vxlan device with a vlan-aware bridge"
91 }
92
93 sanitization_single_dev_mcast_enabled_test()
94 {
95         RET=0
96
97         ip link add dev br0 type bridge
98
99         ip link add name vxlan0 up type vxlan id 10 nolearning noudpcsum \
100                 ttl 20 tos inherit local 198.51.100.1 dstport 4789
101
102         sanitization_single_dev_test_fail
103
104         ip link del dev vxlan0
105         ip link del dev br0
106
107         log_test "vxlan device with a multicast enabled bridge"
108 }
109
110 sanitization_single_dev_mcast_group_test()
111 {
112         RET=0
113
114         ip link add dev br0 type bridge mcast_snooping 0
115
116         ip link add name vxlan0 up type vxlan id 10 nolearning noudpcsum \
117                 ttl 20 tos inherit local 198.51.100.1 dstport 4789 \
118                 dev $swp2 group 239.0.0.1
119
120         sanitization_single_dev_test_fail
121
122         ip link del dev vxlan0
123         ip link del dev br0
124
125         log_test "vxlan device with a multicast group"
126 }
127
128 sanitization_single_dev_no_local_ip_test()
129 {
130         RET=0
131
132         ip link add dev br0 type bridge mcast_snooping 0
133
134         ip link add name vxlan0 up type vxlan id 10 nolearning noudpcsum \
135                 ttl 20 tos inherit dstport 4789
136
137         sanitization_single_dev_test_fail
138
139         ip link del dev vxlan0
140         ip link del dev br0
141
142         log_test "vxlan device with no local ip"
143 }
144
145 sanitization_single_dev_local_ipv6_test()
146 {
147         RET=0
148
149         ip link add dev br0 type bridge mcast_snooping 0
150
151         ip link add name vxlan0 up type vxlan id 10 nolearning noudpcsum \
152                 ttl 20 tos inherit local 2001:db8::1 dstport 4789
153
154         sanitization_single_dev_test_fail
155
156         ip link del dev vxlan0
157         ip link del dev br0
158
159         log_test "vxlan device with local ipv6 address"
160 }
161
162 sanitization_single_dev_learning_enabled_test()
163 {
164         RET=0
165
166         ip link add dev br0 type bridge mcast_snooping 0
167
168         ip link add name vxlan0 up type vxlan id 10 learning noudpcsum \
169                 ttl 20 tos inherit local 198.51.100.1 dstport 4789
170
171         sanitization_single_dev_test_pass
172
173         ip link del dev vxlan0
174         ip link del dev br0
175
176         log_test "vxlan device with learning enabled"
177 }
178
179 sanitization_single_dev_local_interface_test()
180 {
181         RET=0
182
183         ip link add dev br0 type bridge mcast_snooping 0
184
185         ip link add name vxlan0 up type vxlan id 10 nolearning noudpcsum \
186                 ttl 20 tos inherit local 198.51.100.1 dstport 4789 dev $swp2
187
188         sanitization_single_dev_test_fail
189
190         ip link del dev vxlan0
191         ip link del dev br0
192
193         log_test "vxlan device with local interface"
194 }
195
196 sanitization_single_dev_port_range_test()
197 {
198         RET=0
199
200         ip link add dev br0 type bridge mcast_snooping 0
201
202         ip link add name vxlan0 up type vxlan id 10 nolearning noudpcsum \
203                 ttl 20 tos inherit local 198.51.100.1 dstport 4789 \
204                 srcport 4000 5000
205
206         sanitization_single_dev_test_fail
207
208         ip link del dev vxlan0
209         ip link del dev br0
210
211         log_test "vxlan device with udp source port range"
212 }
213
214 sanitization_single_dev_tos_static_test()
215 {
216         RET=0
217
218         ip link add dev br0 type bridge mcast_snooping 0
219
220         ip link add name vxlan0 up type vxlan id 10 nolearning noudpcsum \
221                 ttl 20 tos 20 local 198.51.100.1 dstport 4789
222
223         sanitization_single_dev_test_fail
224
225         ip link del dev vxlan0
226         ip link del dev br0
227
228         log_test "vxlan device with static tos"
229 }
230
231 sanitization_single_dev_ttl_inherit_test()
232 {
233         RET=0
234
235         ip link add dev br0 type bridge mcast_snooping 0
236
237         ip link add name vxlan0 up type vxlan id 10 nolearning noudpcsum \
238                 ttl inherit tos inherit local 198.51.100.1 dstport 4789
239
240         sanitization_single_dev_test_fail
241
242         ip link del dev vxlan0
243         ip link del dev br0
244
245         log_test "vxlan device with inherit ttl"
246 }
247
248 sanitization_single_dev_udp_checksum_test()
249 {
250         RET=0
251
252         ip link add dev br0 type bridge mcast_snooping 0
253
254         ip link add name vxlan0 up type vxlan id 10 nolearning udpcsum \
255                 ttl 20 tos inherit local 198.51.100.1 dstport 4789
256
257         sanitization_single_dev_test_fail
258
259         ip link del dev vxlan0
260         ip link del dev br0
261
262         log_test "vxlan device with udp checksum"
263 }
264
265 sanitization_single_dev_test()
266 {
267         # These tests make sure that we correctly sanitize VxLAN device
268         # configurations we do not support
269         sanitization_single_dev_valid_test
270         sanitization_single_dev_vlan_aware_test
271         sanitization_single_dev_mcast_enabled_test
272         sanitization_single_dev_mcast_group_test
273         sanitization_single_dev_no_local_ip_test
274         sanitization_single_dev_local_ipv6_test
275         sanitization_single_dev_learning_enabled_test
276         sanitization_single_dev_local_interface_test
277         sanitization_single_dev_port_range_test
278         sanitization_single_dev_tos_static_test
279         sanitization_single_dev_ttl_inherit_test
280         sanitization_single_dev_udp_checksum_test
281 }
282
283 sanitization_multi_devs_test_pass()
284 {
285         ip link set dev $swp1 master br0
286         check_err $?
287         ip link set dev vxlan0 master br0
288         check_err $?
289         ip link set dev $swp2 master br1
290         check_err $?
291         ip link set dev vxlan1 master br1
292         check_err $?
293
294         ip link set dev $swp2 nomaster
295         ip link set dev $swp1 nomaster
296
297         ip link set dev $swp1 master br0
298         check_err $?
299         ip link set dev $swp2 master br1
300         check_err $?
301 }
302
303 sanitization_multi_devs_test_fail()
304 {
305         ip link set dev $swp1 master br0
306         check_err $?
307         ip link set dev vxlan0 master br0
308         check_err $?
309         ip link set dev $swp2 master br1
310         check_err $?
311         ip link set dev vxlan1 master br1 &> /dev/null
312         check_fail $?
313
314         ip link set dev $swp2 nomaster
315         ip link set dev $swp1 nomaster
316
317         ip link set dev vxlan1 master br1
318         check_err $?
319         ip link set dev $swp1 master br0
320         check_err $?
321         ip link set dev $swp2 master br1 &> /dev/null
322         check_fail $?
323 }
324
325 sanitization_multi_devs_valid_test()
326 {
327         RET=0
328
329         ip link add dev br0 type bridge mcast_snooping 0
330         ip link add dev br1 type bridge mcast_snooping 0
331
332         ip link add name vxlan0 up type vxlan id 10 nolearning noudpcsum \
333                 ttl 20 tos inherit local 198.51.100.1 dstport 4789
334         ip link add name vxlan1 up type vxlan id 20 nolearning noudpcsum \
335                 ttl 20 tos inherit local 198.51.100.1 dstport 4789
336
337         sanitization_multi_devs_test_pass
338
339         ip link del dev vxlan1
340         ip link del dev vxlan0
341         ip link del dev br1
342         ip link del dev br0
343
344         log_test "multiple vxlan devices - valid configuration"
345 }
346
347 sanitization_multi_devs_ttl_test()
348 {
349         RET=0
350
351         ip link add dev br0 type bridge mcast_snooping 0
352         ip link add dev br1 type bridge mcast_snooping 0
353
354         ip link add name vxlan0 up type vxlan id 10 nolearning noudpcsum \
355                 ttl 20 tos inherit local 198.51.100.1 dstport 4789
356         ip link add name vxlan1 up type vxlan id 20 nolearning noudpcsum \
357                 ttl 40 tos inherit local 198.51.100.1 dstport 4789
358
359         sanitization_multi_devs_test_fail
360
361         ip link del dev vxlan1
362         ip link del dev vxlan0
363         ip link del dev br1
364         ip link del dev br0
365
366         log_test "multiple vxlan devices with different ttl"
367 }
368
369 sanitization_multi_devs_udp_dstport_test()
370 {
371         RET=0
372
373         ip link add dev br0 type bridge mcast_snooping 0
374         ip link add dev br1 type bridge mcast_snooping 0
375
376         ip link add name vxlan0 up type vxlan id 10 nolearning noudpcsum \
377                 ttl 20 tos inherit local 198.51.100.1 dstport 4789
378         ip link add name vxlan1 up type vxlan id 20 nolearning noudpcsum \
379                 ttl 20 tos inherit local 198.51.100.1 dstport 5789
380
381         sanitization_multi_devs_test_fail
382
383         ip link del dev vxlan1
384         ip link del dev vxlan0
385         ip link del dev br1
386         ip link del dev br0
387
388         log_test "multiple vxlan devices with different udp destination port"
389 }
390
391 sanitization_multi_devs_local_ip_test()
392 {
393         RET=0
394
395         ip link add dev br0 type bridge mcast_snooping 0
396         ip link add dev br1 type bridge mcast_snooping 0
397
398         ip link add name vxlan0 up type vxlan id 10 nolearning noudpcsum \
399                 ttl 20 tos inherit local 198.51.100.1 dstport 4789
400         ip link add name vxlan1 up type vxlan id 20 nolearning noudpcsum \
401                 ttl 20 tos inherit local 198.51.100.2 dstport 4789
402
403         sanitization_multi_devs_test_fail
404
405         ip link del dev vxlan1
406         ip link del dev vxlan0
407         ip link del dev br1
408         ip link del dev br0
409
410         log_test "multiple vxlan devices with different local ip"
411 }
412
413 sanitization_multi_devs_test()
414 {
415         # The device has a single VTEP, which means all the VxLAN devices
416         # we offload must share certain properties such as source IP and
417         # UDP destination port. These tests make sure that we forbid
418         # configurations that violate this limitation
419         sanitization_multi_devs_valid_test
420         sanitization_multi_devs_ttl_test
421         sanitization_multi_devs_udp_dstport_test
422         sanitization_multi_devs_local_ip_test
423 }
424
425 sanitization_test()
426 {
427         sanitization_single_dev_test
428         sanitization_multi_devs_test
429 }
430
431 offload_indication_setup_create()
432 {
433         # Create a simple setup with two bridges, each with a VxLAN device
434         # and one local port
435         ip link add name br0 up type bridge mcast_snooping 0
436         ip link add name br1 up type bridge mcast_snooping 0
437
438         ip link set dev $swp1 master br0
439         ip link set dev $swp2 master br1
440
441         ip address add 198.51.100.1/32 dev lo
442
443         ip link add name vxlan0 up master br0 type vxlan id 10 nolearning \
444                 noudpcsum ttl 20 tos inherit local 198.51.100.1 dstport 4789
445         ip link add name vxlan1 up master br1 type vxlan id 20 nolearning \
446                 noudpcsum ttl 20 tos inherit local 198.51.100.1 dstport 4789
447 }
448
449 offload_indication_setup_destroy()
450 {
451         ip link del dev vxlan1
452         ip link del dev vxlan0
453
454         ip address del 198.51.100.1/32 dev lo
455
456         ip link set dev $swp2 nomaster
457         ip link set dev $swp1 nomaster
458
459         ip link del dev br1
460         ip link del dev br0
461 }
462
463 offload_indication_fdb_flood_test()
464 {
465         RET=0
466
467         bridge fdb append 00:00:00:00:00:00 dev vxlan0 self dst 198.51.100.2
468
469         bridge fdb show brport vxlan0 | grep 00:00:00:00:00:00 \
470                 | grep -q offload
471         check_err $?
472
473         bridge fdb del 00:00:00:00:00:00 dev vxlan0 self
474
475         log_test "vxlan flood entry offload indication"
476 }
477
478 offload_indication_fdb_bridge_test()
479 {
480         RET=0
481
482         bridge fdb add de:ad:be:ef:13:37 dev vxlan0 self master static \
483                 dst 198.51.100.2
484
485         bridge fdb show brport vxlan0 | grep de:ad:be:ef:13:37 | grep self \
486                 | grep -q offload
487         check_err $?
488         bridge fdb show brport vxlan0 | grep de:ad:be:ef:13:37 | grep -v self \
489                 | grep -q offload
490         check_err $?
491
492         log_test "vxlan entry offload indication - initial state"
493
494         # Remove FDB entry from the bridge driver and check that corresponding
495         # entry in the VxLAN driver is not marked as offloaded
496         RET=0
497
498         bridge fdb del de:ad:be:ef:13:37 dev vxlan0 master
499         bridge fdb show brport vxlan0 | grep de:ad:be:ef:13:37 | grep self \
500                 | grep -q offload
501         check_fail $?
502
503         log_test "vxlan entry offload indication - after removal from bridge"
504
505         # Add the FDB entry back to the bridge driver and make sure it is
506         # marked as offloaded in both drivers
507         RET=0
508
509         bridge fdb add de:ad:be:ef:13:37 dev vxlan0 master static
510         bridge fdb show brport vxlan0 | grep de:ad:be:ef:13:37 | grep self \
511                 | grep -q offload
512         check_err $?
513         bridge fdb show brport vxlan0 | grep de:ad:be:ef:13:37 | grep -v self \
514                 | grep -q offload
515         check_err $?
516
517         log_test "vxlan entry offload indication - after re-add to bridge"
518
519         # Remove FDB entry from the VxLAN driver and check that corresponding
520         # entry in the bridge driver is not marked as offloaded
521         RET=0
522
523         bridge fdb del de:ad:be:ef:13:37 dev vxlan0 self
524         bridge fdb show brport vxlan0 | grep de:ad:be:ef:13:37 | grep -v self \
525                 | grep -q offload
526         check_fail $?
527
528         log_test "vxlan entry offload indication - after removal from vxlan"
529
530         # Add the FDB entry back to the VxLAN driver and make sure it is
531         # marked as offloaded in both drivers
532         RET=0
533
534         bridge fdb add de:ad:be:ef:13:37 dev vxlan0 self dst 198.51.100.2
535         bridge fdb show brport vxlan0 | grep de:ad:be:ef:13:37 | grep self \
536                 | grep -q offload
537         check_err $?
538         bridge fdb show brport vxlan0 | grep de:ad:be:ef:13:37 | grep -v self \
539                 | grep -q offload
540         check_err $?
541
542         log_test "vxlan entry offload indication - after re-add to vxlan"
543
544         bridge fdb del de:ad:be:ef:13:37 dev vxlan0 self master
545 }
546
547 offload_indication_fdb_test()
548 {
549         offload_indication_fdb_flood_test
550         offload_indication_fdb_bridge_test
551 }
552
553 offload_indication_decap_route_test()
554 {
555         RET=0
556
557         ip route show table local | grep 198.51.100.1 | grep -q offload
558         check_err $?
559
560         ip link set dev vxlan0 down
561         ip route show table local | grep 198.51.100.1 | grep -q offload
562         check_err $?
563
564         ip link set dev vxlan1 down
565         ip route show table local | grep 198.51.100.1 | grep -q offload
566         check_fail $?
567
568         log_test "vxlan decap route - vxlan device down"
569
570         RET=0
571
572         ip link set dev vxlan1 up
573         ip route show table local | grep 198.51.100.1 | grep -q offload
574         check_err $?
575
576         ip link set dev vxlan0 up
577         ip route show table local | grep 198.51.100.1 | grep -q offload
578         check_err $?
579
580         log_test "vxlan decap route - vxlan device up"
581
582         RET=0
583
584         ip address delete 198.51.100.1/32 dev lo
585         ip route show table local | grep 198.51.100.1 | grep -q offload
586         check_fail $?
587
588         ip address add 198.51.100.1/32 dev lo
589         ip route show table local | grep 198.51.100.1 | grep -q offload
590         check_err $?
591
592         log_test "vxlan decap route - add local route"
593
594         RET=0
595
596         ip link set dev $swp1 nomaster
597         ip route show table local | grep 198.51.100.1 | grep -q offload
598         check_err $?
599
600         ip link set dev $swp2 nomaster
601         ip route show table local | grep 198.51.100.1 | grep -q offload
602         check_fail $?
603
604         ip link set dev $swp1 master br0
605         ip link set dev $swp2 master br1
606         ip route show table local | grep 198.51.100.1 | grep -q offload
607         check_err $?
608
609         log_test "vxlan decap route - local ports enslavement"
610
611         RET=0
612
613         ip link del dev br0
614         ip route show table local | grep 198.51.100.1 | grep -q offload
615         check_err $?
616
617         ip link del dev br1
618         ip route show table local | grep 198.51.100.1 | grep -q offload
619         check_fail $?
620
621         log_test "vxlan decap route - bridge device deletion"
622
623         RET=0
624
625         ip link add name br0 up type bridge mcast_snooping 0
626         ip link add name br1 up type bridge mcast_snooping 0
627         ip link set dev $swp1 master br0
628         ip link set dev $swp2 master br1
629         ip link set dev vxlan0 master br0
630         ip link set dev vxlan1 master br1
631         ip route show table local | grep 198.51.100.1 | grep -q offload
632         check_err $?
633
634         ip link del dev vxlan0
635         ip route show table local | grep 198.51.100.1 | grep -q offload
636         check_err $?
637
638         ip link del dev vxlan1
639         ip route show table local | grep 198.51.100.1 | grep -q offload
640         check_fail $?
641
642         log_test "vxlan decap route - vxlan device deletion"
643
644         ip link add name vxlan0 up master br0 type vxlan id 10 nolearning \
645                 noudpcsum ttl 20 tos inherit local 198.51.100.1 dstport 4789
646         ip link add name vxlan1 up master br1 type vxlan id 20 nolearning \
647                 noudpcsum ttl 20 tos inherit local 198.51.100.1 dstport 4789
648 }
649
650 check_fdb_offloaded()
651 {
652         local mac=00:11:22:33:44:55
653         local zmac=00:00:00:00:00:00
654
655         bridge fdb show dev vxlan0 | grep $mac | grep self | grep -q offload
656         check_err $?
657         bridge fdb show dev vxlan0 | grep $mac | grep master | grep -q offload
658         check_err $?
659
660         bridge fdb show dev vxlan0 | grep $zmac | grep self | grep -q offload
661         check_err $?
662 }
663
664 check_vxlan_fdb_not_offloaded()
665 {
666         local mac=00:11:22:33:44:55
667         local zmac=00:00:00:00:00:00
668
669         bridge fdb show dev vxlan0 | grep $mac | grep -q self
670         check_err $?
671         bridge fdb show dev vxlan0 | grep $mac | grep self | grep -q offload
672         check_fail $?
673
674         bridge fdb show dev vxlan0 | grep $zmac | grep -q self
675         check_err $?
676         bridge fdb show dev vxlan0 | grep $zmac | grep self | grep -q offload
677         check_fail $?
678 }
679
680 check_bridge_fdb_not_offloaded()
681 {
682         local mac=00:11:22:33:44:55
683         local zmac=00:00:00:00:00:00
684
685         bridge fdb show dev vxlan0 | grep $mac | grep -q master
686         check_err $?
687         bridge fdb show dev vxlan0 | grep $mac | grep master | grep -q offload
688         check_fail $?
689 }
690
691 __offload_indication_join_vxlan_first()
692 {
693         local vid=$1; shift
694
695         local mac=00:11:22:33:44:55
696         local zmac=00:00:00:00:00:00
697
698         bridge fdb append $zmac dev vxlan0 self dst 198.51.100.2
699
700         ip link set dev vxlan0 master br0
701         bridge fdb add dev vxlan0 $mac self master static dst 198.51.100.2
702
703         RET=0
704         check_vxlan_fdb_not_offloaded
705         ip link set dev $swp1 master br0
706         sleep .1
707         check_fdb_offloaded
708         log_test "offload indication - attach vxlan first"
709
710         RET=0
711         ip link set dev vxlan0 down
712         check_vxlan_fdb_not_offloaded
713         check_bridge_fdb_not_offloaded
714         log_test "offload indication - set vxlan down"
715
716         RET=0
717         ip link set dev vxlan0 up
718         sleep .1
719         check_fdb_offloaded
720         log_test "offload indication - set vxlan up"
721
722         if [[ ! -z $vid ]]; then
723                 RET=0
724                 bridge vlan del dev vxlan0 vid $vid
725                 check_vxlan_fdb_not_offloaded
726                 check_bridge_fdb_not_offloaded
727                 log_test "offload indication - delete VLAN"
728
729                 RET=0
730                 bridge vlan add dev vxlan0 vid $vid
731                 check_vxlan_fdb_not_offloaded
732                 check_bridge_fdb_not_offloaded
733                 log_test "offload indication - add tagged VLAN"
734
735                 RET=0
736                 bridge vlan add dev vxlan0 vid $vid pvid untagged
737                 sleep .1
738                 check_fdb_offloaded
739                 log_test "offload indication - add pvid/untagged VLAN"
740         fi
741
742         RET=0
743         ip link set dev $swp1 nomaster
744         check_vxlan_fdb_not_offloaded
745         log_test "offload indication - detach port"
746 }
747
748 offload_indication_join_vxlan_first()
749 {
750         ip link add dev br0 up type bridge mcast_snooping 0
751         ip link add name vxlan0 up type vxlan id 10 nolearning noudpcsum \
752                 ttl 20 tos inherit local 198.51.100.1 dstport 4789
753
754         __offload_indication_join_vxlan_first
755
756         ip link del dev vxlan0
757         ip link del dev br0
758 }
759
760 __offload_indication_join_vxlan_last()
761 {
762         local zmac=00:00:00:00:00:00
763
764         RET=0
765
766         bridge fdb append $zmac dev vxlan0 self dst 198.51.100.2
767
768         ip link set dev $swp1 master br0
769
770         bridge fdb show dev vxlan0 | grep $zmac | grep self | grep -q offload
771         check_fail $?
772
773         ip link set dev vxlan0 master br0
774
775         bridge fdb show dev vxlan0 | grep $zmac | grep self | grep -q offload
776         check_err $?
777
778         log_test "offload indication - attach vxlan last"
779 }
780
781 offload_indication_join_vxlan_last()
782 {
783         ip link add dev br0 up type bridge mcast_snooping 0
784         ip link add name vxlan0 up type vxlan id 10 nolearning noudpcsum \
785                 ttl 20 tos inherit local 198.51.100.1 dstport 4789
786
787         __offload_indication_join_vxlan_last
788
789         ip link del dev vxlan0
790         ip link del dev br0
791 }
792
793 offload_indication_test()
794 {
795         offload_indication_setup_create
796         offload_indication_fdb_test
797         offload_indication_decap_route_test
798         offload_indication_setup_destroy
799
800         log_info "offload indication - replay & cleanup"
801         offload_indication_join_vxlan_first
802         offload_indication_join_vxlan_last
803 }
804
805 sanitization_vlan_aware_test()
806 {
807         RET=0
808
809         ip link add dev br0 type bridge mcast_snooping 0 vlan_filtering 1
810
811         ip link add name vxlan10 up master br0 type vxlan id 10 nolearning \
812                 noudpcsum ttl 20 tos inherit local 198.51.100.1 dstport 4789
813
814         ip link add name vxlan20 up master br0 type vxlan id 20 nolearning \
815                 noudpcsum ttl 20 tos inherit local 198.51.100.1 dstport 4789
816
817         # Test that when each VNI is mapped to a different VLAN we can enslave
818         # a port to the bridge
819         bridge vlan add vid 10 dev vxlan10 pvid untagged
820         bridge vlan add vid 20 dev vxlan20 pvid untagged
821
822         ip link set dev $swp1 master br0
823         check_err $?
824
825         log_test "vlan-aware - enslavement to vlan-aware bridge"
826
827         # Try to map both VNIs to the same VLAN and make sure configuration
828         # fails
829         RET=0
830
831         bridge vlan add vid 10 dev vxlan20 pvid untagged &> /dev/null
832         check_fail $?
833
834         log_test "vlan-aware - two vnis mapped to the same vlan"
835
836         # Test that enslavement of a port to a bridge fails when two VNIs
837         # are mapped to the same VLAN
838         RET=0
839
840         ip link set dev $swp1 nomaster
841
842         bridge vlan del vid 20 dev vxlan20 pvid untagged
843         bridge vlan add vid 10 dev vxlan20 pvid untagged
844
845         ip link set dev $swp1 master br0 &> /dev/null
846         check_fail $?
847
848         log_test "vlan-aware - failed enslavement to vlan-aware bridge"
849
850         bridge vlan del vid 10 dev vxlan20
851         bridge vlan add vid 20 dev vxlan20 pvid untagged
852
853         # Test that offloading of an unsupported tunnel fails when it is
854         # triggered by addition of VLAN to a local port
855         RET=0
856
857         # TOS must be set to inherit
858         ip link set dev vxlan10 type vxlan tos 42
859
860         ip link set dev $swp1 master br0
861         bridge vlan add vid 10 dev $swp1 &> /dev/null
862         check_fail $?
863
864         log_test "vlan-aware - failed vlan addition to a local port"
865
866         ip link set dev vxlan10 type vxlan tos inherit
867
868         ip link del dev vxlan20
869         ip link del dev vxlan10
870         ip link del dev br0
871 }
872
873 offload_indication_vlan_aware_setup_create()
874 {
875         # Create a simple setup with two VxLAN devices and a single VLAN-aware
876         # bridge
877         ip link add name br0 up type bridge mcast_snooping 0 vlan_filtering 1 \
878                 vlan_default_pvid 0
879
880         ip link set dev $swp1 master br0
881
882         bridge vlan add vid 10 dev $swp1
883         bridge vlan add vid 20 dev $swp1
884
885         ip address add 198.51.100.1/32 dev lo
886
887         ip link add name vxlan10 up master br0 type vxlan id 10 nolearning \
888                 noudpcsum ttl 20 tos inherit local 198.51.100.1 dstport 4789
889         ip link add name vxlan20 up master br0 type vxlan id 20 nolearning \
890                 noudpcsum ttl 20 tos inherit local 198.51.100.1 dstport 4789
891
892         bridge vlan add vid 10 dev vxlan10 pvid untagged
893         bridge vlan add vid 20 dev vxlan20 pvid untagged
894 }
895
896 offload_indication_vlan_aware_setup_destroy()
897 {
898         bridge vlan del vid 20 dev vxlan20
899         bridge vlan del vid 10 dev vxlan10
900
901         ip link del dev vxlan20
902         ip link del dev vxlan10
903
904         ip address del 198.51.100.1/32 dev lo
905
906         bridge vlan del vid 20 dev $swp1
907         bridge vlan del vid 10 dev $swp1
908
909         ip link set dev $swp1 nomaster
910
911         ip link del dev br0
912 }
913
914 offload_indication_vlan_aware_fdb_test()
915 {
916         RET=0
917
918         log_info "vxlan entry offload indication - vlan-aware"
919
920         bridge fdb add de:ad:be:ef:13:37 dev vxlan10 self master static \
921                 dst 198.51.100.2 vlan 10
922
923         bridge fdb show brport vxlan10 | grep de:ad:be:ef:13:37 | grep self \
924                 | grep -q offload
925         check_err $?
926         bridge fdb show brport vxlan10 | grep de:ad:be:ef:13:37 | grep -v self \
927                 | grep -q offload
928         check_err $?
929
930         log_test "vxlan entry offload indication - initial state"
931
932         # Remove FDB entry from the bridge driver and check that corresponding
933         # entry in the VxLAN driver is not marked as offloaded
934         RET=0
935
936         bridge fdb del de:ad:be:ef:13:37 dev vxlan10 master vlan 10
937         bridge fdb show brport vxlan10 | grep de:ad:be:ef:13:37 | grep self \
938                 | grep -q offload
939         check_fail $?
940
941         log_test "vxlan entry offload indication - after removal from bridge"
942
943         # Add the FDB entry back to the bridge driver and make sure it is
944         # marked as offloaded in both drivers
945         RET=0
946
947         bridge fdb add de:ad:be:ef:13:37 dev vxlan10 master static vlan 10
948         bridge fdb show brport vxlan10 | grep de:ad:be:ef:13:37 | grep self \
949                 | grep -q offload
950         check_err $?
951         bridge fdb show brport vxlan10 | grep de:ad:be:ef:13:37 | grep -v self \
952                 | grep -q offload
953         check_err $?
954
955         log_test "vxlan entry offload indication - after re-add to bridge"
956
957         # Remove FDB entry from the VxLAN driver and check that corresponding
958         # entry in the bridge driver is not marked as offloaded
959         RET=0
960
961         bridge fdb del de:ad:be:ef:13:37 dev vxlan10 self
962         bridge fdb show brport vxlan10 | grep de:ad:be:ef:13:37 | grep -v self \
963                 | grep -q offload
964         check_fail $?
965
966         log_test "vxlan entry offload indication - after removal from vxlan"
967
968         # Add the FDB entry back to the VxLAN driver and make sure it is
969         # marked as offloaded in both drivers
970         RET=0
971
972         bridge fdb add de:ad:be:ef:13:37 dev vxlan10 self dst 198.51.100.2
973         bridge fdb show brport vxlan10 | grep de:ad:be:ef:13:37 | grep self \
974                 | grep -q offload
975         check_err $?
976         bridge fdb show brport vxlan10 | grep de:ad:be:ef:13:37 | grep -v self \
977                 | grep -q offload
978         check_err $?
979
980         log_test "vxlan entry offload indication - after re-add to vxlan"
981
982         bridge fdb del de:ad:be:ef:13:37 dev vxlan10 self master vlan 10
983 }
984
985 offload_indication_vlan_aware_decap_route_test()
986 {
987         RET=0
988
989         ip route show table local | grep 198.51.100.1 | grep -q offload
990         check_err $?
991
992         # Toggle PVID flag on one VxLAN device and make sure route is still
993         # marked as offloaded
994         bridge vlan add vid 10 dev vxlan10 untagged
995
996         ip route show table local | grep 198.51.100.1 | grep -q offload
997         check_err $?
998
999         # Toggle PVID flag on second VxLAN device and make sure route is no
1000         # longer marked as offloaded
1001         bridge vlan add vid 20 dev vxlan20 untagged
1002
1003         ip route show table local | grep 198.51.100.1 | grep -q offload
1004         check_fail $?
1005
1006         # Toggle PVID flag back and make sure route is marked as offloaded
1007         bridge vlan add vid 10 dev vxlan10 pvid untagged
1008         bridge vlan add vid 20 dev vxlan20 pvid untagged
1009
1010         ip route show table local | grep 198.51.100.1 | grep -q offload
1011         check_err $?
1012
1013         log_test "vxlan decap route - vni map/unmap"
1014 }
1015
1016 offload_indication_vlan_aware_join_vxlan_first()
1017 {
1018         ip link add dev br0 up type bridge mcast_snooping 0 \
1019                 vlan_filtering 1 vlan_default_pvid 1
1020         ip link add name vxlan0 up type vxlan id 10 nolearning noudpcsum \
1021                 ttl 20 tos inherit local 198.51.100.1 dstport 4789
1022
1023         __offload_indication_join_vxlan_first 1
1024
1025         ip link del dev vxlan0
1026         ip link del dev br0
1027 }
1028
1029 offload_indication_vlan_aware_join_vxlan_last()
1030 {
1031         ip link add dev br0 up type bridge mcast_snooping 0 \
1032                 vlan_filtering 1 vlan_default_pvid 1
1033         ip link add name vxlan0 up type vxlan id 10 nolearning noudpcsum \
1034                 ttl 20 tos inherit local 198.51.100.1 dstport 4789
1035
1036         __offload_indication_join_vxlan_last
1037
1038         ip link del dev vxlan0
1039         ip link del dev br0
1040 }
1041
1042 offload_indication_vlan_aware_l3vni_test()
1043 {
1044         local zmac=00:00:00:00:00:00
1045
1046         RET=0
1047
1048         sysctl_set net.ipv6.conf.default.disable_ipv6 1
1049         ip link add dev br0 up type bridge mcast_snooping 0 \
1050                 vlan_filtering 1 vlan_default_pvid 0
1051         ip link add name vxlan0 up type vxlan id 10 nolearning noudpcsum \
1052                 ttl 20 tos inherit local 198.51.100.1 dstport 4789
1053
1054         ip link set dev $swp1 master br0
1055
1056         # The test will use the offload indication on the FDB entry to
1057         # understand if the tunnel is offloaded or not
1058         bridge fdb append $zmac dev vxlan0 self dst 192.0.2.1
1059
1060         ip link set dev vxlan0 master br0
1061         bridge vlan add dev vxlan0 vid 10 pvid untagged
1062
1063         # No local port or router port is member in the VLAN, so tunnel should
1064         # not be offloaded
1065         bridge fdb show brport vxlan0 | grep $zmac | grep self \
1066                 | grep -q offload
1067         check_fail $? "vxlan tunnel offloaded when should not"
1068
1069         # Configure a VLAN interface and make sure tunnel is offloaded
1070         ip link add link br0 name br10 up type vlan id 10
1071         sysctl_set net.ipv6.conf.br10.disable_ipv6 0
1072         ip -6 address add 2001:db8:1::1/64 dev br10
1073         bridge fdb show brport vxlan0 | grep $zmac | grep self \
1074                 | grep -q offload
1075         check_err $? "vxlan tunnel not offloaded when should"
1076
1077         # Unlink the VXLAN device, make sure tunnel is no longer offloaded,
1078         # then add it back to the bridge and make sure it is offloaded
1079         ip link set dev vxlan0 nomaster
1080         bridge fdb show brport vxlan0 | grep $zmac | grep self \
1081                 | grep -q offload
1082         check_fail $? "vxlan tunnel offloaded after unlinked from bridge"
1083
1084         ip link set dev vxlan0 master br0
1085         bridge fdb show brport vxlan0 | grep $zmac | grep self \
1086                 | grep -q offload
1087         check_fail $? "vxlan tunnel offloaded despite no matching vid"
1088
1089         bridge vlan add dev vxlan0 vid 10 pvid untagged
1090         bridge fdb show brport vxlan0 | grep $zmac | grep self \
1091                 | grep -q offload
1092         check_err $? "vxlan tunnel not offloaded after adding vid"
1093
1094         log_test "vxlan - l3 vni"
1095
1096         ip link del dev vxlan0
1097         ip link del dev br0
1098         sysctl_restore net.ipv6.conf.default.disable_ipv6
1099 }
1100
1101 offload_indication_vlan_aware_test()
1102 {
1103         offload_indication_vlan_aware_setup_create
1104         offload_indication_vlan_aware_fdb_test
1105         offload_indication_vlan_aware_decap_route_test
1106         offload_indication_vlan_aware_setup_destroy
1107
1108         log_info "offload indication - replay & cleanup - vlan aware"
1109         offload_indication_vlan_aware_join_vxlan_first
1110         offload_indication_vlan_aware_join_vxlan_last
1111         offload_indication_vlan_aware_l3vni_test
1112 }
1113
1114 trap cleanup EXIT
1115
1116 setup_prepare
1117 setup_wait
1118
1119 tests_run
1120
1121 exit $EXIT_STATUS