1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0
3
4lib_dir=$(dirname $0)/../../../net/forwarding
5
6ALL_TESTS="
7	bridge_rif_add
8	bridge_rif_nomaster
9	bridge_rif_remaster
10	bridge_rif_nomaster_addr
11	bridge_rif_nomaster_port
12	bridge_rif_remaster_port
13"
14
15REQUIRE_TEAMD="yes"
16NUM_NETIFS=2
17source $lib_dir/lib.sh
18source $lib_dir/devlink_lib.sh
19
20setup_prepare()
21{
22	swp1=${NETIFS[p1]}
23	swp2=${NETIFS[p2]}
24
25	team_create lag1 lacp
26	ip link set dev lag1 addrgenmode none
27	ip link set dev lag1 address $(mac_get $swp1)
28
29	team_create lag2 lacp
30	ip link set dev lag2 addrgenmode none
31	ip link set dev lag2 address $(mac_get $swp2)
32
33	ip link add name br1 type bridge vlan_filtering 1
34	ip link set dev br1 addrgenmode none
35	ip link set dev br1 address $(mac_get lag1)
36	ip link set dev br1 up
37
38	ip link set dev lag1 master br1
39
40	ip link set dev $swp1 master lag1
41	ip link set dev $swp1 up
42
43	ip link set dev $swp2 master lag2
44	ip link set dev $swp2 up
45}
46
47cleanup()
48{
49	pre_cleanup
50
51	ip link set dev $swp2 nomaster
52	ip link set dev $swp2 down
53
54	ip link set dev $swp1 nomaster
55	ip link set dev $swp1 down
56
57	ip link del dev lag2
58	ip link set dev lag1 nomaster
59	ip link del dev lag1
60
61	ip link del dev br1
62}
63
64bridge_rif_add()
65{
66	RET=0
67
68	local rifs_occ_t0=$(devlink_resource_occ_get rifs)
69	__addr_add_del br1 add 192.0.2.2/28
70	sleep 1
71	local rifs_occ_t1=$(devlink_resource_occ_get rifs)
72	local expected_rifs=$((rifs_occ_t0 + 1))
73
74	((expected_rifs == rifs_occ_t1))
75	check_err $? "Expected $expected_rifs RIFs, $rifs_occ_t1 are used"
76
77	log_test "Add RIF for bridge on address addition"
78}
79
80bridge_rif_nomaster()
81{
82	RET=0
83
84	local rifs_occ_t0=$(devlink_resource_occ_get rifs)
85	ip link set dev lag1 nomaster
86	sleep 1
87	local rifs_occ_t1=$(devlink_resource_occ_get rifs)
88	local expected_rifs=$((rifs_occ_t0 - 1))
89
90	((expected_rifs == rifs_occ_t1))
91	check_err $? "Expected $expected_rifs RIFs, $rifs_occ_t1 are used"
92
93	log_test "Drop RIF for bridge on LAG deslavement"
94}
95
96bridge_rif_remaster()
97{
98	RET=0
99
100	local rifs_occ_t0=$(devlink_resource_occ_get rifs)
101	ip link set dev lag1 master br1
102	sleep 1
103	local rifs_occ_t1=$(devlink_resource_occ_get rifs)
104	local expected_rifs=$((rifs_occ_t0 + 1))
105
106	((expected_rifs == rifs_occ_t1))
107	check_err $? "Expected $expected_rifs RIFs, $rifs_occ_t1 are used"
108
109	log_test "Add RIF for bridge on LAG reenslavement"
110}
111
112bridge_rif_nomaster_addr()
113{
114	local rifs_occ_t0=$(devlink_resource_occ_get rifs)
115
116	# Adding an address while the LAG is enslaved shouldn't generate a RIF.
117	__addr_add_del lag1 add 192.0.2.65/28
118	sleep 1
119	local rifs_occ_t1=$(devlink_resource_occ_get rifs)
120	local expected_rifs=$((rifs_occ_t0))
121
122	((expected_rifs == rifs_occ_t1))
123	check_err $? "After adding IP: Expected $expected_rifs RIFs, $rifs_occ_t1 are used"
124
125	# Removing the LAG from the bridge should drop RIF for the bridge (as
126	# tested in bridge_rif_lag_nomaster), but since the LAG now has an
127	# address, it should gain a RIF.
128	ip link set dev lag1 nomaster
129	sleep 1
130	local rifs_occ_t2=$(devlink_resource_occ_get rifs)
131	local expected_rifs=$((rifs_occ_t0))
132
133	((expected_rifs == rifs_occ_t2))
134	check_err $? "After deslaving: Expected $expected_rifs RIFs, $rifs_occ_t2 are used"
135
136	log_test "Add RIF for LAG on deslavement from bridge"
137
138	__addr_add_del lag1 del 192.0.2.65/28
139	ip link set dev lag1 master br1
140	sleep 1
141}
142
143bridge_rif_nomaster_port()
144{
145	RET=0
146
147	local rifs_occ_t0=$(devlink_resource_occ_get rifs)
148	ip link set dev $swp1 nomaster
149	sleep 1
150	local rifs_occ_t1=$(devlink_resource_occ_get rifs)
151	local expected_rifs=$((rifs_occ_t0 - 1))
152
153	((expected_rifs == rifs_occ_t1))
154	check_err $? "Expected $expected_rifs RIFs, $rifs_occ_t1 are used"
155
156	log_test "Drop RIF for bridge on deslavement of port from LAG"
157}
158
159bridge_rif_remaster_port()
160{
161	RET=0
162
163	local rifs_occ_t0=$(devlink_resource_occ_get rifs)
164	ip link set dev $swp1 down
165	ip link set dev $swp1 master lag1
166	ip link set dev $swp1 up
167	setup_wait_dev $swp1
168	local rifs_occ_t1=$(devlink_resource_occ_get rifs)
169	local expected_rifs=$((rifs_occ_t0 + 1))
170
171	((expected_rifs == rifs_occ_t1))
172	check_err $? "Expected $expected_rifs RIFs, $rifs_occ_t1 are used"
173
174	log_test "Add RIF for bridge on reenslavement of port to LAG"
175}
176
177trap cleanup EXIT
178
179setup_prepare
180setup_wait
181
182tests_run
183
184exit $EXIT_STATUS
185