Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
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}