1*4882a593Smuzhiyun#!/bin/bash 2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0 3*4882a593Smuzhiyun# 4*4882a593Smuzhiyun# This test is for checking the FIB offload API. It makes use of netdevsim 5*4882a593Smuzhiyun# which registers a listener to the FIB notification chain. 6*4882a593Smuzhiyun 7*4882a593Smuzhiyunlib_dir=$(dirname $0)/../../../net/forwarding 8*4882a593Smuzhiyun 9*4882a593SmuzhiyunALL_TESTS=" 10*4882a593Smuzhiyun ipv4_identical_routes 11*4882a593Smuzhiyun ipv4_tos 12*4882a593Smuzhiyun ipv4_metric 13*4882a593Smuzhiyun ipv4_replace 14*4882a593Smuzhiyun ipv4_delete 15*4882a593Smuzhiyun ipv4_plen 16*4882a593Smuzhiyun ipv4_replay 17*4882a593Smuzhiyun ipv4_flush 18*4882a593Smuzhiyun ipv4_error_path 19*4882a593Smuzhiyun ipv6_add 20*4882a593Smuzhiyun ipv6_metric 21*4882a593Smuzhiyun ipv6_append_single 22*4882a593Smuzhiyun ipv6_replace_single 23*4882a593Smuzhiyun ipv6_metric_multipath 24*4882a593Smuzhiyun ipv6_append_multipath 25*4882a593Smuzhiyun ipv6_replace_multipath 26*4882a593Smuzhiyun ipv6_append_multipath_to_single 27*4882a593Smuzhiyun ipv6_delete_single 28*4882a593Smuzhiyun ipv6_delete_multipath 29*4882a593Smuzhiyun ipv6_replay_single 30*4882a593Smuzhiyun ipv6_replay_multipath 31*4882a593Smuzhiyun ipv6_error_path 32*4882a593Smuzhiyun" 33*4882a593SmuzhiyunNETDEVSIM_PATH=/sys/bus/netdevsim/ 34*4882a593SmuzhiyunDEV_ADDR=1337 35*4882a593SmuzhiyunDEV=netdevsim${DEV_ADDR} 36*4882a593SmuzhiyunDEVLINK_DEV=netdevsim/${DEV} 37*4882a593SmuzhiyunSYSFS_NET_DIR=/sys/bus/netdevsim/devices/$DEV/net/ 38*4882a593SmuzhiyunNUM_NETIFS=0 39*4882a593Smuzhiyunsource $lib_dir/lib.sh 40*4882a593Smuzhiyunsource $lib_dir/devlink_lib.sh 41*4882a593Smuzhiyunsource $lib_dir/fib_offload_lib.sh 42*4882a593Smuzhiyun 43*4882a593Smuzhiyunipv4_identical_routes() 44*4882a593Smuzhiyun{ 45*4882a593Smuzhiyun fib_ipv4_identical_routes_test "testns1" 46*4882a593Smuzhiyun} 47*4882a593Smuzhiyun 48*4882a593Smuzhiyunipv4_tos() 49*4882a593Smuzhiyun{ 50*4882a593Smuzhiyun fib_ipv4_tos_test "testns1" 51*4882a593Smuzhiyun} 52*4882a593Smuzhiyun 53*4882a593Smuzhiyunipv4_metric() 54*4882a593Smuzhiyun{ 55*4882a593Smuzhiyun fib_ipv4_metric_test "testns1" 56*4882a593Smuzhiyun} 57*4882a593Smuzhiyun 58*4882a593Smuzhiyunipv4_replace() 59*4882a593Smuzhiyun{ 60*4882a593Smuzhiyun fib_ipv4_replace_test "testns1" 61*4882a593Smuzhiyun} 62*4882a593Smuzhiyun 63*4882a593Smuzhiyunipv4_delete() 64*4882a593Smuzhiyun{ 65*4882a593Smuzhiyun fib_ipv4_delete_test "testns1" 66*4882a593Smuzhiyun} 67*4882a593Smuzhiyun 68*4882a593Smuzhiyunipv4_plen() 69*4882a593Smuzhiyun{ 70*4882a593Smuzhiyun fib_ipv4_plen_test "testns1" 71*4882a593Smuzhiyun} 72*4882a593Smuzhiyun 73*4882a593Smuzhiyunipv4_replay_metric() 74*4882a593Smuzhiyun{ 75*4882a593Smuzhiyun fib_ipv4_replay_metric_test "testns1" "$DEVLINK_DEV" 76*4882a593Smuzhiyun} 77*4882a593Smuzhiyun 78*4882a593Smuzhiyunipv4_replay_tos() 79*4882a593Smuzhiyun{ 80*4882a593Smuzhiyun fib_ipv4_replay_tos_test "testns1" "$DEVLINK_DEV" 81*4882a593Smuzhiyun} 82*4882a593Smuzhiyun 83*4882a593Smuzhiyunipv4_replay_plen() 84*4882a593Smuzhiyun{ 85*4882a593Smuzhiyun fib_ipv4_replay_plen_test "testns1" "$DEVLINK_DEV" 86*4882a593Smuzhiyun} 87*4882a593Smuzhiyun 88*4882a593Smuzhiyunipv4_replay() 89*4882a593Smuzhiyun{ 90*4882a593Smuzhiyun ipv4_replay_metric 91*4882a593Smuzhiyun ipv4_replay_tos 92*4882a593Smuzhiyun ipv4_replay_plen 93*4882a593Smuzhiyun} 94*4882a593Smuzhiyun 95*4882a593Smuzhiyunipv4_flush() 96*4882a593Smuzhiyun{ 97*4882a593Smuzhiyun fib_ipv4_flush_test "testns1" 98*4882a593Smuzhiyun} 99*4882a593Smuzhiyun 100*4882a593Smuzhiyunipv4_error_path_add() 101*4882a593Smuzhiyun{ 102*4882a593Smuzhiyun local lsb 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun RET=0 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun ip -n testns1 link add name dummy1 type dummy 107*4882a593Smuzhiyun ip -n testns1 link set dev dummy1 up 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun devlink -N testns1 resource set $DEVLINK_DEV path IPv4/fib size 10 110*4882a593Smuzhiyun devlink -N testns1 dev reload $DEVLINK_DEV 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun for lsb in $(seq 1 20); do 113*4882a593Smuzhiyun ip -n testns1 route add 192.0.2.${lsb}/32 dev dummy1 \ 114*4882a593Smuzhiyun &> /dev/null 115*4882a593Smuzhiyun done 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun log_test "IPv4 error path - add" 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun ip -n testns1 link del dev dummy1 120*4882a593Smuzhiyun} 121*4882a593Smuzhiyun 122*4882a593Smuzhiyunipv4_error_path_replay() 123*4882a593Smuzhiyun{ 124*4882a593Smuzhiyun local lsb 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun RET=0 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun ip -n testns1 link add name dummy1 type dummy 129*4882a593Smuzhiyun ip -n testns1 link set dev dummy1 up 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun devlink -N testns1 resource set $DEVLINK_DEV path IPv4/fib size 100 132*4882a593Smuzhiyun devlink -N testns1 dev reload $DEVLINK_DEV 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun for lsb in $(seq 1 20); do 135*4882a593Smuzhiyun ip -n testns1 route add 192.0.2.${lsb}/32 dev dummy1 136*4882a593Smuzhiyun done 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun devlink -N testns1 resource set $DEVLINK_DEV path IPv4/fib size 10 139*4882a593Smuzhiyun devlink -N testns1 dev reload $DEVLINK_DEV &> /dev/null 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun log_test "IPv4 error path - replay" 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun ip -n testns1 link del dev dummy1 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun # Successfully reload after deleting all the routes. 146*4882a593Smuzhiyun devlink -N testns1 resource set $DEVLINK_DEV path IPv4/fib size 100 147*4882a593Smuzhiyun devlink -N testns1 dev reload $DEVLINK_DEV 148*4882a593Smuzhiyun} 149*4882a593Smuzhiyun 150*4882a593Smuzhiyunipv4_error_path() 151*4882a593Smuzhiyun{ 152*4882a593Smuzhiyun # Test the different error paths of the notifiers by limiting the size 153*4882a593Smuzhiyun # of the "IPv4/fib" resource. 154*4882a593Smuzhiyun ipv4_error_path_add 155*4882a593Smuzhiyun ipv4_error_path_replay 156*4882a593Smuzhiyun} 157*4882a593Smuzhiyun 158*4882a593Smuzhiyunipv6_add() 159*4882a593Smuzhiyun{ 160*4882a593Smuzhiyun fib_ipv6_add_test "testns1" 161*4882a593Smuzhiyun} 162*4882a593Smuzhiyun 163*4882a593Smuzhiyunipv6_metric() 164*4882a593Smuzhiyun{ 165*4882a593Smuzhiyun fib_ipv6_metric_test "testns1" 166*4882a593Smuzhiyun} 167*4882a593Smuzhiyun 168*4882a593Smuzhiyunipv6_append_single() 169*4882a593Smuzhiyun{ 170*4882a593Smuzhiyun fib_ipv6_append_single_test "testns1" 171*4882a593Smuzhiyun} 172*4882a593Smuzhiyun 173*4882a593Smuzhiyunipv6_replace_single() 174*4882a593Smuzhiyun{ 175*4882a593Smuzhiyun fib_ipv6_replace_single_test "testns1" 176*4882a593Smuzhiyun} 177*4882a593Smuzhiyun 178*4882a593Smuzhiyunipv6_metric_multipath() 179*4882a593Smuzhiyun{ 180*4882a593Smuzhiyun fib_ipv6_metric_multipath_test "testns1" 181*4882a593Smuzhiyun} 182*4882a593Smuzhiyun 183*4882a593Smuzhiyunipv6_append_multipath() 184*4882a593Smuzhiyun{ 185*4882a593Smuzhiyun fib_ipv6_append_multipath_test "testns1" 186*4882a593Smuzhiyun} 187*4882a593Smuzhiyun 188*4882a593Smuzhiyunipv6_replace_multipath() 189*4882a593Smuzhiyun{ 190*4882a593Smuzhiyun fib_ipv6_replace_multipath_test "testns1" 191*4882a593Smuzhiyun} 192*4882a593Smuzhiyun 193*4882a593Smuzhiyunipv6_append_multipath_to_single() 194*4882a593Smuzhiyun{ 195*4882a593Smuzhiyun fib_ipv6_append_multipath_to_single_test "testns1" 196*4882a593Smuzhiyun} 197*4882a593Smuzhiyun 198*4882a593Smuzhiyunipv6_delete_single() 199*4882a593Smuzhiyun{ 200*4882a593Smuzhiyun fib_ipv6_delete_single_test "testns1" 201*4882a593Smuzhiyun} 202*4882a593Smuzhiyun 203*4882a593Smuzhiyunipv6_delete_multipath() 204*4882a593Smuzhiyun{ 205*4882a593Smuzhiyun fib_ipv6_delete_multipath_test "testns1" 206*4882a593Smuzhiyun} 207*4882a593Smuzhiyun 208*4882a593Smuzhiyunipv6_replay_single() 209*4882a593Smuzhiyun{ 210*4882a593Smuzhiyun fib_ipv6_replay_single_test "testns1" "$DEVLINK_DEV" 211*4882a593Smuzhiyun} 212*4882a593Smuzhiyun 213*4882a593Smuzhiyunipv6_replay_multipath() 214*4882a593Smuzhiyun{ 215*4882a593Smuzhiyun fib_ipv6_replay_multipath_test "testns1" "$DEVLINK_DEV" 216*4882a593Smuzhiyun} 217*4882a593Smuzhiyun 218*4882a593Smuzhiyunipv6_error_path_add_single() 219*4882a593Smuzhiyun{ 220*4882a593Smuzhiyun local lsb 221*4882a593Smuzhiyun 222*4882a593Smuzhiyun RET=0 223*4882a593Smuzhiyun 224*4882a593Smuzhiyun ip -n testns1 link add name dummy1 type dummy 225*4882a593Smuzhiyun ip -n testns1 link set dev dummy1 up 226*4882a593Smuzhiyun 227*4882a593Smuzhiyun devlink -N testns1 resource set $DEVLINK_DEV path IPv6/fib size 10 228*4882a593Smuzhiyun devlink -N testns1 dev reload $DEVLINK_DEV 229*4882a593Smuzhiyun 230*4882a593Smuzhiyun for lsb in $(seq 1 20); do 231*4882a593Smuzhiyun ip -n testns1 route add 2001:db8:1::${lsb}/128 dev dummy1 \ 232*4882a593Smuzhiyun &> /dev/null 233*4882a593Smuzhiyun done 234*4882a593Smuzhiyun 235*4882a593Smuzhiyun log_test "IPv6 error path - add single" 236*4882a593Smuzhiyun 237*4882a593Smuzhiyun ip -n testns1 link del dev dummy1 238*4882a593Smuzhiyun} 239*4882a593Smuzhiyun 240*4882a593Smuzhiyunipv6_error_path_add_multipath() 241*4882a593Smuzhiyun{ 242*4882a593Smuzhiyun local lsb 243*4882a593Smuzhiyun 244*4882a593Smuzhiyun RET=0 245*4882a593Smuzhiyun 246*4882a593Smuzhiyun for i in $(seq 1 2); do 247*4882a593Smuzhiyun ip -n testns1 link add name dummy$i type dummy 248*4882a593Smuzhiyun ip -n testns1 link set dev dummy$i up 249*4882a593Smuzhiyun ip -n testns1 address add 2001:db8:$i::1/64 dev dummy$i 250*4882a593Smuzhiyun done 251*4882a593Smuzhiyun 252*4882a593Smuzhiyun devlink -N testns1 resource set $DEVLINK_DEV path IPv6/fib size 10 253*4882a593Smuzhiyun devlink -N testns1 dev reload $DEVLINK_DEV 254*4882a593Smuzhiyun 255*4882a593Smuzhiyun for lsb in $(seq 1 20); do 256*4882a593Smuzhiyun ip -n testns1 route add 2001:db8:10::${lsb}/128 \ 257*4882a593Smuzhiyun nexthop via 2001:db8:1::2 dev dummy1 \ 258*4882a593Smuzhiyun nexthop via 2001:db8:2::2 dev dummy2 &> /dev/null 259*4882a593Smuzhiyun done 260*4882a593Smuzhiyun 261*4882a593Smuzhiyun log_test "IPv6 error path - add multipath" 262*4882a593Smuzhiyun 263*4882a593Smuzhiyun for i in $(seq 1 2); do 264*4882a593Smuzhiyun ip -n testns1 link del dev dummy$i 265*4882a593Smuzhiyun done 266*4882a593Smuzhiyun} 267*4882a593Smuzhiyun 268*4882a593Smuzhiyunipv6_error_path_replay() 269*4882a593Smuzhiyun{ 270*4882a593Smuzhiyun local lsb 271*4882a593Smuzhiyun 272*4882a593Smuzhiyun RET=0 273*4882a593Smuzhiyun 274*4882a593Smuzhiyun ip -n testns1 link add name dummy1 type dummy 275*4882a593Smuzhiyun ip -n testns1 link set dev dummy1 up 276*4882a593Smuzhiyun 277*4882a593Smuzhiyun devlink -N testns1 resource set $DEVLINK_DEV path IPv6/fib size 100 278*4882a593Smuzhiyun devlink -N testns1 dev reload $DEVLINK_DEV 279*4882a593Smuzhiyun 280*4882a593Smuzhiyun for lsb in $(seq 1 20); do 281*4882a593Smuzhiyun ip -n testns1 route add 2001:db8:1::${lsb}/128 dev dummy1 282*4882a593Smuzhiyun done 283*4882a593Smuzhiyun 284*4882a593Smuzhiyun devlink -N testns1 resource set $DEVLINK_DEV path IPv6/fib size 10 285*4882a593Smuzhiyun devlink -N testns1 dev reload $DEVLINK_DEV &> /dev/null 286*4882a593Smuzhiyun 287*4882a593Smuzhiyun log_test "IPv6 error path - replay" 288*4882a593Smuzhiyun 289*4882a593Smuzhiyun ip -n testns1 link del dev dummy1 290*4882a593Smuzhiyun 291*4882a593Smuzhiyun # Successfully reload after deleting all the routes. 292*4882a593Smuzhiyun devlink -N testns1 resource set $DEVLINK_DEV path IPv6/fib size 100 293*4882a593Smuzhiyun devlink -N testns1 dev reload $DEVLINK_DEV 294*4882a593Smuzhiyun} 295*4882a593Smuzhiyun 296*4882a593Smuzhiyunipv6_error_path() 297*4882a593Smuzhiyun{ 298*4882a593Smuzhiyun # Test the different error paths of the notifiers by limiting the size 299*4882a593Smuzhiyun # of the "IPv6/fib" resource. 300*4882a593Smuzhiyun ipv6_error_path_add_single 301*4882a593Smuzhiyun ipv6_error_path_add_multipath 302*4882a593Smuzhiyun ipv6_error_path_replay 303*4882a593Smuzhiyun} 304*4882a593Smuzhiyun 305*4882a593Smuzhiyunsetup_prepare() 306*4882a593Smuzhiyun{ 307*4882a593Smuzhiyun local netdev 308*4882a593Smuzhiyun 309*4882a593Smuzhiyun modprobe netdevsim &> /dev/null 310*4882a593Smuzhiyun 311*4882a593Smuzhiyun echo "$DEV_ADDR 1" > ${NETDEVSIM_PATH}/new_device 312*4882a593Smuzhiyun while [ ! -d $SYSFS_NET_DIR ] ; do :; done 313*4882a593Smuzhiyun 314*4882a593Smuzhiyun ip netns add testns1 315*4882a593Smuzhiyun if [ $? -ne 0 ]; then 316*4882a593Smuzhiyun echo "Failed to add netns \"testns1\"" 317*4882a593Smuzhiyun exit 1 318*4882a593Smuzhiyun fi 319*4882a593Smuzhiyun 320*4882a593Smuzhiyun devlink dev reload $DEVLINK_DEV netns testns1 321*4882a593Smuzhiyun if [ $? -ne 0 ]; then 322*4882a593Smuzhiyun echo "Failed to reload into netns \"testns1\"" 323*4882a593Smuzhiyun exit 1 324*4882a593Smuzhiyun fi 325*4882a593Smuzhiyun} 326*4882a593Smuzhiyun 327*4882a593Smuzhiyuncleanup() 328*4882a593Smuzhiyun{ 329*4882a593Smuzhiyun pre_cleanup 330*4882a593Smuzhiyun ip netns del testns1 331*4882a593Smuzhiyun echo "$DEV_ADDR" > ${NETDEVSIM_PATH}/del_device 332*4882a593Smuzhiyun modprobe -r netdevsim &> /dev/null 333*4882a593Smuzhiyun} 334*4882a593Smuzhiyun 335*4882a593Smuzhiyuntrap cleanup EXIT 336*4882a593Smuzhiyun 337*4882a593Smuzhiyunsetup_prepare 338*4882a593Smuzhiyun 339*4882a593Smuzhiyuntests_run 340*4882a593Smuzhiyun 341*4882a593Smuzhiyunexit $EXIT_STATUS 342