1#!/bin/bash 2# SPDX-License-Identifier: GPL-2.0 3# 4# This test is for checking the nexthop offload API. It makes use of netdevsim 5# which registers a listener to the nexthop notification chain. 6 7lib_dir=$(dirname $0)/../../../net/forwarding 8 9ALL_TESTS=" 10 nexthop_single_add_test 11 nexthop_single_add_err_test 12 nexthop_group_add_test 13 nexthop_group_add_err_test 14 nexthop_group_replace_test 15 nexthop_group_replace_err_test 16 nexthop_single_replace_test 17 nexthop_single_replace_err_test 18 nexthop_single_in_group_replace_test 19 nexthop_single_in_group_replace_err_test 20 nexthop_single_in_group_delete_test 21 nexthop_single_in_group_delete_err_test 22 nexthop_replay_test 23 nexthop_replay_err_test 24" 25NETDEVSIM_PATH=/sys/bus/netdevsim/ 26DEV_ADDR=1337 27DEV=netdevsim${DEV_ADDR} 28DEVLINK_DEV=netdevsim/${DEV} 29SYSFS_NET_DIR=/sys/bus/netdevsim/devices/$DEV/net/ 30NUM_NETIFS=0 31source $lib_dir/lib.sh 32source $lib_dir/devlink_lib.sh 33 34nexthop_check() 35{ 36 local nharg="$1"; shift 37 local expected="$1"; shift 38 39 out=$($IP nexthop show ${nharg} | sed -e 's/ *$//') 40 if [[ "$out" != "$expected" ]]; then 41 return 1 42 fi 43 44 return 0 45} 46 47nexthop_resource_check() 48{ 49 local expected_occ=$1; shift 50 51 occ=$($DEVLINK -jp resource show $DEVLINK_DEV \ 52 | jq '.[][][] | select(.name=="nexthops") | .["occ"]') 53 54 if [ $expected_occ -ne $occ ]; then 55 return 1 56 fi 57 58 return 0 59} 60 61nexthop_resource_set() 62{ 63 local size=$1; shift 64 65 $DEVLINK resource set $DEVLINK_DEV path nexthops size $size 66 $DEVLINK dev reload $DEVLINK_DEV 67} 68 69nexthop_single_add_test() 70{ 71 RET=0 72 73 $IP nexthop add id 1 via 192.0.2.2 dev dummy1 74 nexthop_check "id 1" "id 1 via 192.0.2.2 dev dummy1 scope link trap" 75 check_err $? "Unexpected nexthop entry" 76 77 nexthop_resource_check 1 78 check_err $? "Wrong nexthop occupancy" 79 80 $IP nexthop del id 1 81 nexthop_resource_check 0 82 check_err $? "Wrong nexthop occupancy after delete" 83 84 log_test "Single nexthop add and delete" 85} 86 87nexthop_single_add_err_test() 88{ 89 RET=0 90 91 nexthop_resource_set 1 92 93 $IP nexthop add id 1 via 192.0.2.2 dev dummy1 94 95 $IP nexthop add id 2 via 192.0.2.3 dev dummy1 &> /dev/null 96 check_fail $? "Nexthop addition succeeded when should fail" 97 98 nexthop_resource_check 1 99 check_err $? "Wrong nexthop occupancy" 100 101 log_test "Single nexthop add failure" 102 103 $IP nexthop flush &> /dev/null 104 nexthop_resource_set 9999 105} 106 107nexthop_group_add_test() 108{ 109 RET=0 110 111 $IP nexthop add id 1 via 192.0.2.2 dev dummy1 112 $IP nexthop add id 2 via 192.0.2.3 dev dummy1 113 114 $IP nexthop add id 10 group 1/2 115 nexthop_check "id 10" "id 10 group 1/2 trap" 116 check_err $? "Unexpected nexthop group entry" 117 118 nexthop_resource_check 4 119 check_err $? "Wrong nexthop occupancy" 120 121 $IP nexthop del id 10 122 nexthop_resource_check 2 123 check_err $? "Wrong nexthop occupancy after delete" 124 125 $IP nexthop add id 10 group 1,20/2,39 126 nexthop_check "id 10" "id 10 group 1,20/2,39 trap" 127 check_err $? "Unexpected weighted nexthop group entry" 128 129 nexthop_resource_check 61 130 check_err $? "Wrong weighted nexthop occupancy" 131 132 $IP nexthop del id 10 133 nexthop_resource_check 2 134 check_err $? "Wrong nexthop occupancy after delete" 135 136 log_test "Nexthop group add and delete" 137 138 $IP nexthop flush &> /dev/null 139} 140 141nexthop_group_add_err_test() 142{ 143 RET=0 144 145 nexthop_resource_set 2 146 147 $IP nexthop add id 1 via 192.0.2.2 dev dummy1 148 $IP nexthop add id 2 via 192.0.2.3 dev dummy1 149 150 $IP nexthop add id 10 group 1/2 &> /dev/null 151 check_fail $? "Nexthop group addition succeeded when should fail" 152 153 nexthop_resource_check 2 154 check_err $? "Wrong nexthop occupancy" 155 156 log_test "Nexthop group add failure" 157 158 $IP nexthop flush &> /dev/null 159 nexthop_resource_set 9999 160} 161 162nexthop_group_replace_test() 163{ 164 RET=0 165 166 $IP nexthop add id 1 via 192.0.2.2 dev dummy1 167 $IP nexthop add id 2 via 192.0.2.3 dev dummy1 168 $IP nexthop add id 3 via 192.0.2.4 dev dummy1 169 $IP nexthop add id 10 group 1/2 170 171 $IP nexthop replace id 10 group 1/2/3 172 nexthop_check "id 10" "id 10 group 1/2/3 trap" 173 check_err $? "Unexpected nexthop group entry" 174 175 nexthop_resource_check 6 176 check_err $? "Wrong nexthop occupancy" 177 178 log_test "Nexthop group replace" 179 180 $IP nexthop flush &> /dev/null 181} 182 183nexthop_group_replace_err_test() 184{ 185 RET=0 186 187 nexthop_resource_set 5 188 189 $IP nexthop add id 1 via 192.0.2.2 dev dummy1 190 $IP nexthop add id 2 via 192.0.2.3 dev dummy1 191 $IP nexthop add id 3 via 192.0.2.4 dev dummy1 192 $IP nexthop add id 10 group 1/2 193 194 $IP nexthop replace id 10 group 1/2/3 &> /dev/null 195 check_fail $? "Nexthop group replacement succeeded when should fail" 196 197 nexthop_check "id 10" "id 10 group 1/2 trap" 198 check_err $? "Unexpected nexthop group entry after failure" 199 200 nexthop_resource_check 5 201 check_err $? "Wrong nexthop occupancy after failure" 202 203 log_test "Nexthop group replace failure" 204 205 $IP nexthop flush &> /dev/null 206 nexthop_resource_set 9999 207} 208 209nexthop_single_replace_test() 210{ 211 RET=0 212 213 $IP nexthop add id 1 via 192.0.2.2 dev dummy1 214 215 $IP nexthop replace id 1 via 192.0.2.3 dev dummy1 216 nexthop_check "id 1" "id 1 via 192.0.2.3 dev dummy1 scope link trap" 217 check_err $? "Unexpected nexthop entry" 218 219 nexthop_resource_check 1 220 check_err $? "Wrong nexthop occupancy" 221 222 log_test "Single nexthop replace" 223 224 $IP nexthop flush &> /dev/null 225} 226 227nexthop_single_replace_err_test() 228{ 229 RET=0 230 231 # This is supposed to cause the replace to fail because the new nexthop 232 # is programmed before deleting the replaced one. 233 nexthop_resource_set 1 234 235 $IP nexthop add id 1 via 192.0.2.2 dev dummy1 236 237 $IP nexthop replace id 1 via 192.0.2.3 dev dummy1 &> /dev/null 238 check_fail $? "Nexthop replace succeeded when should fail" 239 240 nexthop_check "id 1" "id 1 via 192.0.2.2 dev dummy1 scope link trap" 241 check_err $? "Unexpected nexthop entry after failure" 242 243 nexthop_resource_check 1 244 check_err $? "Wrong nexthop occupancy after failure" 245 246 log_test "Single nexthop replace failure" 247 248 $IP nexthop flush &> /dev/null 249 nexthop_resource_set 9999 250} 251 252nexthop_single_in_group_replace_test() 253{ 254 RET=0 255 256 $IP nexthop add id 1 via 192.0.2.2 dev dummy1 257 $IP nexthop add id 2 via 192.0.2.3 dev dummy1 258 $IP nexthop add id 10 group 1/2 259 260 $IP nexthop replace id 1 via 192.0.2.4 dev dummy1 261 check_err $? "Failed to replace nexthop when should not" 262 263 nexthop_check "id 10" "id 10 group 1/2 trap" 264 check_err $? "Unexpected nexthop group entry" 265 266 nexthop_resource_check 4 267 check_err $? "Wrong nexthop occupancy" 268 269 log_test "Single nexthop replace while in group" 270 271 $IP nexthop flush &> /dev/null 272} 273 274nexthop_single_in_group_replace_err_test() 275{ 276 RET=0 277 278 nexthop_resource_set 5 279 280 $IP nexthop add id 1 via 192.0.2.2 dev dummy1 281 $IP nexthop add id 2 via 192.0.2.3 dev dummy1 282 $IP nexthop add id 10 group 1/2 283 284 $IP nexthop replace id 1 via 192.0.2.4 dev dummy1 &> /dev/null 285 check_fail $? "Nexthop replacement succeeded when should fail" 286 287 nexthop_check "id 1" "id 1 via 192.0.2.2 dev dummy1 scope link trap" 288 check_err $? "Unexpected nexthop entry after failure" 289 290 nexthop_check "id 10" "id 10 group 1/2 trap" 291 check_err $? "Unexpected nexthop group entry after failure" 292 293 nexthop_resource_check 4 294 check_err $? "Wrong nexthop occupancy" 295 296 log_test "Single nexthop replace while in group failure" 297 298 $IP nexthop flush &> /dev/null 299 nexthop_resource_set 9999 300} 301 302nexthop_single_in_group_delete_test() 303{ 304 RET=0 305 306 $IP nexthop add id 1 via 192.0.2.2 dev dummy1 307 $IP nexthop add id 2 via 192.0.2.3 dev dummy1 308 $IP nexthop add id 10 group 1/2 309 310 $IP nexthop del id 1 311 nexthop_check "id 10" "id 10 group 2 trap" 312 check_err $? "Unexpected nexthop group entry" 313 314 nexthop_resource_check 2 315 check_err $? "Wrong nexthop occupancy" 316 317 log_test "Single nexthop delete while in group" 318 319 $IP nexthop flush &> /dev/null 320} 321 322nexthop_single_in_group_delete_err_test() 323{ 324 RET=0 325 326 # First, nexthop 1 will be deleted, which will reduce the occupancy to 327 # 5. Afterwards, a replace notification will be sent for nexthop group 328 # 10 with only two nexthops. Since the new group is allocated before 329 # the old is deleted, the replacement will fail as it will result in an 330 # occupancy of 7. 331 nexthop_resource_set 6 332 333 $IP nexthop add id 1 via 192.0.2.2 dev dummy1 334 $IP nexthop add id 2 via 192.0.2.3 dev dummy1 335 $IP nexthop add id 3 via 192.0.2.4 dev dummy1 336 $IP nexthop add id 10 group 1/2/3 337 338 $IP nexthop del id 1 339 340 nexthop_resource_check 5 341 check_err $? "Wrong nexthop occupancy" 342 343 log_test "Single nexthop delete while in group failure" 344 345 $IP nexthop flush &> /dev/null 346 nexthop_resource_set 9999 347} 348 349nexthop_replay_test() 350{ 351 RET=0 352 353 $IP nexthop add id 1 via 192.0.2.2 dev dummy1 354 $IP nexthop add id 2 via 192.0.2.3 dev dummy1 355 $IP nexthop add id 10 group 1/2 356 357 $DEVLINK dev reload $DEVLINK_DEV 358 check_err $? "Failed to reload when should not" 359 360 nexthop_check "id 1" "id 1 via 192.0.2.2 dev dummy1 scope link trap" 361 check_err $? "Unexpected nexthop entry after reload" 362 363 nexthop_check "id 2" "id 2 via 192.0.2.3 dev dummy1 scope link trap" 364 check_err $? "Unexpected nexthop entry after reload" 365 366 nexthop_check "id 10" "id 10 group 1/2 trap" 367 check_err $? "Unexpected nexthop group entry after reload" 368 369 nexthop_resource_check 4 370 check_err $? "Wrong nexthop occupancy" 371 372 log_test "Nexthop replay" 373 374 $IP nexthop flush &> /dev/null 375} 376 377nexthop_replay_err_test() 378{ 379 RET=0 380 381 $IP nexthop add id 1 via 192.0.2.2 dev dummy1 382 $IP nexthop add id 2 via 192.0.2.3 dev dummy1 383 $IP nexthop add id 10 group 1/2 384 385 # Reduce size of nexthop resource so that reload will fail. 386 $DEVLINK resource set $DEVLINK_DEV path nexthops size 3 387 $DEVLINK dev reload $DEVLINK_DEV &> /dev/null 388 check_fail $? "Reload succeeded when should fail" 389 390 $DEVLINK resource set $DEVLINK_DEV path nexthops size 9999 391 $DEVLINK dev reload $DEVLINK_DEV 392 check_err $? "Failed to reload when should not" 393 394 log_test "Nexthop replay failure" 395 396 $IP nexthop flush &> /dev/null 397} 398 399setup_prepare() 400{ 401 local netdev 402 403 modprobe netdevsim &> /dev/null 404 405 echo "$DEV_ADDR 1" > ${NETDEVSIM_PATH}/new_device 406 while [ ! -d $SYSFS_NET_DIR ] ; do :; done 407 408 set -e 409 410 ip netns add testns1 411 devlink dev reload $DEVLINK_DEV netns testns1 412 413 IP="ip -netns testns1" 414 DEVLINK="devlink -N testns1" 415 416 $IP link add name dummy1 up type dummy 417 $IP address add 192.0.2.1/24 dev dummy1 418 419 set +e 420} 421 422cleanup() 423{ 424 pre_cleanup 425 ip netns del testns1 426 echo "$DEV_ADDR" > ${NETDEVSIM_PATH}/del_device 427 modprobe -r netdevsim &> /dev/null 428} 429 430trap cleanup EXIT 431 432setup_prepare 433 434tests_run 435 436exit $EXIT_STATUS 437