1#!/bin/bash 2# SPDX-License-Identifier: GPL-2.0 3 4lib_dir=$(dirname $0)/../../../net/forwarding 5 6ALL_TESTS="fw_flash_test params_test regions_test reload_test \ 7 netns_reload_test resource_test" 8NUM_NETIFS=0 9source $lib_dir/lib.sh 10 11BUS_ADDR=10 12PORT_COUNT=4 13DEV_NAME=netdevsim$BUS_ADDR 14SYSFS_NET_DIR=/sys/bus/netdevsim/devices/$DEV_NAME/net/ 15DEBUGFS_DIR=/sys/kernel/debug/netdevsim/$DEV_NAME/ 16DL_HANDLE=netdevsim/$DEV_NAME 17 18fw_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 34param_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 42param_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 50check_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 68params_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 94check_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 105check_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 117regions_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 146reload_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 180netns_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 201DUMMYDEV="dummytest" 202 203res_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 215resource_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 287setup_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 294cleanup() 295{ 296 pre_cleanup 297 echo "$BUS_ADDR" > /sys/bus/netdevsim/del_device 298 modprobe -r netdevsim 299} 300 301trap cleanup EXIT 302 303setup_prepare 304 305tests_run 306 307exit $EXIT_STATUS 308