Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0
3
4lib_dir=$(dirname $0)/../../../net/forwarding
5
6ALL_TESTS="
7 mac_profile_test
8"
9NUM_NETIFS=4
10source $lib_dir/lib.sh
11source $lib_dir/tc_common.sh
12source $lib_dir/devlink_lib.sh
13
14h1_create()
15{
16 simple_if_init $h1 192.0.2.1/24
17 ip route add 198.51.100.0/24 vrf v$h1 nexthop via 192.0.2.2
18
19 tc qdisc add dev $h1 ingress
20}
21
22h1_destroy()
23{
24 tc qdisc del dev $h1 ingress
25
26 ip route del 198.51.100.0/24 vrf v$h1
27 simple_if_fini $h1 192.0.2.1/24
28}
29
30h2_create()
31{
32 simple_if_init $h2 198.51.100.1/24
33 ip route add 192.0.2.0/24 vrf v$h2 nexthop via 198.51.100.2
34
35 tc qdisc add dev $h2 ingress
36}
37
38h2_destroy()
39{
40 tc qdisc del dev $h2 ingress
41
42 ip route del 192.0.2.0/24 vrf v$h2
43 simple_if_fini $h2 198.51.100.1/24
44}
45
46router_create()
47{
48 ip link set dev $rp1 up
49 ip link set dev $rp2 up
50
51 tc qdisc add dev $rp1 clsact
52 tc qdisc add dev $rp2 clsact
53 ip address add 192.0.2.2/24 dev $rp1
54 ip address add 198.51.100.2/24 dev $rp2
55}
56
57router_destroy()
58{
59 ip address del 198.51.100.2/24 dev $rp2
60 ip address del 192.0.2.2/24 dev $rp1
61 tc qdisc del dev $rp2 clsact
62 tc qdisc del dev $rp1 clsact
63
64 ip link set dev $rp2 down
65 ip link set dev $rp1 down
66}
67
68setup_prepare()
69{
70 h1=${NETIFS[p1]}
71 rp1=${NETIFS[p2]}
72
73 rp2=${NETIFS[p3]}
74 h2=${NETIFS[p4]}
75
76 vrf_prepare
77
78 h1_create
79 h2_create
80
81 router_create
82
83 forwarding_enable
84}
85
86cleanup()
87{
88 pre_cleanup
89
90 forwarding_restore
91
92 router_destroy
93
94 h2_destroy
95 h1_destroy
96
97 vrf_cleanup
98}
99
100h1_to_h2()
101{
102 local test_name=$@; shift
103 local smac=$(mac_get $rp2)
104
105 RET=0
106
107 # Replace neighbour to avoid first packet being forwarded in software
108 ip neigh replace dev $rp2 198.51.100.1 lladdr $(mac_get $h2)
109
110 # Add a filter to ensure that packets are forwarded in hardware. Cannot
111 # match on source MAC because it is not set in eACL after routing
112 tc filter add dev $rp2 egress proto ip pref 1 handle 101 \
113 flower skip_sw ip_proto udp src_port 12345 dst_port 54321 \
114 action pass
115
116 # Add a filter to ensure that packets are received with the correct
117 # source MAC
118 tc filter add dev $h2 ingress proto ip pref 1 handle 101 \
119 flower skip_sw src_mac $smac ip_proto udp src_port 12345 \
120 dst_port 54321 action pass
121
122 $MZ $h1 -a own -b $(mac_get $rp1) -t udp "sp=12345,dp=54321" \
123 -A 192.0.2.1 -B 198.51.100.1 -c 10 -p 100 -d 1msec -q
124
125 tc_check_packets "dev $rp2 egress" 101 10
126 check_err $? "packets not forwarded in hardware"
127
128 tc_check_packets "dev $h2 ingress" 101 10
129 check_err $? "packets not forwarded with correct source mac"
130
131 log_test "h1->h2: $test_name"
132
133 tc filter del dev $h2 ingress protocol ip pref 1 handle 101 flower
134 tc filter del dev $rp2 egress protocol ip pref 1 handle 101 flower
135 ip neigh del dev $rp2 198.51.100.1 lladdr $(mac_get $h2)
136}
137
138h2_to_h1()
139{
140 local test_name=$@; shift
141 local rp1_mac=$(mac_get $rp1)
142
143 RET=0
144
145 ip neigh replace dev $rp1 192.0.2.1 lladdr $(mac_get $h1)
146
147 tc filter add dev $rp1 egress proto ip pref 1 handle 101 \
148 flower skip_sw ip_proto udp src_port 54321 dst_port 12345 \
149 action pass
150
151 tc filter add dev $h1 ingress proto ip pref 1 handle 101 \
152 flower skip_sw src_mac $rp1_mac ip_proto udp src_port 54321 \
153 dst_port 12345 action pass
154
155 $MZ $h2 -a own -b $(mac_get $rp2) -t udp "sp=54321,dp=12345" \
156 -A 198.51.100.1 -B 192.0.2.1 -c 10 -p 100 -d 1msec -q
157
158 tc_check_packets "dev $rp1 egress" 101 10
159 check_err $? "packets not forwarded in hardware"
160
161 tc_check_packets "dev $h1 ingress" 101 10
162 check_err $? "packets not forwarded with correct source mac"
163
164 log_test "h2->h1: $test_name"
165
166 tc filter del dev $h1 ingress protocol ip pref 1 handle 101 flower
167 tc filter del dev $rp1 egress protocol ip pref 1 handle 101 flower
168 ip neigh del dev $rp1 192.0.2.1 lladdr $(mac_get $h1)
169}
170
171smac_test()
172{
173 local test_name=$@; shift
174
175 # Test that packets forwarded to $h2 via $rp2 are forwarded with the
176 # current source MAC of $rp2
177 h1_to_h2 $test_name
178
179 # Test that packets forwarded to $h1 via $rp1 are forwarded with the
180 # current source MAC of $rp1. This MAC is never changed during the test,
181 # but given the shared nature of MAC profile, the point is to see that
182 # changes to the MAC of $rp2 do not affect that of $rp1
183 h2_to_h1 $test_name
184}
185
186mac_profile_test()
187{
188 local rp2_mac=$(mac_get $rp2)
189
190 # Test behavior when the RIF backing $rp2 is transitioned to use
191 # a new MAC profile
192 ip link set dev $rp2 addr 00:11:22:33:44:55
193 smac_test "new mac profile"
194
195 # Test behavior when the MAC profile used by the RIF is edited
196 ip link set dev $rp2 address 00:22:22:22:22:22
197 smac_test "edit mac profile"
198
199 # Restore original MAC
200 ip link set dev $rp2 addr $rp2_mac
201}
202
203trap cleanup EXIT
204
205setup_prepare
206setup_wait
207
208mac_profiles=$(devlink_resource_size_get rif_mac_profiles)
209if [[ $mac_profiles -ne 1 ]]; then
210 tests_run
211fi
212
213exit $EXIT_STATUS