1#!/bin/bash 2# SPDX-License-Identifier: GPL-2.0 3 4NAMESPACES="" 5 6# Test that a link aggregation device (bonding, team) removes the hardware 7# addresses that it adds on its underlying devices. 8test_LAG_cleanup() 9{ 10 local driver=$1 11 local mode=$2 12 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 name 16 17 ip link add dummy1 type dummy 18 ip link add dummy2 type dummy 19 if [ "$driver" = "bonding" ]; then 20 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" ]; then 25 name="team0" 26 ip link add "$name" type team 27 ip link set dev dummy1 master "$name" 28 ip link set dev dummy2 master "$name" 29 ip link set dev "$name" up 30 else 31 check_err 1 32 log_test test_LAG_cleanup ": unknown driver \"$driver\"" 33 return 34 fi 35 36 # Used to test dev->uc handling 37 ip link add mv0 link "$name" up address "$ucaddr" type macvlan 38 # Used to test dev->mc handling 39 ip address add "$addr6" dev "$name" 40 41 # Check that addresses were added as expected 42 (grep_bridge_fdb "$ucaddr" bridge fdb show dev dummy1 || 43 grep_bridge_fdb "$ucaddr" bridge fdb show dev dummy2) >/dev/null 44 check_err $? "macvlan unicast address not found on a slave" 45 46 # mcaddr is added asynchronously by addrconf_dad_work(), use busywait 47 (busywait 10000 grep_bridge_fdb "$mcaddr" bridge fdb show dev dummy1 || 48 grep_bridge_fdb "$mcaddr" bridge fdb show dev dummy2) >/dev/null 49 check_err $? "IPv6 solicited-node multicast mac address not found on a slave" 50 51 ip link set dev "$name" down 52 ip link del "$name" 53 54 not grep_bridge_fdb "$ucaddr" bridge fdb show >/dev/null 55 check_err $? "macvlan unicast address still present on a slave" 56 57 not grep_bridge_fdb "$mcaddr" bridge fdb show >/dev/null 58 check_err $? "IPv6 solicited-node multicast mac address still present on a slave" 59 60 cleanup 61 62 log_test "$driver cleanup mode $mode" 63} 64 65# Build a generic 2 node net namespace with 2 connections 66# between the namespaces 67# 68# +-----------+ +-----------+ 69# | node1 | | node2 | 70# | | | | 71# | | | | 72# | eth0 +-------+ eth0 | 73# | | | | 74# | eth1 +-------+ eth1 | 75# | | | | 76# +-----------+ +-----------+ 77lag_setup2x2() 78{ 79 local state=${1:-down} 80 local namespaces="lag_node1 lag_node2" 81 82 # create namespaces 83 for n in ${namespaces}; do 84 ip netns add ${n} 85 done 86 87 # wire up namespaces 88 ip link add name lag1 type veth peer name lag1-end 89 ip link set dev lag1 netns lag_node1 $state name eth0 90 ip link set dev lag1-end netns lag_node2 $state name eth0 91 92 ip link add name lag1 type veth peer name lag1-end 93 ip link set dev lag1 netns lag_node1 $state name eth1 94 ip link set dev lag1-end netns lag_node2 $state name eth1 95 96 NAMESPACES="${namespaces}" 97} 98 99# cleanup all lag related namespaces 100lag_cleanup() 101{ 102 for n in ${NAMESPACES}; do 103 ip netns delete ${n} >/dev/null 2>&1 || true 104 done 105} 106 107SWITCH="lag_node1" 108CLIENT="lag_node2" 109CLIENTIP="172.20.2.1" 110SWITCHIP="172.20.2.2" 111 112lag_setup_network() 113{ 114 lag_setup2x2 "down" 115 116 # create switch 117 ip netns exec ${SWITCH} ip link add br0 up type bridge 118 ip netns exec ${SWITCH} ip link set eth0 master br0 up 119 ip netns exec ${SWITCH} ip link set eth1 master br0 up 120 ip netns exec ${SWITCH} ip addr add ${SWITCHIP}/24 dev br0 121} 122 123lag_reset_network() 124{ 125 ip netns exec ${CLIENT} ip link del bond0 126 ip netns exec ${SWITCH} ip link set eth0 up 127 ip netns exec ${SWITCH} ip link set eth1 up 128} 129 130create_bond() 131{ 132 # create client 133 ip netns exec ${CLIENT} ip link set eth0 down 134 ip netns exec ${CLIENT} ip link set eth1 down 135 136 ip netns exec ${CLIENT} ip link add bond0 type bond $@ 137 ip netns exec ${CLIENT} ip link set eth0 master bond0 138 ip netns exec ${CLIENT} ip link set eth1 master bond0 139 ip netns exec ${CLIENT} ip link set bond0 up 140 ip netns exec ${CLIENT} ip addr add ${CLIENTIP}/24 dev bond0 141} 142 143test_bond_recovery() 144{ 145 RET=0 146 147 create_bond $@ 148 149 # verify connectivity 150 slowwait 2 ip netns exec ${CLIENT} ping ${SWITCHIP} -c 2 -W 0.1 &> /dev/null 151 check_err $? "No connectivity" 152 153 # force the links of the bond down 154 ip netns exec ${SWITCH} ip link set eth0 down 155 sleep 2 156 ip netns exec ${SWITCH} ip link set eth0 up 157 ip netns exec ${SWITCH} ip link set eth1 down 158 159 # re-verify connectivity 160 slowwait 2 ip netns exec ${CLIENT} ping ${SWITCHIP} -c 2 -W 0.1 &> /dev/null 161 162 local rc=$? 163 check_err $rc "Bond failed to recover" 164 log_test "$1 ($2) bond recovery" 165 lag_reset_network 166} 167