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