cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

vxlan.sh (30290B)


      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 up type bridge mcast_snooping 0
    448	ip link add name br1 up type bridge mcast_snooping 0
    449
    450	ip link set dev $swp1 master br0
    451	ip link set dev $swp2 master br1
    452
    453	ip address add $LOCAL_IP_1/$PREFIX_LEN dev lo
    454
    455	ip link add name vxlan0 up master br0 type vxlan id 10 nolearning \
    456		$UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
    457	ip link add name vxlan1 up master br1 type vxlan id 20 nolearning \
    458		$UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
    459}
    460
    461offload_indication_setup_destroy()
    462{
    463	ip link del dev vxlan1
    464	ip link del dev vxlan0
    465
    466	ip address del $LOCAL_IP_1/$PREFIX_LEN dev lo
    467
    468	ip link set dev $swp2 nomaster
    469	ip link set dev $swp1 nomaster
    470
    471	ip link del dev br1
    472	ip link del dev br0
    473}
    474
    475offload_indication_fdb_flood_test()
    476{
    477	RET=0
    478
    479	bridge fdb append 00:00:00:00:00:00 dev vxlan0 self dst $LOCAL_IP_2
    480
    481	busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb 00:00:00:00:00:00 \
    482		bridge fdb show brport vxlan0
    483	check_err $?
    484
    485	bridge fdb del 00:00:00:00:00:00 dev vxlan0 self
    486
    487	log_test "vxlan flood entry offload indication"
    488}
    489
    490offload_indication_fdb_bridge_test()
    491{
    492	RET=0
    493
    494	bridge fdb add de:ad:be:ef:13:37 dev vxlan0 self master static \
    495		dst $LOCAL_IP_2
    496
    497	busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \
    498		de:ad:be:ef:13:37 self bridge fdb show brport vxlan0
    499	check_err $?
    500	busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \
    501		de:ad:be:ef:13:37 self -v bridge fdb show brport vxlan0
    502	check_err $?
    503
    504	log_test "vxlan entry offload indication - initial state"
    505
    506	# Remove FDB entry from the bridge driver and check that corresponding
    507	# entry in the VxLAN driver is not marked as offloaded
    508	RET=0
    509
    510	bridge fdb del de:ad:be:ef:13:37 dev vxlan0 master
    511	busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb \
    512		de:ad:be:ef:13:37 self bridge fdb show brport vxlan0
    513	check_err $?
    514
    515	log_test "vxlan entry offload indication - after removal from bridge"
    516
    517	# Add the FDB entry back to the bridge driver and make sure it is
    518	# marked as offloaded in both drivers
    519	RET=0
    520
    521	bridge fdb add de:ad:be:ef:13:37 dev vxlan0 master static
    522	busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \
    523		de:ad:be:ef:13:37 self bridge fdb show brport vxlan0
    524	check_err $?
    525	busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \
    526		de:ad:be:ef:13:37 self -v bridge fdb show brport vxlan0
    527	check_err $?
    528
    529	log_test "vxlan entry offload indication - after re-add to bridge"
    530
    531	# Remove FDB entry from the VxLAN driver and check that corresponding
    532	# entry in the bridge driver is not marked as offloaded
    533	RET=0
    534
    535	bridge fdb del de:ad:be:ef:13:37 dev vxlan0 self
    536	busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb \
    537		de:ad:be:ef:13:37 self -v bridge fdb show brport vxlan0
    538	check_err $?
    539
    540	log_test "vxlan entry offload indication - after removal from vxlan"
    541
    542	# Add the FDB entry back to the VxLAN driver and make sure it is
    543	# marked as offloaded in both drivers
    544	RET=0
    545
    546	bridge fdb add de:ad:be:ef:13:37 dev vxlan0 self dst $LOCAL_IP_2
    547	busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \
    548		de:ad:be:ef:13:37 self bridge fdb show brport vxlan0
    549	check_err $?
    550	busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \
    551		de:ad:be:ef:13:37 self -v bridge fdb show brport vxlan0
    552	check_err $?
    553
    554	log_test "vxlan entry offload indication - after re-add to vxlan"
    555
    556	bridge fdb del de:ad:be:ef:13:37 dev vxlan0 self master
    557}
    558
    559offload_indication_fdb_test()
    560{
    561	offload_indication_fdb_flood_test
    562	offload_indication_fdb_bridge_test
    563}
    564
    565offload_indication_decap_route_test()
    566{
    567	RET=0
    568
    569	busywait "$TIMEOUT" wait_for_offload \
    570		ip $IP_FLAG route show table local $LOCAL_IP_1
    571	check_err $?
    572
    573	ip link set dev vxlan0 down
    574	busywait "$TIMEOUT" wait_for_offload \
    575		ip $IP_FLAG route show table local $LOCAL_IP_1
    576	check_err $?
    577
    578	ip link set dev vxlan1 down
    579	busywait "$TIMEOUT" not wait_for_offload \
    580		ip $IP_FLAG route show table local $LOCAL_IP_1
    581	check_err $?
    582
    583	log_test "vxlan decap route - vxlan device down"
    584
    585	RET=0
    586
    587	ip link set dev vxlan1 up
    588	busywait "$TIMEOUT" wait_for_offload \
    589		ip $IP_FLAG route show table local $LOCAL_IP_1
    590	check_err $?
    591
    592	ip link set dev vxlan0 up
    593	busywait "$TIMEOUT" wait_for_offload \
    594		ip $IP_FLAG route show table local $LOCAL_IP_1
    595	check_err $?
    596
    597	log_test "vxlan decap route - vxlan device up"
    598
    599	RET=0
    600
    601	ip address delete $LOCAL_IP_1/$PREFIX_LEN dev lo
    602	busywait "$TIMEOUT" not wait_for_offload \
    603		ip $IP_FLAG route show table local $LOCAL_IP_1
    604	check_err $?
    605
    606	ip address add $LOCAL_IP_1/$PREFIX_LEN dev lo
    607	busywait "$TIMEOUT" wait_for_offload \
    608		ip $IP_FLAG route show table local $LOCAL_IP_1
    609	check_err $?
    610
    611	log_test "vxlan decap route - add local route"
    612
    613	RET=0
    614
    615	ip link set dev $swp1 nomaster
    616	busywait "$TIMEOUT" wait_for_offload \
    617		ip $IP_FLAG route show table local $LOCAL_IP_1
    618	check_err $?
    619
    620	ip link set dev $swp2 nomaster
    621	busywait "$TIMEOUT" not wait_for_offload \
    622		ip $IP_FLAG route show table local $LOCAL_IP_1
    623	check_err $?
    624
    625	ip link set dev $swp1 master br0
    626	ip link set dev $swp2 master br1
    627	busywait "$TIMEOUT" wait_for_offload \
    628		ip $IP_FLAG route show table local $LOCAL_IP_1
    629	check_err $?
    630
    631	log_test "vxlan decap route - local ports enslavement"
    632
    633	RET=0
    634
    635	ip link del dev br0
    636	busywait "$TIMEOUT" wait_for_offload \
    637		ip $IP_FLAG route show table local $LOCAL_IP_1
    638	check_err $?
    639
    640	ip link del dev br1
    641	busywait "$TIMEOUT" not wait_for_offload \
    642		ip $IP_FLAG route show table local $LOCAL_IP_1
    643	check_err $?
    644
    645	log_test "vxlan decap route - bridge device deletion"
    646
    647	RET=0
    648
    649	ip link add name br0 up type bridge mcast_snooping 0
    650	ip link add name br1 up type bridge mcast_snooping 0
    651	ip link set dev $swp1 master br0
    652	ip link set dev $swp2 master br1
    653	ip link set dev vxlan0 master br0
    654	ip link set dev vxlan1 master br1
    655	busywait "$TIMEOUT" wait_for_offload \
    656		ip $IP_FLAG route show table local $LOCAL_IP_1
    657	check_err $?
    658
    659	ip link del dev vxlan0
    660	busywait "$TIMEOUT" wait_for_offload \
    661		ip $IP_FLAG route show table local $LOCAL_IP_1
    662	check_err $?
    663
    664	ip link del dev vxlan1
    665	busywait "$TIMEOUT" not wait_for_offload \
    666		ip $IP_FLAG route show table local $LOCAL_IP_1
    667	check_err $?
    668
    669	log_test "vxlan decap route - vxlan device deletion"
    670
    671	ip link add name vxlan0 up master br0 type vxlan id 10 nolearning \
    672		$UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
    673	ip link add name vxlan1 up master br1 type vxlan id 20 nolearning \
    674		$UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
    675}
    676
    677check_fdb_offloaded()
    678{
    679	local mac=00:11:22:33:44:55
    680	local zmac=00:00:00:00:00:00
    681
    682	busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb $mac self \
    683		bridge fdb show dev vxlan0
    684	check_err $?
    685	busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb $mac master \
    686		bridge fdb show dev vxlan0
    687	check_err $?
    688
    689	busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb $zmac self \
    690		bridge fdb show dev vxlan0
    691	check_err $?
    692}
    693
    694check_vxlan_fdb_not_offloaded()
    695{
    696	local mac=00:11:22:33:44:55
    697	local zmac=00:00:00:00:00:00
    698
    699	bridge fdb show dev vxlan0 | grep $mac | grep -q self
    700	check_err $?
    701	busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb $mac self \
    702		bridge fdb show dev vxlan0
    703	check_err $?
    704
    705	bridge fdb show dev vxlan0 | grep $zmac | grep -q self
    706	check_err $?
    707	busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb $zmac self \
    708		bridge fdb show dev vxlan0
    709	check_err $?
    710}
    711
    712check_bridge_fdb_not_offloaded()
    713{
    714	local mac=00:11:22:33:44:55
    715	local zmac=00:00:00:00:00:00
    716
    717	bridge fdb show dev vxlan0 | grep $mac | grep -q master
    718	check_err $?
    719	busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb $mac master \
    720		bridge fdb show dev vxlan0
    721	check_err $?
    722}
    723
    724__offload_indication_join_vxlan_first()
    725{
    726	local vid=$1; shift
    727
    728	local mac=00:11:22:33:44:55
    729	local zmac=00:00:00:00:00:00
    730
    731	bridge fdb append $zmac dev vxlan0 self dst $LOCAL_IP_2
    732
    733	ip link set dev vxlan0 master br0
    734	bridge fdb add dev vxlan0 $mac self master static dst $LOCAL_IP_2
    735
    736	RET=0
    737	check_vxlan_fdb_not_offloaded
    738	ip link set dev $swp1 master br0
    739	sleep .1
    740	check_fdb_offloaded
    741	log_test "offload indication - attach vxlan first"
    742
    743	RET=0
    744	ip link set dev vxlan0 down
    745	check_vxlan_fdb_not_offloaded
    746	check_bridge_fdb_not_offloaded
    747	log_test "offload indication - set vxlan down"
    748
    749	RET=0
    750	ip link set dev vxlan0 up
    751	sleep .1
    752	check_fdb_offloaded
    753	log_test "offload indication - set vxlan up"
    754
    755	if [[ ! -z $vid ]]; then
    756		RET=0
    757		bridge vlan del dev vxlan0 vid $vid
    758		check_vxlan_fdb_not_offloaded
    759		check_bridge_fdb_not_offloaded
    760		log_test "offload indication - delete VLAN"
    761
    762		RET=0
    763		bridge vlan add dev vxlan0 vid $vid
    764		check_vxlan_fdb_not_offloaded
    765		check_bridge_fdb_not_offloaded
    766		log_test "offload indication - add tagged VLAN"
    767
    768		RET=0
    769		bridge vlan add dev vxlan0 vid $vid pvid untagged
    770		sleep .1
    771		check_fdb_offloaded
    772		log_test "offload indication - add pvid/untagged VLAN"
    773	fi
    774
    775	RET=0
    776	ip link set dev $swp1 nomaster
    777	check_vxlan_fdb_not_offloaded
    778	log_test "offload indication - detach port"
    779}
    780
    781offload_indication_join_vxlan_first()
    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 $UDPCSUM_FLAFS \
    785		ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
    786
    787	__offload_indication_join_vxlan_first
    788
    789	ip link del dev vxlan0
    790	ip link del dev br0
    791}
    792
    793__offload_indication_join_vxlan_last()
    794{
    795	local zmac=00:00:00:00:00:00
    796
    797	RET=0
    798
    799	bridge fdb append $zmac dev vxlan0 self dst $LOCAL_IP_2
    800
    801	ip link set dev $swp1 master br0
    802
    803	busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb $zmac self \
    804		bridge fdb show dev vxlan0
    805	check_err $?
    806
    807	ip link set dev vxlan0 master br0
    808
    809	busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb $zmac self \
    810		bridge fdb show dev vxlan0
    811	check_err $?
    812
    813	log_test "offload indication - attach vxlan last"
    814}
    815
    816offload_indication_join_vxlan_last()
    817{
    818	ip link add dev br0 up type bridge mcast_snooping 0
    819	ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
    820		ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
    821
    822	__offload_indication_join_vxlan_last
    823
    824	ip link del dev vxlan0
    825	ip link del dev br0
    826}
    827
    828offload_indication_test()
    829{
    830	offload_indication_setup_create
    831	offload_indication_fdb_test
    832	offload_indication_decap_route_test
    833	offload_indication_setup_destroy
    834
    835	log_info "offload indication - replay & cleanup"
    836	offload_indication_join_vxlan_first
    837	offload_indication_join_vxlan_last
    838}
    839
    840sanitization_vlan_aware_test()
    841{
    842	RET=0
    843
    844	ip link add dev br0 type bridge mcast_snooping 0 vlan_filtering 1
    845
    846	ip link add name vxlan10 up master br0 type vxlan id 10 nolearning \
    847		$UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
    848
    849	ip link add name vxlan20 up master br0 type vxlan id 20 nolearning \
    850		$UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
    851
    852	# Test that when each VNI is mapped to a different VLAN we can enslave
    853	# a port to the bridge
    854	bridge vlan add vid 10 dev vxlan10 pvid untagged
    855	bridge vlan add vid 20 dev vxlan20 pvid untagged
    856
    857	ip link set dev $swp1 master br0
    858	check_err $?
    859
    860	log_test "vlan-aware - enslavement to vlan-aware bridge"
    861
    862	# Try to map both VNIs to the same VLAN and make sure configuration
    863	# fails
    864	RET=0
    865
    866	bridge vlan add vid 10 dev vxlan20 pvid untagged &> /dev/null
    867	check_fail $?
    868
    869	log_test "vlan-aware - two vnis mapped to the same vlan"
    870
    871	# Test that enslavement of a port to a bridge fails when two VNIs
    872	# are mapped to the same VLAN
    873	RET=0
    874
    875	ip link set dev $swp1 nomaster
    876
    877	bridge vlan del vid 20 dev vxlan20 pvid untagged
    878	bridge vlan add vid 10 dev vxlan20 pvid untagged
    879
    880	ip link set dev $swp1 master br0 &> /dev/null
    881	check_fail $?
    882
    883	log_test "vlan-aware - failed enslavement to vlan-aware bridge"
    884
    885	bridge vlan del vid 10 dev vxlan20
    886	bridge vlan add vid 20 dev vxlan20 pvid untagged
    887
    888	# Test that when two VXLAN tunnels with conflicting configurations
    889	# (i.e., different TTL) are enslaved to the same VLAN-aware bridge,
    890	# then the enslavement of a port to the bridge is denied.
    891
    892	# Use the offload indication of the local route to ensure the VXLAN
    893	# configuration was correctly rollbacked.
    894	ip address add $LOCAL_IP_1/$PREFIX_LEN dev lo
    895
    896	ip link set dev vxlan10 type vxlan ttl 10
    897	ip link set dev $swp1 master br0 &> /dev/null
    898	check_fail $?
    899
    900	busywait "$TIMEOUT" not wait_for_offload \
    901		ip $IP_FLAG route show table local $LOCAL_IP_1
    902	check_err $?
    903
    904	log_test "vlan-aware - failed enslavement to bridge due to conflict"
    905
    906	ip link set dev vxlan10 type vxlan ttl 20
    907	ip address del $LOCAL_IP_1/$PREFIX_LEN dev lo
    908
    909	ip link del dev vxlan20
    910	ip link del dev vxlan10
    911	ip link del dev br0
    912}
    913
    914offload_indication_vlan_aware_setup_create()
    915{
    916	# Create a simple setup with two VxLAN devices and a single VLAN-aware
    917	# bridge
    918	ip link add name br0 up type bridge mcast_snooping 0 vlan_filtering 1 \
    919		vlan_default_pvid 0
    920
    921	ip link set dev $swp1 master br0
    922
    923	bridge vlan add vid 10 dev $swp1
    924	bridge vlan add vid 20 dev $swp1
    925
    926	ip address add $LOCAL_IP_1/$PREFIX_LEN dev lo
    927
    928	ip link add name vxlan10 up master br0 type vxlan id 10 nolearning \
    929		$UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
    930	ip link add name vxlan20 up master br0 type vxlan id 20 nolearning \
    931		$UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
    932
    933	bridge vlan add vid 10 dev vxlan10 pvid untagged
    934	bridge vlan add vid 20 dev vxlan20 pvid untagged
    935}
    936
    937offload_indication_vlan_aware_setup_destroy()
    938{
    939	bridge vlan del vid 20 dev vxlan20
    940	bridge vlan del vid 10 dev vxlan10
    941
    942	ip link del dev vxlan20
    943	ip link del dev vxlan10
    944
    945	ip address del $LOCAL_IP_1/$PREFIX_LEN dev lo
    946
    947	bridge vlan del vid 20 dev $swp1
    948	bridge vlan del vid 10 dev $swp1
    949
    950	ip link set dev $swp1 nomaster
    951
    952	ip link del dev br0
    953}
    954
    955offload_indication_vlan_aware_fdb_test()
    956{
    957	RET=0
    958
    959	log_info "vxlan entry offload indication - vlan-aware"
    960
    961	bridge fdb add de:ad:be:ef:13:37 dev vxlan10 self master static \
    962		dst $LOCAL_IP_2 vlan 10
    963
    964	busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \
    965		de:ad:be:ef:13:37 self bridge fdb show brport vxlan10
    966	check_err $?
    967	busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \
    968		de:ad:be:ef:13:37 self -v bridge fdb show brport vxlan10
    969	check_err $?
    970
    971	log_test "vxlan entry offload indication - initial state"
    972
    973	# Remove FDB entry from the bridge driver and check that corresponding
    974	# entry in the VxLAN driver is not marked as offloaded
    975	RET=0
    976
    977	bridge fdb del de:ad:be:ef:13:37 dev vxlan10 master vlan 10
    978	busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb \
    979		de:ad:be:ef:13:37 self bridge fdb show brport vxlan10
    980	check_err $?
    981
    982	log_test "vxlan entry offload indication - after removal from bridge"
    983
    984	# Add the FDB entry back to the bridge driver and make sure it is
    985	# marked as offloaded in both drivers
    986	RET=0
    987
    988	bridge fdb add de:ad:be:ef:13:37 dev vxlan10 master static vlan 10
    989	busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \
    990		de:ad:be:ef:13:37 self bridge fdb show brport vxlan10
    991	check_err $?
    992	busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \
    993		de:ad:be:ef:13:37 self -v bridge fdb show brport vxlan10
    994	check_err $?
    995
    996	log_test "vxlan entry offload indication - after re-add to bridge"
    997
    998	# Remove FDB entry from the VxLAN driver and check that corresponding
    999	# entry in the bridge driver is not marked as offloaded
   1000	RET=0
   1001
   1002	bridge fdb del de:ad:be:ef:13:37 dev vxlan10 self
   1003	busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb \
   1004		de:ad:be:ef:13:37 self -v bridge fdb show brport vxlan10
   1005	check_err $?
   1006
   1007	log_test "vxlan entry offload indication - after removal from vxlan"
   1008
   1009	# Add the FDB entry back to the VxLAN driver and make sure it is
   1010	# marked as offloaded in both drivers
   1011	RET=0
   1012
   1013	bridge fdb add de:ad:be:ef:13:37 dev vxlan10 self dst $LOCAL_IP_2
   1014	busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \
   1015		de:ad:be:ef:13:37 self bridge fdb show brport vxlan10
   1016	check_err $?
   1017	busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \
   1018		de:ad:be:ef:13:37 self -v bridge fdb show brport vxlan10
   1019	check_err $?
   1020
   1021	log_test "vxlan entry offload indication - after re-add to vxlan"
   1022
   1023	bridge fdb del de:ad:be:ef:13:37 dev vxlan10 self master vlan 10
   1024}
   1025
   1026offload_indication_vlan_aware_decap_route_test()
   1027{
   1028	RET=0
   1029
   1030	busywait "$TIMEOUT" wait_for_offload \
   1031		ip $IP_FLAG route show table local $LOCAL_IP_1
   1032	check_err $?
   1033
   1034	# Toggle PVID flag on one VxLAN device and make sure route is still
   1035	# marked as offloaded
   1036	bridge vlan add vid 10 dev vxlan10 untagged
   1037
   1038	busywait "$TIMEOUT" wait_for_offload \
   1039		ip $IP_FLAG route show table local $LOCAL_IP_1
   1040	check_err $?
   1041
   1042	# Toggle PVID flag on second VxLAN device and make sure route is no
   1043	# longer marked as offloaded
   1044	bridge vlan add vid 20 dev vxlan20 untagged
   1045
   1046	busywait "$TIMEOUT" not wait_for_offload \
   1047		ip $IP_FLAG route show table local $LOCAL_IP_1
   1048	check_err $?
   1049
   1050	# Toggle PVID flag back and make sure route is marked as offloaded
   1051	bridge vlan add vid 10 dev vxlan10 pvid untagged
   1052	bridge vlan add vid 20 dev vxlan20 pvid untagged
   1053
   1054	busywait "$TIMEOUT" wait_for_offload ip $IP_FLAG route show table local \
   1055		$LOCAL_IP_1
   1056	check_err $?
   1057
   1058	log_test "vxlan decap route - vni map/unmap"
   1059}
   1060
   1061offload_indication_vlan_aware_join_vxlan_first()
   1062{
   1063	ip link add dev br0 up type bridge mcast_snooping 0 \
   1064		vlan_filtering 1 vlan_default_pvid 1
   1065	ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
   1066		ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
   1067
   1068	__offload_indication_join_vxlan_first 1
   1069
   1070	ip link del dev vxlan0
   1071	ip link del dev br0
   1072}
   1073
   1074offload_indication_vlan_aware_join_vxlan_last()
   1075{
   1076	ip link add dev br0 up type bridge mcast_snooping 0 \
   1077		vlan_filtering 1 vlan_default_pvid 1
   1078	ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
   1079		ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
   1080
   1081	__offload_indication_join_vxlan_last
   1082
   1083	ip link del dev vxlan0
   1084	ip link del dev br0
   1085}
   1086
   1087offload_indication_vlan_aware_l3vni_test()
   1088{
   1089	local zmac=00:00:00:00:00:00
   1090
   1091	RET=0
   1092
   1093	sysctl_set net.ipv6.conf.default.disable_ipv6 1
   1094	ip link add dev br0 up type bridge mcast_snooping 0 \
   1095		vlan_filtering 1 vlan_default_pvid 0
   1096	ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
   1097		ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
   1098
   1099	ip link set dev $swp1 master br0
   1100
   1101	# The test will use the offload indication on the FDB entry to
   1102	# understand if the tunnel is offloaded or not
   1103	bridge fdb append $zmac dev vxlan0 self dst $LOCAL_IP_2
   1104
   1105	ip link set dev vxlan0 master br0
   1106	bridge vlan add dev vxlan0 vid 10 pvid untagged
   1107
   1108	busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb $zmac self \
   1109		bridge fdb show brport vxlan0
   1110	check_err $? "vxlan tunnel not offloaded when should"
   1111
   1112	# Configure a VLAN interface and make sure tunnel is offloaded
   1113	ip link add link br0 name br10 up type vlan id 10
   1114	sysctl_set net.ipv6.conf.br10.disable_ipv6 0
   1115	ip -6 address add 2001:db8:1::1/64 dev br10
   1116	busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb $zmac self \
   1117		bridge fdb show brport vxlan0
   1118	check_err $? "vxlan tunnel not offloaded when should"
   1119
   1120	# Unlink the VXLAN device, make sure tunnel is no longer offloaded,
   1121	# then add it back to the bridge and make sure it is offloaded
   1122	ip link set dev vxlan0 nomaster
   1123	busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb $zmac self \
   1124		bridge fdb show brport vxlan0
   1125	check_err $? "vxlan tunnel offloaded after unlinked from bridge"
   1126
   1127	ip link set dev vxlan0 master br0
   1128	busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb $zmac self \
   1129		bridge fdb show brport vxlan0
   1130	check_err $? "vxlan tunnel offloaded despite no matching vid"
   1131
   1132	bridge vlan add dev vxlan0 vid 10 pvid untagged
   1133	busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb $zmac self \
   1134		bridge fdb show brport vxlan0
   1135	check_err $? "vxlan tunnel not offloaded after adding vid"
   1136
   1137	log_test "vxlan - l3 vni"
   1138
   1139	ip link del dev vxlan0
   1140	ip link del dev br0
   1141	sysctl_restore net.ipv6.conf.default.disable_ipv6
   1142}
   1143
   1144offload_indication_vlan_aware_test()
   1145{
   1146	offload_indication_vlan_aware_setup_create
   1147	offload_indication_vlan_aware_fdb_test
   1148	offload_indication_vlan_aware_decap_route_test
   1149	offload_indication_vlan_aware_setup_destroy
   1150
   1151	log_info "offload indication - replay & cleanup - vlan aware"
   1152	offload_indication_vlan_aware_join_vxlan_first
   1153	offload_indication_vlan_aware_join_vxlan_last
   1154	offload_indication_vlan_aware_l3vni_test
   1155}
   1156
   1157trap cleanup EXIT
   1158
   1159setup_prepare
   1160setup_wait
   1161
   1162tests_run
   1163
   1164exit $EXIT_STATUS