| #!/bin/bash |
| # SPDX-License-Identifier: GPL-2.0 |
| # |
| # This test is for checking functionality of flushing FDB entries. |
| # Check that flush works as expected with all the supported arguments and verify |
| # some combinations of arguments. |
| |
| source lib.sh |
| |
| FLUSH_BY_STATE_TESTS=" |
| vxlan_test_flush_by_permanent |
| vxlan_test_flush_by_nopermanent |
| vxlan_test_flush_by_static |
| vxlan_test_flush_by_nostatic |
| vxlan_test_flush_by_dynamic |
| vxlan_test_flush_by_nodynamic |
| " |
| |
| FLUSH_BY_FLAG_TESTS=" |
| vxlan_test_flush_by_extern_learn |
| vxlan_test_flush_by_noextern_learn |
| vxlan_test_flush_by_router |
| vxlan_test_flush_by_norouter |
| " |
| |
| TESTS=" |
| vxlan_test_flush_by_dev |
| vxlan_test_flush_by_vni |
| vxlan_test_flush_by_src_vni |
| vxlan_test_flush_by_port |
| vxlan_test_flush_by_dst_ip |
| vxlan_test_flush_by_nhid |
| $FLUSH_BY_STATE_TESTS |
| $FLUSH_BY_FLAG_TESTS |
| vxlan_test_flush_by_several_args |
| vxlan_test_flush_by_remote_attributes |
| bridge_test_flush_by_dev |
| bridge_test_flush_by_vlan |
| bridge_vxlan_test_flush |
| " |
| |
| : ${VERBOSE:=0} |
| : ${PAUSE_ON_FAIL:=no} |
| : ${PAUSE:=no} |
| : ${VXPORT:=4789} |
| |
| run_cmd() |
| { |
| local cmd="$1" |
| local out |
| local rc |
| local stderr="2>/dev/null" |
| |
| if [ "$VERBOSE" = "1" ]; then |
| printf "COMMAND: $cmd\n" |
| stderr= |
| fi |
| |
| out=$(eval $cmd $stderr) |
| rc=$? |
| if [ "$VERBOSE" = "1" -a -n "$out" ]; then |
| echo " $out" |
| fi |
| |
| return $rc |
| } |
| |
| log_test() |
| { |
| local rc=$1 |
| local expected=$2 |
| local msg="$3" |
| local nsuccess |
| local nfail |
| local ret |
| |
| if [ ${rc} -eq ${expected} ]; then |
| printf "TEST: %-60s [ OK ]\n" "${msg}" |
| nsuccess=$((nsuccess+1)) |
| else |
| ret=1 |
| nfail=$((nfail+1)) |
| printf "TEST: %-60s [FAIL]\n" "${msg}" |
| if [ "$VERBOSE" = "1" ]; then |
| echo " rc=$rc, expected $expected" |
| fi |
| |
| if [ "${PAUSE_ON_FAIL}" = "yes" ]; then |
| echo |
| echo "hit enter to continue, 'q' to quit" |
| read a |
| [ "$a" = "q" ] && exit 1 |
| fi |
| fi |
| |
| if [ "${PAUSE}" = "yes" ]; then |
| echo |
| echo "hit enter to continue, 'q' to quit" |
| read a |
| [ "$a" = "q" ] && exit 1 |
| fi |
| |
| [ "$VERBOSE" = "1" ] && echo |
| } |
| |
| MAC_POOL_1=" |
| de:ad:be:ef:13:10 |
| de:ad:be:ef:13:11 |
| de:ad:be:ef:13:12 |
| de:ad:be:ef:13:13 |
| de:ad:be:ef:13:14 |
| " |
| mac_pool_1_len=$(echo "$MAC_POOL_1" | grep -c .) |
| |
| MAC_POOL_2=" |
| ca:fe:be:ef:13:10 |
| ca:fe:be:ef:13:11 |
| ca:fe:be:ef:13:12 |
| ca:fe:be:ef:13:13 |
| ca:fe:be:ef:13:14 |
| " |
| mac_pool_2_len=$(echo "$MAC_POOL_2" | grep -c .) |
| |
| fdb_add_mac_pool_1() |
| { |
| local dev=$1; shift |
| local args="$@" |
| |
| for mac in $MAC_POOL_1 |
| do |
| $BRIDGE fdb add $mac dev $dev $args |
| done |
| } |
| |
| fdb_add_mac_pool_2() |
| { |
| local dev=$1; shift |
| local args="$@" |
| |
| for mac in $MAC_POOL_2 |
| do |
| $BRIDGE fdb add $mac dev $dev $args |
| done |
| } |
| |
| fdb_check_n_entries_by_dev_filter() |
| { |
| local dev=$1; shift |
| local exp_entries=$1; shift |
| local filter="$@" |
| |
| local entries=$($BRIDGE fdb show dev $dev | grep "$filter" | wc -l) |
| |
| [[ $entries -eq $exp_entries ]] |
| rc=$? |
| |
| log_test $rc 0 "$dev: Expected $exp_entries FDB entries, got $entries" |
| return $rc |
| } |
| |
| vxlan_test_flush_by_dev() |
| { |
| local vni=3000 |
| local dst_ip=192.0.2.1 |
| |
| fdb_add_mac_pool_1 vx10 vni $vni dst $dst_ip |
| fdb_add_mac_pool_2 vx20 vni $vni dst $dst_ip |
| |
| fdb_check_n_entries_by_dev_filter vx10 $mac_pool_1_len |
| fdb_check_n_entries_by_dev_filter vx20 $mac_pool_2_len |
| |
| run_cmd "$BRIDGE fdb flush dev vx10" |
| log_test $? 0 "Flush FDB by dev vx10" |
| |
| fdb_check_n_entries_by_dev_filter vx10 0 |
| log_test $? 0 "Flush FDB by dev vx10 - test vx10 entries" |
| |
| fdb_check_n_entries_by_dev_filter vx20 $mac_pool_2_len |
| log_test $? 0 "Flush FDB by dev vx10 - test vx20 entries" |
| } |
| |
| vxlan_test_flush_by_vni() |
| { |
| local vni_1=3000 |
| local vni_2=4000 |
| local dst_ip=192.0.2.1 |
| |
| fdb_add_mac_pool_1 vx10 vni $vni_1 dst $dst_ip |
| fdb_add_mac_pool_2 vx10 vni $vni_2 dst $dst_ip |
| |
| fdb_check_n_entries_by_dev_filter vx10 $mac_pool_1_len vni $vni_1 |
| fdb_check_n_entries_by_dev_filter vx10 $mac_pool_2_len vni $vni_2 |
| |
| run_cmd "$BRIDGE fdb flush dev vx10 vni $vni_2" |
| log_test $? 0 "Flush FDB by dev vx10 and vni $vni_2" |
| |
| fdb_check_n_entries_by_dev_filter vx10 $mac_pool_1_len vni $vni_1 |
| log_test $? 0 "Test entries with vni $vni_1" |
| |
| fdb_check_n_entries_by_dev_filter vx10 0 vni $vni_2 |
| log_test $? 0 "Test entries with vni $vni_2" |
| } |
| |
| vxlan_test_flush_by_src_vni() |
| { |
| # Set some entries with {vni=x,src_vni=y} and some with the opposite - |
| # {vni=y,src_vni=x}, to verify that when we flush by src_vni=x, entries |
| # with vni=x are not flused. |
| local vni_1=3000 |
| local vni_2=4000 |
| local src_vni_1=4000 |
| local src_vni_2=3000 |
| local dst_ip=192.0.2.1 |
| |
| # Reconfigure vx10 with 'external' to get 'src_vni' details in |
| # 'bridge fdb' output |
| $IP link del dev vx10 |
| $IP link add name vx10 type vxlan dstport "$VXPORT" external |
| |
| fdb_add_mac_pool_1 vx10 vni $vni_1 src_vni $src_vni_1 dst $dst_ip |
| fdb_add_mac_pool_2 vx10 vni $vni_2 src_vni $src_vni_2 dst $dst_ip |
| |
| fdb_check_n_entries_by_dev_filter vx10 $mac_pool_1_len \ |
| src_vni $src_vni_1 |
| fdb_check_n_entries_by_dev_filter vx10 $mac_pool_2_len \ |
| src_vni $src_vni_2 |
| |
| run_cmd "$BRIDGE fdb flush dev vx10 src_vni $src_vni_2" |
| log_test $? 0 "Flush FDB by dev vx10 and src_vni $src_vni_2" |
| |
| fdb_check_n_entries_by_dev_filter vx10 $mac_pool_1_len \ |
| src_vni $src_vni_1 |
| log_test $? 0 "Test entries with src_vni $src_vni_1" |
| |
| fdb_check_n_entries_by_dev_filter vx10 0 src_vni $src_vni_2 |
| log_test $? 0 "Test entries with src_vni $src_vni_2" |
| } |
| |
| vxlan_test_flush_by_port() |
| { |
| local port_1=1234 |
| local port_2=4321 |
| local dst_ip=192.0.2.1 |
| |
| fdb_add_mac_pool_1 vx10 port $port_1 dst $dst_ip |
| fdb_add_mac_pool_2 vx10 port $port_2 dst $dst_ip |
| |
| fdb_check_n_entries_by_dev_filter vx10 $mac_pool_1_len port $port_1 |
| fdb_check_n_entries_by_dev_filter vx10 $mac_pool_2_len port $port_2 |
| |
| run_cmd "$BRIDGE fdb flush dev vx10 port $port_2" |
| log_test $? 0 "Flush FDB by dev vx10 and port $port_2" |
| |
| fdb_check_n_entries_by_dev_filter vx10 $mac_pool_1_len port $port_1 |
| log_test $? 0 "Test entries with port $port_1" |
| |
| fdb_check_n_entries_by_dev_filter vx10 0 port $port_2 |
| log_test $? 0 "Test entries with port $port_2" |
| } |
| |
| vxlan_test_flush_by_dst_ip() |
| { |
| local dst_ip_1=192.0.2.1 |
| local dst_ip_2=192.0.2.2 |
| |
| fdb_add_mac_pool_1 vx10 dst $dst_ip_1 |
| fdb_add_mac_pool_2 vx10 dst $dst_ip_2 |
| |
| fdb_check_n_entries_by_dev_filter vx10 $mac_pool_1_len dst $dst_ip_1 |
| fdb_check_n_entries_by_dev_filter vx10 $mac_pool_2_len dst $dst_ip_2 |
| |
| run_cmd "$BRIDGE fdb flush dev vx10 dst $dst_ip_2" |
| log_test $? 0 "Flush FDB by dev vx10 and dst $dst_ip_2" |
| |
| fdb_check_n_entries_by_dev_filter vx10 $mac_pool_1_len dst $dst_ip_1 |
| log_test $? 0 "Test entries with dst $dst_ip_1" |
| |
| fdb_check_n_entries_by_dev_filter vx10 0 dst $dst_ip_2 |
| log_test $? 0 "Test entries with dst $dst_ip_2" |
| } |
| |
| nexthops_add() |
| { |
| local nhid_1=$1; shift |
| local nhid_2=$1; shift |
| |
| $IP nexthop add id 10 via 192.0.2.1 fdb |
| $IP nexthop add id $nhid_1 group 10 fdb |
| |
| $IP nexthop add id 20 via 192.0.2.2 fdb |
| $IP nexthop add id $nhid_2 group 20 fdb |
| } |
| |
| vxlan_test_flush_by_nhid() |
| { |
| local nhid_1=100 |
| local nhid_2=200 |
| |
| nexthops_add $nhid_1 $nhid_2 |
| |
| fdb_add_mac_pool_1 vx10 nhid $nhid_1 |
| fdb_add_mac_pool_2 vx10 nhid $nhid_2 |
| |
| fdb_check_n_entries_by_dev_filter vx10 $mac_pool_1_len nhid $nhid_1 |
| fdb_check_n_entries_by_dev_filter vx10 $mac_pool_2_len nhid $nhid_2 |
| |
| run_cmd "$BRIDGE fdb flush dev vx10 nhid $nhid_2" |
| log_test $? 0 "Flush FDB by dev vx10 and nhid $nhid_2" |
| |
| fdb_check_n_entries_by_dev_filter vx10 $mac_pool_1_len nhid $nhid_1 |
| log_test $? 0 "Test entries with nhid $nhid_1" |
| |
| fdb_check_n_entries_by_dev_filter vx10 0 nhid $nhid_2 |
| log_test $? 0 "Test entries with nhid $nhid_2" |
| |
| # Flush also entries with $nhid_1, and then verify that flushing by |
| # 'nhid' does not return an error when there are no entries with |
| # nexthops. |
| run_cmd "$BRIDGE fdb flush dev vx10 nhid $nhid_1" |
| log_test $? 0 "Flush FDB by dev vx10 and nhid $nhid_1" |
| |
| fdb_check_n_entries_by_dev_filter vx10 0 nhid |
| log_test $? 0 "Test entries with 'nhid' keyword" |
| |
| run_cmd "$BRIDGE fdb flush dev vx10 nhid $nhid_1" |
| log_test $? 0 "Flush FDB by nhid when there are no entries with nexthop" |
| } |
| |
| vxlan_test_flush_by_state() |
| { |
| local flush_by_state=$1; shift |
| local state_1=$1; shift |
| local exp_state_1=$1; shift |
| local state_2=$1; shift |
| local exp_state_2=$1; shift |
| |
| local dst_ip_1=192.0.2.1 |
| local dst_ip_2=192.0.2.2 |
| |
| fdb_add_mac_pool_1 vx10 dst $dst_ip_1 $state_1 |
| fdb_add_mac_pool_2 vx10 dst $dst_ip_2 $state_2 |
| |
| # Check the entries by dst_ip as not all states appear in 'bridge fdb' |
| # output. |
| fdb_check_n_entries_by_dev_filter vx10 $mac_pool_1_len dst $dst_ip_1 |
| fdb_check_n_entries_by_dev_filter vx10 $mac_pool_2_len dst $dst_ip_2 |
| |
| run_cmd "$BRIDGE fdb flush dev vx10 $flush_by_state" |
| log_test $? 0 "Flush FDB by dev vx10 and state $flush_by_state" |
| |
| fdb_check_n_entries_by_dev_filter vx10 $exp_state_1 dst $dst_ip_1 |
| log_test $? 0 "Test entries with state $state_1" |
| |
| fdb_check_n_entries_by_dev_filter vx10 $exp_state_2 dst $dst_ip_2 |
| log_test $? 0 "Test entries with state $state_2" |
| } |
| |
| vxlan_test_flush_by_permanent() |
| { |
| # Entries that are added without state get 'permanent' state by |
| # default, add some entries with flag 'extern_learn' instead of state, |
| # so they will be added with 'permanent' and should be flushed also. |
| local flush_by_state="permanent" |
| local state_1="permanent" |
| local exp_state_1=0 |
| local state_2="extern_learn" |
| local exp_state_2=0 |
| |
| vxlan_test_flush_by_state $flush_by_state $state_1 $exp_state_1 \ |
| $state_2 $exp_state_2 |
| } |
| |
| vxlan_test_flush_by_nopermanent() |
| { |
| local flush_by_state="nopermanent" |
| local state_1="permanent" |
| local exp_state_1=$mac_pool_1_len |
| local state_2="static" |
| local exp_state_2=0 |
| |
| vxlan_test_flush_by_state $flush_by_state $state_1 $exp_state_1 \ |
| $state_2 $exp_state_2 |
| } |
| |
| vxlan_test_flush_by_static() |
| { |
| local flush_by_state="static" |
| local state_1="static" |
| local exp_state_1=0 |
| local state_2="dynamic" |
| local exp_state_2=$mac_pool_2_len |
| |
| vxlan_test_flush_by_state $flush_by_state $state_1 $exp_state_1 \ |
| $state_2 $exp_state_2 |
| } |
| |
| vxlan_test_flush_by_nostatic() |
| { |
| local flush_by_state="nostatic" |
| local state_1="permanent" |
| local exp_state_1=$mac_pool_1_len |
| local state_2="dynamic" |
| local exp_state_2=0 |
| |
| vxlan_test_flush_by_state $flush_by_state $state_1 $exp_state_1 \ |
| $state_2 $exp_state_2 |
| } |
| |
| vxlan_test_flush_by_dynamic() |
| { |
| local flush_by_state="dynamic" |
| local state_1="dynamic" |
| local exp_state_1=0 |
| local state_2="static" |
| local exp_state_2=$mac_pool_2_len |
| |
| vxlan_test_flush_by_state $flush_by_state $state_1 $exp_state_1 \ |
| $state_2 $exp_state_2 |
| } |
| |
| vxlan_test_flush_by_nodynamic() |
| { |
| local flush_by_state="nodynamic" |
| local state_1="permanent" |
| local exp_state_1=0 |
| local state_2="dynamic" |
| local exp_state_2=$mac_pool_2_len |
| |
| vxlan_test_flush_by_state $flush_by_state $state_1 $exp_state_1 \ |
| $state_2 $exp_state_2 |
| } |
| |
| vxlan_test_flush_by_flag() |
| { |
| local flush_by_flag=$1; shift |
| local flag_1=$1; shift |
| local exp_flag_1=$1; shift |
| local flag_2=$1; shift |
| local exp_flag_2=$1; shift |
| |
| local dst_ip_1=192.0.2.1 |
| local dst_ip_2=192.0.2.2 |
| |
| fdb_add_mac_pool_1 vx10 dst $dst_ip_1 $flag_1 |
| fdb_add_mac_pool_2 vx10 dst $dst_ip_2 $flag_2 |
| |
| fdb_check_n_entries_by_dev_filter vx10 $mac_pool_1_len $flag_1 |
| fdb_check_n_entries_by_dev_filter vx10 $mac_pool_2_len $flag_2 |
| |
| run_cmd "$BRIDGE fdb flush dev vx10 $flush_by_flag" |
| log_test $? 0 "Flush FDB by dev vx10 and flag $flush_by_flag" |
| |
| fdb_check_n_entries_by_dev_filter vx10 $exp_flag_1 dst $dst_ip_1 |
| log_test $? 0 "Test entries with flag $flag_1" |
| |
| fdb_check_n_entries_by_dev_filter vx10 $exp_flag_2 dst $dst_ip_2 |
| log_test $? 0 "Test entries with flag $flag_2" |
| } |
| |
| vxlan_test_flush_by_extern_learn() |
| { |
| local flush_by_flag="extern_learn" |
| local flag_1="extern_learn" |
| local exp_flag_1=0 |
| local flag_2="router" |
| local exp_flag_2=$mac_pool_2_len |
| |
| vxlan_test_flush_by_flag $flush_by_flag $flag_1 $exp_flag_1 \ |
| $flag_2 $exp_flag_2 |
| } |
| |
| vxlan_test_flush_by_noextern_learn() |
| { |
| local flush_by_flag="noextern_learn" |
| local flag_1="extern_learn" |
| local exp_flag_1=$mac_pool_1_len |
| local flag_2="router" |
| local exp_flag_2=0 |
| |
| vxlan_test_flush_by_flag $flush_by_flag $flag_1 $exp_flag_1 \ |
| $flag_2 $exp_flag_2 |
| } |
| |
| vxlan_test_flush_by_router() |
| { |
| local flush_by_flag="router" |
| local flag_1="router" |
| local exp_flag_1=0 |
| local flag_2="extern_learn" |
| local exp_flag_2=$mac_pool_2_len |
| |
| vxlan_test_flush_by_flag $flush_by_flag $flag_1 $exp_flag_1 \ |
| $flag_2 $exp_flag_2 |
| } |
| |
| vxlan_test_flush_by_norouter() |
| { |
| |
| local flush_by_flag="norouter" |
| local flag_1="router" |
| local exp_flag_1=$mac_pool_1_len |
| local flag_2="extern_learn" |
| local exp_flag_2=0 |
| |
| vxlan_test_flush_by_flag $flush_by_flag $flag_1 $exp_flag_1 \ |
| $flag_2 $exp_flag_2 |
| } |
| |
| vxlan_test_flush_by_several_args() |
| { |
| local dst_ip_1=192.0.2.1 |
| local dst_ip_2=192.0.2.2 |
| local state_1=permanent |
| local state_2=static |
| local vni=3000 |
| local port=1234 |
| local nhid=100 |
| local flag=router |
| local flush_args |
| |
| ################### Flush by 2 args - nhid and flag #################### |
| $IP nexthop add id 10 via 192.0.2.1 fdb |
| $IP nexthop add id $nhid group 10 fdb |
| |
| fdb_add_mac_pool_1 vx10 nhid $nhid $flag $state_1 |
| fdb_add_mac_pool_2 vx10 nhid $nhid $flag $state_2 |
| |
| fdb_check_n_entries_by_dev_filter vx10 $mac_pool_1_len $state_1 |
| fdb_check_n_entries_by_dev_filter vx10 $mac_pool_2_len $state_2 |
| |
| run_cmd "$BRIDGE fdb flush dev vx10 nhid $nhid $flag" |
| log_test $? 0 "Flush FDB by dev vx10 nhid $nhid $flag" |
| |
| # All entries should be flushed as 'state' is not an argument for flush |
| # filtering. |
| fdb_check_n_entries_by_dev_filter vx10 0 $state_1 |
| log_test $? 0 "Test entries with state $state_1" |
| |
| fdb_check_n_entries_by_dev_filter vx10 0 $state_2 |
| log_test $? 0 "Test entries with state $state_2" |
| |
| ################ Flush by 3 args - VNI, port and dst_ip ################ |
| fdb_add_mac_pool_1 vx10 vni $vni port $port dst $dst_ip_1 |
| fdb_add_mac_pool_2 vx10 vni $vni port $port dst $dst_ip_2 |
| |
| fdb_check_n_entries_by_dev_filter vx10 $mac_pool_1_len dst $dst_ip_1 |
| fdb_check_n_entries_by_dev_filter vx10 $mac_pool_2_len dst $dst_ip_2 |
| |
| flush_args="vni $vni port $port dst $dst_ip_2" |
| run_cmd "$BRIDGE fdb flush dev vx10 $flush_args" |
| log_test $? 0 "Flush FDB by dev vx10 $flush_args" |
| |
| # Only entries with $dst_ip_2 should be flushed, even the rest arguments |
| # match the filter, the flush should be AND of all the arguments. |
| fdb_check_n_entries_by_dev_filter vx10 $mac_pool_1_len dst $dst_ip_1 |
| log_test $? 0 "Test entries with dst $dst_ip_1" |
| |
| fdb_check_n_entries_by_dev_filter vx10 0 dst $dst_ip_2 |
| log_test $? 0 "Test entries with dst $dst_ip_2" |
| } |
| |
| multicast_fdb_entries_add() |
| { |
| mac=00:00:00:00:00:00 |
| vnis=(2000 3000) |
| |
| for vni in "${vnis[@]}"; do |
| $BRIDGE fdb append $mac dev vx10 dst 192.0.2.1 vni $vni \ |
| src_vni 5000 |
| $BRIDGE fdb append $mac dev vx10 dst 192.0.2.1 vni $vni \ |
| port 1111 |
| $BRIDGE fdb append $mac dev vx10 dst 192.0.2.2 vni $vni \ |
| port 2222 |
| done |
| } |
| |
| vxlan_test_flush_by_remote_attributes() |
| { |
| local flush_args |
| |
| # Reconfigure vx10 with 'external' to get 'src_vni' details in |
| # 'bridge fdb' output |
| $IP link del dev vx10 |
| $IP link add name vx10 type vxlan dstport "$VXPORT" external |
| |
| # For multicat FDB entries, the VXLAN driver stores a linked list of |
| # remotes for a given key. Verify that only the expected remotes are |
| # flushed. |
| multicast_fdb_entries_add |
| |
| ## Flush by 3 remote's attributes - destination IP, port and VNI ## |
| flush_args="dst 192.0.2.1 port 1111 vni 2000" |
| fdb_check_n_entries_by_dev_filter vx10 1 $flush_args |
| |
| t0_n_entries=$($BRIDGE fdb show dev vx10 | wc -l) |
| run_cmd "$BRIDGE fdb flush dev vx10 $flush_args" |
| log_test $? 0 "Flush FDB by dev vx10 $flush_args" |
| |
| fdb_check_n_entries_by_dev_filter vx10 0 $flush_args |
| |
| exp_n_entries=$((t0_n_entries - 1)) |
| t1_n_entries=$($BRIDGE fdb show dev vx10 | wc -l) |
| [[ $t1_n_entries -eq $exp_n_entries ]] |
| log_test $? 0 "Check how many entries were flushed" |
| |
| ## Flush by 2 remote's attributes - destination IP and port ## |
| flush_args="dst 192.0.2.2 port 2222" |
| |
| fdb_check_n_entries_by_dev_filter vx10 2 $flush_args |
| |
| t0_n_entries=$($BRIDGE fdb show dev vx10 | wc -l) |
| run_cmd "$BRIDGE fdb flush dev vx10 $flush_args" |
| log_test $? 0 "Flush FDB by dev vx10 $flush_args" |
| |
| fdb_check_n_entries_by_dev_filter vx10 0 $flush_args |
| |
| exp_n_entries=$((t0_n_entries - 2)) |
| t1_n_entries=$($BRIDGE fdb show dev vx10 | wc -l) |
| [[ $t1_n_entries -eq $exp_n_entries ]] |
| log_test $? 0 "Check how many entries were flushed" |
| |
| ## Flush by source VNI, which is not remote's attribute and VNI ## |
| flush_args="vni 3000 src_vni 5000" |
| |
| fdb_check_n_entries_by_dev_filter vx10 1 $flush_args |
| |
| t0_n_entries=$($BRIDGE fdb show dev vx10 | wc -l) |
| run_cmd "$BRIDGE fdb flush dev vx10 $flush_args" |
| log_test $? 0 "Flush FDB by dev vx10 $flush_args" |
| |
| fdb_check_n_entries_by_dev_filter vx10 0 $flush_args |
| |
| exp_n_entries=$((t0_n_entries -1)) |
| t1_n_entries=$($BRIDGE fdb show dev vx10 | wc -l) |
| [[ $t1_n_entries -eq $exp_n_entries ]] |
| log_test $? 0 "Check how many entries were flushed" |
| |
| # Flush by 1 remote's attribute - destination IP ## |
| flush_args="dst 192.0.2.1" |
| |
| fdb_check_n_entries_by_dev_filter vx10 2 $flush_args |
| |
| t0_n_entries=$($BRIDGE fdb show dev vx10 | wc -l) |
| run_cmd "$BRIDGE fdb flush dev vx10 $flush_args" |
| log_test $? 0 "Flush FDB by dev vx10 $flush_args" |
| |
| fdb_check_n_entries_by_dev_filter vx10 0 $flush_args |
| |
| exp_n_entries=$((t0_n_entries -2)) |
| t1_n_entries=$($BRIDGE fdb show dev vx10 | wc -l) |
| [[ $t1_n_entries -eq $exp_n_entries ]] |
| log_test $? 0 "Check how many entries were flushed" |
| } |
| |
| bridge_test_flush_by_dev() |
| { |
| local dst_ip=192.0.2.1 |
| local br0_n_ent_t0=$($BRIDGE fdb show dev br0 | wc -l) |
| local br1_n_ent_t0=$($BRIDGE fdb show dev br1 | wc -l) |
| |
| fdb_add_mac_pool_1 br0 dst $dst_ip |
| fdb_add_mac_pool_2 br1 dst $dst_ip |
| |
| # Each 'fdb add' command adds one extra entry in the bridge with the |
| # default vlan. |
| local exp_br0_n_ent=$(($br0_n_ent_t0 + 2 * $mac_pool_1_len)) |
| local exp_br1_n_ent=$(($br1_n_ent_t0 + 2 * $mac_pool_2_len)) |
| |
| fdb_check_n_entries_by_dev_filter br0 $exp_br0_n_ent |
| fdb_check_n_entries_by_dev_filter br1 $exp_br1_n_ent |
| |
| run_cmd "$BRIDGE fdb flush dev br0" |
| log_test $? 0 "Flush FDB by dev br0" |
| |
| # The default entry should not be flushed |
| fdb_check_n_entries_by_dev_filter br0 1 |
| log_test $? 0 "Flush FDB by dev br0 - test br0 entries" |
| |
| fdb_check_n_entries_by_dev_filter br1 $exp_br1_n_ent |
| log_test $? 0 "Flush FDB by dev br0 - test br1 entries" |
| } |
| |
| bridge_test_flush_by_vlan() |
| { |
| local vlan_1=10 |
| local vlan_2=20 |
| local vlan_1_ent_t0 |
| local vlan_2_ent_t0 |
| |
| $BRIDGE vlan add vid $vlan_1 dev br0 self |
| $BRIDGE vlan add vid $vlan_2 dev br0 self |
| |
| vlan_1_ent_t0=$($BRIDGE fdb show dev br0 | grep "vlan $vlan_1" | wc -l) |
| vlan_2_ent_t0=$($BRIDGE fdb show dev br0 | grep "vlan $vlan_2" | wc -l) |
| |
| fdb_add_mac_pool_1 br0 vlan $vlan_1 |
| fdb_add_mac_pool_2 br0 vlan $vlan_2 |
| |
| local exp_vlan_1_ent=$(($vlan_1_ent_t0 + $mac_pool_1_len)) |
| local exp_vlan_2_ent=$(($vlan_2_ent_t0 + $mac_pool_2_len)) |
| |
| fdb_check_n_entries_by_dev_filter br0 $exp_vlan_1_ent vlan $vlan_1 |
| fdb_check_n_entries_by_dev_filter br0 $exp_vlan_2_ent vlan $vlan_2 |
| |
| run_cmd "$BRIDGE fdb flush dev br0 vlan $vlan_1" |
| log_test $? 0 "Flush FDB by dev br0 and vlan $vlan_1" |
| |
| fdb_check_n_entries_by_dev_filter br0 0 vlan $vlan_1 |
| log_test $? 0 "Test entries with vlan $vlan_1" |
| |
| fdb_check_n_entries_by_dev_filter br0 $exp_vlan_2_ent vlan $vlan_2 |
| log_test $? 0 "Test entries with vlan $vlan_2" |
| } |
| |
| bridge_vxlan_test_flush() |
| { |
| local vlan_1=10 |
| local dst_ip=192.0.2.1 |
| |
| $IP link set dev vx10 master br0 |
| $BRIDGE vlan add vid $vlan_1 dev br0 self |
| $BRIDGE vlan add vid $vlan_1 dev vx10 |
| |
| fdb_add_mac_pool_1 vx10 vni 3000 dst $dst_ip self master |
| |
| fdb_check_n_entries_by_dev_filter vx10 $mac_pool_1_len vlan $vlan_1 |
| fdb_check_n_entries_by_dev_filter vx10 $mac_pool_1_len vni 3000 |
| |
| # Such command should fail in VXLAN driver as vlan is not supported, |
| # but the command should flush the entries in the bridge |
| run_cmd "$BRIDGE fdb flush dev vx10 vlan $vlan_1 master self" |
| log_test $? 255 \ |
| "Flush FDB by dev vx10, vlan $vlan_1, master and self" |
| |
| fdb_check_n_entries_by_dev_filter vx10 0 vlan $vlan_1 |
| log_test $? 0 "Test entries with vlan $vlan_1" |
| |
| fdb_check_n_entries_by_dev_filter vx10 $mac_pool_1_len dst $dst_ip |
| log_test $? 0 "Test entries with dst $dst_ip" |
| } |
| |
| setup() |
| { |
| setup_ns NS |
| IP="ip -netns ${NS}" |
| BRIDGE="bridge -netns ${NS}" |
| |
| $IP link add name vx10 type vxlan id 1000 dstport "$VXPORT" |
| $IP link add name vx20 type vxlan id 2000 dstport "$VXPORT" |
| |
| $IP link add br0 type bridge vlan_filtering 1 |
| $IP link add br1 type bridge vlan_filtering 1 |
| } |
| |
| cleanup() |
| { |
| $IP link del dev br1 |
| $IP link del dev br0 |
| |
| $IP link del dev vx20 |
| $IP link del dev vx10 |
| |
| cleanup_ns ${NS} |
| } |
| |
| ################################################################################ |
| # main |
| |
| while getopts :t:pPhvw: o |
| do |
| case $o in |
| t) TESTS=$OPTARG;; |
| p) PAUSE_ON_FAIL=yes;; |
| P) PAUSE=yes;; |
| v) VERBOSE=$(($VERBOSE + 1));; |
| w) PING_TIMEOUT=$OPTARG;; |
| h) usage; exit 0;; |
| *) usage; exit 1;; |
| esac |
| done |
| |
| # make sure we don't pause twice |
| [ "${PAUSE}" = "yes" ] && PAUSE_ON_FAIL=no |
| |
| if [ "$(id -u)" -ne 0 ];then |
| echo "SKIP: Need root privileges" |
| exit $ksft_skip; |
| fi |
| |
| if [ ! -x "$(command -v ip)" ]; then |
| echo "SKIP: Could not run test without ip tool" |
| exit $ksft_skip |
| fi |
| |
| # Check a flag that is added to flush command as part of VXLAN flush support |
| bridge fdb help 2>&1 | grep -q "\[no\]router" |
| if [ $? -ne 0 ]; then |
| echo "SKIP: iproute2 too old, missing flush command for VXLAN" |
| exit $ksft_skip |
| fi |
| |
| ip link add dev vx10 type vxlan id 1000 2> /dev/null |
| out=$(bridge fdb flush dev vx10 2>&1 | grep -q "Operation not supported") |
| if [ $? -eq 0 ]; then |
| echo "SKIP: kernel lacks vxlan flush support" |
| exit $ksft_skip |
| fi |
| ip link del dev vx10 |
| |
| for t in $TESTS |
| do |
| setup; $t; cleanup; |
| done |