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

rtnetlink.sh (27881B)


      1#!/bin/bash
      2# SPDX-License-Identifier: GPL-2.0
      3#
      4# Test various interface configuration scenarios. Observe that configurations
      5# deemed valid by mlxsw succeed, invalid configurations fail and that no traces
      6# are produced. To prevent the test from passing in case traces are produced,
      7# the user can set the 'kernel.panic_on_warn' and 'kernel.panic_on_oops'
      8# sysctls in its environment.
      9
     10lib_dir=$(dirname $0)/../../../net/forwarding
     11
     12ALL_TESTS="
     13	rif_vrf_set_addr_test
     14	rif_non_inherit_bridge_addr_test
     15	vlan_interface_deletion_test
     16	bridge_deletion_test
     17	bridge_vlan_flags_test
     18	vlan_1_test
     19	lag_bridge_upper_test
     20	duplicate_vlans_test
     21	vlan_rif_refcount_test
     22	subport_rif_refcount_test
     23	subport_rif_lag_join_test
     24	vlan_dev_deletion_test
     25	lag_unlink_slaves_test
     26	lag_dev_deletion_test
     27	vlan_interface_uppers_test
     28	bridge_extern_learn_test
     29	neigh_offload_test
     30	nexthop_offload_test
     31	nexthop_obj_invalid_test
     32	nexthop_obj_offload_test
     33	nexthop_obj_group_offload_test
     34	nexthop_obj_bucket_offload_test
     35	nexthop_obj_blackhole_offload_test
     36	nexthop_obj_route_offload_test
     37	devlink_reload_test
     38"
     39NUM_NETIFS=2
     40: ${TIMEOUT:=20000} # ms
     41source $lib_dir/lib.sh
     42source $lib_dir/devlink_lib.sh
     43
     44setup_prepare()
     45{
     46	swp1=${NETIFS[p1]}
     47	swp2=${NETIFS[p2]}
     48
     49	ip link set dev $swp1 up
     50	ip link set dev $swp2 up
     51}
     52
     53cleanup()
     54{
     55	pre_cleanup
     56
     57	ip link set dev $swp2 down
     58	ip link set dev $swp1 down
     59}
     60
     61rif_vrf_set_addr_test()
     62{
     63	# Test that it is possible to set an IP address on a VRF upper despite
     64	# its random MAC address.
     65	RET=0
     66
     67	ip link add name vrf-test type vrf table 10
     68	ip link set dev $swp1 master vrf-test
     69
     70	ip -4 address add 192.0.2.1/24 dev vrf-test
     71	check_err $? "failed to set IPv4 address on VRF"
     72	ip -6 address add 2001:db8:1::1/64 dev vrf-test
     73	check_err $? "failed to set IPv6 address on VRF"
     74
     75	log_test "RIF - setting IP address on VRF"
     76
     77	ip link del dev vrf-test
     78}
     79
     80rif_non_inherit_bridge_addr_test()
     81{
     82	local swp2_mac=$(mac_get $swp2)
     83
     84	RET=0
     85
     86	# Create first RIF
     87	ip addr add dev $swp1 192.0.2.1/28
     88	check_err $?
     89
     90	# Create a FID RIF
     91	ip link add name br1 up type bridge vlan_filtering 0
     92	ip link set dev br1 addr $swp2_mac
     93	ip link set dev $swp2 master br1
     94	ip addr add dev br1 192.0.2.17/28
     95	check_err $?
     96
     97	# Prepare a device with a low MAC address
     98	ip link add name d up type dummy
     99	ip link set dev d addr 00:11:22:33:44:55
    100
    101	# Attach the device to br1. Since the bridge address was set, it should
    102	# work.
    103	ip link set dev d master br1 &>/dev/null
    104	check_err $? "Could not attach a device with low MAC to a bridge with RIF"
    105
    106	# Port MAC address change should be allowed for a bridge with set MAC.
    107	ip link set dev $swp2 addr 00:11:22:33:44:55
    108	check_err $? "Changing swp2's MAC address not permitted"
    109
    110	log_test "RIF - attach port with bad MAC to bridge with set MAC"
    111
    112	ip link set dev $swp2 addr $swp2_mac
    113	ip link del dev d
    114	ip link del dev br1
    115	ip addr del dev $swp1 192.0.2.1/28
    116}
    117
    118vlan_interface_deletion_test()
    119{
    120	# Test that when a VLAN interface is deleted, its associated router
    121	# interface (RIF) is correctly deleted and not leaked. See commit
    122	# c360867ec46a ("mlxsw: spectrum: Delete RIF when VLAN device is
    123	# removed") for more details
    124	RET=0
    125
    126	ip link add name br0 type bridge vlan_filtering 1
    127	ip link set dev $swp1 master br0
    128
    129	ip link add link br0 name br0.10 type vlan id 10
    130	ip -6 address add 2001:db8:1::1/64 dev br0.10
    131	ip link del dev br0.10
    132
    133	# If we leaked the previous RIF, then this should produce a trace
    134	ip link add link br0 name br0.20 type vlan id 20
    135	ip -6 address add 2001:db8:1::1/64 dev br0.20
    136	ip link del dev br0.20
    137
    138	log_test "vlan interface deletion"
    139
    140	ip link del dev br0
    141}
    142
    143bridge_deletion_test()
    144{
    145	# Test that when a bridge with VLAN interfaces is deleted, we correctly
    146	# delete the associated RIFs. See commit 602b74eda813 ("mlxsw:
    147	# spectrum_switchdev: Do not leak RIFs when removing bridge") for more
    148	# details
    149	RET=0
    150
    151	ip link add name br0 type bridge vlan_filtering 1
    152	ip link set dev $swp1 master br0
    153	ip -6 address add 2001:db8::1/64 dev br0
    154
    155	ip link add link br0 name br0.10 type vlan id 10
    156	ip -6 address add 2001:db8:1::1/64 dev br0.10
    157
    158	ip link add link br0 name br0.20 type vlan id 20
    159	ip -6 address add 2001:db8:2::1/64 dev br0.20
    160
    161	ip link del dev br0
    162
    163	# If we leaked previous RIFs, then this should produce a trace
    164	ip -6 address add 2001:db8:1::1/64 dev $swp1
    165	ip -6 address del 2001:db8:1::1/64 dev $swp1
    166
    167	log_test "bridge deletion"
    168}
    169
    170bridge_vlan_flags_test()
    171{
    172	# Test that when bridge VLAN flags are toggled, we do not take
    173	# unnecessary references on related structs. See commit 9e25826ffc94
    174	# ("mlxsw: spectrum_switchdev: Fix port_vlan refcounting") for more
    175	# details
    176	RET=0
    177
    178	ip link add name br0 type bridge vlan_filtering 1
    179	ip link set dev $swp1 master br0
    180
    181	bridge vlan add vid 10 dev $swp1 pvid untagged
    182	bridge vlan add vid 10 dev $swp1 untagged
    183	bridge vlan add vid 10 dev $swp1 pvid
    184	bridge vlan add vid 10 dev $swp1
    185	ip link del dev br0
    186
    187	# If we did not handle references correctly, then this should produce a
    188	# trace
    189	devlink dev reload "$DEVLINK_DEV"
    190
    191	# Allow netdevices to be re-created following the reload
    192	sleep 20
    193
    194	log_test "bridge vlan flags"
    195}
    196
    197vlan_1_test()
    198{
    199	# Test that VLAN 1 can be configured over mlxsw ports. In the past it
    200	# was used internally for untagged traffic. See commit 47bf9df2e820
    201	# ("mlxsw: spectrum: Forbid creation of VLAN 1 over port/LAG") for more
    202	# details
    203	RET=0
    204
    205	ip link add link $swp1 name $swp1.1 type vlan id 1
    206	check_err $? "did not manage to create vlan 1 when should"
    207
    208	log_test "vlan 1"
    209
    210	ip link del dev $swp1.1
    211}
    212
    213lag_bridge_upper_test()
    214{
    215	# Test that ports cannot be enslaved to LAG devices that have uppers
    216	# and that failure is handled gracefully. See commit b3529af6bb0d
    217	# ("spectrum: Reference count VLAN entries") for more details
    218	RET=0
    219
    220	ip link add name bond1 type bond mode 802.3ad
    221
    222	ip link add name br0 type bridge vlan_filtering 1
    223	ip link set dev bond1 master br0
    224
    225	ip link set dev $swp1 down
    226	ip link set dev $swp1 master bond1 &> /dev/null
    227	check_fail $? "managed to enslave port to lag when should not"
    228
    229	# This might generate a trace, if we did not handle the failure
    230	# correctly
    231	ip -6 address add 2001:db8:1::1/64 dev $swp1
    232	ip -6 address del 2001:db8:1::1/64 dev $swp1
    233
    234	log_test "lag with bridge upper"
    235
    236	ip link del dev br0
    237	ip link del dev bond1
    238}
    239
    240duplicate_vlans_test()
    241{
    242	# Test that on a given port a VLAN is only used once. Either as VLAN
    243	# in a VLAN-aware bridge or as a VLAN device
    244	RET=0
    245
    246	ip link add name br0 type bridge vlan_filtering 1
    247	ip link set dev $swp1 master br0
    248	bridge vlan add vid 10 dev $swp1
    249
    250	ip link add link $swp1 name $swp1.10 type vlan id 10 &> /dev/null
    251	check_fail $? "managed to create vlan device when should not"
    252
    253	bridge vlan del vid 10 dev $swp1
    254	ip link add link $swp1 name $swp1.10 type vlan id 10
    255	check_err $? "did not manage to create vlan device when should"
    256	bridge vlan add vid 10 dev $swp1 &> /dev/null
    257	check_fail $? "managed to add bridge vlan when should not"
    258
    259	log_test "duplicate vlans"
    260
    261	ip link del dev $swp1.10
    262	ip link del dev br0
    263}
    264
    265vlan_rif_refcount_test()
    266{
    267	# Test that RIFs representing VLAN interfaces are not affected from
    268	# ports member in the VLAN. We use the offload indication on routes
    269	# configured on the RIF to understand if it was created / destroyed
    270	RET=0
    271
    272	ip link add name br0 type bridge vlan_filtering 1
    273	ip link set dev $swp1 master br0
    274
    275	ip link set dev $swp1 up
    276	ip link set dev br0 up
    277
    278	ip link add link br0 name br0.10 up type vlan id 10
    279	ip -6 address add 2001:db8:1::1/64 dev br0.10
    280
    281	busywait "$TIMEOUT" wait_for_offload \
    282		ip -6 route get fibmatch 2001:db8:1::2 dev br0.10
    283	check_err $? "vlan rif was not created before adding port to vlan"
    284
    285	bridge vlan add vid 10 dev $swp1
    286	busywait "$TIMEOUT" wait_for_offload \
    287		ip -6 route get fibmatch 2001:db8:1::2 dev br0.10
    288	check_err $? "vlan rif was destroyed after adding port to vlan"
    289
    290	bridge vlan del vid 10 dev $swp1
    291	busywait "$TIMEOUT" wait_for_offload \
    292		ip -6 route get fibmatch 2001:db8:1::2 dev br0.10
    293	check_err $? "vlan rif was destroyed after removing port from vlan"
    294
    295	ip link set dev $swp1 nomaster
    296	busywait "$TIMEOUT" not wait_for_offload \
    297		ip -6 route get fibmatch 2001:db8:1::2 dev br0.10
    298	check_err $? "vlan rif was not destroyed after unlinking port from bridge"
    299
    300	log_test "vlan rif refcount"
    301
    302	ip link del dev br0.10
    303	ip link set dev $swp1 down
    304	ip link del dev br0
    305}
    306
    307subport_rif_refcount_test()
    308{
    309	# Test that RIFs representing upper devices of physical ports are
    310	# reference counted correctly and destroyed when should. We use the
    311	# offload indication on routes configured on the RIF to understand if
    312	# it was created / destroyed
    313	RET=0
    314
    315	ip link add name bond1 type bond mode 802.3ad
    316	ip link set dev $swp1 down
    317	ip link set dev $swp2 down
    318	ip link set dev $swp1 master bond1
    319	ip link set dev $swp2 master bond1
    320
    321	ip link set dev bond1 up
    322	ip link add link bond1 name bond1.10 up type vlan id 10
    323	ip -6 address add 2001:db8:1::1/64 dev bond1
    324	ip -6 address add 2001:db8:2::1/64 dev bond1.10
    325
    326	busywait "$TIMEOUT" wait_for_offload \
    327		ip -6 route get fibmatch 2001:db8:1::2 dev bond1
    328	check_err $? "subport rif was not created on lag device"
    329	busywait "$TIMEOUT" wait_for_offload \
    330		ip -6 route get fibmatch 2001:db8:2::2 dev bond1.10
    331	check_err $? "subport rif was not created on vlan device"
    332
    333	ip link set dev $swp1 nomaster
    334	busywait "$TIMEOUT" wait_for_offload \
    335		ip -6 route get fibmatch 2001:db8:1::2 dev bond1
    336	check_err $? "subport rif of lag device was destroyed when should not"
    337	busywait "$TIMEOUT" wait_for_offload \
    338		ip -6 route get fibmatch 2001:db8:2::2 dev bond1.10
    339	check_err $? "subport rif of vlan device was destroyed when should not"
    340
    341	ip link set dev $swp2 nomaster
    342	busywait "$TIMEOUT" not wait_for_offload \
    343		ip -6 route get fibmatch 2001:db8:1::2 dev bond1
    344	check_err $? "subport rif of lag device was not destroyed when should"
    345	busywait "$TIMEOUT" not wait_for_offload \
    346		ip -6 route get fibmatch 2001:db8:2::2 dev bond1.10
    347	check_err $? "subport rif of vlan device was not destroyed when should"
    348
    349	log_test "subport rif refcount"
    350
    351	ip link del dev bond1.10
    352	ip link del dev bond1
    353}
    354
    355subport_rif_lag_join_test()
    356{
    357	# Test that the reference count of a RIF configured for a LAG is
    358	# incremented / decremented when ports join / leave the LAG. We use the
    359	# offload indication on routes configured on the RIF to understand if
    360	# it was created / destroyed
    361	RET=0
    362
    363	ip link add name bond1 type bond mode 802.3ad
    364	ip link set dev $swp1 down
    365	ip link set dev $swp2 down
    366	ip link set dev $swp1 master bond1
    367	ip link set dev $swp2 master bond1
    368
    369	ip link set dev bond1 up
    370	ip -6 address add 2001:db8:1::1/64 dev bond1
    371
    372	busywait "$TIMEOUT" wait_for_offload \
    373		ip -6 route get fibmatch 2001:db8:1::2 dev bond1
    374	check_err $? "subport rif was not created on lag device"
    375
    376	ip link set dev $swp1 nomaster
    377	busywait "$TIMEOUT" wait_for_offload \
    378		ip -6 route get fibmatch 2001:db8:1::2 dev bond1
    379	check_err $? "subport rif of lag device was destroyed after removing one port"
    380
    381	ip link set dev $swp1 master bond1
    382	ip link set dev $swp2 nomaster
    383	busywait "$TIMEOUT" wait_for_offload \
    384		ip -6 route get fibmatch 2001:db8:1::2 dev bond1
    385	check_err $? "subport rif of lag device was destroyed after re-adding a port and removing another"
    386
    387	ip link set dev $swp1 nomaster
    388	busywait "$TIMEOUT" not wait_for_offload \
    389		ip -6 route get fibmatch 2001:db8:1::2 dev bond1
    390	check_err $? "subport rif of lag device was not destroyed when should"
    391
    392	log_test "subport rif lag join"
    393
    394	ip link del dev bond1
    395}
    396
    397vlan_dev_deletion_test()
    398{
    399	# Test that VLAN devices are correctly deleted / unlinked when enslaved
    400	# to bridge
    401	RET=0
    402
    403	ip link add name br10 type bridge
    404	ip link add name br20 type bridge
    405	ip link add name br30 type bridge
    406	ip link add link $swp1 name $swp1.10 type vlan id 10
    407	ip link add link $swp1 name $swp1.20 type vlan id 20
    408	ip link add link $swp1 name $swp1.30 type vlan id 30
    409	ip link set dev $swp1.10 master br10
    410	ip link set dev $swp1.20 master br20
    411	ip link set dev $swp1.30 master br30
    412
    413	# If we did not handle the situation correctly, then these operations
    414	# might produce a trace
    415	ip link set dev $swp1.30 nomaster
    416	ip link del dev $swp1.20
    417	# Deletion via ioctl uses different code paths from netlink
    418	vconfig rem $swp1.10 &> /dev/null
    419
    420	log_test "vlan device deletion"
    421
    422	ip link del dev $swp1.30
    423	ip link del dev br30
    424	ip link del dev br20
    425	ip link del dev br10
    426}
    427
    428lag_create()
    429{
    430	ip link add name bond1 type bond mode 802.3ad
    431	ip link set dev $swp1 down
    432	ip link set dev $swp2 down
    433	ip link set dev $swp1 master bond1
    434	ip link set dev $swp2 master bond1
    435
    436	ip link add link bond1 name bond1.10 type vlan id 10
    437	ip link add link bond1 name bond1.20 type vlan id 20
    438
    439	ip link add name br0 type bridge vlan_filtering 1
    440	ip link set dev bond1 master br0
    441
    442	ip link add name br10 type bridge
    443	ip link set dev bond1.10 master br10
    444
    445	ip link add name br20 type bridge
    446	ip link set dev bond1.20 master br20
    447}
    448
    449lag_unlink_slaves_test()
    450{
    451	# Test that ports are correctly unlinked from their LAG master, when
    452	# the LAG and its VLAN uppers are enslaved to bridges
    453	RET=0
    454
    455	lag_create
    456
    457	ip link set dev $swp1 nomaster
    458	check_err $? "lag slave $swp1 was not unlinked from master"
    459	ip link set dev $swp2 nomaster
    460	check_err $? "lag slave $swp2 was not unlinked from master"
    461
    462	# Try to configure corresponding VLANs as router interfaces
    463	ip -6 address add 2001:db8:1::1/64 dev $swp1
    464	check_err $? "failed to configure ip address on $swp1"
    465
    466	ip link add link $swp1 name $swp1.10 type vlan id 10
    467	ip -6 address add 2001:db8:10::1/64 dev $swp1.10
    468	check_err $? "failed to configure ip address on $swp1.10"
    469
    470	ip link add link $swp1 name $swp1.20 type vlan id 20
    471	ip -6 address add 2001:db8:20::1/64 dev $swp1.20
    472	check_err $? "failed to configure ip address on $swp1.20"
    473
    474	log_test "lag slaves unlinking"
    475
    476	ip link del dev $swp1.20
    477	ip link del dev $swp1.10
    478	ip address flush dev $swp1
    479
    480	ip link del dev br20
    481	ip link del dev br10
    482	ip link del dev br0
    483	ip link del dev bond1
    484}
    485
    486lag_dev_deletion_test()
    487{
    488	# Test that LAG device is correctly deleted, when the LAG and its VLAN
    489	# uppers are enslaved to bridges
    490	RET=0
    491
    492	lag_create
    493
    494	ip link del dev bond1
    495
    496	log_test "lag device deletion"
    497
    498	ip link del dev br20
    499	ip link del dev br10
    500	ip link del dev br0
    501}
    502
    503vlan_interface_uppers_test()
    504{
    505	# Test that uppers of a VLAN interface are correctly sanitized
    506	RET=0
    507
    508	ip link add name br0 type bridge vlan_filtering 1
    509	ip link set dev $swp1 master br0
    510
    511	ip link add link br0 name br0.10 type vlan id 10
    512	ip link add link br0.10 name macvlan0 \
    513		type macvlan mode private &> /dev/null
    514	check_fail $? "managed to create a macvlan when should not"
    515
    516	ip -6 address add 2001:db8:1::1/64 dev br0.10
    517	ip link add link br0.10 name macvlan0 type macvlan mode private
    518	check_err $? "did not manage to create a macvlan when should"
    519
    520	ip link del dev macvlan0
    521
    522	ip link add name vrf-test type vrf table 10
    523	ip link set dev br0.10 master vrf-test
    524	check_err $? "did not manage to enslave vlan interface to vrf"
    525	ip link del dev vrf-test
    526
    527	ip link add name br-test type bridge
    528	ip link set dev br0.10 master br-test &> /dev/null
    529	check_fail $? "managed to enslave vlan interface to bridge when should not"
    530	ip link del dev br-test
    531
    532	log_test "vlan interface uppers"
    533
    534	ip link del dev br0
    535}
    536
    537bridge_extern_learn_test()
    538{
    539	# Test that externally learned entries added from user space are
    540	# marked as offloaded
    541	RET=0
    542
    543	ip link add name br0 type bridge
    544	ip link set dev $swp1 master br0
    545
    546	bridge fdb add de:ad:be:ef:13:37 dev $swp1 master extern_learn
    547
    548	busywait "$TIMEOUT" wait_for_offload \
    549		bridge fdb show brport $swp1 de:ad:be:ef:13:37
    550	check_err $? "fdb entry not marked as offloaded when should"
    551
    552	log_test "externally learned fdb entry"
    553
    554	ip link del dev br0
    555}
    556
    557neigh_offload_test()
    558{
    559	# Test that IPv4 and IPv6 neighbour entries are marked as offloaded
    560	RET=0
    561
    562	ip -4 address add 192.0.2.1/24 dev $swp1
    563	ip -6 address add 2001:db8:1::1/64 dev $swp1
    564
    565	ip -4 neigh add 192.0.2.2 lladdr de:ad:be:ef:13:37 nud perm dev $swp1
    566	ip -6 neigh add 2001:db8:1::2 lladdr de:ad:be:ef:13:37 nud perm \
    567		dev $swp1
    568
    569	busywait "$TIMEOUT" wait_for_offload \
    570		ip -4 neigh show dev $swp1 192.0.2.2
    571	check_err $? "ipv4 neigh entry not marked as offloaded when should"
    572	busywait "$TIMEOUT" wait_for_offload \
    573		ip -6 neigh show dev $swp1 2001:db8:1::2
    574	check_err $? "ipv6 neigh entry not marked as offloaded when should"
    575
    576	log_test "neighbour offload indication"
    577
    578	ip -6 neigh del 2001:db8:1::2 dev $swp1
    579	ip -4 neigh del 192.0.2.2 dev $swp1
    580	ip -6 address del 2001:db8:1::1/64 dev $swp1
    581	ip -4 address del 192.0.2.1/24 dev $swp1
    582}
    583
    584nexthop_offload_test()
    585{
    586	# Test that IPv4 and IPv6 nexthops are marked as offloaded
    587	RET=0
    588
    589	sysctl_set net.ipv6.conf.$swp2.keep_addr_on_down 1
    590	simple_if_init $swp1 192.0.2.1/24 2001:db8:1::1/64
    591	simple_if_init $swp2 192.0.2.2/24 2001:db8:1::2/64
    592	setup_wait
    593
    594	ip -4 route add 198.51.100.0/24 vrf v$swp1 \
    595		nexthop via 192.0.2.2 dev $swp1
    596	ip -6 route add 2001:db8:2::/64 vrf v$swp1 \
    597		nexthop via 2001:db8:1::2 dev $swp1
    598
    599	busywait "$TIMEOUT" wait_for_offload \
    600		ip -4 route show 198.51.100.0/24 vrf v$swp1
    601	check_err $? "ipv4 nexthop not marked as offloaded when should"
    602	busywait "$TIMEOUT" wait_for_offload \
    603		ip -6 route show 2001:db8:2::/64 vrf v$swp1
    604	check_err $? "ipv6 nexthop not marked as offloaded when should"
    605
    606	ip link set dev $swp2 down
    607	sleep 1
    608
    609	busywait "$TIMEOUT" not wait_for_offload \
    610		ip -4 route show 198.51.100.0/24 vrf v$swp1
    611	check_err $? "ipv4 nexthop marked as offloaded when should not"
    612	busywait "$TIMEOUT" not wait_for_offload \
    613		ip -6 route show 2001:db8:2::/64 vrf v$swp1
    614	check_err $? "ipv6 nexthop marked as offloaded when should not"
    615
    616	ip link set dev $swp2 up
    617	setup_wait
    618
    619	busywait "$TIMEOUT" wait_for_offload \
    620		ip -4 route show 198.51.100.0/24 vrf v$swp1
    621	check_err $? "ipv4 nexthop not marked as offloaded after neigh add"
    622	busywait "$TIMEOUT" wait_for_offload \
    623		ip -6 route show 2001:db8:2::/64 vrf v$swp1
    624	check_err $? "ipv6 nexthop not marked as offloaded after neigh add"
    625
    626	log_test "nexthop offload indication"
    627
    628	ip -6 route del 2001:db8:2::/64 vrf v$swp1
    629	ip -4 route del 198.51.100.0/24 vrf v$swp1
    630
    631	simple_if_fini $swp2 192.0.2.2/24 2001:db8:1::2/64
    632	simple_if_fini $swp1 192.0.2.1/24 2001:db8:1::1/64
    633	sysctl_restore net.ipv6.conf.$swp2.keep_addr_on_down
    634}
    635
    636nexthop_obj_invalid_test()
    637{
    638	# Test that invalid nexthop object configurations are rejected
    639	RET=0
    640
    641	simple_if_init $swp1 192.0.2.1/24 2001:db8:1::1/64
    642	simple_if_init $swp2 192.0.2.2/24 2001:db8:1::2/64
    643	setup_wait
    644
    645	ip nexthop add id 1 via 192.0.2.3 fdb
    646	check_fail $? "managed to configure an FDB nexthop when should not"
    647
    648	ip nexthop add id 1 encap mpls 200/300 via 192.0.2.3 dev $swp1
    649	check_fail $? "managed to configure a nexthop with MPLS encap when should not"
    650
    651	ip nexthop add id 1 dev $swp1
    652	ip nexthop add id 2 dev $swp1
    653	ip nexthop add id 3 via 192.0.2.3 dev $swp1
    654	ip nexthop add id 10 group 1/2
    655	check_fail $? "managed to configure a nexthop group with device-only nexthops when should not"
    656
    657	ip nexthop add id 10 group 3 type resilient buckets 7
    658	check_fail $? "managed to configure a too small resilient nexthop group when should not"
    659
    660	ip nexthop add id 10 group 3 type resilient buckets 129
    661	check_fail $? "managed to configure a resilient nexthop group with invalid number of buckets when should not"
    662
    663	ip nexthop add id 10 group 1/2 type resilient buckets 32
    664	check_fail $? "managed to configure a resilient nexthop group with device-only nexthops when should not"
    665
    666	ip nexthop add id 10 group 3 type resilient buckets 32
    667	check_err $? "failed to configure a valid resilient nexthop group"
    668	ip nexthop replace id 3 dev $swp1
    669	check_fail $? "managed to populate a nexthop bucket with a device-only nexthop when should not"
    670
    671	log_test "nexthop objects - invalid configurations"
    672
    673	ip nexthop del id 10
    674	ip nexthop del id 3
    675	ip nexthop del id 2
    676	ip nexthop del id 1
    677
    678	simple_if_fini $swp2 192.0.2.2/24 2001:db8:1::2/64
    679	simple_if_fini $swp1 192.0.2.1/24 2001:db8:1::1/64
    680}
    681
    682nexthop_obj_offload_test()
    683{
    684	# Test offload indication of nexthop objects
    685	RET=0
    686
    687	simple_if_init $swp1 192.0.2.1/24 2001:db8:1::1/64
    688	simple_if_init $swp2
    689	setup_wait
    690
    691	ip nexthop add id 1 via 192.0.2.2 dev $swp1
    692	ip neigh replace 192.0.2.2 lladdr 00:11:22:33:44:55 nud perm \
    693		dev $swp1
    694
    695	busywait "$TIMEOUT" wait_for_offload \
    696		ip nexthop show id 1
    697	check_err $? "nexthop not marked as offloaded when should"
    698
    699	ip neigh replace 192.0.2.2 nud failed dev $swp1
    700	busywait "$TIMEOUT" not wait_for_offload \
    701		ip nexthop show id 1
    702	check_err $? "nexthop marked as offloaded after setting neigh to failed state"
    703
    704	ip neigh replace 192.0.2.2 lladdr 00:11:22:33:44:55 nud perm \
    705		dev $swp1
    706	busywait "$TIMEOUT" wait_for_offload \
    707		ip nexthop show id 1
    708	check_err $? "nexthop not marked as offloaded after neigh replace"
    709
    710	ip nexthop replace id 1 via 192.0.2.3 dev $swp1
    711	busywait "$TIMEOUT" not wait_for_offload \
    712		ip nexthop show id 1
    713	check_err $? "nexthop marked as offloaded after replacing to use an invalid address"
    714
    715	ip nexthop replace id 1 via 192.0.2.2 dev $swp1
    716	busywait "$TIMEOUT" wait_for_offload \
    717		ip nexthop show id 1
    718	check_err $? "nexthop not marked as offloaded after replacing to use a valid address"
    719
    720	log_test "nexthop objects offload indication"
    721
    722	ip neigh del 192.0.2.2 dev $swp1
    723	ip nexthop del id 1
    724
    725	simple_if_fini $swp2
    726	simple_if_fini $swp1 192.0.2.1/24 2001:db8:1::1/64
    727}
    728
    729nexthop_obj_group_offload_test()
    730{
    731	# Test offload indication of nexthop group objects
    732	RET=0
    733
    734	simple_if_init $swp1 192.0.2.1/24 2001:db8:1::1/64
    735	simple_if_init $swp2
    736	setup_wait
    737
    738	ip nexthop add id 1 via 192.0.2.2 dev $swp1
    739	ip nexthop add id 2 via 2001:db8:1::2 dev $swp1
    740	ip nexthop add id 10 group 1/2
    741	ip neigh replace 192.0.2.2 lladdr 00:11:22:33:44:55 nud perm \
    742		dev $swp1
    743	ip neigh replace 192.0.2.3 lladdr 00:11:22:33:44:55 nud perm \
    744		dev $swp1
    745	ip neigh replace 2001:db8:1::2 lladdr 00:11:22:33:44:55 nud perm \
    746		dev $swp1
    747
    748	busywait "$TIMEOUT" wait_for_offload \
    749		ip nexthop show id 1
    750	check_err $? "IPv4 nexthop not marked as offloaded when should"
    751	busywait "$TIMEOUT" wait_for_offload \
    752		ip nexthop show id 2
    753	check_err $? "IPv6 nexthop not marked as offloaded when should"
    754	busywait "$TIMEOUT" wait_for_offload \
    755		ip nexthop show id 10
    756	check_err $? "nexthop group not marked as offloaded when should"
    757
    758	# Invalidate nexthop id 1
    759	ip neigh replace 192.0.2.2 nud failed dev $swp1
    760	busywait "$TIMEOUT" not wait_for_offload \
    761		ip nexthop show id 10
    762	check_fail $? "nexthop group not marked as offloaded with one valid nexthop"
    763
    764	# Invalidate nexthop id 2
    765	ip neigh replace 2001:db8:1::2 nud failed dev $swp1
    766	busywait "$TIMEOUT" not wait_for_offload \
    767		ip nexthop show id 10
    768	check_err $? "nexthop group marked as offloaded when should not"
    769
    770	# Revalidate nexthop id 1
    771	ip nexthop replace id 1 via 192.0.2.3 dev $swp1
    772	busywait "$TIMEOUT" wait_for_offload \
    773		ip nexthop show id 10
    774	check_err $? "nexthop group not marked as offloaded after revalidating nexthop"
    775
    776	log_test "nexthop group objects offload indication"
    777
    778	ip neigh del 2001:db8:1::2 dev $swp1
    779	ip neigh del 192.0.2.3 dev $swp1
    780	ip neigh del 192.0.2.2 dev $swp1
    781	ip nexthop del id 10
    782	ip nexthop del id 2
    783	ip nexthop del id 1
    784
    785	simple_if_fini $swp2
    786	simple_if_fini $swp1 192.0.2.1/24 2001:db8:1::1/64
    787}
    788
    789nexthop_obj_bucket_offload_test()
    790{
    791	# Test offload indication of nexthop buckets
    792	RET=0
    793
    794	simple_if_init $swp1 192.0.2.1/24 2001:db8:1::1/64
    795	simple_if_init $swp2
    796	setup_wait
    797
    798	ip nexthop add id 1 via 192.0.2.2 dev $swp1
    799	ip nexthop add id 2 via 2001:db8:1::2 dev $swp1
    800	ip nexthop add id 10 group 1/2 type resilient buckets 32 idle_timer 0
    801	ip neigh replace 192.0.2.2 lladdr 00:11:22:33:44:55 nud perm \
    802		dev $swp1
    803	ip neigh replace 192.0.2.3 lladdr 00:11:22:33:44:55 nud perm \
    804		dev $swp1
    805	ip neigh replace 2001:db8:1::2 lladdr 00:11:22:33:44:55 nud perm \
    806		dev $swp1
    807
    808	busywait "$TIMEOUT" wait_for_offload \
    809		ip nexthop bucket show nhid 1
    810	check_err $? "IPv4 nexthop buckets not marked as offloaded when should"
    811	busywait "$TIMEOUT" wait_for_offload \
    812		ip nexthop bucket show nhid 2
    813	check_err $? "IPv6 nexthop buckets not marked as offloaded when should"
    814
    815	# Invalidate nexthop id 1
    816	ip neigh replace 192.0.2.2 nud failed dev $swp1
    817	busywait "$TIMEOUT" wait_for_trap \
    818		ip nexthop bucket show nhid 1
    819	check_err $? "IPv4 nexthop buckets not marked with trap when should"
    820
    821	# Invalidate nexthop id 2
    822	ip neigh replace 2001:db8:1::2 nud failed dev $swp1
    823	busywait "$TIMEOUT" wait_for_trap \
    824		ip nexthop bucket show nhid 2
    825	check_err $? "IPv6 nexthop buckets not marked with trap when should"
    826
    827	# Revalidate nexthop id 1 by changing its configuration
    828	ip nexthop replace id 1 via 192.0.2.3 dev $swp1
    829	busywait "$TIMEOUT" wait_for_offload \
    830		ip nexthop bucket show nhid 1
    831	check_err $? "nexthop bucket not marked as offloaded after revalidating nexthop"
    832
    833	# Revalidate nexthop id 2 by changing its neighbour
    834	ip neigh replace 2001:db8:1::2 lladdr 00:11:22:33:44:55 nud perm \
    835		dev $swp1
    836	busywait "$TIMEOUT" wait_for_offload \
    837		ip nexthop bucket show nhid 2
    838	check_err $? "nexthop bucket not marked as offloaded after revalidating neighbour"
    839
    840	log_test "nexthop bucket offload indication"
    841
    842	ip neigh del 2001:db8:1::2 dev $swp1
    843	ip neigh del 192.0.2.3 dev $swp1
    844	ip neigh del 192.0.2.2 dev $swp1
    845	ip nexthop del id 10
    846	ip nexthop del id 2
    847	ip nexthop del id 1
    848
    849	simple_if_fini $swp2
    850	simple_if_fini $swp1 192.0.2.1/24 2001:db8:1::1/64
    851}
    852
    853nexthop_obj_blackhole_offload_test()
    854{
    855	# Test offload indication of blackhole nexthop objects
    856	RET=0
    857
    858	ip nexthop add id 1 blackhole
    859	busywait "$TIMEOUT" wait_for_offload \
    860		ip nexthop show id 1
    861	check_err $? "Blackhole nexthop not marked as offloaded when should"
    862
    863	ip nexthop add id 10 group 1
    864	busywait "$TIMEOUT" wait_for_offload \
    865		ip nexthop show id 10
    866	check_err $? "Nexthop group not marked as offloaded when should"
    867
    868	log_test "blackhole nexthop objects offload indication"
    869
    870	ip nexthop del id 10
    871	ip nexthop del id 1
    872}
    873
    874nexthop_obj_route_offload_test()
    875{
    876	# Test offload indication of routes using nexthop objects
    877	RET=0
    878
    879	simple_if_init $swp1 192.0.2.1/24 2001:db8:1::1/64
    880	simple_if_init $swp2
    881	setup_wait
    882
    883	ip nexthop add id 1 via 192.0.2.2 dev $swp1
    884	ip neigh replace 192.0.2.2 lladdr 00:11:22:33:44:55 nud perm \
    885		dev $swp1
    886	ip neigh replace 192.0.2.3 lladdr 00:11:22:33:44:55 nud perm \
    887		dev $swp1
    888
    889	ip route replace 198.51.100.0/24 nhid 1
    890	busywait "$TIMEOUT" wait_for_offload \
    891		ip route show 198.51.100.0/24
    892	check_err $? "route not marked as offloaded when using valid nexthop"
    893
    894	ip nexthop replace id 1 via 192.0.2.3 dev $swp1
    895	busywait "$TIMEOUT" wait_for_offload \
    896		ip route show 198.51.100.0/24
    897	check_err $? "route not marked as offloaded after replacing valid nexthop with a valid one"
    898
    899	ip nexthop replace id 1 via 192.0.2.4 dev $swp1
    900	busywait "$TIMEOUT" not wait_for_offload \
    901		ip route show 198.51.100.0/24
    902	check_err $? "route marked as offloaded after replacing valid nexthop with an invalid one"
    903
    904	ip nexthop replace id 1 via 192.0.2.2 dev $swp1
    905	busywait "$TIMEOUT" wait_for_offload \
    906		ip route show 198.51.100.0/24
    907	check_err $? "route not marked as offloaded after replacing invalid nexthop with a valid one"
    908
    909	log_test "routes using nexthop objects offload indication"
    910
    911	ip route del 198.51.100.0/24
    912	ip neigh del 192.0.2.3 dev $swp1
    913	ip neigh del 192.0.2.2 dev $swp1
    914	ip nexthop del id 1
    915
    916	simple_if_fini $swp2
    917	simple_if_fini $swp1 192.0.2.1/24 2001:db8:1::1/64
    918}
    919
    920devlink_reload_test()
    921{
    922	# Test that after executing all the above configuration tests, a
    923	# devlink reload can be performed without errors
    924	RET=0
    925
    926	devlink dev reload "$DEVLINK_DEV"
    927	check_err $? "devlink reload failed"
    928
    929	log_test "devlink reload - last test"
    930
    931	sleep 20
    932}
    933
    934trap cleanup EXIT
    935
    936setup_prepare
    937setup_wait
    938
    939tests_run
    940
    941exit $EXIT_STATUS