mirror of https://github.com/torvalds/linux.git
171 lines
4.4 KiB
Bash
Executable File
171 lines
4.4 KiB
Bash
Executable File
#!/bin/bash
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
|
|
# +-----------------------+ +------------------------+
|
|
# | H1 (vrf) | | H2 (vrf) |
|
|
# | 192.0.2.1/28 | | 192.0.2.2/28 |
|
|
# | + $h1 | | + $h2 |
|
|
# +----|------------------+ +----|-------------------+
|
|
# | |
|
|
# +----|--------------------------------------------------|-------------------+
|
|
# | SW | | |
|
|
# | +--|--------------------------------------------------|-----------------+ |
|
|
# | | + $swp1 BR1 (802.1d) + $swp2 | |
|
|
# | | | |
|
|
# | +-----------------------------------------------------------------------+ |
|
|
# +---------------------------------------------------------------------------+
|
|
|
|
ALL_TESTS="
|
|
new_inactive_test
|
|
existing_active_test
|
|
norefresh_test
|
|
"
|
|
|
|
NUM_NETIFS=4
|
|
source lib.sh
|
|
|
|
h1_create()
|
|
{
|
|
adf_simple_if_init "$h1" 192.0.2.1/28
|
|
}
|
|
|
|
h2_create()
|
|
{
|
|
adf_simple_if_init "$h2" 192.0.2.2/28
|
|
}
|
|
|
|
switch_create()
|
|
{
|
|
adf_ip_link_add br1 type bridge vlan_filtering 0 mcast_snooping 0 \
|
|
ageing_time "$LOW_AGEING_TIME"
|
|
adf_ip_link_set_up br1
|
|
|
|
adf_ip_link_set_master "$swp1" br1
|
|
adf_ip_link_set_up "$swp1"
|
|
|
|
adf_ip_link_set_master "$swp2" br1
|
|
adf_ip_link_set_up "$swp2"
|
|
}
|
|
|
|
setup_prepare()
|
|
{
|
|
h1=${NETIFS[p1]}
|
|
swp1=${NETIFS[p2]}
|
|
|
|
swp2=${NETIFS[p3]}
|
|
h2=${NETIFS[p4]}
|
|
|
|
adf_vrf_prepare
|
|
|
|
h1_create
|
|
h2_create
|
|
switch_create
|
|
}
|
|
|
|
fdb_active_wait()
|
|
{
|
|
local mac=$1; shift
|
|
|
|
bridge -d fdb get "$mac" br br1 | grep -q -v "inactive"
|
|
}
|
|
|
|
fdb_inactive_wait()
|
|
{
|
|
local mac=$1; shift
|
|
|
|
bridge -d fdb get "$mac" br br1 | grep -q "inactive"
|
|
}
|
|
|
|
new_inactive_test()
|
|
{
|
|
local mac="00:11:22:33:44:55"
|
|
|
|
# Add a new FDB entry as static and inactive and check that it
|
|
# becomes active upon traffic.
|
|
RET=0
|
|
|
|
bridge fdb add "$mac" dev "$swp1" master static activity_notify inactive
|
|
bridge -d fdb get "$mac" br br1 | grep -q "inactive"
|
|
check_err $? "FDB entry not present as \"inactive\" when should"
|
|
|
|
$MZ "$h1" -c 1 -p 64 -a "$mac" -b bcast -t ip -q
|
|
|
|
busywait "$BUSYWAIT_TIMEOUT" fdb_active_wait "$mac"
|
|
check_err $? "FDB entry present as \"inactive\" when should not"
|
|
|
|
log_test "Transition from inactive to active"
|
|
|
|
bridge fdb del "$mac" dev "$swp1" master
|
|
}
|
|
|
|
existing_active_test()
|
|
{
|
|
local mac="00:11:22:33:44:55"
|
|
local ageing_time
|
|
|
|
# Enable activity notifications on an existing dynamic FDB entry and
|
|
# check that it becomes inactive after the ageing time passed.
|
|
RET=0
|
|
|
|
bridge fdb add "$mac" dev "$swp1" master dynamic
|
|
bridge fdb replace "$mac" dev "$swp1" master static activity_notify norefresh
|
|
|
|
bridge -d fdb get "$mac" br br1 | grep -q "activity_notify"
|
|
check_err $? "FDB entry not present as \"activity_notify\" when should"
|
|
|
|
bridge -d fdb get "$mac" br br1 | grep -q "inactive"
|
|
check_fail $? "FDB entry present as \"inactive\" when should not"
|
|
|
|
ageing_time=$(bridge_ageing_time_get br1)
|
|
slowwait $((ageing_time * 2)) fdb_inactive_wait "$mac"
|
|
check_err $? "FDB entry not present as \"inactive\" when should"
|
|
|
|
log_test "Transition from active to inactive"
|
|
|
|
bridge fdb del "$mac" dev "$swp1" master
|
|
}
|
|
|
|
norefresh_test()
|
|
{
|
|
local mac="00:11:22:33:44:55"
|
|
local updated_time
|
|
|
|
# Check that the "updated" time is reset when replacing an FDB entry
|
|
# without the "norefresh" keyword and that it is not reset when
|
|
# replacing with the "norefresh" keyword.
|
|
RET=0
|
|
|
|
bridge fdb add "$mac" dev "$swp1" master static
|
|
sleep 1
|
|
|
|
bridge fdb replace "$mac" dev "$swp1" master static activity_notify
|
|
updated_time=$(bridge -d -s -j fdb get "$mac" br br1 | jq '.[]["updated"]')
|
|
if [[ $updated_time -ne 0 ]]; then
|
|
check_err 1 "\"updated\" time was not reset when should"
|
|
fi
|
|
|
|
sleep 1
|
|
bridge fdb replace "$mac" dev "$swp1" master static norefresh
|
|
updated_time=$(bridge -d -s -j fdb get "$mac" br br1 | jq '.[]["updated"]')
|
|
if [[ $updated_time -eq 0 ]]; then
|
|
check_err 1 "\"updated\" time was reset when should not"
|
|
fi
|
|
|
|
log_test "Resetting of \"updated\" time"
|
|
|
|
bridge fdb del "$mac" dev "$swp1" master
|
|
}
|
|
|
|
if ! bridge fdb help 2>&1 | grep -q "activity_notify"; then
|
|
echo "SKIP: iproute2 too old, missing bridge FDB activity notification control"
|
|
exit "$ksft_skip"
|
|
fi
|
|
|
|
trap cleanup EXIT
|
|
|
|
setup_prepare
|
|
setup_wait
|
|
tests_run
|
|
|
|
exit "$EXIT_STATUS"
|