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