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	vlan_create lag1 100
38	ip link set dev lag1.100 addrgenmode none
39
40	vlan_create lag1 200
41	ip link set dev lag1.200 addrgenmode none
42}
43
44cleanup()
45{
46	pre_cleanup
47
48	ip link del dev lag1.200
49	ip link del dev lag1.100
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 del dev lag1
59}
60
61lag_rif_add()
62{
63	RET=0
64
65	local rifs_occ_t0=$(devlink_resource_occ_get rifs)
66	__addr_add_del lag1.100 add 192.0.2.2/28
67	__addr_add_del lag1.200 add 192.0.2.18/28
68	sleep 1
69	local rifs_occ_t1=$(devlink_resource_occ_get rifs)
70	local expected_rifs=$((rifs_occ_t0 + 2))
71
72	((expected_rifs == rifs_occ_t1))
73	check_err $? "Expected $expected_rifs RIFs, $rifs_occ_t1 are used"
74
75	log_test "Add RIFs for LAG VLANs on address addition"
76}
77
78lag_rif_nomaster()
79{
80	RET=0
81
82	local rifs_occ_t0=$(devlink_resource_occ_get rifs)
83	ip link set dev $swp1 nomaster
84	sleep 1
85	local rifs_occ_t1=$(devlink_resource_occ_get rifs)
86	local expected_rifs=$((rifs_occ_t0 - 2))
87
88	((expected_rifs == rifs_occ_t1))
89	check_err $? "Expected $expected_rifs RIFs, $rifs_occ_t1 are used"
90
91	log_test "Drop RIFs for LAG VLANs on port deslavement"
92}
93
94lag_rif_remaster()
95{
96	RET=0
97
98	local rifs_occ_t0=$(devlink_resource_occ_get rifs)
99	ip link set dev $swp1 down
100	ip link set dev $swp1 master lag1
101	ip link set dev $swp1 up
102	setup_wait_dev $swp1
103	local rifs_occ_t1=$(devlink_resource_occ_get rifs)
104	local expected_rifs=$((rifs_occ_t0 + 2))
105
106	((expected_rifs == rifs_occ_t1))
107	check_err $? "Expected $expected_rifs RIFs, $rifs_occ_t1 are used"
108
109	log_test "Add RIFs for LAG VLANs on port reenslavement"
110}
111
112lag_rif_nomaster_addr()
113{
114	local rifs_occ_t0=$(devlink_resource_occ_get rifs)
115
116	# Adding an address while the port is LAG'd shouldn't generate a RIF.
117	__addr_add_del $swp1 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 port from LAG should drop two RIFs for the LAG VLANs (as
126	# tested in lag_rif_nomaster), but since the port now has an address, it
127	# should gain a RIF.
128	ip link set dev $swp1 nomaster
129	sleep 1
130	local rifs_occ_t2=$(devlink_resource_occ_get rifs)
131	local expected_rifs=$((rifs_occ_t0 - 1))
132
133	((expected_rifs == rifs_occ_t2))
134	check_err $? "After deslaving: Expected $expected_rifs RIFs, $rifs_occ_t2 are used"
135
136	__addr_add_del $swp1 del 192.0.2.65/28
137	log_test "Add RIF for port on deslavement from LAG"
138}
139
140trap cleanup EXIT
141
142setup_prepare
143setup_wait
144
145tests_run
146
147exit $EXIT_STATUS
148