1#!/bin/bash 2# SPDX-License-Identifier: GPL-2.0 3# 4# ns: me | ns: peer | ns: remote 5# 2001:db8:91::1 | 2001:db8:91::2 | 6# 172.16.1.1 | 172.16.1.2 | 7# veth1 <---|---> veth2 | 8# | veth5 <--|--> veth6 172.16.101.1 9# veth3 <---|---> veth4 | 2001:db8:101::1 10# 172.16.2.1 | 172.16.2.2 | 11# 2001:db8:92::1 | 2001:db8:92::2 | 12# 13# This test is for checking IPv4 and IPv6 FIB behavior with nexthop 14# objects. Device reference counts and network namespace cleanup tested 15# by use of network namespace for peer. 16 17ret=0 18# Kselftest framework requirement - SKIP code is 4. 19ksft_skip=4 20 21# all tests in this script. Can be overridden with -t option 22IPV4_TESTS="ipv4_fcnal ipv4_grp_fcnal ipv4_withv6_fcnal ipv4_fcnal_runtime ipv4_compat_mode" 23IPV6_TESTS="ipv6_fcnal ipv6_grp_fcnal ipv6_fcnal_runtime ipv6_compat_mode" 24 25ALL_TESTS="basic ${IPV4_TESTS} ${IPV6_TESTS}" 26TESTS="${ALL_TESTS}" 27VERBOSE=0 28PAUSE_ON_FAIL=no 29PAUSE=no 30 31nsid=100 32 33################################################################################ 34# utilities 35 36log_test() 37{ 38 local rc=$1 39 local expected=$2 40 local msg="$3" 41 42 if [ ${rc} -eq ${expected} ]; then 43 printf "TEST: %-60s [ OK ]\n" "${msg}" 44 nsuccess=$((nsuccess+1)) 45 else 46 ret=1 47 nfail=$((nfail+1)) 48 printf "TEST: %-60s [FAIL]\n" "${msg}" 49 if [ "$VERBOSE" = "1" ]; then 50 echo " rc=$rc, expected $expected" 51 fi 52 53 if [ "${PAUSE_ON_FAIL}" = "yes" ]; then 54 echo 55 echo "hit enter to continue, 'q' to quit" 56 read a 57 [ "$a" = "q" ] && exit 1 58 fi 59 fi 60 61 if [ "${PAUSE}" = "yes" ]; then 62 echo 63 echo "hit enter to continue, 'q' to quit" 64 read a 65 [ "$a" = "q" ] && exit 1 66 fi 67 68 [ "$VERBOSE" = "1" ] && echo 69} 70 71run_cmd() 72{ 73 local cmd="$1" 74 local out 75 local stderr="2>/dev/null" 76 77 if [ "$VERBOSE" = "1" ]; then 78 printf "COMMAND: $cmd\n" 79 stderr= 80 fi 81 82 out=$(eval $cmd $stderr) 83 rc=$? 84 if [ "$VERBOSE" = "1" -a -n "$out" ]; then 85 echo " $out" 86 fi 87 88 return $rc 89} 90 91get_linklocal() 92{ 93 local dev=$1 94 local ns 95 local addr 96 97 [ -n "$2" ] && ns="-netns $2" 98 addr=$(ip $ns -6 -br addr show dev ${dev} | \ 99 awk '{ 100 for (i = 3; i <= NF; ++i) { 101 if ($i ~ /^fe80/) 102 print $i 103 } 104 }' 105 ) 106 addr=${addr/\/*} 107 108 [ -z "$addr" ] && return 1 109 110 echo $addr 111 112 return 0 113} 114 115create_ns() 116{ 117 local n=${1} 118 119 ip netns del ${n} 2>/dev/null 120 121 set -e 122 ip netns add ${n} 123 ip netns set ${n} $((nsid++)) 124 ip -netns ${n} addr add 127.0.0.1/8 dev lo 125 ip -netns ${n} link set lo up 126 127 ip netns exec ${n} sysctl -qw net.ipv4.ip_forward=1 128 ip netns exec ${n} sysctl -qw net.ipv4.fib_multipath_use_neigh=1 129 ip netns exec ${n} sysctl -qw net.ipv4.conf.default.ignore_routes_with_linkdown=1 130 ip netns exec ${n} sysctl -qw net.ipv6.conf.all.keep_addr_on_down=1 131 ip netns exec ${n} sysctl -qw net.ipv6.conf.all.forwarding=1 132 ip netns exec ${n} sysctl -qw net.ipv6.conf.default.forwarding=1 133 ip netns exec ${n} sysctl -qw net.ipv6.conf.default.ignore_routes_with_linkdown=1 134 ip netns exec ${n} sysctl -qw net.ipv6.conf.all.accept_dad=0 135 ip netns exec ${n} sysctl -qw net.ipv6.conf.default.accept_dad=0 136 137 set +e 138} 139 140setup() 141{ 142 cleanup 143 144 create_ns me 145 create_ns peer 146 create_ns remote 147 148 IP="ip -netns me" 149 set -e 150 $IP li add veth1 type veth peer name veth2 151 $IP li set veth1 up 152 $IP addr add 172.16.1.1/24 dev veth1 153 $IP -6 addr add 2001:db8:91::1/64 dev veth1 nodad 154 155 $IP li add veth3 type veth peer name veth4 156 $IP li set veth3 up 157 $IP addr add 172.16.2.1/24 dev veth3 158 $IP -6 addr add 2001:db8:92::1/64 dev veth3 nodad 159 160 $IP li set veth2 netns peer up 161 ip -netns peer addr add 172.16.1.2/24 dev veth2 162 ip -netns peer -6 addr add 2001:db8:91::2/64 dev veth2 nodad 163 164 $IP li set veth4 netns peer up 165 ip -netns peer addr add 172.16.2.2/24 dev veth4 166 ip -netns peer -6 addr add 2001:db8:92::2/64 dev veth4 nodad 167 168 ip -netns remote li add veth5 type veth peer name veth6 169 ip -netns remote li set veth5 up 170 ip -netns remote addr add dev veth5 172.16.101.1/24 171 ip -netns remote -6 addr add dev veth5 2001:db8:101::1/64 nodad 172 ip -netns remote ro add 172.16.0.0/22 via 172.16.101.2 173 ip -netns remote -6 ro add 2001:db8:90::/40 via 2001:db8:101::2 174 175 ip -netns remote li set veth6 netns peer up 176 ip -netns peer addr add dev veth6 172.16.101.2/24 177 ip -netns peer -6 addr add dev veth6 2001:db8:101::2/64 nodad 178 set +e 179} 180 181cleanup() 182{ 183 local ns 184 185 for ns in me peer remote; do 186 ip netns del ${ns} 2>/dev/null 187 done 188} 189 190check_output() 191{ 192 local out="$1" 193 local expected="$2" 194 local rc=0 195 196 [ "${out}" = "${expected}" ] && return 0 197 198 if [ -z "${out}" ]; then 199 if [ "$VERBOSE" = "1" ]; then 200 printf "\nNo entry found\n" 201 printf "Expected:\n" 202 printf " ${expected}\n" 203 fi 204 return 1 205 fi 206 207 out=$(echo ${out}) 208 if [ "${out}" != "${expected}" ]; then 209 rc=1 210 if [ "${VERBOSE}" = "1" ]; then 211 printf " Unexpected entry. Have:\n" 212 printf " ${out}\n" 213 printf " Expected:\n" 214 printf " ${expected}\n\n" 215 else 216 echo " WARNING: Unexpected route entry" 217 fi 218 fi 219 220 return $rc 221} 222 223check_nexthop() 224{ 225 local nharg="$1" 226 local expected="$2" 227 local out 228 229 out=$($IP nexthop ls ${nharg} 2>/dev/null) 230 231 check_output "${out}" "${expected}" 232} 233 234check_route() 235{ 236 local pfx="$1" 237 local expected="$2" 238 local out 239 240 out=$($IP route ls match ${pfx} 2>/dev/null) 241 242 check_output "${out}" "${expected}" 243} 244 245check_route6() 246{ 247 local pfx="$1" 248 local expected="$2" 249 local out 250 251 out=$($IP -6 route ls match ${pfx} 2>/dev/null | sed -e 's/pref medium//') 252 253 check_output "${out}" "${expected}" 254} 255 256start_ip_monitor() 257{ 258 local mtype=$1 259 260 # start the monitor in the background 261 tmpfile=`mktemp /var/run/nexthoptestXXX` 262 mpid=`($IP monitor $mtype > $tmpfile & echo $!) 2>/dev/null` 263 sleep 0.2 264 echo "$mpid $tmpfile" 265} 266 267stop_ip_monitor() 268{ 269 local mpid=$1 270 local tmpfile=$2 271 local el=$3 272 273 # check the monitor results 274 kill $mpid 275 lines=`wc -l $tmpfile | cut "-d " -f1` 276 test $lines -eq $el 277 rc=$? 278 rm -rf $tmpfile 279 280 return $rc 281} 282 283################################################################################ 284# basic operations (add, delete, replace) on nexthops and nexthop groups 285# 286# IPv6 287 288ipv6_fcnal() 289{ 290 local rc 291 292 echo 293 echo "IPv6" 294 echo "----------------------" 295 296 run_cmd "$IP nexthop add id 52 via 2001:db8:91::2 dev veth1" 297 rc=$? 298 log_test $rc 0 "Create nexthop with id, gw, dev" 299 if [ $rc -ne 0 ]; then 300 echo "Basic IPv6 create fails; can not continue" 301 return 1 302 fi 303 304 run_cmd "$IP nexthop get id 52" 305 log_test $? 0 "Get nexthop by id" 306 check_nexthop "id 52" "id 52 via 2001:db8:91::2 dev veth1 scope link" 307 308 run_cmd "$IP nexthop del id 52" 309 log_test $? 0 "Delete nexthop by id" 310 check_nexthop "id 52" "" 311 312 # 313 # gw, device spec 314 # 315 # gw validation, no device - fails since dev required 316 run_cmd "$IP nexthop add id 52 via 2001:db8:92::3" 317 log_test $? 2 "Create nexthop - gw only" 318 319 # gw is not reachable throught given dev 320 run_cmd "$IP nexthop add id 53 via 2001:db8:3::3 dev veth1" 321 log_test $? 2 "Create nexthop - invalid gw+dev combination" 322 323 # onlink arg overrides gw+dev lookup 324 run_cmd "$IP nexthop add id 53 via 2001:db8:3::3 dev veth1 onlink" 325 log_test $? 0 "Create nexthop - gw+dev and onlink" 326 327 # admin down should delete nexthops 328 set -e 329 run_cmd "$IP -6 nexthop add id 55 via 2001:db8:91::3 dev veth1" 330 run_cmd "$IP nexthop add id 56 via 2001:db8:91::4 dev veth1" 331 run_cmd "$IP nexthop add id 57 via 2001:db8:91::5 dev veth1" 332 run_cmd "$IP li set dev veth1 down" 333 set +e 334 check_nexthop "dev veth1" "" 335 log_test $? 0 "Nexthops removed on admin down" 336} 337 338ipv6_grp_fcnal() 339{ 340 local rc 341 342 echo 343 echo "IPv6 groups functional" 344 echo "----------------------" 345 346 # basic functionality: create a nexthop group, default weight 347 run_cmd "$IP nexthop add id 61 via 2001:db8:91::2 dev veth1" 348 run_cmd "$IP nexthop add id 101 group 61" 349 log_test $? 0 "Create nexthop group with single nexthop" 350 351 # get nexthop group 352 run_cmd "$IP nexthop get id 101" 353 log_test $? 0 "Get nexthop group by id" 354 check_nexthop "id 101" "id 101 group 61" 355 356 # delete nexthop group 357 run_cmd "$IP nexthop del id 101" 358 log_test $? 0 "Delete nexthop group by id" 359 check_nexthop "id 101" "" 360 361 $IP nexthop flush >/dev/null 2>&1 362 check_nexthop "id 101" "" 363 364 # 365 # create group with multiple nexthops - mix of gw and dev only 366 # 367 run_cmd "$IP nexthop add id 62 via 2001:db8:91::2 dev veth1" 368 run_cmd "$IP nexthop add id 63 via 2001:db8:91::3 dev veth1" 369 run_cmd "$IP nexthop add id 64 via 2001:db8:91::4 dev veth1" 370 run_cmd "$IP nexthop add id 65 dev veth1" 371 run_cmd "$IP nexthop add id 102 group 62/63/64/65" 372 log_test $? 0 "Nexthop group with multiple nexthops" 373 check_nexthop "id 102" "id 102 group 62/63/64/65" 374 375 # Delete nexthop in a group and group is updated 376 run_cmd "$IP nexthop del id 63" 377 check_nexthop "id 102" "id 102 group 62/64/65" 378 log_test $? 0 "Nexthop group updated when entry is deleted" 379 380 # create group with multiple weighted nexthops 381 run_cmd "$IP nexthop add id 63 via 2001:db8:91::3 dev veth1" 382 run_cmd "$IP nexthop add id 103 group 62/63,2/64,3/65,4" 383 log_test $? 0 "Nexthop group with weighted nexthops" 384 check_nexthop "id 103" "id 103 group 62/63,2/64,3/65,4" 385 386 # Delete nexthop in a weighted group and group is updated 387 run_cmd "$IP nexthop del id 63" 388 check_nexthop "id 103" "id 103 group 62/64,3/65,4" 389 log_test $? 0 "Weighted nexthop group updated when entry is deleted" 390 391 # admin down - nexthop is removed from group 392 run_cmd "$IP li set dev veth1 down" 393 check_nexthop "dev veth1" "" 394 log_test $? 0 "Nexthops in groups removed on admin down" 395 396 # expect groups to have been deleted as well 397 check_nexthop "" "" 398 399 run_cmd "$IP li set dev veth1 up" 400 401 $IP nexthop flush >/dev/null 2>&1 402 403 # group with nexthops using different devices 404 set -e 405 run_cmd "$IP nexthop add id 62 via 2001:db8:91::2 dev veth1" 406 run_cmd "$IP nexthop add id 63 via 2001:db8:91::3 dev veth1" 407 run_cmd "$IP nexthop add id 64 via 2001:db8:91::4 dev veth1" 408 run_cmd "$IP nexthop add id 65 via 2001:db8:91::5 dev veth1" 409 410 run_cmd "$IP nexthop add id 72 via 2001:db8:92::2 dev veth3" 411 run_cmd "$IP nexthop add id 73 via 2001:db8:92::3 dev veth3" 412 run_cmd "$IP nexthop add id 74 via 2001:db8:92::4 dev veth3" 413 run_cmd "$IP nexthop add id 75 via 2001:db8:92::5 dev veth3" 414 set +e 415 416 # multiple groups with same nexthop 417 run_cmd "$IP nexthop add id 104 group 62" 418 run_cmd "$IP nexthop add id 105 group 62" 419 check_nexthop "group" "id 104 group 62 id 105 group 62" 420 log_test $? 0 "Multiple groups with same nexthop" 421 422 run_cmd "$IP nexthop flush groups" 423 [ $? -ne 0 ] && return 1 424 425 # on admin down of veth1, it should be removed from the group 426 run_cmd "$IP nexthop add id 105 group 62/63/72/73/64" 427 run_cmd "$IP li set veth1 down" 428 check_nexthop "id 105" "id 105 group 72/73" 429 log_test $? 0 "Nexthops in group removed on admin down - mixed group" 430 431 run_cmd "$IP nexthop add id 106 group 105/74" 432 log_test $? 2 "Nexthop group can not have a group as an entry" 433 434 # a group can have a blackhole entry only if it is the only 435 # nexthop in the group. Needed for atomic replace with an 436 # actual nexthop group 437 run_cmd "$IP -6 nexthop add id 31 blackhole" 438 run_cmd "$IP nexthop add id 107 group 31" 439 log_test $? 0 "Nexthop group with a blackhole entry" 440 441 run_cmd "$IP nexthop add id 108 group 31/24" 442 log_test $? 2 "Nexthop group can not have a blackhole and another nexthop" 443} 444 445ipv6_fcnal_runtime() 446{ 447 local rc 448 449 echo 450 echo "IPv6 functional runtime" 451 echo "-----------------------" 452 453 # 454 # IPv6 - the basics 455 # 456 run_cmd "$IP nexthop add id 81 via 2001:db8:91::2 dev veth1" 457 run_cmd "$IP ro add 2001:db8:101::1/128 nhid 81" 458 log_test $? 0 "Route add" 459 460 run_cmd "$IP ro delete 2001:db8:101::1/128 nhid 81" 461 log_test $? 0 "Route delete" 462 463 run_cmd "$IP ro add 2001:db8:101::1/128 nhid 81" 464 run_cmd "ip netns exec me ping -c1 -w1 2001:db8:101::1" 465 log_test $? 0 "Ping with nexthop" 466 467 run_cmd "$IP nexthop add id 82 via 2001:db8:92::2 dev veth3" 468 run_cmd "$IP nexthop add id 122 group 81/82" 469 run_cmd "$IP ro replace 2001:db8:101::1/128 nhid 122" 470 run_cmd "ip netns exec me ping -c1 -w1 2001:db8:101::1" 471 log_test $? 0 "Ping - multipath" 472 473 # 474 # IPv6 with blackhole nexthops 475 # 476 run_cmd "$IP -6 nexthop add id 83 blackhole" 477 run_cmd "$IP ro replace 2001:db8:101::1/128 nhid 83" 478 run_cmd "ip netns exec me ping -c1 -w1 2001:db8:101::1" 479 log_test $? 2 "Ping - blackhole" 480 481 run_cmd "$IP nexthop replace id 83 via 2001:db8:91::2 dev veth1" 482 run_cmd "ip netns exec me ping -c1 -w1 2001:db8:101::1" 483 log_test $? 0 "Ping - blackhole replaced with gateway" 484 485 run_cmd "$IP -6 nexthop replace id 83 blackhole" 486 run_cmd "ip netns exec me ping -c1 -w1 2001:db8:101::1" 487 log_test $? 2 "Ping - gateway replaced by blackhole" 488 489 run_cmd "$IP ro replace 2001:db8:101::1/128 nhid 122" 490 run_cmd "ip netns exec me ping -c1 -w1 2001:db8:101::1" 491 if [ $? -eq 0 ]; then 492 run_cmd "$IP nexthop replace id 122 group 83" 493 run_cmd "ip netns exec me ping -c1 -w1 2001:db8:101::1" 494 log_test $? 2 "Ping - group with blackhole" 495 496 run_cmd "$IP nexthop replace id 122 group 81/82" 497 run_cmd "ip netns exec me ping -c1 -w1 2001:db8:101::1" 498 log_test $? 0 "Ping - group blackhole replaced with gateways" 499 else 500 log_test 2 0 "Ping - multipath failed" 501 fi 502 503 # 504 # device only and gw + dev only mix 505 # 506 run_cmd "$IP -6 nexthop add id 85 dev veth1" 507 run_cmd "$IP ro replace 2001:db8:101::1/128 nhid 85" 508 log_test $? 0 "IPv6 route with device only nexthop" 509 check_route6 "2001:db8:101::1" "2001:db8:101::1 nhid 85 dev veth1 metric 1024" 510 511 run_cmd "$IP nexthop add id 123 group 81/85" 512 run_cmd "$IP ro replace 2001:db8:101::1/128 nhid 123" 513 log_test $? 0 "IPv6 multipath route with nexthop mix - dev only + gw" 514 check_route6 "2001:db8:101::1" "2001:db8:101::1 nhid 123 metric 1024 nexthop via 2001:db8:91::2 dev veth1 weight 1 nexthop dev veth1 weight 1" 515 516 # 517 # IPv6 route with v4 nexthop - not allowed 518 # 519 run_cmd "$IP ro delete 2001:db8:101::1/128" 520 run_cmd "$IP nexthop add id 84 via 172.16.1.1 dev veth1" 521 run_cmd "$IP ro add 2001:db8:101::1/128 nhid 84" 522 log_test $? 2 "IPv6 route can not have a v4 gateway" 523 524 run_cmd "$IP ro replace 2001:db8:101::1/128 nhid 81" 525 run_cmd "$IP nexthop replace id 81 via 172.16.1.1 dev veth1" 526 log_test $? 2 "Nexthop replace - v6 route, v4 nexthop" 527 528 run_cmd "$IP ro replace 2001:db8:101::1/128 nhid 122" 529 run_cmd "$IP nexthop replace id 81 via 172.16.1.1 dev veth1" 530 log_test $? 2 "Nexthop replace of group entry - v6 route, v4 nexthop" 531 532 $IP nexthop flush >/dev/null 2>&1 533 534 # 535 # weird IPv6 cases 536 # 537 run_cmd "$IP nexthop add id 86 via 2001:db8:91::2 dev veth1" 538 run_cmd "$IP ro add 2001:db8:101::1/128 nhid 81" 539 540 # TO-DO: 541 # existing route with old nexthop; append route with new nexthop 542 # existing route with old nexthop; replace route with new 543 # existing route with new nexthop; replace route with old 544 # route with src address and using nexthop - not allowed 545} 546 547ipv4_fcnal() 548{ 549 local rc 550 551 echo 552 echo "IPv4 functional" 553 echo "----------------------" 554 555 # 556 # basic IPv4 ops - add, get, delete 557 # 558 run_cmd "$IP nexthop add id 12 via 172.16.1.2 dev veth1" 559 rc=$? 560 log_test $rc 0 "Create nexthop with id, gw, dev" 561 if [ $rc -ne 0 ]; then 562 echo "Basic IPv4 create fails; can not continue" 563 return 1 564 fi 565 566 run_cmd "$IP nexthop get id 12" 567 log_test $? 0 "Get nexthop by id" 568 check_nexthop "id 12" "id 12 via 172.16.1.2 dev veth1 scope link" 569 570 run_cmd "$IP nexthop del id 12" 571 log_test $? 0 "Delete nexthop by id" 572 check_nexthop "id 52" "" 573 574 # 575 # gw, device spec 576 # 577 # gw validation, no device - fails since dev is required 578 run_cmd "$IP nexthop add id 12 via 172.16.2.3" 579 log_test $? 2 "Create nexthop - gw only" 580 581 # gw not reachable through given dev 582 run_cmd "$IP nexthop add id 13 via 172.16.3.2 dev veth1" 583 log_test $? 2 "Create nexthop - invalid gw+dev combination" 584 585 # onlink flag overrides gw+dev lookup 586 run_cmd "$IP nexthop add id 13 via 172.16.3.2 dev veth1 onlink" 587 log_test $? 0 "Create nexthop - gw+dev and onlink" 588 589 # admin down should delete nexthops 590 set -e 591 run_cmd "$IP nexthop add id 15 via 172.16.1.3 dev veth1" 592 run_cmd "$IP nexthop add id 16 via 172.16.1.4 dev veth1" 593 run_cmd "$IP nexthop add id 17 via 172.16.1.5 dev veth1" 594 run_cmd "$IP li set dev veth1 down" 595 set +e 596 check_nexthop "dev veth1" "" 597 log_test $? 0 "Nexthops removed on admin down" 598} 599 600ipv4_grp_fcnal() 601{ 602 local rc 603 604 echo 605 echo "IPv4 groups functional" 606 echo "----------------------" 607 608 # basic functionality: create a nexthop group, default weight 609 run_cmd "$IP nexthop add id 11 via 172.16.1.2 dev veth1" 610 run_cmd "$IP nexthop add id 101 group 11" 611 log_test $? 0 "Create nexthop group with single nexthop" 612 613 # get nexthop group 614 run_cmd "$IP nexthop get id 101" 615 log_test $? 0 "Get nexthop group by id" 616 check_nexthop "id 101" "id 101 group 11" 617 618 # delete nexthop group 619 run_cmd "$IP nexthop del id 101" 620 log_test $? 0 "Delete nexthop group by id" 621 check_nexthop "id 101" "" 622 623 $IP nexthop flush >/dev/null 2>&1 624 625 # 626 # create group with multiple nexthops 627 run_cmd "$IP nexthop add id 12 via 172.16.1.2 dev veth1" 628 run_cmd "$IP nexthop add id 13 via 172.16.1.3 dev veth1" 629 run_cmd "$IP nexthop add id 14 via 172.16.1.4 dev veth1" 630 run_cmd "$IP nexthop add id 15 via 172.16.1.5 dev veth1" 631 run_cmd "$IP nexthop add id 102 group 12/13/14/15" 632 log_test $? 0 "Nexthop group with multiple nexthops" 633 check_nexthop "id 102" "id 102 group 12/13/14/15" 634 635 # Delete nexthop in a group and group is updated 636 run_cmd "$IP nexthop del id 13" 637 check_nexthop "id 102" "id 102 group 12/14/15" 638 log_test $? 0 "Nexthop group updated when entry is deleted" 639 640 # create group with multiple weighted nexthops 641 run_cmd "$IP nexthop add id 13 via 172.16.1.3 dev veth1" 642 run_cmd "$IP nexthop add id 103 group 12/13,2/14,3/15,4" 643 log_test $? 0 "Nexthop group with weighted nexthops" 644 check_nexthop "id 103" "id 103 group 12/13,2/14,3/15,4" 645 646 # Delete nexthop in a weighted group and group is updated 647 run_cmd "$IP nexthop del id 13" 648 check_nexthop "id 103" "id 103 group 12/14,3/15,4" 649 log_test $? 0 "Weighted nexthop group updated when entry is deleted" 650 651 # admin down - nexthop is removed from group 652 run_cmd "$IP li set dev veth1 down" 653 check_nexthop "dev veth1" "" 654 log_test $? 0 "Nexthops in groups removed on admin down" 655 656 # expect groups to have been deleted as well 657 check_nexthop "" "" 658 659 run_cmd "$IP li set dev veth1 up" 660 661 $IP nexthop flush >/dev/null 2>&1 662 663 # group with nexthops using different devices 664 set -e 665 run_cmd "$IP nexthop add id 12 via 172.16.1.2 dev veth1" 666 run_cmd "$IP nexthop add id 13 via 172.16.1.3 dev veth1" 667 run_cmd "$IP nexthop add id 14 via 172.16.1.4 dev veth1" 668 run_cmd "$IP nexthop add id 15 via 172.16.1.5 dev veth1" 669 670 run_cmd "$IP nexthop add id 22 via 172.16.2.2 dev veth3" 671 run_cmd "$IP nexthop add id 23 via 172.16.2.3 dev veth3" 672 run_cmd "$IP nexthop add id 24 via 172.16.2.4 dev veth3" 673 run_cmd "$IP nexthop add id 25 via 172.16.2.5 dev veth3" 674 set +e 675 676 # multiple groups with same nexthop 677 run_cmd "$IP nexthop add id 104 group 12" 678 run_cmd "$IP nexthop add id 105 group 12" 679 check_nexthop "group" "id 104 group 12 id 105 group 12" 680 log_test $? 0 "Multiple groups with same nexthop" 681 682 run_cmd "$IP nexthop flush groups" 683 [ $? -ne 0 ] && return 1 684 685 # on admin down of veth1, it should be removed from the group 686 run_cmd "$IP nexthop add id 105 group 12/13/22/23/14" 687 run_cmd "$IP li set veth1 down" 688 check_nexthop "id 105" "id 105 group 22/23" 689 log_test $? 0 "Nexthops in group removed on admin down - mixed group" 690 691 run_cmd "$IP nexthop add id 106 group 105/24" 692 log_test $? 2 "Nexthop group can not have a group as an entry" 693 694 # a group can have a blackhole entry only if it is the only 695 # nexthop in the group. Needed for atomic replace with an 696 # actual nexthop group 697 run_cmd "$IP nexthop add id 31 blackhole" 698 run_cmd "$IP nexthop add id 107 group 31" 699 log_test $? 0 "Nexthop group with a blackhole entry" 700 701 run_cmd "$IP nexthop add id 108 group 31/24" 702 log_test $? 2 "Nexthop group can not have a blackhole and another nexthop" 703} 704 705ipv4_withv6_fcnal() 706{ 707 local lladdr 708 709 set -e 710 lladdr=$(get_linklocal veth2 peer) 711 run_cmd "$IP nexthop add id 11 via ${lladdr} dev veth1" 712 set +e 713 run_cmd "$IP ro add 172.16.101.1/32 nhid 11" 714 log_test $? 0 "IPv6 nexthop with IPv4 route" 715 check_route "172.16.101.1" "172.16.101.1 nhid 11 via inet6 ${lladdr} dev veth1" 716 717 set -e 718 run_cmd "$IP nexthop add id 12 via 172.16.1.2 dev veth1" 719 run_cmd "$IP nexthop add id 101 group 11/12" 720 set +e 721 run_cmd "$IP ro replace 172.16.101.1/32 nhid 101" 722 log_test $? 0 "IPv6 nexthop with IPv4 route" 723 724 check_route "172.16.101.1" "172.16.101.1 nhid 101 nexthop via inet6 ${lladdr} dev veth1 weight 1 nexthop via 172.16.1.2 dev veth1 weight 1" 725 726 run_cmd "$IP ro replace 172.16.101.1/32 via inet6 ${lladdr} dev veth1" 727 log_test $? 0 "IPv4 route with IPv6 gateway" 728 check_route "172.16.101.1" "172.16.101.1 via inet6 ${lladdr} dev veth1" 729 730 run_cmd "$IP ro replace 172.16.101.1/32 via inet6 2001:db8:50::1 dev veth1" 731 log_test $? 2 "IPv4 route with invalid IPv6 gateway" 732} 733 734ipv4_fcnal_runtime() 735{ 736 local lladdr 737 local rc 738 739 echo 740 echo "IPv4 functional runtime" 741 echo "-----------------------" 742 743 run_cmd "$IP nexthop add id 21 via 172.16.1.2 dev veth1" 744 run_cmd "$IP ro add 172.16.101.1/32 nhid 21" 745 log_test $? 0 "Route add" 746 check_route "172.16.101.1" "172.16.101.1 nhid 21 via 172.16.1.2 dev veth1" 747 748 run_cmd "$IP ro delete 172.16.101.1/32 nhid 21" 749 log_test $? 0 "Route delete" 750 751 # 752 # scope mismatch 753 # 754 run_cmd "$IP nexthop add id 22 via 172.16.1.2 dev veth1" 755 run_cmd "$IP ro add 172.16.101.1/32 nhid 22 scope host" 756 log_test $? 2 "Route add - scope conflict with nexthop" 757 758 run_cmd "$IP nexthop replace id 22 dev veth3" 759 run_cmd "$IP ro add 172.16.101.1/32 nhid 22 scope host" 760 run_cmd "$IP nexthop replace id 22 via 172.16.2.2 dev veth3" 761 log_test $? 2 "Nexthop replace with invalid scope for existing route" 762 763 # 764 # add route with nexthop and check traffic 765 # 766 run_cmd "$IP nexthop replace id 21 via 172.16.1.2 dev veth1" 767 run_cmd "$IP ro replace 172.16.101.1/32 nhid 21" 768 run_cmd "ip netns exec me ping -c1 -w1 172.16.101.1" 769 log_test $? 0 "Basic ping" 770 771 run_cmd "$IP nexthop replace id 22 via 172.16.2.2 dev veth3" 772 run_cmd "$IP nexthop add id 122 group 21/22" 773 run_cmd "$IP ro replace 172.16.101.1/32 nhid 122" 774 run_cmd "ip netns exec me ping -c1 -w1 172.16.101.1" 775 log_test $? 0 "Ping - multipath" 776 777 run_cmd "$IP ro delete 172.16.101.1/32 nhid 122" 778 779 # 780 # multiple default routes 781 # - tests fib_select_default 782 run_cmd "$IP nexthop add id 501 via 172.16.1.2 dev veth1" 783 run_cmd "$IP ro add default nhid 501" 784 run_cmd "$IP ro add default via 172.16.1.3 dev veth1 metric 20" 785 run_cmd "ip netns exec me ping -c1 -w1 172.16.101.1" 786 log_test $? 0 "Ping - multiple default routes, nh first" 787 788 # flip the order 789 run_cmd "$IP ro del default nhid 501" 790 run_cmd "$IP ro del default via 172.16.1.3 dev veth1 metric 20" 791 run_cmd "$IP ro add default via 172.16.1.2 dev veth1 metric 20" 792 run_cmd "$IP nexthop replace id 501 via 172.16.1.3 dev veth1" 793 run_cmd "$IP ro add default nhid 501 metric 20" 794 run_cmd "ip netns exec me ping -c1 -w1 172.16.101.1" 795 log_test $? 0 "Ping - multiple default routes, nh second" 796 797 run_cmd "$IP nexthop delete nhid 501" 798 run_cmd "$IP ro del default" 799 800 # 801 # IPv4 with blackhole nexthops 802 # 803 run_cmd "$IP nexthop add id 23 blackhole" 804 run_cmd "$IP ro replace 172.16.101.1/32 nhid 23" 805 run_cmd "ip netns exec me ping -c1 -w1 172.16.101.1" 806 log_test $? 2 "Ping - blackhole" 807 808 run_cmd "$IP nexthop replace id 23 via 172.16.1.2 dev veth1" 809 run_cmd "ip netns exec me ping -c1 -w1 172.16.101.1" 810 log_test $? 0 "Ping - blackhole replaced with gateway" 811 812 run_cmd "$IP nexthop replace id 23 blackhole" 813 run_cmd "ip netns exec me ping -c1 -w1 172.16.101.1" 814 log_test $? 2 "Ping - gateway replaced by blackhole" 815 816 run_cmd "$IP ro replace 172.16.101.1/32 nhid 122" 817 run_cmd "ip netns exec me ping -c1 -w1 172.16.101.1" 818 if [ $? -eq 0 ]; then 819 run_cmd "$IP nexthop replace id 122 group 23" 820 run_cmd "ip netns exec me ping -c1 -w1 172.16.101.1" 821 log_test $? 2 "Ping - group with blackhole" 822 823 run_cmd "$IP nexthop replace id 122 group 21/22" 824 run_cmd "ip netns exec me ping -c1 -w1 172.16.101.1" 825 log_test $? 0 "Ping - group blackhole replaced with gateways" 826 else 827 log_test 2 0 "Ping - multipath failed" 828 fi 829 830 # 831 # device only and gw + dev only mix 832 # 833 run_cmd "$IP nexthop add id 85 dev veth1" 834 run_cmd "$IP ro replace 172.16.101.1/32 nhid 85" 835 log_test $? 0 "IPv4 route with device only nexthop" 836 check_route "172.16.101.1" "172.16.101.1 nhid 85 dev veth1" 837 838 run_cmd "$IP nexthop add id 123 group 21/85" 839 run_cmd "$IP ro replace 172.16.101.1/32 nhid 123" 840 log_test $? 0 "IPv4 multipath route with nexthop mix - dev only + gw" 841 check_route "172.16.101.1" "172.16.101.1 nhid 123 nexthop via 172.16.1.2 dev veth1 weight 1 nexthop dev veth1 weight 1" 842 843 # 844 # IPv4 with IPv6 845 # 846 set -e 847 lladdr=$(get_linklocal veth2 peer) 848 run_cmd "$IP nexthop add id 24 via ${lladdr} dev veth1" 849 set +e 850 run_cmd "$IP ro replace 172.16.101.1/32 nhid 24" 851 run_cmd "ip netns exec me ping -c1 -w1 172.16.101.1" 852 log_test $? 0 "IPv6 nexthop with IPv4 route" 853 854 $IP neigh sh | grep -q "${lladdr} dev veth1" 855 if [ $? -eq 1 ]; then 856 echo " WARNING: Neigh entry missing for ${lladdr}" 857 $IP neigh sh | grep 'dev veth1' 858 fi 859 860 $IP neigh sh | grep -q "172.16.101.1 dev eth1" 861 if [ $? -eq 0 ]; then 862 echo " WARNING: Neigh entry exists for 172.16.101.1" 863 $IP neigh sh | grep 'dev veth1' 864 fi 865 866 set -e 867 run_cmd "$IP nexthop add id 25 via 172.16.1.2 dev veth1" 868 run_cmd "$IP nexthop add id 101 group 24/25" 869 set +e 870 run_cmd "$IP ro replace 172.16.101.1/32 nhid 101" 871 log_test $? 0 "IPv4 route with mixed v4-v6 multipath route" 872 873 check_route "172.16.101.1" "172.16.101.1 nhid 101 nexthop via inet6 ${lladdr} dev veth1 weight 1 nexthop via 172.16.1.2 dev veth1 weight 1" 874 875 run_cmd "ip netns exec me ping -c1 -w1 172.16.101.1" 876 log_test $? 0 "IPv6 nexthop with IPv4 route" 877 878 run_cmd "$IP ro replace 172.16.101.1/32 via inet6 ${lladdr} dev veth1" 879 run_cmd "ip netns exec me ping -c1 -w1 172.16.101.1" 880 log_test $? 0 "IPv4 route with IPv6 gateway" 881 882 $IP neigh sh | grep -q "${lladdr} dev veth1" 883 if [ $? -eq 1 ]; then 884 echo " WARNING: Neigh entry missing for ${lladdr}" 885 $IP neigh sh | grep 'dev veth1' 886 fi 887 888 $IP neigh sh | grep -q "172.16.101.1 dev eth1" 889 if [ $? -eq 0 ]; then 890 echo " WARNING: Neigh entry exists for 172.16.101.1" 891 $IP neigh sh | grep 'dev veth1' 892 fi 893 894 run_cmd "$IP ro del 172.16.101.1/32 via inet6 ${lladdr} dev veth1" 895 run_cmd "$IP -4 ro add default via inet6 ${lladdr} dev veth1" 896 run_cmd "ip netns exec me ping -c1 -w1 172.16.101.1" 897 log_test $? 0 "IPv4 default route with IPv6 gateway" 898 899 # 900 # MPLS as an example of LWT encap 901 # 902 run_cmd "$IP nexthop add id 51 encap mpls 101 via 172.16.1.2 dev veth1" 903 log_test $? 0 "IPv4 route with MPLS encap" 904 check_nexthop "id 51" "id 51 encap mpls 101 via 172.16.1.2 dev veth1 scope link" 905 log_test $? 0 "IPv4 route with MPLS encap - check" 906 907 run_cmd "$IP nexthop add id 52 encap mpls 102 via inet6 2001:db8:91::2 dev veth1" 908 log_test $? 0 "IPv4 route with MPLS encap and v6 gateway" 909 check_nexthop "id 52" "id 52 encap mpls 102 via 2001:db8:91::2 dev veth1 scope link" 910 log_test $? 0 "IPv4 route with MPLS encap, v6 gw - check" 911} 912 913sysctl_nexthop_compat_mode_check() 914{ 915 local sysctlname="net.ipv4.nexthop_compat_mode" 916 local lprefix=$1 917 918 IPE="ip netns exec me" 919 920 $IPE sysctl -q $sysctlname 2>&1 >/dev/null 921 if [ $? -ne 0 ]; then 922 echo "SKIP: kernel lacks nexthop compat mode sysctl control" 923 return $ksft_skip 924 fi 925 926 out=$($IPE sysctl $sysctlname 2>/dev/null) 927 log_test $? 0 "$lprefix default nexthop compat mode check" 928 check_output "${out}" "$sysctlname = 1" 929} 930 931sysctl_nexthop_compat_mode_set() 932{ 933 local sysctlname="net.ipv4.nexthop_compat_mode" 934 local mode=$1 935 local lprefix=$2 936 937 IPE="ip netns exec me" 938 939 out=$($IPE sysctl -w $sysctlname=$mode) 940 log_test $? 0 "$lprefix set compat mode - $mode" 941 check_output "${out}" "net.ipv4.nexthop_compat_mode = $mode" 942} 943 944ipv6_compat_mode() 945{ 946 local rc 947 948 echo 949 echo "IPv6 nexthop api compat mode test" 950 echo "--------------------------------" 951 952 sysctl_nexthop_compat_mode_check "IPv6" 953 if [ $? -eq $ksft_skip ]; then 954 return $ksft_skip 955 fi 956 957 run_cmd "$IP nexthop add id 62 via 2001:db8:91::2 dev veth1" 958 run_cmd "$IP nexthop add id 63 via 2001:db8:91::3 dev veth1" 959 run_cmd "$IP nexthop add id 122 group 62/63" 960 ipmout=$(start_ip_monitor route) 961 962 run_cmd "$IP -6 ro add 2001:db8:101::1/128 nhid 122" 963 # route add notification should contain expanded nexthops 964 stop_ip_monitor $ipmout 3 965 log_test $? 0 "IPv6 compat mode on - route add notification" 966 967 # route dump should contain expanded nexthops 968 check_route6 "2001:db8:101::1" "2001:db8:101::1 nhid 122 metric 1024 pref medium nexthop via 2001:db8:91::2 dev veth1 weight 1 nexthop via 2001:db8:91::3 dev veth1 weight 1" 969 log_test $? 0 "IPv6 compat mode on - route dump" 970 971 # change in nexthop group should generate route notification 972 run_cmd "$IP nexthop add id 64 via 2001:db8:91::4 dev veth1" 973 ipmout=$(start_ip_monitor route) 974 run_cmd "$IP nexthop replace id 122 group 62/64" 975 stop_ip_monitor $ipmout 3 976 977 log_test $? 0 "IPv6 compat mode on - nexthop change" 978 979 # set compat mode off 980 sysctl_nexthop_compat_mode_set 0 "IPv6" 981 982 run_cmd "$IP -6 ro del 2001:db8:101::1/128 nhid 122" 983 984 run_cmd "$IP nexthop add id 62 via 2001:db8:91::2 dev veth1" 985 run_cmd "$IP nexthop add id 63 via 2001:db8:91::3 dev veth1" 986 run_cmd "$IP nexthop add id 122 group 62/63" 987 ipmout=$(start_ip_monitor route) 988 989 run_cmd "$IP -6 ro add 2001:db8:101::1/128 nhid 122" 990 # route add notification should not contain expanded nexthops 991 stop_ip_monitor $ipmout 1 992 log_test $? 0 "IPv6 compat mode off - route add notification" 993 994 # route dump should not contain expanded nexthops 995 check_route6 "2001:db8:101::1" "2001:db8:101::1 nhid 122 metric 1024 pref medium" 996 log_test $? 0 "IPv6 compat mode off - route dump" 997 998 # change in nexthop group should not generate route notification 999 run_cmd "$IP nexthop add id 64 via 2001:db8:91::4 dev veth1" 1000 ipmout=$(start_ip_monitor route) 1001 run_cmd "$IP nexthop replace id 122 group 62/64" 1002 stop_ip_monitor $ipmout 0 1003 log_test $? 0 "IPv6 compat mode off - nexthop change" 1004 1005 # nexthop delete should not generate route notification 1006 ipmout=$(start_ip_monitor route) 1007 run_cmd "$IP nexthop del id 122" 1008 stop_ip_monitor $ipmout 0 1009 log_test $? 0 "IPv6 compat mode off - nexthop delete" 1010 1011 # set compat mode back on 1012 sysctl_nexthop_compat_mode_set 1 "IPv6" 1013} 1014 1015ipv4_compat_mode() 1016{ 1017 local rc 1018 1019 echo 1020 echo "IPv4 nexthop api compat mode" 1021 echo "----------------------------" 1022 1023 sysctl_nexthop_compat_mode_check "IPv4" 1024 if [ $? -eq $ksft_skip ]; then 1025 return $ksft_skip 1026 fi 1027 1028 run_cmd "$IP nexthop add id 21 via 172.16.1.2 dev veth1" 1029 run_cmd "$IP nexthop add id 22 via 172.16.1.2 dev veth1" 1030 run_cmd "$IP nexthop add id 122 group 21/22" 1031 ipmout=$(start_ip_monitor route) 1032 1033 run_cmd "$IP ro add 172.16.101.1/32 nhid 122" 1034 stop_ip_monitor $ipmout 3 1035 1036 # route add notification should contain expanded nexthops 1037 log_test $? 0 "IPv4 compat mode on - route add notification" 1038 1039 # route dump should contain expanded nexthops 1040 check_route "172.16.101.1" "172.16.101.1 nhid 122 nexthop via 172.16.1.2 dev veth1 weight 1 nexthop via 172.16.1.2 dev veth1 weight 1" 1041 log_test $? 0 "IPv4 compat mode on - route dump" 1042 1043 # change in nexthop group should generate route notification 1044 run_cmd "$IP nexthop add id 23 via 172.16.1.3 dev veth1" 1045 ipmout=$(start_ip_monitor route) 1046 run_cmd "$IP nexthop replace id 122 group 21/23" 1047 stop_ip_monitor $ipmout 3 1048 log_test $? 0 "IPv4 compat mode on - nexthop change" 1049 1050 sysctl_nexthop_compat_mode_set 0 "IPv4" 1051 1052 # cleanup 1053 run_cmd "$IP ro del 172.16.101.1/32 nhid 122" 1054 1055 ipmout=$(start_ip_monitor route) 1056 run_cmd "$IP ro add 172.16.101.1/32 nhid 122" 1057 stop_ip_monitor $ipmout 1 1058 # route add notification should not contain expanded nexthops 1059 log_test $? 0 "IPv4 compat mode off - route add notification" 1060 1061 # route dump should not contain expanded nexthops 1062 check_route "172.16.101.1" "172.16.101.1 nhid 122" 1063 log_test $? 0 "IPv4 compat mode off - route dump" 1064 1065 # change in nexthop group should not generate route notification 1066 ipmout=$(start_ip_monitor route) 1067 run_cmd "$IP nexthop replace id 122 group 21/22" 1068 stop_ip_monitor $ipmout 0 1069 log_test $? 0 "IPv4 compat mode off - nexthop change" 1070 1071 # nexthop delete should not generate route notification 1072 ipmout=$(start_ip_monitor route) 1073 run_cmd "$IP nexthop del id 122" 1074 stop_ip_monitor $ipmout 0 1075 log_test $? 0 "IPv4 compat mode off - nexthop delete" 1076 1077 sysctl_nexthop_compat_mode_set 1 "IPv4" 1078} 1079 1080basic() 1081{ 1082 echo 1083 echo "Basic functional tests" 1084 echo "----------------------" 1085 run_cmd "$IP nexthop ls" 1086 log_test $? 0 "List with nothing defined" 1087 1088 run_cmd "$IP nexthop get id 1" 1089 log_test $? 2 "Nexthop get on non-existent id" 1090 1091 # attempt to create nh without a device or gw - fails 1092 run_cmd "$IP nexthop add id 1" 1093 log_test $? 2 "Nexthop with no device or gateway" 1094 1095 # attempt to create nh with down device - fails 1096 $IP li set veth1 down 1097 run_cmd "$IP nexthop add id 1 dev veth1" 1098 log_test $? 2 "Nexthop with down device" 1099 1100 # create nh with linkdown device - fails 1101 $IP li set veth1 up 1102 ip -netns peer li set veth2 down 1103 run_cmd "$IP nexthop add id 1 dev veth1" 1104 log_test $? 2 "Nexthop with device that is linkdown" 1105 ip -netns peer li set veth2 up 1106 1107 # device only 1108 run_cmd "$IP nexthop add id 1 dev veth1" 1109 log_test $? 0 "Nexthop with device only" 1110 1111 # create nh with duplicate id 1112 run_cmd "$IP nexthop add id 1 dev veth3" 1113 log_test $? 2 "Nexthop with duplicate id" 1114 1115 # blackhole nexthop 1116 run_cmd "$IP nexthop add id 2 blackhole" 1117 log_test $? 0 "Blackhole nexthop" 1118 1119 # blackhole nexthop can not have other specs 1120 run_cmd "$IP nexthop replace id 2 blackhole dev veth1" 1121 log_test $? 2 "Blackhole nexthop with other attributes" 1122 1123 # 1124 # groups 1125 # 1126 1127 run_cmd "$IP nexthop add id 101 group 1" 1128 log_test $? 0 "Create group" 1129 1130 run_cmd "$IP nexthop add id 102 group 2" 1131 log_test $? 0 "Create group with blackhole nexthop" 1132 1133 # multipath group can not have a blackhole as 1 path 1134 run_cmd "$IP nexthop add id 103 group 1/2" 1135 log_test $? 2 "Create multipath group where 1 path is a blackhole" 1136 1137 # multipath group can not have a member replaced by a blackhole 1138 run_cmd "$IP nexthop replace id 2 dev veth3" 1139 run_cmd "$IP nexthop replace id 102 group 1/2" 1140 run_cmd "$IP nexthop replace id 2 blackhole" 1141 log_test $? 2 "Multipath group can not have a member replaced by blackhole" 1142 1143 # attempt to create group with non-existent nexthop 1144 run_cmd "$IP nexthop add id 103 group 12" 1145 log_test $? 2 "Create group with non-existent nexthop" 1146 1147 # attempt to create group with same nexthop 1148 run_cmd "$IP nexthop add id 103 group 1/1" 1149 log_test $? 2 "Create group with same nexthop multiple times" 1150 1151 # replace nexthop with a group - fails 1152 run_cmd "$IP nexthop replace id 2 group 1" 1153 log_test $? 2 "Replace nexthop with nexthop group" 1154 1155 # replace nexthop group with a nexthop - fails 1156 run_cmd "$IP nexthop replace id 101 dev veth1" 1157 log_test $? 2 "Replace nexthop group with nexthop" 1158 1159 # nexthop group with other attributes fail 1160 run_cmd "$IP nexthop add id 104 group 1 dev veth1" 1161 log_test $? 2 "Nexthop group and device" 1162 1163 # Tests to ensure that flushing works as expected. 1164 run_cmd "$IP nexthop add id 105 blackhole proto 99" 1165 run_cmd "$IP nexthop add id 106 blackhole proto 100" 1166 run_cmd "$IP nexthop add id 107 blackhole proto 99" 1167 run_cmd "$IP nexthop flush proto 99" 1168 check_nexthop "id 105" "" 1169 check_nexthop "id 106" "id 106 blackhole proto 100" 1170 check_nexthop "id 107" "" 1171 run_cmd "$IP nexthop flush proto 100" 1172 check_nexthop "id 106" "" 1173 1174 run_cmd "$IP nexthop flush proto 100" 1175 log_test $? 0 "Test proto flush" 1176 1177 run_cmd "$IP nexthop add id 104 group 1 blackhole" 1178 log_test $? 2 "Nexthop group and blackhole" 1179 1180 $IP nexthop flush >/dev/null 2>&1 1181} 1182 1183################################################################################ 1184# usage 1185 1186usage() 1187{ 1188 cat <<EOF 1189usage: ${0##*/} OPTS 1190 1191 -t <test> Test(s) to run (default: all) 1192 (options: $ALL_TESTS) 1193 -4 IPv4 tests only 1194 -6 IPv6 tests only 1195 -p Pause on fail 1196 -P Pause after each test before cleanup 1197 -v verbose mode (show commands and output) 1198 1199 Runtime test 1200 -n num Number of nexthops to target 1201 -N Use new style to install routes in DUT 1202 1203done 1204EOF 1205} 1206 1207################################################################################ 1208# main 1209 1210while getopts :t:pP46hv o 1211do 1212 case $o in 1213 t) TESTS=$OPTARG;; 1214 4) TESTS=${IPV4_TESTS};; 1215 6) TESTS=${IPV6_TESTS};; 1216 p) PAUSE_ON_FAIL=yes;; 1217 P) PAUSE=yes;; 1218 v) VERBOSE=$(($VERBOSE + 1));; 1219 h) usage; exit 0;; 1220 *) usage; exit 1;; 1221 esac 1222done 1223 1224# make sure we don't pause twice 1225[ "${PAUSE}" = "yes" ] && PAUSE_ON_FAIL=no 1226 1227if [ "$(id -u)" -ne 0 ];then 1228 echo "SKIP: Need root privileges" 1229 exit $ksft_skip; 1230fi 1231 1232if [ ! -x "$(command -v ip)" ]; then 1233 echo "SKIP: Could not run test without ip tool" 1234 exit $ksft_skip 1235fi 1236 1237ip help 2>&1 | grep -q nexthop 1238if [ $? -ne 0 ]; then 1239 echo "SKIP: iproute2 too old, missing nexthop command" 1240 exit $ksft_skip 1241fi 1242 1243out=$(ip nexthop ls 2>&1 | grep -q "Operation not supported") 1244if [ $? -eq 0 ]; then 1245 echo "SKIP: kernel lacks nexthop support" 1246 exit $ksft_skip 1247fi 1248 1249for t in $TESTS 1250do 1251 case $t in 1252 none) IP="ip -netns peer"; setup; exit 0;; 1253 *) setup; $t; cleanup;; 1254 esac 1255done 1256 1257if [ "$TESTS" != "none" ]; then 1258 printf "\nTests passed: %3d\n" ${nsuccess} 1259 printf "Tests failed: %3d\n" ${nfail} 1260fi 1261 1262exit $ret 1263