Path: blob/master/tools/testing/selftests/drivers/net/bonding/lag_lib.sh
26292 views
#!/bin/bash1# SPDX-License-Identifier: GPL-2.023NAMESPACES=""45# Test that a link aggregation device (bonding, team) removes the hardware6# addresses that it adds on its underlying devices.7test_LAG_cleanup()8{9local driver=$110local mode=$211local ucaddr="02:00:00:12:34:56"12local addr6="fe80::78:9abc/64"13local mcaddr="33:33:ff:78:9a:bc"14local name1516ip link add dummy1 type dummy17ip link add dummy2 type dummy18if [ "$driver" = "bonding" ]; then19name="bond1"20ip link add "$name" up type bond mode "$mode"21ip link set dev dummy1 master "$name"22ip link set dev dummy2 master "$name"23elif [ "$driver" = "team" ]; then24name="team0"25teamd -d -c '26{27"device": "'"$name"'",28"runner": {29"name": "'"$mode"'"30},31"ports": {32"dummy1":33{},34"dummy2":35{}36}37}38'39ip link set dev "$name" up40else41check_err 142log_test test_LAG_cleanup ": unknown driver \"$driver\""43return44fi4546# Used to test dev->uc handling47ip link add mv0 link "$name" up address "$ucaddr" type macvlan48# Used to test dev->mc handling49ip address add "$addr6" dev "$name"5051# Check that addresses were added as expected52(grep_bridge_fdb "$ucaddr" bridge fdb show dev dummy1 ||53grep_bridge_fdb "$ucaddr" bridge fdb show dev dummy2) >/dev/null54check_err $? "macvlan unicast address not found on a slave"5556# mcaddr is added asynchronously by addrconf_dad_work(), use busywait57(busywait 10000 grep_bridge_fdb "$mcaddr" bridge fdb show dev dummy1 ||58grep_bridge_fdb "$mcaddr" bridge fdb show dev dummy2) >/dev/null59check_err $? "IPv6 solicited-node multicast mac address not found on a slave"6061ip link set dev "$name" down62ip link del "$name"6364not grep_bridge_fdb "$ucaddr" bridge fdb show >/dev/null65check_err $? "macvlan unicast address still present on a slave"6667not grep_bridge_fdb "$mcaddr" bridge fdb show >/dev/null68check_err $? "IPv6 solicited-node multicast mac address still present on a slave"6970cleanup7172log_test "$driver cleanup mode $mode"73}7475# Build a generic 2 node net namespace with 2 connections76# between the namespaces77#78# +-----------+ +-----------+79# | node1 | | node2 |80# | | | |81# | | | |82# | eth0 +-------+ eth0 |83# | | | |84# | eth1 +-------+ eth1 |85# | | | |86# +-----------+ +-----------+87lag_setup2x2()88{89local state=${1:-down}90local namespaces="lag_node1 lag_node2"9192# create namespaces93for n in ${namespaces}; do94ip netns add ${n}95done9697# wire up namespaces98ip link add name lag1 type veth peer name lag1-end99ip link set dev lag1 netns lag_node1 $state name eth0100ip link set dev lag1-end netns lag_node2 $state name eth0101102ip link add name lag1 type veth peer name lag1-end103ip link set dev lag1 netns lag_node1 $state name eth1104ip link set dev lag1-end netns lag_node2 $state name eth1105106NAMESPACES="${namespaces}"107}108109# cleanup all lag related namespaces110lag_cleanup()111{112for n in ${NAMESPACES}; do113ip netns delete ${n} >/dev/null 2>&1 || true114done115}116117SWITCH="lag_node1"118CLIENT="lag_node2"119CLIENTIP="172.20.2.1"120SWITCHIP="172.20.2.2"121122lag_setup_network()123{124lag_setup2x2 "down"125126# create switch127ip netns exec ${SWITCH} ip link add br0 up type bridge128ip netns exec ${SWITCH} ip link set eth0 master br0 up129ip netns exec ${SWITCH} ip link set eth1 master br0 up130ip netns exec ${SWITCH} ip addr add ${SWITCHIP}/24 dev br0131}132133lag_reset_network()134{135ip netns exec ${CLIENT} ip link del bond0136ip netns exec ${SWITCH} ip link set eth0 up137ip netns exec ${SWITCH} ip link set eth1 up138}139140create_bond()141{142# create client143ip netns exec ${CLIENT} ip link set eth0 down144ip netns exec ${CLIENT} ip link set eth1 down145146ip netns exec ${CLIENT} ip link add bond0 type bond $@147ip netns exec ${CLIENT} ip link set eth0 master bond0148ip netns exec ${CLIENT} ip link set eth1 master bond0149ip netns exec ${CLIENT} ip link set bond0 up150ip netns exec ${CLIENT} ip addr add ${CLIENTIP}/24 dev bond0151}152153test_bond_recovery()154{155RET=0156157create_bond $@158159# verify connectivity160slowwait 2 ip netns exec ${CLIENT} ping ${SWITCHIP} -c 2 -W 0.1 &> /dev/null161check_err $? "No connectivity"162163# force the links of the bond down164ip netns exec ${SWITCH} ip link set eth0 down165sleep 2166ip netns exec ${SWITCH} ip link set eth0 up167ip netns exec ${SWITCH} ip link set eth1 down168169# re-verify connectivity170slowwait 2 ip netns exec ${CLIENT} ping ${SWITCHIP} -c 2 -W 0.1 &> /dev/null171172local rc=$?173check_err $rc "Bond failed to recover"174log_test "$1 ($2) bond recovery"175lag_reset_network176}177178179