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