Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/tools/testing/selftests/drivers/net/netdevsim/fib.sh
26299 views
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
7
lib_dir=$(dirname $0)/../../../net/forwarding
8
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
34
"
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
43
44
DEVLINK_DEV=
45
source $lib_dir/devlink_lib.sh
46
DEVLINK_DEV=netdevsim/${DEV}
47
48
ipv4_identical_routes()
49
{
50
fib_ipv4_identical_routes_test "testns1"
51
}
52
53
ipv4_tos()
54
{
55
fib_ipv4_tos_test "testns1"
56
}
57
58
ipv4_metric()
59
{
60
fib_ipv4_metric_test "testns1"
61
}
62
63
ipv4_replace()
64
{
65
fib_ipv4_replace_test "testns1"
66
}
67
68
ipv4_delete()
69
{
70
fib_ipv4_delete_test "testns1"
71
}
72
73
ipv4_plen()
74
{
75
fib_ipv4_plen_test "testns1"
76
}
77
78
ipv4_replay_metric()
79
{
80
fib_ipv4_replay_metric_test "testns1" "$DEVLINK_DEV"
81
}
82
83
ipv4_replay_tos()
84
{
85
fib_ipv4_replay_tos_test "testns1" "$DEVLINK_DEV"
86
}
87
88
ipv4_replay_plen()
89
{
90
fib_ipv4_replay_plen_test "testns1" "$DEVLINK_DEV"
91
}
92
93
ipv4_replay()
94
{
95
ipv4_replay_metric
96
ipv4_replay_tos
97
ipv4_replay_plen
98
}
99
100
ipv4_flush()
101
{
102
fib_ipv4_flush_test "testns1"
103
}
104
105
ipv4_error_path_add()
106
{
107
local lsb
108
109
RET=0
110
111
ip -n testns1 link add name dummy1 type dummy
112
ip -n testns1 link set dev dummy1 up
113
114
devlink -N testns1 resource set $DEVLINK_DEV path IPv4/fib size 10
115
devlink -N testns1 dev reload $DEVLINK_DEV
116
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
121
122
log_test "IPv4 error path - add"
123
124
ip -n testns1 link del dev dummy1
125
}
126
127
ipv4_error_path_replay()
128
{
129
local lsb
130
131
RET=0
132
133
ip -n testns1 link add name dummy1 type dummy
134
ip -n testns1 link set dev dummy1 up
135
136
devlink -N testns1 resource set $DEVLINK_DEV path IPv4/fib size 100
137
devlink -N testns1 dev reload $DEVLINK_DEV
138
139
for lsb in $(seq 1 20); do
140
ip -n testns1 route add 192.0.2.${lsb}/32 dev dummy1
141
done
142
143
devlink -N testns1 resource set $DEVLINK_DEV path IPv4/fib size 10
144
devlink -N testns1 dev reload $DEVLINK_DEV &> /dev/null
145
146
log_test "IPv4 error path - replay"
147
148
ip -n testns1 link del dev dummy1
149
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
153
}
154
155
ipv4_error_path()
156
{
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
161
}
162
163
ipv4_delete_fail()
164
{
165
RET=0
166
167
echo "y" > $DEBUGFS_DIR/fib/fail_route_delete
168
169
ip -n testns1 link add name dummy1 type dummy
170
ip -n testns1 link set dev dummy1 up
171
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
174
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
178
179
log_test "IPv4 route delete failure"
180
181
echo "n" > $DEBUGFS_DIR/fib/fail_route_delete
182
}
183
184
ipv6_add()
185
{
186
fib_ipv6_add_test "testns1"
187
}
188
189
ipv6_metric()
190
{
191
fib_ipv6_metric_test "testns1"
192
}
193
194
ipv6_append_single()
195
{
196
fib_ipv6_append_single_test "testns1"
197
}
198
199
ipv6_replace_single()
200
{
201
fib_ipv6_replace_single_test "testns1"
202
}
203
204
ipv6_metric_multipath()
205
{
206
fib_ipv6_metric_multipath_test "testns1"
207
}
208
209
ipv6_append_multipath()
210
{
211
fib_ipv6_append_multipath_test "testns1"
212
}
213
214
ipv6_replace_multipath()
215
{
216
fib_ipv6_replace_multipath_test "testns1"
217
}
218
219
ipv6_append_multipath_to_single()
220
{
221
fib_ipv6_append_multipath_to_single_test "testns1"
222
}
223
224
ipv6_delete_single()
225
{
226
fib_ipv6_delete_single_test "testns1"
227
}
228
229
ipv6_delete_multipath()
230
{
231
fib_ipv6_delete_multipath_test "testns1"
232
}
233
234
ipv6_replay_single()
235
{
236
fib_ipv6_replay_single_test "testns1" "$DEVLINK_DEV"
237
}
238
239
ipv6_replay_multipath()
240
{
241
fib_ipv6_replay_multipath_test "testns1" "$DEVLINK_DEV"
242
}
243
244
ipv6_error_path_add_single()
245
{
246
local lsb
247
248
RET=0
249
250
ip -n testns1 link add name dummy1 type dummy
251
ip -n testns1 link set dev dummy1 up
252
253
devlink -N testns1 resource set $DEVLINK_DEV path IPv6/fib size 10
254
devlink -N testns1 dev reload $DEVLINK_DEV
255
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
260
261
log_test "IPv6 error path - add single"
262
263
ip -n testns1 link del dev dummy1
264
}
265
266
ipv6_error_path_add_multipath()
267
{
268
local lsb
269
270
RET=0
271
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
277
278
devlink -N testns1 resource set $DEVLINK_DEV path IPv6/fib size 10
279
devlink -N testns1 dev reload $DEVLINK_DEV
280
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
286
287
log_test "IPv6 error path - add multipath"
288
289
for i in $(seq 1 2); do
290
ip -n testns1 link del dev dummy$i
291
done
292
}
293
294
ipv6_error_path_replay()
295
{
296
local lsb
297
298
RET=0
299
300
ip -n testns1 link add name dummy1 type dummy
301
ip -n testns1 link set dev dummy1 up
302
303
devlink -N testns1 resource set $DEVLINK_DEV path IPv6/fib size 100
304
devlink -N testns1 dev reload $DEVLINK_DEV
305
306
for lsb in $(seq 1 20); do
307
ip -n testns1 route add 2001:db8:1::${lsb}/128 dev dummy1
308
done
309
310
devlink -N testns1 resource set $DEVLINK_DEV path IPv6/fib size 10
311
devlink -N testns1 dev reload $DEVLINK_DEV &> /dev/null
312
313
log_test "IPv6 error path - replay"
314
315
ip -n testns1 link del dev dummy1
316
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
320
}
321
322
ipv6_error_path()
323
{
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
329
}
330
331
ipv6_delete_fail()
332
{
333
RET=0
334
335
echo "y" > $DEBUGFS_DIR/fib/fail_route_delete
336
337
ip -n testns1 link add name dummy1 type dummy
338
ip -n testns1 link set dev dummy1 up
339
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
342
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
346
347
log_test "IPv6 route delete failure"
348
349
echo "n" > $DEBUGFS_DIR/fib/fail_route_delete
350
}
351
352
fib_notify_on_flag_change_set()
353
{
354
local notify=$1; shift
355
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
358
359
log_info "Set fib_notify_on_flag_change to $notify"
360
}
361
362
setup_prepare()
363
{
364
local netdev
365
366
modprobe netdevsim &> /dev/null
367
368
echo "$DEV_ADDR 1" > ${NETDEVSIM_PATH}/new_device
369
while [ ! -d $SYSFS_NET_DIR ] ; do :; done
370
371
ip netns add testns1
372
if [ $? -ne 0 ]; then
373
echo "Failed to add netns \"testns1\""
374
exit 1
375
fi
376
377
devlink dev reload $DEVLINK_DEV netns testns1
378
if [ $? -ne 0 ]; then
379
echo "Failed to reload into netns \"testns1\""
380
exit 1
381
fi
382
}
383
384
cleanup()
385
{
386
pre_cleanup
387
ip netns del testns1
388
echo "$DEV_ADDR" > ${NETDEVSIM_PATH}/del_device
389
modprobe -r netdevsim &> /dev/null
390
}
391
392
trap cleanup EXIT
393
394
setup_prepare
395
396
fib_notify_on_flag_change_set 1
397
tests_run
398
399
fib_notify_on_flag_change_set 0
400
tests_run
401
402
exit $EXIT_STATUS
403
404