| #!/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" |