Skip to content

Commit

Permalink
selftests: Add an occupancy test for RIF MAC profiles
Browse files Browse the repository at this point in the history
When all the RIF MAC profiles are in use, test that it is possible to
change the MAC of a netdev (i.e., a RIF) when its MAC profile is not
shared with other RIFs. Test that replacement fails when the MAC profile
is shared.

Signed-off-by: Danielle Ratson <danieller@nvidia.com>
Signed-off-by: Ido Schimmel <idosch@nvidia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Danielle Ratson authored and David S. Miller committed Oct 26, 2021
1 parent a10b7ba commit 20d446d
Showing 1 changed file with 117 additions and 0 deletions.
117 changes: 117 additions & 0 deletions tools/testing/selftests/drivers/net/mlxsw/rif_mac_profiles_occ.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0

lib_dir=$(dirname $0)/../../../net/forwarding

ALL_TESTS="
rif_mac_profile_edit_test
"
NUM_NETIFS=2
source $lib_dir/lib.sh
source $lib_dir/devlink_lib.sh

setup_prepare()
{
h1=${NETIFS[p1]}
h2=${NETIFS[p2]}

# Disable IPv6 on the two interfaces to avoid IPv6 link-local addresses
# being generated and RIFs being created
sysctl_set net.ipv6.conf.$h1.disable_ipv6 1
sysctl_set net.ipv6.conf.$h2.disable_ipv6 1

ip link set $h1 up
ip link set $h2 up
}

cleanup()
{
pre_cleanup

ip link set $h2 down
ip link set $h1 down

sysctl_restore net.ipv6.conf.$h2.disable_ipv6
sysctl_restore net.ipv6.conf.$h1.disable_ipv6

# Reload in order to clean all the RIFs and RIF MAC profiles created
devlink_reload
}

create_max_rif_mac_profiles()
{
local count=$1; shift
local batch_file="$(mktemp)"

for ((i = 1; i <= count; i++)); do
vlan=$(( i*10 ))
m=$(( i*11 ))

cat >> $batch_file <<-EOF
link add link $h1 name $h1.$vlan \
address 00:$m:$m:$m:$m:$m type vlan id $vlan
address add 192.0.$m.1/24 dev $h1.$vlan
EOF
done

ip -b $batch_file &> /dev/null
rm -f $batch_file
}

rif_mac_profile_replacement_test()
{
local h1_10_mac=$(mac_get $h1.10)

RET=0

ip link set $h1.10 address 00:12:34:56:78:99
check_err $?

log_test "RIF MAC profile replacement"

ip link set $h1.10 address $h1_10_mac
}

rif_mac_profile_shared_replacement_test()
{
local count=$1; shift
local i=$((count + 1))
local vlan=$(( i*10 ))
local m=11

RET=0

# Create a VLAN netdevice that has the same MAC as the first one.
ip link add link $h1 name $h1.$vlan address 00:$m:$m:$m:$m:$m \
type vlan id $vlan
ip address add 192.0.$m.1/24 dev $h1.$vlan

# MAC replacement should fail because all the MAC profiles are in use
# and the profile is shared between multiple RIFs
m=$(( i*11 ))
ip link set $h1.$vlan address 00:$m:$m:$m:$m:$m &> /dev/null
check_fail $?

log_test "RIF MAC profile shared replacement"

ip link del dev $h1.$vlan
}

rif_mac_profile_edit_test()
{
local count=$(devlink_resource_size_get rif_mac_profiles)

create_max_rif_mac_profiles $count

rif_mac_profile_replacement_test
rif_mac_profile_shared_replacement_test $count
}

trap cleanup EXIT

setup_prepare
setup_wait

tests_run

exit $EXIT_STATUS

0 comments on commit 20d446d

Please sign in to comment.