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#
4# This test is for checking the FIB offload API. It makes use of netdevsim
5# which registers a listener to the FIB notification chain.
6
7lib_dir=$(dirname $0)/../../../net/forwarding
8
9ALL_TESTS="
10 ipv4_identical_routes
11 ipv4_tos
12 ipv4_metric
13 ipv4_replace
14 ipv4_delete
15 ipv4_plen
16 ipv4_replay
17 ipv4_flush
18 ipv4_error_path
19 ipv6_add
20 ipv6_metric
21 ipv6_append_single
22 ipv6_replace_single
23 ipv6_metric_multipath
24 ipv6_append_multipath
25 ipv6_replace_multipath
26 ipv6_append_multipath_to_single
27 ipv6_delete_single
28 ipv6_delete_multipath
29 ipv6_replay_single
30 ipv6_replay_multipath
31 ipv6_error_path
32"
33NETDEVSIM_PATH=/sys/bus/netdevsim/
34DEV_ADDR=1337
35DEV=netdevsim${DEV_ADDR}
36SYSFS_NET_DIR=/sys/bus/netdevsim/devices/$DEV/net/
37NUM_NETIFS=0
38source $lib_dir/lib.sh
39source $lib_dir/fib_offload_lib.sh
40
41DEVLINK_DEV=
42source $lib_dir/devlink_lib.sh
43DEVLINK_DEV=netdevsim/${DEV}
44
45ipv4_identical_routes()
46{
47 fib_ipv4_identical_routes_test "testns1"
48}
49
50ipv4_tos()
51{
52 fib_ipv4_tos_test "testns1"
53}
54
55ipv4_metric()
56{
57 fib_ipv4_metric_test "testns1"
58}
59
60ipv4_replace()
61{
62 fib_ipv4_replace_test "testns1"
63}
64
65ipv4_delete()
66{
67 fib_ipv4_delete_test "testns1"
68}
69
70ipv4_plen()
71{
72 fib_ipv4_plen_test "testns1"
73}
74
75ipv4_replay_metric()
76{
77 fib_ipv4_replay_metric_test "testns1" "$DEVLINK_DEV"
78}
79
80ipv4_replay_tos()
81{
82 fib_ipv4_replay_tos_test "testns1" "$DEVLINK_DEV"
83}
84
85ipv4_replay_plen()
86{
87 fib_ipv4_replay_plen_test "testns1" "$DEVLINK_DEV"
88}
89
90ipv4_replay()
91{
92 ipv4_replay_metric
93 ipv4_replay_tos
94 ipv4_replay_plen
95}
96
97ipv4_flush()
98{
99 fib_ipv4_flush_test "testns1"
100}
101
102ipv4_error_path_add()
103{
104 local lsb
105
106 RET=0
107
108 ip -n testns1 link add name dummy1 type dummy
109 ip -n testns1 link set dev dummy1 up
110
111 devlink -N testns1 resource set $DEVLINK_DEV path IPv4/fib size 10
112 devlink -N testns1 dev reload $DEVLINK_DEV
113
114 for lsb in $(seq 1 20); do
115 ip -n testns1 route add 192.0.2.${lsb}/32 dev dummy1 \
116 &> /dev/null
117 done
118
119 log_test "IPv4 error path - add"
120
121 ip -n testns1 link del dev dummy1
122}
123
124ipv4_error_path_replay()
125{
126 local lsb
127
128 RET=0
129
130 ip -n testns1 link add name dummy1 type dummy
131 ip -n testns1 link set dev dummy1 up
132
133 devlink -N testns1 resource set $DEVLINK_DEV path IPv4/fib size 100
134 devlink -N testns1 dev reload $DEVLINK_DEV
135
136 for lsb in $(seq 1 20); do
137 ip -n testns1 route add 192.0.2.${lsb}/32 dev dummy1
138 done
139
140 devlink -N testns1 resource set $DEVLINK_DEV path IPv4/fib size 10
141 devlink -N testns1 dev reload $DEVLINK_DEV &> /dev/null
142
143 log_test "IPv4 error path - replay"
144
145 ip -n testns1 link del dev dummy1
146
147 # Successfully reload after deleting all the routes.
148 devlink -N testns1 resource set $DEVLINK_DEV path IPv4/fib size 100
149 devlink -N testns1 dev reload $DEVLINK_DEV
150}
151
152ipv4_error_path()
153{
154 # Test the different error paths of the notifiers by limiting the size
155 # of the "IPv4/fib" resource.
156 ipv4_error_path_add
157 ipv4_error_path_replay
158}
159
160ipv6_add()
161{
162 fib_ipv6_add_test "testns1"
163}
164
165ipv6_metric()
166{
167 fib_ipv6_metric_test "testns1"
168}
169
170ipv6_append_single()
171{
172 fib_ipv6_append_single_test "testns1"
173}
174
175ipv6_replace_single()
176{
177 fib_ipv6_replace_single_test "testns1"
178}
179
180ipv6_metric_multipath()
181{
182 fib_ipv6_metric_multipath_test "testns1"
183}
184
185ipv6_append_multipath()
186{
187 fib_ipv6_append_multipath_test "testns1"
188}
189
190ipv6_replace_multipath()
191{
192 fib_ipv6_replace_multipath_test "testns1"
193}
194
195ipv6_append_multipath_to_single()
196{
197 fib_ipv6_append_multipath_to_single_test "testns1"
198}
199
200ipv6_delete_single()
201{
202 fib_ipv6_delete_single_test "testns1"
203}
204
205ipv6_delete_multipath()
206{
207 fib_ipv6_delete_multipath_test "testns1"
208}
209
210ipv6_replay_single()
211{
212 fib_ipv6_replay_single_test "testns1" "$DEVLINK_DEV"
213}
214
215ipv6_replay_multipath()
216{
217 fib_ipv6_replay_multipath_test "testns1" "$DEVLINK_DEV"
218}
219
220ipv6_error_path_add_single()
221{
222 local lsb
223
224 RET=0
225
226 ip -n testns1 link add name dummy1 type dummy
227 ip -n testns1 link set dev dummy1 up
228
229 devlink -N testns1 resource set $DEVLINK_DEV path IPv6/fib size 10
230 devlink -N testns1 dev reload $DEVLINK_DEV
231
232 for lsb in $(seq 1 20); do
233 ip -n testns1 route add 2001:db8:1::${lsb}/128 dev dummy1 \
234 &> /dev/null
235 done
236
237 log_test "IPv6 error path - add single"
238
239 ip -n testns1 link del dev dummy1
240}
241
242ipv6_error_path_add_multipath()
243{
244 local lsb
245
246 RET=0
247
248 for i in $(seq 1 2); do
249 ip -n testns1 link add name dummy$i type dummy
250 ip -n testns1 link set dev dummy$i up
251 ip -n testns1 address add 2001:db8:$i::1/64 dev dummy$i
252 done
253
254 devlink -N testns1 resource set $DEVLINK_DEV path IPv6/fib size 10
255 devlink -N testns1 dev reload $DEVLINK_DEV
256
257 for lsb in $(seq 1 20); do
258 ip -n testns1 route add 2001:db8:10::${lsb}/128 \
259 nexthop via 2001:db8:1::2 dev dummy1 \
260 nexthop via 2001:db8:2::2 dev dummy2 &> /dev/null
261 done
262
263 log_test "IPv6 error path - add multipath"
264
265 for i in $(seq 1 2); do
266 ip -n testns1 link del dev dummy$i
267 done
268}
269
270ipv6_error_path_replay()
271{
272 local lsb
273
274 RET=0
275
276 ip -n testns1 link add name dummy1 type dummy
277 ip -n testns1 link set dev dummy1 up
278
279 devlink -N testns1 resource set $DEVLINK_DEV path IPv6/fib size 100
280 devlink -N testns1 dev reload $DEVLINK_DEV
281
282 for lsb in $(seq 1 20); do
283 ip -n testns1 route add 2001:db8:1::${lsb}/128 dev dummy1
284 done
285
286 devlink -N testns1 resource set $DEVLINK_DEV path IPv6/fib size 10
287 devlink -N testns1 dev reload $DEVLINK_DEV &> /dev/null
288
289 log_test "IPv6 error path - replay"
290
291 ip -n testns1 link del dev dummy1
292
293 # Successfully reload after deleting all the routes.
294 devlink -N testns1 resource set $DEVLINK_DEV path IPv6/fib size 100
295 devlink -N testns1 dev reload $DEVLINK_DEV
296}
297
298ipv6_error_path()
299{
300 # Test the different error paths of the notifiers by limiting the size
301 # of the "IPv6/fib" resource.
302 ipv6_error_path_add_single
303 ipv6_error_path_add_multipath
304 ipv6_error_path_replay
305}
306
307fib_notify_on_flag_change_set()
308{
309 local notify=$1; shift
310
311 ip netns exec testns1 sysctl -qw net.ipv4.fib_notify_on_flag_change=$notify
312 ip netns exec testns1 sysctl -qw net.ipv6.fib_notify_on_flag_change=$notify
313
314 log_info "Set fib_notify_on_flag_change to $notify"
315}
316
317setup_prepare()
318{
319 local netdev
320
321 modprobe netdevsim &> /dev/null
322
323 echo "$DEV_ADDR 1" > ${NETDEVSIM_PATH}/new_device
324 while [ ! -d $SYSFS_NET_DIR ] ; do :; done
325
326 ip netns add testns1
327 if [ $? -ne 0 ]; then
328 echo "Failed to add netns \"testns1\""
329 exit 1
330 fi
331
332 devlink dev reload $DEVLINK_DEV netns testns1
333 if [ $? -ne 0 ]; then
334 echo "Failed to reload into netns \"testns1\""
335 exit 1
336 fi
337}
338
339cleanup()
340{
341 pre_cleanup
342 ip netns del testns1
343 echo "$DEV_ADDR" > ${NETDEVSIM_PATH}/del_device
344 modprobe -r netdevsim &> /dev/null
345}
346
347trap cleanup EXIT
348
349setup_prepare
350
351fib_notify_on_flag_change_set 1
352tests_run
353
354fib_notify_on_flag_change_set 0
355tests_run
356
357exit $EXIT_STATUS