1*bbb774d9SBenjamin Poirier#!/bin/bash
2*bbb774d9SBenjamin Poirier# SPDX-License-Identifier: GPL-2.0
3*bbb774d9SBenjamin Poirier#
4*bbb774d9SBenjamin Poirier# Test bond device handling of addr lists (dev->uc, mc)
5*bbb774d9SBenjamin Poirier#
6*bbb774d9SBenjamin Poirier
7*bbb774d9SBenjamin PoirierALL_TESTS="
8*bbb774d9SBenjamin Poirier	bond_cleanup_mode1
9*bbb774d9SBenjamin Poirier	bond_cleanup_mode4
10*bbb774d9SBenjamin Poirier	bond_listen_lacpdu_multicast_case_down
11*bbb774d9SBenjamin Poirier	bond_listen_lacpdu_multicast_case_up
12*bbb774d9SBenjamin Poirier"
13*bbb774d9SBenjamin Poirier
14*bbb774d9SBenjamin PoirierREQUIRE_MZ=no
15*bbb774d9SBenjamin PoirierNUM_NETIFS=0
16*bbb774d9SBenjamin Poirierlib_dir=$(dirname "$0")
17*bbb774d9SBenjamin Poiriersource "$lib_dir"/../../../net/forwarding/lib.sh
18*bbb774d9SBenjamin Poirier
19*bbb774d9SBenjamin Poiriersource "$lib_dir"/lag_lib.sh
20*bbb774d9SBenjamin Poirier
21*bbb774d9SBenjamin Poirier
22*bbb774d9SBenjamin Poirierdestroy()
23*bbb774d9SBenjamin Poirier{
24*bbb774d9SBenjamin Poirier	local ifnames=(dummy1 dummy2 bond1 mv0)
25*bbb774d9SBenjamin Poirier	local ifname
26*bbb774d9SBenjamin Poirier
27*bbb774d9SBenjamin Poirier	for ifname in "${ifnames[@]}"; do
28*bbb774d9SBenjamin Poirier		ip link del "$ifname" &>/dev/null
29*bbb774d9SBenjamin Poirier	done
30*bbb774d9SBenjamin Poirier}
31*bbb774d9SBenjamin Poirier
32*bbb774d9SBenjamin Poiriercleanup()
33*bbb774d9SBenjamin Poirier{
34*bbb774d9SBenjamin Poirier	pre_cleanup
35*bbb774d9SBenjamin Poirier
36*bbb774d9SBenjamin Poirier	destroy
37*bbb774d9SBenjamin Poirier}
38*bbb774d9SBenjamin Poirier
39*bbb774d9SBenjamin Poirier
40*bbb774d9SBenjamin Poirier# bond driver control paths vary between modes that have a primary slave
41*bbb774d9SBenjamin Poirier# (bond_uses_primary()) and others. Test both kinds of modes.
42*bbb774d9SBenjamin Poirier
43*bbb774d9SBenjamin Poirierbond_cleanup_mode1()
44*bbb774d9SBenjamin Poirier{
45*bbb774d9SBenjamin Poirier	RET=0
46*bbb774d9SBenjamin Poirier
47*bbb774d9SBenjamin Poirier	test_LAG_cleanup "bonding" "active-backup"
48*bbb774d9SBenjamin Poirier}
49*bbb774d9SBenjamin Poirier
50*bbb774d9SBenjamin Poirierbond_cleanup_mode4() {
51*bbb774d9SBenjamin Poirier	RET=0
52*bbb774d9SBenjamin Poirier
53*bbb774d9SBenjamin Poirier	test_LAG_cleanup "bonding" "802.3ad"
54*bbb774d9SBenjamin Poirier}
55*bbb774d9SBenjamin Poirier
56*bbb774d9SBenjamin Poirierbond_listen_lacpdu_multicast()
57*bbb774d9SBenjamin Poirier{
58*bbb774d9SBenjamin Poirier	# Initial state of bond device, up | down
59*bbb774d9SBenjamin Poirier	local init_state=$1
60*bbb774d9SBenjamin Poirier	local lacpdu_mc="01:80:c2:00:00:02"
61*bbb774d9SBenjamin Poirier
62*bbb774d9SBenjamin Poirier	ip link add dummy1 type dummy
63*bbb774d9SBenjamin Poirier	ip link add bond1 "$init_state" type bond mode 802.3ad
64*bbb774d9SBenjamin Poirier	ip link set dev dummy1 master bond1
65*bbb774d9SBenjamin Poirier	if [ "$init_state" = "down" ]; then
66*bbb774d9SBenjamin Poirier		ip link set dev bond1 up
67*bbb774d9SBenjamin Poirier	fi
68*bbb774d9SBenjamin Poirier
69*bbb774d9SBenjamin Poirier	grep_bridge_fdb "$lacpdu_mc" bridge fdb show brport dummy1 >/dev/null
70*bbb774d9SBenjamin Poirier	check_err $? "LACPDU multicast address not present on slave (1)"
71*bbb774d9SBenjamin Poirier
72*bbb774d9SBenjamin Poirier	ip link set dev bond1 down
73*bbb774d9SBenjamin Poirier
74*bbb774d9SBenjamin Poirier	not grep_bridge_fdb "$lacpdu_mc" bridge fdb show brport dummy1 >/dev/null
75*bbb774d9SBenjamin Poirier	check_err $? "LACPDU multicast address still present on slave"
76*bbb774d9SBenjamin Poirier
77*bbb774d9SBenjamin Poirier	ip link set dev bond1 up
78*bbb774d9SBenjamin Poirier
79*bbb774d9SBenjamin Poirier	grep_bridge_fdb "$lacpdu_mc" bridge fdb show brport dummy1 >/dev/null
80*bbb774d9SBenjamin Poirier	check_err $? "LACPDU multicast address not present on slave (2)"
81*bbb774d9SBenjamin Poirier
82*bbb774d9SBenjamin Poirier	cleanup
83*bbb774d9SBenjamin Poirier
84*bbb774d9SBenjamin Poirier	log_test "bonding LACPDU multicast address to slave (from bond $init_state)"
85*bbb774d9SBenjamin Poirier}
86*bbb774d9SBenjamin Poirier
87*bbb774d9SBenjamin Poirier# The LACPDU mc addr is added by different paths depending on the initial state
88*bbb774d9SBenjamin Poirier# of the bond when enslaving a device. Test both cases.
89*bbb774d9SBenjamin Poirier
90*bbb774d9SBenjamin Poirierbond_listen_lacpdu_multicast_case_down()
91*bbb774d9SBenjamin Poirier{
92*bbb774d9SBenjamin Poirier	RET=0
93*bbb774d9SBenjamin Poirier
94*bbb774d9SBenjamin Poirier	bond_listen_lacpdu_multicast "down"
95*bbb774d9SBenjamin Poirier}
96*bbb774d9SBenjamin Poirier
97*bbb774d9SBenjamin Poirierbond_listen_lacpdu_multicast_case_up()
98*bbb774d9SBenjamin Poirier{
99*bbb774d9SBenjamin Poirier	RET=0
100*bbb774d9SBenjamin Poirier
101*bbb774d9SBenjamin Poirier	bond_listen_lacpdu_multicast "up"
102*bbb774d9SBenjamin Poirier}
103*bbb774d9SBenjamin Poirier
104*bbb774d9SBenjamin Poirier
105*bbb774d9SBenjamin Poiriertrap cleanup EXIT
106*bbb774d9SBenjamin Poirier
107*bbb774d9SBenjamin Poiriertests_run
108*bbb774d9SBenjamin Poirier
109*bbb774d9SBenjamin Poirierexit "$EXIT_STATUS"
110