summaryrefslogtreecommitdiff
path: root/tools/testing/selftests/drivers/net/mlxsw/rif_mac_profiles.sh
blob: c18340cee55d589baa1d5f58f82c11e01863177d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0

lib_dir=$(dirname $0)/../../../net/forwarding

ALL_TESTS="
	mac_profile_test
"
NUM_NETIFS=4
source $lib_dir/lib.sh
source $lib_dir/tc_common.sh
source $lib_dir/devlink_lib.sh

h1_create()
{
	simple_if_init $h1 192.0.2.1/24
	ip route add 198.51.100.0/24 vrf v$h1 nexthop via 192.0.2.2

	tc qdisc add dev $h1 ingress
}

h1_destroy()
{
	tc qdisc del dev $h1 ingress

	ip route del 198.51.100.0/24 vrf v$h1
	simple_if_fini $h1 192.0.2.1/24
}

h2_create()
{
	simple_if_init $h2 198.51.100.1/24
	ip route add 192.0.2.0/24 vrf v$h2 nexthop via 198.51.100.2

	tc qdisc add dev $h2 ingress
}

h2_destroy()
{
	tc qdisc del dev $h2 ingress

	ip route del 192.0.2.0/24 vrf v$h2
	simple_if_fini $h2 198.51.100.1/24
}

router_create()
{
	ip link set dev $rp1 up
	ip link set dev $rp2 up

	tc qdisc add dev $rp1 clsact
	tc qdisc add dev $rp2 clsact
	ip address add 192.0.2.2/24 dev $rp1
	ip address add 198.51.100.2/24 dev $rp2
}

router_destroy()
{
	ip address del 198.51.100.2/24 dev $rp2
	ip address del 192.0.2.2/24 dev $rp1
	tc qdisc del dev $rp2 clsact
	tc qdisc del dev $rp1 clsact

	ip link set dev $rp2 down
	ip link set dev $rp1 down
}

setup_prepare()
{
	h1=${NETIFS[p1]}
	rp1=${NETIFS[p2]}

	rp2=${NETIFS[p3]}
	h2=${NETIFS[p4]}

	vrf_prepare

	h1_create
	h2_create

	router_create

	forwarding_enable
}

cleanup()
{
	pre_cleanup

	forwarding_restore

	router_destroy

	h2_destroy
	h1_destroy

	vrf_cleanup
}

h1_to_h2()
{
	local test_name=$@; shift
	local smac=$(mac_get $rp2)

	RET=0

	# Replace neighbour to avoid first packet being forwarded in software
	ip neigh replace dev $rp2 198.51.100.1 lladdr $(mac_get $h2)

	# Add a filter to ensure that packets are forwarded in hardware. Cannot
	# match on source MAC because it is not set in eACL after routing
	tc filter add dev $rp2 egress proto ip pref 1 handle 101 \
		flower skip_sw ip_proto udp src_port 12345 dst_port 54321 \
		action pass

	# Add a filter to ensure that packets are received with the correct
	# source MAC
	tc filter add dev $h2 ingress proto ip pref 1 handle 101 \
		flower skip_sw src_mac $smac ip_proto udp src_port 12345 \
		dst_port 54321 action pass

	$MZ $h1 -a own -b $(mac_get $rp1) -t udp "sp=12345,dp=54321" \
		-A 192.0.2.1 -B 198.51.100.1 -c 10 -p 100 -d 1msec -q

	tc_check_packets "dev $rp2 egress" 101 10
	check_err $? "packets not forwarded in hardware"

	tc_check_packets "dev $h2 ingress" 101 10
	check_err $? "packets not forwarded with correct source mac"

	log_test "h1->h2: $test_name"

	tc filter del dev $h2 ingress protocol ip pref 1 handle 101 flower
	tc filter del dev $rp2 egress protocol ip pref 1 handle 101 flower
	ip neigh del dev $rp2 198.51.100.1 lladdr $(mac_get $h2)
}

h2_to_h1()
{
	local test_name=$@; shift
	local rp1_mac=$(mac_get $rp1)

	RET=0

	ip neigh replace dev $rp1 192.0.2.1 lladdr $(mac_get $h1)

	tc filter add dev $rp1 egress proto ip pref 1 handle 101 \
		flower skip_sw ip_proto udp src_port 54321 dst_port 12345 \
		action pass

	tc filter add dev $h1 ingress proto ip pref 1 handle 101 \
		flower skip_sw src_mac $rp1_mac ip_proto udp src_port 54321 \
		dst_port 12345 action pass

	$MZ $h2 -a own -b $(mac_get $rp2) -t udp "sp=54321,dp=12345" \
		-A 198.51.100.1 -B 192.0.2.1 -c 10 -p 100 -d 1msec -q

	tc_check_packets "dev $rp1 egress" 101 10
	check_err $? "packets not forwarded in hardware"

	tc_check_packets "dev $h1 ingress" 101 10
	check_err $? "packets not forwarded with correct source mac"

	log_test "h2->h1: $test_name"

	tc filter del dev $h1 ingress protocol ip pref 1 handle 101 flower
	tc filter del dev $rp1 egress protocol ip pref 1 handle 101 flower
	ip neigh del dev $rp1 192.0.2.1 lladdr $(mac_get $h1)
}

smac_test()
{
	local test_name=$@; shift

	# Test that packets forwarded to $h2 via $rp2 are forwarded with the
	# current source MAC of $rp2
	h1_to_h2 $test_name

	# Test that packets forwarded to $h1 via $rp1 are forwarded with the
	# current source MAC of $rp1. This MAC is never changed during the test,
	# but given the shared nature of MAC profile, the point is to see that
	# changes to the MAC of $rp2 do not affect that of $rp1
	h2_to_h1 $test_name
}

mac_profile_test()
{
	local rp2_mac=$(mac_get $rp2)

	# Test behavior when the RIF backing $rp2 is transitioned to use
	# a new MAC profile
	ip link set dev $rp2 addr 00:11:22:33:44:55
	smac_test "new mac profile"

	# Test behavior when the MAC profile used by the RIF is edited
	ip link set dev $rp2 address 00:22:22:22:22:22
	smac_test "edit mac profile"

	# Restore original MAC
	ip link set dev $rp2 addr $rp2_mac
}

trap cleanup EXIT

setup_prepare
setup_wait

mac_profiles=$(devlink_resource_size_get rif_mac_profiles)
if [[ $mac_profiles -ne 1 ]]; then
	tests_run
fi

exit $EXIT_STATUS