Skip to content

Commit

Permalink
net: Add tests for bonding and team address list management
Browse files Browse the repository at this point in the history
Test that the bonding and team drivers clean up an underlying device's
address lists (dev->uc, dev->mc) when the aggregated device is deleted.

Test addition and removal of the LACPDU multicast address on underlying
devices by the bonding driver.

v2:
* add lag_lib.sh to TEST_FILES

v3:
* extend bond_listen_lacpdu_multicast test to init_state up and down cases
* remove some superfluous shell syntax and 'set dev ... up' commands

Signed-off-by: Benjamin Poirier <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
gobenji authored and davem330 committed Sep 16, 2022
1 parent bd60234 commit bbb774d
Show file tree
Hide file tree
Showing 9 changed files with 237 additions and 1 deletion.
1 change: 1 addition & 0 deletions MAINTAINERS
Original file line number Diff line number Diff line change
Expand Up @@ -19948,6 +19948,7 @@ S: Supported
F: drivers/net/team/
F: include/linux/if_team.h
F: include/uapi/linux/if_team.h
F: tools/testing/selftests/net/team/

TECHNOLOGIC SYSTEMS TS-5500 PLATFORM SUPPORT
M: "Savoir-faire Linux Inc." <[email protected]>
Expand Down
1 change: 1 addition & 0 deletions tools/testing/selftests/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ TARGETS += damon
TARGETS += drivers/dma-buf
TARGETS += drivers/s390x/uvdevice
TARGETS += drivers/net/bonding
TARGETS += drivers/net/team
TARGETS += efivarfs
TARGETS += exec
TARGETS += filesystems
Expand Down
5 changes: 4 additions & 1 deletion tools/testing/selftests/drivers/net/bonding/Makefile
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
# SPDX-License-Identifier: GPL-2.0
# Makefile for net selftests

TEST_PROGS := bond-break-lacpdu-tx.sh
TEST_PROGS := bond-break-lacpdu-tx.sh \
dev_addr_lists.sh

TEST_FILES := lag_lib.sh

include ../../../lib.mk
1 change: 1 addition & 0 deletions tools/testing/selftests/drivers/net/bonding/config
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
CONFIG_BONDING=y
CONFIG_MACVLAN=y
109 changes: 109 additions & 0 deletions tools/testing/selftests/drivers/net/bonding/dev_addr_lists.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
#
# Test bond device handling of addr lists (dev->uc, mc)
#

ALL_TESTS="
bond_cleanup_mode1
bond_cleanup_mode4
bond_listen_lacpdu_multicast_case_down
bond_listen_lacpdu_multicast_case_up
"

REQUIRE_MZ=no
NUM_NETIFS=0
lib_dir=$(dirname "$0")
source "$lib_dir"/../../../net/forwarding/lib.sh

source "$lib_dir"/lag_lib.sh


destroy()
{
local ifnames=(dummy1 dummy2 bond1 mv0)
local ifname

for ifname in "${ifnames[@]}"; do
ip link del "$ifname" &>/dev/null
done
}

cleanup()
{
pre_cleanup

destroy
}


# bond driver control paths vary between modes that have a primary slave
# (bond_uses_primary()) and others. Test both kinds of modes.

bond_cleanup_mode1()
{
RET=0

test_LAG_cleanup "bonding" "active-backup"
}

bond_cleanup_mode4() {
RET=0

test_LAG_cleanup "bonding" "802.3ad"
}

bond_listen_lacpdu_multicast()
{
# Initial state of bond device, up | down
local init_state=$1
local lacpdu_mc="01:80:c2:00:00:02"

ip link add dummy1 type dummy
ip link add bond1 "$init_state" type bond mode 802.3ad
ip link set dev dummy1 master bond1
if [ "$init_state" = "down" ]; then
ip link set dev bond1 up
fi

grep_bridge_fdb "$lacpdu_mc" bridge fdb show brport dummy1 >/dev/null
check_err $? "LACPDU multicast address not present on slave (1)"

ip link set dev bond1 down

not grep_bridge_fdb "$lacpdu_mc" bridge fdb show brport dummy1 >/dev/null
check_err $? "LACPDU multicast address still present on slave"

ip link set dev bond1 up

grep_bridge_fdb "$lacpdu_mc" bridge fdb show brport dummy1 >/dev/null
check_err $? "LACPDU multicast address not present on slave (2)"

cleanup

log_test "bonding LACPDU multicast address to slave (from bond $init_state)"
}

