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