]> asedeno.scripts.mit.edu Git - linux.git/blob - tools/testing/selftests/drivers/net/netdevsim/devlink.sh
de3174431b8ead65260d134af3ff21704d718ae1
[linux.git] / tools / testing / selftests / drivers / net / netdevsim / devlink.sh
1 #!/bin/bash
2 # SPDX-License-Identifier: GPL-2.0
3
4 lib_dir=$(dirname $0)/../../../net/forwarding
5
6 ALL_TESTS="fw_flash_test params_test regions_test reload_test \
7            netns_reload_test resource_test"
8 NUM_NETIFS=0
9 source $lib_dir/lib.sh
10
11 BUS_ADDR=10
12 PORT_COUNT=4
13 DEV_NAME=netdevsim$BUS_ADDR
14 SYSFS_NET_DIR=/sys/bus/netdevsim/devices/$DEV_NAME/net/
15 DEBUGFS_DIR=/sys/kernel/debug/netdevsim/$DEV_NAME/
16 DL_HANDLE=netdevsim/$DEV_NAME
17
18 fw_flash_test()
19 {
20         RET=0
21
22         devlink dev flash $DL_HANDLE file dummy
23         check_err $? "Failed to flash with status updates on"
24
25         echo "n"> $DEBUGFS_DIR/fw_update_status
26         check_err $? "Failed to disable status updates"
27
28         devlink dev flash $DL_HANDLE file dummy
29         check_err $? "Failed to flash with status updates off"
30
31         log_test "fw flash test"
32 }
33
34 param_get()
35 {
36         local name=$1
37
38         cmd_jq "devlink dev param show $DL_HANDLE name $name -j" \
39                '.[][][].values[] | select(.cmode == "driverinit").value'
40 }
41
42 param_set()
43 {
44         local name=$1
45         local value=$2
46
47         devlink dev param set $DL_HANDLE name $name cmode driverinit value $value
48 }
49
50 check_value()
51 {
52         local name=$1
53         local phase_name=$2
54         local expected_param_value=$3
55         local expected_debugfs_value=$4
56         local value
57
58         value=$(param_get $name)
59         check_err $? "Failed to get $name param value"
60         [ "$value" == "$expected_param_value" ]
61         check_err $? "Unexpected $phase_name $name param value"
62         value=$(<$DEBUGFS_DIR/$name)
63         check_err $? "Failed to get $name debugfs value"
64         [ "$value" == "$expected_debugfs_value" ]
65         check_err $? "Unexpected $phase_name $name debugfs value"
66 }
67
68 params_test()
69 {
70         RET=0
71
72         local max_macs
73         local test1
74
75         check_value max_macs initial 32 32
76         check_value test1 initial true Y
77
78         param_set max_macs 16
79         check_err $? "Failed to set max_macs param value"
80         param_set test1 false
81         check_err $? "Failed to set test1 param value"
82
83         check_value max_macs post-set 16 32
84         check_value test1 post-set false Y
85
86         devlink dev reload $DL_HANDLE
87
88         check_value max_macs post-reload 16 16
89         check_value test1 post-reload false N
90
91         log_test "params test"
92 }
93
94 check_region_size()
95 {
96         local name=$1
97         local size
98
99         size=$(devlink region show $DL_HANDLE/$name -j | jq -e -r '.[][].size')
100         check_err $? "Failed to get $name region size"
101         [ $size -eq 32768 ]
102         check_err $? "Invalid $name region size"
103 }
104
105 check_region_snapshot_count()
106 {
107         local name=$1
108         local phase_name=$2
109         local expected_count=$3
110         local count
111
112         count=$(devlink region show $DL_HANDLE/$name -j | jq -e -r '.[][].snapshot | length')
113         [ $count -eq $expected_count ]
114         check_err $? "Unexpected $phase_name snapshot count"
115 }
116
117 regions_test()
118 {
119         RET=0
120
121         local count
122
123         check_region_size dummy
124         check_region_snapshot_count dummy initial 0
125
126         echo ""> $DEBUGFS_DIR/take_snapshot
127         check_err $? "Failed to take first dummy region snapshot"
128         check_region_snapshot_count dummy post-first-snapshot 1
129
130         echo ""> $DEBUGFS_DIR/take_snapshot
131         check_err $? "Failed to take second dummy region snapshot"
132         check_region_snapshot_count dummy post-second-snapshot 2
133
134         echo ""> $DEBUGFS_DIR/take_snapshot
135         check_err $? "Failed to take third dummy region snapshot"
136         check_region_snapshot_count dummy post-third-snapshot 3
137
138         devlink region del $DL_HANDLE/dummy snapshot 1
139         check_err $? "Failed to delete first dummy region snapshot"
140
141         check_region_snapshot_count dummy post-first-delete 2
142
143         log_test "regions test"
144 }
145
146 reload_test()
147 {
148         RET=0
149
150         devlink dev reload $DL_HANDLE
151         check_err $? "Failed to reload"
152
153         echo "y"> $DEBUGFS_DIR/fail_reload
154         check_err $? "Failed to setup devlink reload to fail"
155
156         devlink dev reload $DL_HANDLE
157         check_fail $? "Unexpected success of devlink reload"
158
159         echo "n"> $DEBUGFS_DIR/fail_reload
160         check_err $? "Failed to setup devlink reload not to fail"
161
162         devlink dev reload $DL_HANDLE
163         check_err $? "Failed to reload after set not to fail"
164
165         echo "y"> $DEBUGFS_DIR/dont_allow_reload
166         check_err $? "Failed to forbid devlink reload"
167
168         devlink dev reload $DL_HANDLE
169         check_fail $? "Unexpected success of devlink reload"
170
171         echo "n"> $DEBUGFS_DIR/dont_allow_reload
172         check_err $? "Failed to re-enable devlink reload"
173
174         devlink dev reload $DL_HANDLE
175         check_err $? "Failed to reload after re-enable"
176
177         log_test "reload test"
178 }
179
180 netns_reload_test()
181 {
182         RET=0
183
184         ip netns add testns1
185         check_err $? "Failed add netns \"testns1\""
186         ip netns add testns2
187         check_err $? "Failed add netns \"testns2\""
188
189         devlink dev reload $DL_HANDLE netns testns1
190         check_err $? "Failed to reload into netns \"testns1\""
191
192         devlink -N testns1 dev reload $DL_HANDLE netns testns2
193         check_err $? "Failed to reload from netns \"testns1\" into netns \"testns2\""
194
195         ip netns del testns2
196         ip netns del testns1
197
198         log_test "netns reload test"
199 }
200
201 DUMMYDEV="dummytest"
202
203 res_val_get()
204 {
205         local netns=$1
206         local parentname=$2
207         local name=$3
208         local type=$4
209
210         cmd_jq "devlink -N $netns resource show $DL_HANDLE -j" \
211                ".[][][] | select(.name == \"$parentname\").resources[] \
212                 | select(.name == \"$name\").$type"
213 }
214
215 resource_test()
216 {
217         RET=0
218
219         ip netns add testns1
220         check_err $? "Failed add netns \"testns1\""
221         ip netns add testns2
222         check_err $? "Failed add netns \"testns2\""
223
224         devlink dev reload $DL_HANDLE netns testns1
225         check_err $? "Failed to reload into netns \"testns1\""
226
227         # Create dummy dev to add the address and routes on.
228
229         ip -n testns1 link add name $DUMMYDEV type dummy
230         check_err $? "Failed create dummy device"
231         ip -n testns1 link set $DUMMYDEV up
232         check_err $? "Failed bring up dummy device"
233         ip -n testns1 a a 192.0.1.1/24 dev $DUMMYDEV
234         check_err $? "Failed add an IP address to dummy device"
235
236         local occ=$(res_val_get testns1 IPv4 fib occ)
237         local limit=$((occ+1))
238
239         # Set fib size limit to handle one another route only.
240
241         devlink -N testns1 resource set $DL_HANDLE path IPv4/fib size $limit
242         check_err $? "Failed to set IPv4/fib resource size"
243         local size_new=$(res_val_get testns1 IPv4 fib size_new)
244         [ "$size_new" -eq "$limit" ]
245         check_err $? "Unexpected \"size_new\" value (got $size_new, expected $limit)"
246
247         devlink -N testns1 dev reload $DL_HANDLE
248         check_err $? "Failed to reload"
249         local size=$(res_val_get testns1 IPv4 fib size)
250         [ "$size" -eq "$limit" ]
251         check_err $? "Unexpected \"size\" value (got $size, expected $limit)"
252
253         # Insert 2 routes, the first is going to be inserted,
254         # the second is expected to fail to be inserted.
255
256         ip -n testns1 r a 192.0.2.0/24 via 192.0.1.2
257         check_err $? "Failed to add route"
258
259         ip -n testns1 r a 192.0.3.0/24 via 192.0.1.2
260         check_fail $? "Unexpected successful route add over limit"
261
262         # Now create another dummy in second network namespace and
263         # insert two routes. That is over the limit of the netdevsim
264         # instance in the first namespace. Move the netdevsim instance
265         # into the second namespace and expect it to fail.
266
267         ip -n testns2 link add name $DUMMYDEV type dummy
268         check_err $? "Failed create dummy device"
269         ip -n testns2 link set $DUMMYDEV up
270         check_err $? "Failed bring up dummy device"
271         ip -n testns2 a a 192.0.1.1/24 dev $DUMMYDEV
272         check_err $? "Failed add an IP address to dummy device"
273         ip -n testns2 r a 192.0.2.0/24 via 192.0.1.2
274         check_err $? "Failed to add route"
275         ip -n testns2 r a 192.0.3.0/24 via 192.0.1.2
276         check_err $? "Failed to add route"
277
278         devlink -N testns1 dev reload $DL_HANDLE netns testns2
279         check_fail $? "Unexpected successful reload from netns \"testns1\" into netns \"testns2\""
280
281         ip netns del testns2
282         ip netns del testns1
283
284         log_test "resource test"
285 }
286
287 setup_prepare()
288 {
289         modprobe netdevsim
290         echo "$BUS_ADDR $PORT_COUNT" > /sys/bus/netdevsim/new_device
291         while [ ! -d $SYSFS_NET_DIR ] ; do :; done
292 }
293
294 cleanup()
295 {
296         pre_cleanup
297         echo "$BUS_ADDR" > /sys/bus/netdevsim/del_device
298         modprobe -r netdevsim
299 }
300
301 trap cleanup EXIT
302
303 setup_prepare
304
305 tests_run
306
307 exit $EXIT_STATUS