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