178 lines · bash
1#!/bin/bash2# SPDX-License-Identifier: GPL-2.03 4NAMESPACES=""5 6# Test that a link aggregation device (bonding, team) removes the hardware7# addresses that it adds on its underlying devices.8test_LAG_cleanup()9{10 local driver=$111 local mode=$212 local ucaddr="02:00:00:12:34:56"13 local addr6="fe80::78:9abc/64"14 local mcaddr="33:33:ff:78:9a:bc"15 local name16 17 ip link add dummy1 type dummy18 ip link add dummy2 type dummy19 if [ "$driver" = "bonding" ]; then20 name="bond1"21 ip link add "$name" up type bond mode "$mode"22 ip link set dev dummy1 master "$name"23 ip link set dev dummy2 master "$name"24 elif [ "$driver" = "team" ]; then25 name="team0"26 teamd -d -c '27 {28 "device": "'"$name"'",29 "runner": {30 "name": "'"$mode"'"31 },32 "ports": {33 "dummy1":34 {},35 "dummy2":36 {}37 }38 }39 '40 ip link set dev "$name" up41 else42 check_err 143 log_test test_LAG_cleanup ": unknown driver \"$driver\""44 return45 fi46 47 # Used to test dev->uc handling48 ip link add mv0 link "$name" up address "$ucaddr" type macvlan49 # Used to test dev->mc handling50 ip address add "$addr6" dev "$name"51 52 # Check that addresses were added as expected53 (grep_bridge_fdb "$ucaddr" bridge fdb show dev dummy1 ||54 grep_bridge_fdb "$ucaddr" bridge fdb show dev dummy2) >/dev/null55 check_err $? "macvlan unicast address not found on a slave"56 57 # mcaddr is added asynchronously by addrconf_dad_work(), use busywait58 (busywait 10000 grep_bridge_fdb "$mcaddr" bridge fdb show dev dummy1 ||59 grep_bridge_fdb "$mcaddr" bridge fdb show dev dummy2) >/dev/null60 check_err $? "IPv6 solicited-node multicast mac address not found on a slave"61 62 ip link set dev "$name" down63 ip link del "$name"64 65 not grep_bridge_fdb "$ucaddr" bridge fdb show >/dev/null66 check_err $? "macvlan unicast address still present on a slave"67 68 not grep_bridge_fdb "$mcaddr" bridge fdb show >/dev/null69 check_err $? "IPv6 solicited-node multicast mac address still present on a slave"70 71 cleanup72 73 log_test "$driver cleanup mode $mode"74}75 76# Build a generic 2 node net namespace with 2 connections77# between the namespaces78#79# +-----------+ +-----------+80# | node1 | | node2 |81# | | | |82# | | | |83# | eth0 +-------+ eth0 |84# | | | |85# | eth1 +-------+ eth1 |86# | | | |87# +-----------+ +-----------+88lag_setup2x2()89{90 local state=${1:-down}91 local namespaces="lag_node1 lag_node2"92 93 # create namespaces94 for n in ${namespaces}; do95 ip netns add ${n}96 done97 98 # wire up namespaces99 ip link add name lag1 type veth peer name lag1-end100 ip link set dev lag1 netns lag_node1 $state name eth0101 ip link set dev lag1-end netns lag_node2 $state name eth0102 103 ip link add name lag1 type veth peer name lag1-end104 ip link set dev lag1 netns lag_node1 $state name eth1105 ip link set dev lag1-end netns lag_node2 $state name eth1106 107 NAMESPACES="${namespaces}"108}109 110# cleanup all lag related namespaces111lag_cleanup()112{113 for n in ${NAMESPACES}; do114 ip netns delete ${n} >/dev/null 2>&1 || true115 done116}117 118SWITCH="lag_node1"119CLIENT="lag_node2"120CLIENTIP="172.20.2.1"121SWITCHIP="172.20.2.2"122 123lag_setup_network()124{125 lag_setup2x2 "down"126 127 # create switch128 ip netns exec ${SWITCH} ip link add br0 up type bridge129 ip netns exec ${SWITCH} ip link set eth0 master br0 up130 ip netns exec ${SWITCH} ip link set eth1 master br0 up131 ip netns exec ${SWITCH} ip addr add ${SWITCHIP}/24 dev br0132}133 134lag_reset_network()135{136 ip netns exec ${CLIENT} ip link del bond0137 ip netns exec ${SWITCH} ip link set eth0 up138 ip netns exec ${SWITCH} ip link set eth1 up139}140 141create_bond()142{143 # create client144 ip netns exec ${CLIENT} ip link set eth0 down145 ip netns exec ${CLIENT} ip link set eth1 down146 147 ip netns exec ${CLIENT} ip link add bond0 type bond $@148 ip netns exec ${CLIENT} ip link set eth0 master bond0149 ip netns exec ${CLIENT} ip link set eth1 master bond0150 ip netns exec ${CLIENT} ip link set bond0 up151 ip netns exec ${CLIENT} ip addr add ${CLIENTIP}/24 dev bond0152}153 154test_bond_recovery()155{156 RET=0157 158 create_bond $@159 160 # verify connectivity161 slowwait 2 ip netns exec ${CLIENT} ping ${SWITCHIP} -c 2 -W 0.1 &> /dev/null162 check_err $? "No connectivity"163 164 # force the links of the bond down165 ip netns exec ${SWITCH} ip link set eth0 down166 sleep 2167 ip netns exec ${SWITCH} ip link set eth0 up168 ip netns exec ${SWITCH} ip link set eth1 down169 170 # re-verify connectivity171 slowwait 2 ip netns exec ${CLIENT} ping ${SWITCHIP} -c 2 -W 0.1 &> /dev/null172 173 local rc=$?174 check_err $rc "Bond failed to recover"175 log_test "$1 ($2) bond recovery"176 lag_reset_network177}178