1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0
3
4lib_dir=$(dirname $0)/../../../net/forwarding
5
6ALL_TESTS="
7	lag_rif_add
8	lag_rif_nomaster
9	lag_rif_remaster
10	lag_rif_nomaster_addr
11"
12
13REQUIRE_TEAMD="yes"
14NUM_NETIFS=2
15source $lib_dir/lib.sh
16source $lib_dir/devlink_lib.sh
17
18setup_prepare()
19{
20	swp1=${NETIFS[p1]}
21	swp2=${NETIFS[p2]}
22
23	team_create lag1 lacp
24	ip link set dev lag1 addrgenmode none
25	ip link set dev lag1 address $(mac_get $swp1)
26
27	team_create lag2 lacp
28	ip link set dev lag2 addrgenmode none
29	ip link set dev lag2 address $(mac_get $swp2)
30
31	ip link set dev $swp1 master lag1
32	ip link set dev $swp1 up
33
34	ip link set dev $swp2 master lag2
35	ip link set dev $swp2 up
36}
37
38cleanup()
39{
40	pre_cleanup
41
42	ip link set dev $swp2 nomaster
43	ip link set dev $swp2 down
44
45	ip link set dev $swp1 nomaster
46	ip link set dev $swp1 down
47
48	ip link del dev lag2
49	ip link del dev lag1
50}
51
52lag_rif_add()
53{
54	RET=0
55
56	local rifs_occ_t0=$(devlink_resource_occ_get rifs)
57	__addr_add_del lag1 add 192.0.2.2/28
58	sleep 1
59	local rifs_occ_t1=$(devlink_resource_occ_get rifs)
60	local expected_rifs=$((rifs_occ_t0 + 1))
61
62	((expected_rifs == rifs_occ_t1))
63	check_err $? "Expected $expected_rifs RIFs, $rifs_occ_t1 are used"
64
65	log_test "Add RIF for LAG on address addition"
66}
67
68lag_rif_nomaster()
69{
70	RET=0
71
72	local rifs_occ_t0=$(devlink_resource_occ_get rifs)
73	ip link set dev $swp1 nomaster
74	sleep 1
75	local rifs_occ_t1=$(devlink_resource_occ_get rifs)
76	local expected_rifs=$((rifs_occ_t0 - 1))
77
78	((expected_rifs == rifs_occ_t1))
79	check_err $? "Expected $expected_rifs RIFs, $rifs_occ_t1 are used"
80
81	log_test "Drop RIF for LAG on port deslavement"
82}
83
84lag_rif_remaster()
85{
86	RET=0
87
88	local rifs_occ_t0=$(devlink_resource_occ_get rifs)
89	ip link set dev $swp1 down
90	ip link set dev $swp1 master lag1
91	ip link set dev $swp1 up
92	setup_wait_dev $swp1
93	local rifs_occ_t1=$(devlink_resource_occ_get rifs)
94	local expected_rifs=$((rifs_occ_t0 + 1))
95
96	((expected_rifs == rifs_occ_t1))
97	check_err $? "Expected $expected_rifs RIFs, $rifs_occ_t1 are used"
98
99	log_test "Add RIF for LAG on port reenslavement"
100}
101
102lag_rif_nomaster_addr()
103{
104	local rifs_occ_t0=$(devlink_resource_occ_get rifs)
105
106	# Adding an address while the port is LAG'd shouldn't generate a RIF.
107	__addr_add_del $swp1 add 192.0.2.65/28
108	sleep 1
109	local rifs_occ_t1=$(devlink_resource_occ_get rifs)
110	local expected_rifs=$((rifs_occ_t0))
111
112	((expected_rifs == rifs_occ_t1))
113	check_err $? "After adding IP: Expected $expected_rifs RIFs, $rifs_occ_t1 are used"
114
115	# Removing the port from LAG should drop RIF for the LAG (as tested in
116	# lag_rif_nomaster), but since the port now has an address, it should
117	# gain a RIF.
118	ip link set dev $swp1 nomaster
119	sleep 1
120	local rifs_occ_t2=$(devlink_resource_occ_get rifs)
121	local expected_rifs=$((rifs_occ_t0))
122
123	((expected_rifs == rifs_occ_t2))
124	check_err $? "After deslaving: Expected $expected_rifs RIFs, $rifs_occ_t2 are used"
125
126	__addr_add_del $swp1 del 192.0.2.65/28
127	log_test "Add RIF for port on deslavement from LAG"
128}
129
130trap cleanup EXIT
131
132setup_prepare
133setup_wait
134
135tests_run
136
137exit $EXIT_STATUS
138