Merge tag 'trace-printf-v6.13' of git://git.kernel.org/pub/scm/linux/kernel/git/trace...
[drm/drm-misc.git] / tools / testing / selftests / drivers / net / netdevsim / fib.sh
blob6800de816e8bda2ce7c0b884482c77b20e56c244
1 #!/bin/bash
2 # SPDX-License-Identifier: GPL-2.0
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.
7 lib_dir=$(dirname $0)/../../../net/forwarding
9 ALL_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 ipv4_delete_fail
20 ipv6_add
21 ipv6_metric
22 ipv6_append_single
23 ipv6_replace_single
24 ipv6_metric_multipath
25 ipv6_append_multipath
26 ipv6_replace_multipath
27 ipv6_append_multipath_to_single
28 ipv6_delete_single
29 ipv6_delete_multipath
30 ipv6_replay_single
31 ipv6_replay_multipath
32 ipv6_error_path
33 ipv6_delete_fail
35 NETDEVSIM_PATH=/sys/bus/netdevsim/
36 DEV_ADDR=1337
37 DEV=netdevsim${DEV_ADDR}
38 SYSFS_NET_DIR=/sys/bus/netdevsim/devices/$DEV/net/
39 DEBUGFS_DIR=/sys/kernel/debug/netdevsim/$DEV/
40 NUM_NETIFS=0
41 source $lib_dir/lib.sh
42 source $lib_dir/fib_offload_lib.sh
44 DEVLINK_DEV=
45 source $lib_dir/devlink_lib.sh
46 DEVLINK_DEV=netdevsim/${DEV}
48 ipv4_identical_routes()
50 fib_ipv4_identical_routes_test "testns1"
53 ipv4_tos()
55 fib_ipv4_tos_test "testns1"
58 ipv4_metric()
60 fib_ipv4_metric_test "testns1"
63 ipv4_replace()
65 fib_ipv4_replace_test "testns1"
68 ipv4_delete()
70 fib_ipv4_delete_test "testns1"
73 ipv4_plen()
75 fib_ipv4_plen_test "testns1"
78 ipv4_replay_metric()
80 fib_ipv4_replay_metric_test "testns1" "$DEVLINK_DEV"
83 ipv4_replay_tos()
85 fib_ipv4_replay_tos_test "testns1" "$DEVLINK_DEV"
88 ipv4_replay_plen()
90 fib_ipv4_replay_plen_test "testns1" "$DEVLINK_DEV"
93 ipv4_replay()
95 ipv4_replay_metric
96 ipv4_replay_tos
97 ipv4_replay_plen
100 ipv4_flush()
102 fib_ipv4_flush_test "testns1"
105 ipv4_error_path_add()
107 local lsb
109 RET=0
111 ip -n testns1 link add name dummy1 type dummy
112 ip -n testns1 link set dev dummy1 up
114 devlink -N testns1 resource set $DEVLINK_DEV path IPv4/fib size 10
115 devlink -N testns1 dev reload $DEVLINK_DEV
117 for lsb in $(seq 1 20); do
118 ip -n testns1 route add 192.0.2.${lsb}/32 dev dummy1 \
119 &> /dev/null
120 done
122 log_test "IPv4 error path - add"
124 ip -n testns1 link del dev dummy1
127 ipv4_error_path_replay()
129 local lsb
131 RET=0
133 ip -n testns1 link add name dummy1 type dummy
134 ip -n testns1 link set dev dummy1 up
136 devlink -N testns1 resource set $DEVLINK_DEV path IPv4/fib size 100
137 devlink -N testns1 dev reload $DEVLINK_DEV
139 for lsb in $(seq 1 20); do
140 ip -n testns1 route add 192.0.2.${lsb}/32 dev dummy1
141 done
143 devlink -N testns1 resource set $DEVLINK_DEV path IPv4/fib size 10
144 devlink -N testns1 dev reload $DEVLINK_DEV &> /dev/null
146 log_test "IPv4 error path - replay"
148 ip -n testns1 link del dev dummy1
150 # Successfully reload after deleting all the routes.
151 devlink -N testns1 resource set $DEVLINK_DEV path IPv4/fib size 100
152 devlink -N testns1 dev reload $DEVLINK_DEV
155 ipv4_error_path()
157 # Test the different error paths of the notifiers by limiting the size
158 # of the "IPv4/fib" resource.
159 ipv4_error_path_add
160 ipv4_error_path_replay
163 ipv4_delete_fail()
165 RET=0
167 echo "y" > $DEBUGFS_DIR/fib/fail_route_delete
169 ip -n testns1 link add name dummy1 type dummy
170 ip -n testns1 link set dev dummy1 up
172 ip -n testns1 route add 192.0.2.0/24 dev dummy1
173 ip -n testns1 route del 192.0.2.0/24 dev dummy1 &> /dev/null
175 # We should not be able to delete the netdev if we are leaking a
176 # reference.
177 ip -n testns1 link del dev dummy1
179 log_test "IPv4 route delete failure"
181 echo "n" > $DEBUGFS_DIR/fib/fail_route_delete
184 ipv6_add()
186 fib_ipv6_add_test "testns1"
189 ipv6_metric()
191 fib_ipv6_metric_test "testns1"
194 ipv6_append_single()
196 fib_ipv6_append_single_test "testns1"
199 ipv6_replace_single()
201 fib_ipv6_replace_single_test "testns1"
204 ipv6_metric_multipath()
206 fib_ipv6_metric_multipath_test "testns1"
209 ipv6_append_multipath()
211 fib_ipv6_append_multipath_test "testns1"
214 ipv6_replace_multipath()
216 fib_ipv6_replace_multipath_test "testns1"
219 ipv6_append_multipath_to_single()
221 fib_ipv6_append_multipath_to_single_test "testns1"
224 ipv6_delete_single()
226 fib_ipv6_delete_single_test "testns1"
229 ipv6_delete_multipath()
231 fib_ipv6_delete_multipath_test "testns1"
234 ipv6_replay_single()
236 fib_ipv6_replay_single_test "testns1" "$DEVLINK_DEV"
239 ipv6_replay_multipath()
241 fib_ipv6_replay_multipath_test "testns1" "$DEVLINK_DEV"
244 ipv6_error_path_add_single()
246 local lsb
248 RET=0
250 ip -n testns1 link add name dummy1 type dummy
251 ip -n testns1 link set dev dummy1 up
253 devlink -N testns1 resource set $DEVLINK_DEV path IPv6/fib size 10
254 devlink -N testns1 dev reload $DEVLINK_DEV
256 for lsb in $(seq 1 20); do
257 ip -n testns1 route add 2001:db8:1::${lsb}/128 dev dummy1 \
258 &> /dev/null
259 done
261 log_test "IPv6 error path - add single"
263 ip -n testns1 link del dev dummy1
266 ipv6_error_path_add_multipath()
268 local lsb
270 RET=0
272 for i in $(seq 1 2); do
273 ip -n testns1 link add name dummy$i type dummy
274 ip -n testns1 link set dev dummy$i up
275 ip -n testns1 address add 2001:db8:$i::1/64 dev dummy$i
276 done
278 devlink -N testns1 resource set $DEVLINK_DEV path IPv6/fib size 10
279 devlink -N testns1 dev reload $DEVLINK_DEV
281 for lsb in $(seq 1 20); do
282 ip -n testns1 route add 2001:db8:10::${lsb}/128 \
283 nexthop via 2001:db8:1::2 dev dummy1 \
284 nexthop via 2001:db8:2::2 dev dummy2 &> /dev/null
285 done
287 log_test "IPv6 error path - add multipath"
289 for i in $(seq 1 2); do
290 ip -n testns1 link del dev dummy$i
291 done
294 ipv6_error_path_replay()
296 local lsb
298 RET=0
300 ip -n testns1 link add name dummy1 type dummy
301 ip -n testns1 link set dev dummy1 up
303 devlink -N testns1 resource set $DEVLINK_DEV path IPv6/fib size 100
304 devlink -N testns1 dev reload $DEVLINK_DEV
306 for lsb in $(seq 1 20); do
307 ip -n testns1 route add 2001:db8:1::${lsb}/128 dev dummy1
308 done
310 devlink -N testns1 resource set $DEVLINK_DEV path IPv6/fib size 10
311 devlink -N testns1 dev reload $DEVLINK_DEV &> /dev/null
313 log_test "IPv6 error path - replay"
315 ip -n testns1 link del dev dummy1
317 # Successfully reload after deleting all the routes.
318 devlink -N testns1 resource set $DEVLINK_DEV path IPv6/fib size 100
319 devlink -N testns1 dev reload $DEVLINK_DEV
322 ipv6_error_path()
324 # Test the different error paths of the notifiers by limiting the size
325 # of the "IPv6/fib" resource.
326 ipv6_error_path_add_single
327 ipv6_error_path_add_multipath
328 ipv6_error_path_replay
331 ipv6_delete_fail()
333 RET=0
335 echo "y" > $DEBUGFS_DIR/fib/fail_route_delete
337 ip -n testns1 link add name dummy1 type dummy
338 ip -n testns1 link set dev dummy1 up
340 ip -n testns1 route add 2001:db8:1::/64 dev dummy1
341 ip -n testns1 route del 2001:db8:1::/64 dev dummy1 &> /dev/null
343 # We should not be able to delete the netdev if we are leaking a
344 # reference.
345 ip -n testns1 link del dev dummy1
347 log_test "IPv6 route delete failure"
349 echo "n" > $DEBUGFS_DIR/fib/fail_route_delete
352 fib_notify_on_flag_change_set()
354 local notify=$1; shift
356 ip netns exec testns1 sysctl -qw net.ipv4.fib_notify_on_flag_change=$notify
357 ip netns exec testns1 sysctl -qw net.ipv6.fib_notify_on_flag_change=$notify
359 log_info "Set fib_notify_on_flag_change to $notify"
362 setup_prepare()
364 local netdev
366 modprobe netdevsim &> /dev/null
368 echo "$DEV_ADDR 1" > ${NETDEVSIM_PATH}/new_device
369 while [ ! -d $SYSFS_NET_DIR ] ; do :; done
371 ip netns add testns1
372 if [ $? -ne 0 ]; then
373 echo "Failed to add netns \"testns1\""
374 exit 1
377 devlink dev reload $DEVLINK_DEV netns testns1
378 if [ $? -ne 0 ]; then
379 echo "Failed to reload into netns \"testns1\""
380 exit 1
384 cleanup()
386 pre_cleanup
387 ip netns del testns1
388 echo "$DEV_ADDR" > ${NETDEVSIM_PATH}/del_device
389 modprobe -r netdevsim &> /dev/null
392 trap cleanup EXIT
394 setup_prepare
396 fib_notify_on_flag_change_set 1
397 tests_run
399 fib_notify_on_flag_change_set 0
400 tests_run
402 exit $EXIT_STATUS