# The LACPDU mc addr is added by different paths depending on the initial state
# of the bond when enslaving a device. Test both cases.

bond_listen_lacpdu_multicast_case_down()
{
RET=0

bond_listen_lacpdu_multicast "down"
}

bond_listen_lacpdu_multicast_case_up()
{
RET=0

bond_listen_lacpdu_multicast "up"
}


trap cleanup EXIT

tests_run

exit "$EXIT_STATUS"
61 changes: 61 additions & 0 deletions tools/testing/selftests/drivers/net/bonding/lag_lib.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0

# Test that a link aggregation device (bonding, team) removes the hardware
# addresses that it adds on its underlying devices.
test_LAG_cleanup()
{
local driver=$1
local mode=$2
local ucaddr="02:00:00:12:34:56"
local addr6="fe80::78:9abc/64"
local mcaddr="33:33:ff:78:9a:bc"
local name

ip link add dummy1 type dummy
ip link add dummy2 type dummy
if [ "$driver" = "bonding" ]; then
name="bond1"
ip link add "$name" up type bond mode "$mode"
ip link set dev dummy1 master "$name"
ip link set dev dummy2 master "$name"
elif [ "$driver" = "team" ]; then
name="team0"
teamd -d -c '
{
"device": "'"$name"'",
"runner": {
"name": "'"$mode"'"
},
"ports": {
"dummy1":
{},
"dummy2":
{}
}
}
'
ip link set dev "$name" up
else
check_err 1
log_test test_LAG_cleanup ": unknown driver \"$driver\""
return
fi

# Used to test dev->uc handling
ip link add mv0 link "$name" up address "$ucaddr" type macvlan
# Used to test dev->mc handling
ip address add "$addr6" dev "$name"
ip link set dev "$name" down
ip link del "$name"

not grep_bridge_fdb "$ucaddr" bridge fdb show >/dev/null
check_err $? "macvlan unicast address still present on a slave"

not grep_bridge_fdb "$mcaddr" bridge fdb show >/dev/null
check_err $? "IPv6 solicited-node multicast mac address still present on a slave"

cleanup

log_test "$driver cleanup mode $mode"
}
6 changes: 6 additions & 0 deletions tools/testing/selftests/drivers/net/team/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# SPDX-License-Identifier: GPL-2.0
# Makefile for net selftests

TEST_PROGS := dev_addr_lists.sh

include ../../../lib.mk
3 changes: 3 additions & 0 deletions tools/testing/selftests/drivers/net/team/config
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
CONFIG_NET_TEAM=y
CONFIG_NET_TEAM_MODE_LOADBALANCE=y
CONFIG_MACVLAN=y
51 changes: 51 additions & 0 deletions tools/testing/selftests/drivers/net/team/dev_addr_lists.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
#
# Test team device handling of addr lists (dev->uc, mc)
#

ALL_TESTS="
team_cleanup
"

REQUIRE_MZ=no
NUM_NETIFS=0
lib_dir=$(dirname "$0")
source "$lib_dir"/../../../net/forwarding/lib.sh

source "$lib_dir"/../bonding/lag_lib.sh


destroy()
{
local ifnames=(dummy0 dummy1 team0 mv0)
local ifname

for ifname in "${ifnames[@]}"; do
ip link del "$ifname" &>/dev/null
done
}

cleanup()
{
pre_cleanup

destroy
}


team_cleanup()
{
RET=0

test_LAG_cleanup "team" "lacp"
}


require_command teamd

trap cleanup EXIT

tests_run

exit "$EXIT_STATUS"

0 comments on commit bbb774d

Please sign in to comment.