Resguardo inicial

This commit is contained in:
lastdragon
2026-09-06 12:53:21 -06:00
parent 662efe3c2a
commit ad2088d178
94853 changed files with 43200404 additions and 0 deletions
@@ -0,0 +1,117 @@
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
source "../../../../net/forwarding/devlink_lib.sh"
source ../mlxsw_lib.sh
mlxsw_only_on_spectrum 1 || exit 1
# Needed for returning to default
declare -A KVD_DEFAULTS
KVD_CHILDREN="linear hash_single hash_double"
KVDL_CHILDREN="singles chunks large_chunks"
devlink_sp_resource_minimize()
{
local size
local i
for i in $KVD_CHILDREN; do
size=$(devlink_resource_get kvd "$i" | jq '.["size_min"]')
devlink_resource_size_set "$size" kvd "$i"
done
for i in $KVDL_CHILDREN; do
size=$(devlink_resource_get kvd linear "$i" | \
jq '.["size_min"]')
devlink_resource_size_set "$size" kvd linear "$i"
done
}
devlink_sp_size_kvd_to_default()
{
local need_reload=0
local i
for i in $KVD_CHILDREN; do
local size=$(echo "${KVD_DEFAULTS[kvd_$i]}" | jq '.["size"]')
current_size=$(devlink_resource_size_get kvd "$i")
if [ "$size" -ne "$current_size" ]; then
devlink_resource_size_set "$size" kvd "$i"
need_reload=1
fi
done
for i in $KVDL_CHILDREN; do
local size=$(echo "${KVD_DEFAULTS[kvd_linear_$i]}" | \
jq '.["size"]')
current_size=$(devlink_resource_size_get kvd linear "$i")
if [ "$size" -ne "$current_size" ]; then
devlink_resource_size_set "$size" kvd linear "$i"
need_reload=1
fi
done
if [ "$need_reload" -ne "0" ]; then
devlink_reload
fi
}
devlink_sp_read_kvd_defaults()
{
local key
local i
KVD_DEFAULTS[kvd]=$(devlink_resource_get "kvd")
for i in $KVD_CHILDREN; do
key=kvd_$i
KVD_DEFAULTS[$key]=$(devlink_resource_get kvd "$i")
done
for i in $KVDL_CHILDREN; do
key=kvd_linear_$i
KVD_DEFAULTS[$key]=$(devlink_resource_get kvd linear "$i")
done
}
KVD_PROFILES="default scale ipv4_max"
devlink_sp_resource_kvd_profile_set()
{
local profile=$1
case "$profile" in
scale)
devlink_resource_size_set 64000 kvd linear
devlink_resource_size_set 15616 kvd linear singles
devlink_resource_size_set 32000 kvd linear chunks
devlink_resource_size_set 16384 kvd linear large_chunks
devlink_resource_size_set 128000 kvd hash_single
devlink_resource_size_set 48000 kvd hash_double
devlink_reload
;;
ipv4_max)
devlink_resource_size_set 64000 kvd linear
devlink_resource_size_set 15616 kvd linear singles
devlink_resource_size_set 32000 kvd linear chunks
devlink_resource_size_set 16384 kvd linear large_chunks
devlink_resource_size_set 144000 kvd hash_single
devlink_resource_size_set 32768 kvd hash_double
devlink_reload
;;
default)
devlink_resource_size_set 98304 kvd linear
devlink_resource_size_set 16384 kvd linear singles
devlink_resource_size_set 49152 kvd linear chunks
devlink_resource_size_set 32768 kvd linear large_chunks
devlink_resource_size_set 87040 kvd hash_single
devlink_resource_size_set 60416 kvd hash_double
devlink_reload
;;
*)
check_err 1 "Unknown profile $profile"
esac
}
@@ -0,0 +1,120 @@
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
lib_dir=$(dirname $0)/../../../../net/forwarding
NUM_NETIFS=1
source $lib_dir/lib.sh
source devlink_lib_spectrum.sh
setup_prepare()
{
devlink_sp_read_kvd_defaults
}
cleanup()
{
pre_cleanup
devlink_sp_size_kvd_to_default
}
trap cleanup EXIT
setup_prepare
profiles_test()
{
local i
log_info "Running profile tests"
for i in $KVD_PROFILES; do
RET=0
devlink_sp_resource_kvd_profile_set $i
log_test "'$i' profile"
done
# Default is explicitly tested at end to ensure it's actually applied
RET=0
devlink_sp_resource_kvd_profile_set "default"
log_test "'default' profile"
}
resources_min_test()
{
local size
local i
local j
log_info "Running KVD-minimum tests"
for i in $KVD_CHILDREN; do
RET=0
size=$(devlink_resource_get kvd "$i" | jq '.["size_min"]')
devlink_resource_size_set "$size" kvd "$i"
# In case of linear, need to minimize sub-resources as well
if [[ "$i" == "linear" ]]; then
for j in $KVDL_CHILDREN; do
devlink_resource_size_set 0 kvd linear "$j"
done
fi
devlink_reload
devlink_sp_size_kvd_to_default
log_test "'$i' minimize [$size]"
done
}
resources_max_test()
{
local min_size
local size
local i
local j
log_info "Running KVD-maximum tests"
for i in $KVD_CHILDREN; do
RET=0
devlink_sp_resource_minimize
# Calculate the maximum possible size for the given partition
size=$(devlink_resource_size_get kvd)
for j in $KVD_CHILDREN; do
if [ "$i" != "$j" ]; then
min_size=$(devlink_resource_get kvd "$j" | \
jq '.["size_min"]')
size=$((size - min_size))
fi
done
# Test almost maximum size
devlink_resource_size_set "$((size - 128))" kvd "$i"
devlink_reload
log_test "'$i' almost maximize [$((size - 128))]"
# Test above maximum size
devlink resource set "$DEVLINK_DEV" \
path "kvd/$i" size $((size + 128)) &> /dev/null
check_fail $? "Set kvd/$i to size $((size + 128)) should fail"
log_test "'$i' Overflow rejection [$((size + 128))]"
# Test maximum size
if [ "$i" == "hash_single" ] || [ "$i" == "hash_double" ]; then
echo "SKIP: Observed problem with exact max $i"
continue
fi
devlink_resource_size_set "$size" kvd "$i"
devlink_reload
log_test "'$i' maximize [$size]"
devlink_sp_size_kvd_to_default
done
}
profiles_test
resources_min_test
resources_max_test
exit "$RET"
@@ -0,0 +1,16 @@
# SPDX-License-Identifier: GPL-2.0
source ../mirror_gre_scale.sh
mirror_gre_get_target()
{
local should_fail=$1; shift
local target
target=$(devlink_resource_size_get span_agents)
if ((! should_fail)); then
echo $target
else
echo $((target + 1))
fi
}
@@ -0,0 +1,16 @@
# SPDX-License-Identifier: GPL-2.0
source ../port_range_scale.sh
port_range_get_target()
{
local should_fail=$1; shift
local target
target=$(devlink_resource_size_get port_range_registers)
if ((! should_fail)); then
echo $target
else
echo $((target + 1))
fi
}
@@ -0,0 +1,16 @@
# SPDX-License-Identifier: GPL-2.0
source ../port_scale.sh
port_get_target()
{
local should_fail=$1
local target
target=$(devlink_resource_size_get physical_ports)
if ((! should_fail)); then
echo $target
else
echo $((target + 1))
fi
}
@@ -0,0 +1,67 @@
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
lib_dir=$(dirname $0)/../../../../net/forwarding
VXPORT=4789
ALL_TESTS="
create_vxlan_on_top_of_8021ad_bridge
"
NUM_NETIFS=2
source $lib_dir/lib.sh
setup_prepare()
{
swp1=${NETIFS[p1]}
swp2=${NETIFS[p2]}
ip link set dev $swp1 up
ip link set dev $swp2 up
}
cleanup()
{
pre_cleanup
ip link set dev $swp2 down
ip link set dev $swp1 down
}
create_vxlan_on_top_of_8021ad_bridge()
{
RET=0
ip link add dev br0 type bridge vlan_filtering 1 vlan_protocol 802.1ad \
vlan_default_pvid 0 mcast_snooping 0
ip link set dev br0 addrgenmode none
ip link set dev br0 up
ip link add name vx100 type vxlan id 1000 local 192.0.2.17 dstport \
"$VXPORT" nolearning noudpcsum tos inherit ttl 100
ip link set dev vx100 up
ip link set dev $swp1 master br0
ip link set dev vx100 master br0
bridge vlan add vid 100 dev vx100 pvid untagged 2>/dev/null
check_fail $? "802.1ad bridge with VxLAN in Spectrum-1 not rejected"
bridge vlan add vid 100 dev vx100 pvid untagged 2>&1 >/dev/null \
| grep -q mlxsw_spectrum
check_err $? "802.1ad bridge with VxLAN in Spectrum-1 rejected without extack"
log_test "create VxLAN on top of 802.1ad bridge"
ip link del dev vx100
ip link del dev br0
}
trap cleanup EXIT
setup_prepare
setup_wait
tests_run
exit $EXIT_STATUS
@@ -0,0 +1,84 @@
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
lib_dir=$(dirname $0)/../../../../net/forwarding
NUM_NETIFS=6
source $lib_dir/lib.sh
source $lib_dir/tc_common.sh
source devlink_lib_spectrum.sh
current_test=""
cleanup()
{
pre_cleanup
if [ ! -z $current_test ]; then
${current_test}_cleanup
fi
devlink_sp_size_kvd_to_default
}
devlink_sp_read_kvd_defaults
trap cleanup EXIT
ALL_TESTS="
router
tc_flower
mirror_gre
tc_police
port
rif_mac_profile
rif_counter
port_range
"
for current_test in ${TESTS:-$ALL_TESTS}; do
RET_FIN=0
source ${current_test}_scale.sh
num_netifs_var=${current_test^^}_NUM_NETIFS
num_netifs=${!num_netifs_var:-$NUM_NETIFS}
for profile in $KVD_PROFILES; do
RET=0
devlink_sp_resource_kvd_profile_set $profile
if [[ $RET -gt 0 ]]; then
log_test "'$current_test' [$profile] setting"
continue
fi
for should_fail in 0 1; do
RET=0
target=$(${current_test}_get_target "$should_fail")
if ((target == 0)); then
continue
fi
${current_test}_setup_prepare
setup_wait_n $num_netifs
# Update target in case occupancy of a certain resource
# changed following the test setup.
target=$(${current_test}_get_target "$should_fail")
${current_test}_test "$target" "$should_fail"
if [[ "$should_fail" -eq 0 ]]; then
log_test "'$current_test' [$profile] $target"
if ((!RET)); then
tt=${current_test}_traffic_test
if [[ $(type -t $tt) == "function" ]]
then
$tt "$target"
log_test "'$current_test' [$profile] $target traffic test"
fi
fi
else
log_test "'$current_test' [$profile] overflow $target"
fi
${current_test}_cleanup $target
RET_FIN=$(( RET_FIN || RET ))
done
done
done
current_test=""
exit "$RET_FIN"
@@ -0,0 +1,34 @@
# SPDX-License-Identifier: GPL-2.0
source ../rif_counter_scale.sh
rif_counter_get_target()
{
local should_fail=$1; shift
local max_cnts
local max_rifs
local target
max_rifs=$(devlink_resource_size_get rifs)
max_cnts=$(devlink_resource_size_get counters rif)
# Remove already allocated RIFs.
((max_rifs -= $(devlink_resource_occ_get rifs)))
# 10 KVD slots per counter, ingress+egress counters per RIF
((max_cnts /= 20))
# Pointless to run the overflow test if we don't have enough RIFs to
# host all the counters.
if ((max_cnts > max_rifs && should_fail)); then
echo 0
return
fi
target=$((max_rifs < max_cnts ? max_rifs : max_cnts))
if ((! should_fail)); then
echo $target
else
echo $((target + 1))
fi
}
@@ -0,0 +1,16 @@
# SPDX-License-Identifier: GPL-2.0
source ../rif_mac_profile_scale.sh
rif_mac_profile_get_target()
{
local should_fail=$1
local target
target=$(devlink_resource_size_get rif_mac_profiles)
if ((! should_fail)); then
echo $target
else
echo $((target + 1))
fi
}
@@ -0,0 +1,18 @@
# SPDX-License-Identifier: GPL-2.0
source ../router_scale.sh
router_get_target()
{
local should_fail=$1
local target
target=$(devlink_resource_size_get kvd hash_single)
if [[ $should_fail -eq 0 ]]; then
target=$((target * 85 / 100))
else
target=$((target + 1))
fi
echo $target
}
@@ -0,0 +1,19 @@
# SPDX-License-Identifier: GPL-2.0
source ../tc_flower_scale.sh
tc_flower_get_target()
{
local should_fail=$1; shift
# 6144 (6x1024) is the theoretical maximum.
# One bank of 512 rules is taken by the 18-byte MC router rule.
# One rule is the ACL catch-all.
# 6144 - 512 - 1 = 5631
local target=5631
if ((! should_fail)); then
echo $target
else
echo $((target + 1))
fi
}
@@ -0,0 +1,16 @@
# SPDX-License-Identifier: GPL-2.0
source ../tc_police_scale.sh
tc_police_get_target()
{
local should_fail=$1; shift
local target
target=$(devlink_resource_size_get global_policers single_rate_policers)
if ((! should_fail)); then
echo $target
else
echo $((target + 1))
fi
}
@@ -0,0 +1,334 @@
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
#
# Test VxLAN flooding. The device stores flood records in a singly linked list
# where each record stores up to five IPv6 addresses of remote VTEPs. The test
# verifies that packets are correctly flooded in various cases such as deletion
# of a record in the middle of the list.
#
# +-----------------------+
# | H1 (vrf) |
# | + $h1 |
# | | 2001:db8:1::1/64 |
# +----|------------------+
# |
# +----|----------------------------------------------------------------------+
# | SW | |
# | +--|--------------------------------------------------------------------+ |
# | | + $swp1 BR0 (802.1d) | |
# | | | |
# | | + vxlan0 (vxlan) | |
# | | local 2001:db8:2::1 | |
# | | remote 2001:db8:2::{2..21} | |
# | | id 10 dstport 4789 | |
# | +-----------------------------------------------------------------------+ |
# | |
# | 2001:db8:2::0/64 via 2001:db8:3::2 |
# | |
# | + $rp1 |
# | | 2001:db8:3::1/64 |
# +----|----------------------------------------------------------------------+
# |
# +----|--------------------------------------------------------+
# | | R2 (vrf) |
# | + $rp2 |
# | 2001:db8:3::2/64 |
# | |
# +-------------------------------------------------------------+
lib_dir=$(dirname $0)/../../../../net/forwarding
ALL_TESTS="flooding_test"
NUM_NETIFS=4
source $lib_dir/tc_common.sh
source $lib_dir/lib.sh
h1_create()
{
simple_if_init $h1 2001:db8:1::1/64
}
h1_destroy()
{
simple_if_fini $h1 2001:db8:1::1/64
}
switch_create()
{
# Make sure the bridge uses the MAC address of the local port and
# not that of the VxLAN's device
ip link add dev br0 type bridge mcast_snooping 0
ip link set dev br0 address $(mac_get $swp1)
ip link add name vxlan0 type vxlan id 10 nolearning \
udp6zerocsumrx udp6zerocsumtx ttl 20 tos inherit \
local 2001:db8:2::1 dstport 4789
ip address add 2001:db8:2::1/128 dev lo
ip link set dev $swp1 master br0
ip link set dev vxlan0 master br0
ip link set dev br0 up
ip link set dev $swp1 up
ip link set dev vxlan0 up
}
switch_destroy()
{
ip link set dev vxlan0 down
ip link set dev $swp1 down
ip link set dev br0 down
ip link set dev vxlan0 nomaster
ip link set dev $swp1 nomaster
ip address del 2001:db8:2::1/128 dev lo
ip link del dev vxlan0
ip link del dev br0
}
router1_create()
{
# This router is in the default VRF, where the VxLAN device is
# performing the L3 lookup
ip link set dev $rp1 up
ip address add 2001:db8:3::1/64 dev $rp1
ip route add 2001:db8:2::0/64 via 2001:db8:3::2
}
router1_destroy()
{
ip route del 2001:db8:2::0/64 via 2001:db8:3::2
ip address del 2001:db8:3::1/64 dev $rp1
ip link set dev $rp1 down
}
router2_create()
{
# This router is not in the default VRF, so use simple_if_init()
simple_if_init $rp2 2001:db8:3::2/64
}
router2_destroy()
{
simple_if_fini $rp2 2001:db8:3::2/64
}
setup_prepare()
{
h1=${NETIFS[p1]}
swp1=${NETIFS[p2]}
rp1=${NETIFS[p3]}
rp2=${NETIFS[p4]}
vrf_prepare
h1_create
switch_create
router1_create
router2_create
forwarding_enable
}
cleanup()
{
pre_cleanup
forwarding_restore
router2_destroy
router1_destroy
switch_destroy
h1_destroy
vrf_cleanup
}
flooding_remotes_add()
{
local num_remotes=$1
local lsb
local i
for i in $(eval echo {1..$num_remotes}); do
lsb=$((i + 1))
bridge fdb append 00:00:00:00:00:00 dev vxlan0 self \
dst 2001:db8:2::$lsb
done
}
flooding_filters_add()
{
local num_remotes=$1
local lsb
local i
tc qdisc add dev $rp2 clsact
for i in $(eval echo {1..$num_remotes}); do
lsb=$((i + 1))
tc filter add dev $rp2 ingress protocol ipv6 pref $i handle $i \
flower ip_proto udp dst_ip 2001:db8:2::$lsb \
dst_port 4789 skip_sw action drop
done
}
flooding_filters_del()
{
local num_remotes=$1
local i
for i in $(eval echo {1..$num_remotes}); do
tc filter del dev $rp2 ingress protocol ipv6 pref $i \
handle $i flower
done
tc qdisc del dev $rp2 clsact
}
flooding_check_packets()
{
local packets=("$@")
local num_remotes=${#packets[@]}
local i
for i in $(eval echo {1..$num_remotes}); do
tc_check_packets "dev $rp2 ingress" $i ${packets[i - 1]}
check_err $? "remote $i - did not get expected number of packets"
done
}
flooding_test()
{
# Use 20 remote VTEPs that will be stored in 4 records. The array
# 'packets' will store how many packets are expected to be received
# by each remote VTEP at each stage of the test
declare -a packets=(1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
local num_remotes=20
RET=0
# Add FDB entries for remote VTEPs and corresponding tc filters on the
# ingress of the nexthop router. These filters will count how many
# packets were flooded to each remote VTEP
flooding_remotes_add $num_remotes
flooding_filters_add $num_remotes
# Send one packet and make sure it is flooded to all the remote VTEPs
$MZ -6 $h1 -q -p 64 -b de:ad:be:ef:13:37 -t ip -c 1
flooding_check_packets "${packets[@]}"
log_test "flood after 1 packet"
# Delete the third record which corresponds to VTEPs with LSB 12..16
# and check that packet is flooded correctly when we remove a record
# from the middle of the list
RET=0
packets=(2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 2 2 2 2 2)
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::12
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::13
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::14
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::15
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::16
$MZ -6 $h1 -q -p 64 -b de:ad:be:ef:13:37 -t ip -c 1
flooding_check_packets "${packets[@]}"
log_test "flood after 2 packets"
# Delete the first record and make sure the packet is flooded correctly
RET=0
packets=(2 2 2 2 2 3 3 3 3 3 1 1 1 1 1 3 3 3 3 3)
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::2
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::3
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::4
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::5
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::6
$MZ -6 $h1 -q -p 64 -b de:ad:be:ef:13:37 -t ip -c 1
flooding_check_packets "${packets[@]}"
log_test "flood after 3 packets"
# Delete the last record and make sure the packet is flooded correctly
RET=0
packets=(2 2 2 2 2 4 4 4 4 4 1 1 1 1 1 3 3 3 3 3)
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::17
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::18
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::19
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::20
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::21
$MZ -6 $h1 -q -p 64 -b de:ad:be:ef:13:37 -t ip -c 1
flooding_check_packets "${packets[@]}"
log_test "flood after 4 packets"
# Delete the last record, one entry at a time and make sure single
# entries are correctly removed
RET=0
packets=(2 2 2 2 2 4 5 5 5 5 1 1 1 1 1 3 3 3 3 3)
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::7
$MZ -6 $h1 -q -p 64 -b de:ad:be:ef:13:37 -t ip -c 1
flooding_check_packets "${packets[@]}"
log_test "flood after 5 packets"
RET=0
packets=(2 2 2 2 2 4 5 6 6 6 1 1 1 1 1 3 3 3 3 3)
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::8
$MZ -6 $h1 -q -p 64 -b de:ad:be:ef:13:37 -t ip -c 1
flooding_check_packets "${packets[@]}"
log_test "flood after 6 packets"
RET=0
packets=(2 2 2 2 2 4 5 6 7 7 1 1 1 1 1 3 3 3 3 3)
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::9
$MZ -6 $h1 -q -p 64 -b de:ad:be:ef:13:37 -t ip -c 1
flooding_check_packets "${packets[@]}"
log_test "flood after 7 packets"
RET=0
packets=(2 2 2 2 2 4 5 6 7 8 1 1 1 1 1 3 3 3 3 3)
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::10
$MZ -6 $h1 -q -p 64 -b de:ad:be:ef:13:37 -t ip -c 1
flooding_check_packets "${packets[@]}"
log_test "flood after 8 packets"
RET=0
packets=(2 2 2 2 2 4 5 6 7 8 1 1 1 1 1 3 3 3 3 3)
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::11
$MZ -6 $h1 -q -p 64 -b de:ad:be:ef:13:37 -t ip -c 1
flooding_check_packets "${packets[@]}"
log_test "flood after 9 packets"
flooding_filters_del $num_remotes
}
trap cleanup EXIT
setup_prepare
setup_wait
tests_run
exit $EXIT_STATUS