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
26 ipv6_replace_multipath
27 ipv6_append_multipath_to_single
35 NETDEVSIM_PATH
=/sys
/bus
/netdevsim
/
37 DEV
=netdevsim
${DEV_ADDR}
38 SYSFS_NET_DIR
=/sys
/bus
/netdevsim
/devices
/$DEV/net
/
39 DEBUGFS_DIR
=/sys
/kernel
/debug
/netdevsim
/$DEV/
41 source $lib_dir/lib.sh
42 source $lib_dir/fib_offload_lib.sh
45 source $lib_dir/devlink_lib.sh
46 DEVLINK_DEV
=netdevsim
/${DEV}
48 ipv4_identical_routes
()
50 fib_ipv4_identical_routes_test
"testns1"
55 fib_ipv4_tos_test
"testns1"
60 fib_ipv4_metric_test
"testns1"
65 fib_ipv4_replace_test
"testns1"
70 fib_ipv4_delete_test
"testns1"
75 fib_ipv4_plen_test
"testns1"
80 fib_ipv4_replay_metric_test
"testns1" "$DEVLINK_DEV"
85 fib_ipv4_replay_tos_test
"testns1" "$DEVLINK_DEV"
90 fib_ipv4_replay_plen_test
"testns1" "$DEVLINK_DEV"
102 fib_ipv4_flush_test
"testns1"
105 ipv4_error_path_add
()
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 IPv
4/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 \
122 log_test
"IPv4 error path - add"
124 ip
-n testns1 link del dev dummy1
127 ipv4_error_path_replay
()
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 IPv
4/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
143 devlink
-N testns1 resource
set $DEVLINK_DEV path IPv
4/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 IPv
4/fib size
100
152 devlink
-N testns1 dev reload
$DEVLINK_DEV
157 # Test the different error paths of the notifiers by limiting the size
158 # of the "IPv4/fib" resource.
160 ipv4_error_path_replay
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
177 ip
-n testns1 link del dev dummy1
179 log_test
"IPv4 route delete failure"
181 echo "n" > $DEBUGFS_DIR/fib
/fail_route_delete
186 fib_ipv6_add_test
"testns1"
191 fib_ipv6_metric_test
"testns1"
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"
226 fib_ipv6_delete_single_test
"testns1"
229 ipv6_delete_multipath
()
231 fib_ipv6_delete_multipath_test
"testns1"
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
()
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 IPv
6/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 \
261 log_test
"IPv6 error path - add single"
263 ip
-n testns1 link del dev dummy1
266 ipv6_error_path_add_multipath
()
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
278 devlink
-N testns1 resource
set $DEVLINK_DEV path IPv
6/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
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
294 ipv6_error_path_replay
()
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 IPv
6/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
310 devlink
-N testns1 resource
set $DEVLINK_DEV path IPv
6/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 IPv
6/fib size
100
319 devlink
-N testns1 dev reload
$DEVLINK_DEV
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
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
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"
366 modprobe netdevsim
&> /dev
/null
368 echo "$DEV_ADDR 1" > ${NETDEVSIM_PATH}/new_device
369 while [ ! -d $SYSFS_NET_DIR ] ; do :; done
372 if [ $?
-ne 0 ]; then
373 echo "Failed to add netns \"testns1\""
377 devlink dev reload
$DEVLINK_DEV netns testns1
378 if [ $?
-ne 0 ]; then
379 echo "Failed to reload into netns \"testns1\""
388 echo "$DEV_ADDR" > ${NETDEVSIM_PATH}/del_device
389 modprobe
-r netdevsim
&> /dev
/null
396 fib_notify_on_flag_change_set
1
399 fib_notify_on_flag_change_set
0