1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0
3#
4# Test various interface configuration scenarios. Observe that configurations
5# deemed valid by mlxsw succeed, invalid configurations fail and that no traces
6# are produced. To prevent the test from passing in case traces are produced,
7# the user can set the 'kernel.panic_on_warn' and 'kernel.panic_on_oops'
8# sysctls in its environment.
9
10lib_dir=$(dirname $0)/../../../net/forwarding
11
12ALL_TESTS="
13	rif_set_addr_test
14	rif_inherit_bridge_addr_test
15	rif_non_inherit_bridge_addr_test
16"
17NUM_NETIFS=2
18source $lib_dir/lib.sh
19
20setup_prepare()
21{
22	swp1=${NETIFS[p1]}
23	swp2=${NETIFS[p2]}
24
25	ip link set dev $swp1 up
26	ip link set dev $swp2 up
27}
28
29cleanup()
30{
31	pre_cleanup
32
33	ip link set dev $swp2 down
34	ip link set dev $swp1 down
35}
36
37rif_set_addr_test()
38{
39	local swp1_mac=$(mac_get $swp1)
40	local swp2_mac=$(mac_get $swp2)
41
42	RET=0
43
44	# $swp1 and $swp2 likely got their IPv6 local addresses already, but
45	# here we need to test the transition to RIF.
46	ip addr flush dev $swp1
47	ip addr flush dev $swp2
48	sleep .1
49
50	ip addr add dev $swp1 192.0.2.1/28
51	check_err $?
52
53	ip link set dev $swp1 addr 00:11:22:33:44:55
54	check_err $?
55
56	# IP address enablement should be rejected if the MAC address prefix
57	# doesn't match other RIFs.
58	ip addr add dev $swp2 192.0.2.2/28 &>/dev/null
59	check_fail $? "IP address addition passed for a device with a wrong MAC"
60	ip addr add dev $swp2 192.0.2.2/28 2>&1 >/dev/null \
61	    | grep -q mlxsw_spectrum
62	check_err $? "no extack for IP address addition"
63
64	ip link set dev $swp2 addr 00:11:22:33:44:66
65	check_err $?
66	ip addr add dev $swp2 192.0.2.2/28 &>/dev/null
67	check_err $?
68
69	# Change of MAC address of a RIF should be forbidden if the new MAC
70	# doesn't share the prefix with other MAC addresses.
71	ip link set dev $swp2 addr 00:11:22:33:00:66 &>/dev/null
72	check_fail $? "change of MAC address passed for a wrong MAC"
73	ip link set dev $swp2 addr 00:11:22:33:00:66 2>&1 >/dev/null \
74	    | grep -q mlxsw_spectrum
75	check_err $? "no extack for MAC address change"
76
77	log_test "RIF - bad MAC change"
78
79	ip addr del dev $swp2 192.0.2.2/28
80	ip addr del dev $swp1 192.0.2.1/28
81
82	ip link set dev $swp2 addr $swp2_mac
83	ip link set dev $swp1 addr $swp1_mac
84}
85
86rif_inherit_bridge_addr_test()
87{
88	RET=0
89
90	# Create first RIF
91	ip addr add dev $swp1 192.0.2.1/28
92	check_err $?
93
94	# Create a FID RIF
95	ip link add name br1 up type bridge vlan_filtering 0
96	ip link set dev $swp2 master br1
97	ip addr add dev br1 192.0.2.17/28
98	check_err $?
99
100	# Prepare a device with a low MAC address
101	ip link add name d up type dummy
102	ip link set dev d addr 00:11:22:33:44:55
103
104	# Attach the device to br1. That prompts bridge address change, which
105	# should be vetoed, thus preventing the attachment.
106	ip link set dev d master br1 &>/dev/null
107	check_fail $? "Device with low MAC was permitted to attach a bridge with RIF"
108	ip link set dev d master br1 2>&1 >/dev/null \
109	    | grep -q mlxsw_spectrum
110	check_err $? "no extack for bridge attach rejection"
111
112	ip link set dev $swp2 addr 00:11:22:33:44:55 &>/dev/null
113	check_fail $? "Changing swp2's MAC address permitted"
114	ip link set dev $swp2 addr 00:11:22:33:44:55 2>&1 >/dev/null \
115	    | grep -q mlxsw_spectrum
116	check_err $? "no extack for bridge port MAC address change rejection"
117
118	log_test "RIF - attach port with bad MAC to bridge"
119
120	ip link del dev d
121	ip link del dev br1
122	ip addr del dev $swp1 192.0.2.1/28
123}
124
125rif_non_inherit_bridge_addr_test()
126{
127	local swp2_mac=$(mac_get $swp2)
128
129	RET=0
130
131	# Create first RIF
132	ip addr add dev $swp1 192.0.2.1/28
133	check_err $?
134
135	# Create a FID RIF
136	ip link add name br1 up type bridge vlan_filtering 0
137	ip link set dev br1 addr $swp2_mac
138	ip link set dev $swp2 master br1
139	ip addr add dev br1 192.0.2.17/28
140	check_err $?
141
142	# Prepare a device with a low MAC address
143	ip link add name d up type dummy
144	ip link set dev d addr 00:11:22:33:44:55
145
146	# Attach the device to br1. Since the bridge address was set, it should
147	# work.
148	ip link set dev d master br1 &>/dev/null
149	check_err $? "Could not attach a device with low MAC to a bridge with RIF"
150
151	# Port MAC address change should be allowed for a bridge with set MAC.
152	ip link set dev $swp2 addr 00:11:22:33:44:55
153	check_err $? "Changing swp2's MAC address not permitted"
154
155	log_test "RIF - attach port with bad MAC to bridge with set MAC"
156
157	ip link set dev $swp2 addr $swp2_mac
158	ip link del dev d
159	ip link del dev br1
160	ip addr del dev $swp1 192.0.2.1/28
161}
162
163trap cleanup EXIT
164
165setup_prepare
166setup_wait
167
168tests_run
169
170exit $EXIT_STATUS
171