2534 lines · bash
1#!/bin/bash2# SPDX-License-Identifier: GPL-2.03#4# ns: me | ns: peer | ns: remote5# 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.19# veth3 <---|---> veth4 | 2001:db8:101::110# 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 nexthop14# objects. Device reference counts and network namespace cleanup tested15# by use of network namespace for peer.16 17source lib.sh18ret=019# Kselftest framework requirement - SKIP code is 4.20ksft_skip=421 22# all tests in this script. Can be overridden with -t option23IPV4_TESTS="24 ipv4_fcnal25 ipv4_grp_fcnal26 ipv4_res_grp_fcnal27 ipv4_withv6_fcnal28 ipv4_fcnal_runtime29 ipv4_large_grp30 ipv4_large_res_grp31 ipv4_compat_mode32 ipv4_fdb_grp_fcnal33 ipv4_mpath_select34 ipv4_torture35 ipv4_res_torture36"37 38IPV6_TESTS="39 ipv6_fcnal40 ipv6_grp_fcnal41 ipv6_res_grp_fcnal42 ipv6_fcnal_runtime43 ipv6_large_grp44 ipv6_large_res_grp45 ipv6_compat_mode46 ipv6_fdb_grp_fcnal47 ipv6_mpath_select48 ipv6_torture49 ipv6_res_torture50"51 52ALL_TESTS="53 basic54 basic_res55 ${IPV4_TESTS}56 ${IPV6_TESTS}57"58TESTS="${ALL_TESTS}"59VERBOSE=060PAUSE_ON_FAIL=no61PAUSE=no62PING_TIMEOUT=563 64nsid=10065 66################################################################################67# utilities68 69log_test()70{71 local rc=$172 local expected=$273 local msg="$3"74 75 if [ ${rc} -eq ${expected} ]; then76 printf "TEST: %-60s [ OK ]\n" "${msg}"77 nsuccess=$((nsuccess+1))78 else79 ret=180 nfail=$((nfail+1))81 if [[ $rc -eq $ksft_skip ]]; then82 printf "TEST: %-60s [SKIP]\n" "${msg}"83 else84 printf "TEST: %-60s [FAIL]\n" "${msg}"85 fi86 87 if [ "$VERBOSE" = "1" ]; then88 echo " rc=$rc, expected $expected"89 fi90 91 if [ "${PAUSE_ON_FAIL}" = "yes" ]; then92 echo93 echo "hit enter to continue, 'q' to quit"94 read a95 [ "$a" = "q" ] && exit 196 fi97 fi98 99 if [ "${PAUSE}" = "yes" ]; then100 echo101 echo "hit enter to continue, 'q' to quit"102 read a103 [ "$a" = "q" ] && exit 1104 fi105 106 [ "$VERBOSE" = "1" ] && echo107}108 109run_cmd()110{111 local cmd="$1"112 local out113 local stderr="2>/dev/null"114 115 if [ "$VERBOSE" = "1" ]; then116 printf "COMMAND: $cmd\n"117 stderr=118 fi119 120 out=$(eval $cmd $stderr)121 rc=$?122 if [ "$VERBOSE" = "1" -a -n "$out" ]; then123 echo " $out"124 fi125 126 return $rc127}128 129get_linklocal()130{131 local dev=$1132 local ns133 local addr134 135 [ -n "$2" ] && ns="-netns $2"136 addr=$(ip $ns -6 -br addr show dev ${dev} | \137 awk '{138 for (i = 3; i <= NF; ++i) {139 if ($i ~ /^fe80/)140 print $i141 }142 }'143 )144 addr=${addr/\/*}145 146 [ -z "$addr" ] && return 1147 148 echo $addr149 150 return 0151}152 153create_ns()154{155 local n=${1}156 157 set -e158 159 ip netns exec ${n} sysctl -qw net.ipv4.ip_forward=1160 ip netns exec ${n} sysctl -qw net.ipv4.fib_multipath_use_neigh=1161 ip netns exec ${n} sysctl -qw net.ipv4.conf.default.ignore_routes_with_linkdown=1162 ip netns exec ${n} sysctl -qw net.ipv6.conf.all.keep_addr_on_down=1163 ip netns exec ${n} sysctl -qw net.ipv6.conf.all.forwarding=1164 ip netns exec ${n} sysctl -qw net.ipv6.conf.default.forwarding=1165 ip netns exec ${n} sysctl -qw net.ipv6.conf.default.ignore_routes_with_linkdown=1166 ip netns exec ${n} sysctl -qw net.ipv6.conf.all.accept_dad=0167 ip netns exec ${n} sysctl -qw net.ipv6.conf.default.accept_dad=0168 169 set +e170}171 172setup()173{174 cleanup175 176 setup_ns me peer remote177 create_ns $me178 create_ns $peer179 create_ns $remote180 181 IP="ip -netns $me"182 BRIDGE="bridge -netns $me"183 set -e184 $IP li add veth1 type veth peer name veth2185 $IP li set veth1 up186 $IP addr add 172.16.1.1/24 dev veth1187 $IP -6 addr add 2001:db8:91::1/64 dev veth1 nodad188 189 $IP li add veth3 type veth peer name veth4190 $IP li set veth3 up191 $IP addr add 172.16.2.1/24 dev veth3192 $IP -6 addr add 2001:db8:92::1/64 dev veth3 nodad193 194 $IP li set veth2 netns $peer up195 ip -netns $peer addr add 172.16.1.2/24 dev veth2196 ip -netns $peer -6 addr add 2001:db8:91::2/64 dev veth2 nodad197 198 $IP li set veth4 netns $peer up199 ip -netns $peer addr add 172.16.2.2/24 dev veth4200 ip -netns $peer -6 addr add 2001:db8:92::2/64 dev veth4 nodad201 202 ip -netns $remote li add veth5 type veth peer name veth6203 ip -netns $remote li set veth5 up204 ip -netns $remote addr add dev veth5 172.16.101.1/24205 ip -netns $remote -6 addr add dev veth5 2001:db8:101::1/64 nodad206 ip -netns $remote ro add 172.16.0.0/22 via 172.16.101.2207 ip -netns $remote -6 ro add 2001:db8:90::/40 via 2001:db8:101::2208 209 ip -netns $remote li set veth6 netns $peer up210 ip -netns $peer addr add dev veth6 172.16.101.2/24211 ip -netns $peer -6 addr add dev veth6 2001:db8:101::2/64 nodad212 set +e213}214 215cleanup()216{217 local ns218 219 for ns in $me $peer $remote; do220 ip netns del ${ns} 2>/dev/null221 done222}223 224check_output()225{226 local out="$1"227 local expected="$2"228 local rc=0229 230 [ "${out}" = "${expected}" ] && return 0231 232 if [ -z "${out}" ]; then233 if [ "$VERBOSE" = "1" ]; then234 printf "\nNo entry found\n"235 printf "Expected:\n"236 printf " ${expected}\n"237 fi238 return 1239 fi240 241 out=$(echo ${out})242 if [ "${out}" != "${expected}" ]; then243 rc=1244 if [ "${VERBOSE}" = "1" ]; then245 printf " Unexpected entry. Have:\n"246 printf " ${out}\n"247 printf " Expected:\n"248 printf " ${expected}\n\n"249 else250 echo " WARNING: Unexpected route entry"251 fi252 fi253 254 return $rc255}256 257check_nexthop()258{259 local nharg="$1"260 local expected="$2"261 local out262 263 out=$($IP nexthop ls ${nharg} 2>/dev/null)264 265 check_output "${out}" "${expected}"266}267 268check_nexthop_bucket()269{270 local nharg="$1"271 local expected="$2"272 local out273 274 # remove the idle time since we cannot match it275 out=$($IP nexthop bucket ${nharg} \276 | sed s/idle_time\ [0-9.]*\ // 2>/dev/null)277 278 check_output "${out}" "${expected}"279}280 281check_route()282{283 local pfx="$1"284 local expected="$2"285 local out286 287 out=$($IP route ls match ${pfx} 2>/dev/null)288 289 check_output "${out}" "${expected}"290}291 292check_route6()293{294 local pfx="$1"295 local expected="$2"296 local out297 298 out=$($IP -6 route ls match ${pfx} 2>/dev/null | sed -e 's/pref medium//')299 300 check_output "${out}" "${expected}"301}302 303check_large_grp()304{305 local ipv=$1306 local ecmp=$2307 local grpnum=100308 local nhidstart=100309 local grpidstart=1000310 local iter=0311 local nhidstr=""312 local grpidstr=""313 local grpstr=""314 local ipstr=""315 316 if [ $ipv -eq 4 ]; then317 ipstr="172.16.1."318 else319 ipstr="2001:db8:91::"320 fi321 322 #323 # Create $grpnum groups with specified $ecmp and dump them324 #325 326 # create nexthops with different gateways327 iter=2328 while [ $iter -le $(($ecmp + 1)) ]329 do330 nhidstr="$(($nhidstart + $iter))"331 run_cmd "$IP nexthop add id $nhidstr via $ipstr$iter dev veth1"332 check_nexthop "id $nhidstr" "id $nhidstr via $ipstr$iter dev veth1 scope link"333 334 if [ $iter -le $ecmp ]; then335 grpstr+="$nhidstr/"336 else337 grpstr+="$nhidstr"338 fi339 ((iter++))340 done341 342 # create duplicate large ecmp groups343 iter=0344 while [ $iter -le $grpnum ]345 do346 grpidstr="$(($grpidstart + $iter))"347 run_cmd "$IP nexthop add id $grpidstr group $grpstr"348 check_nexthop "id $grpidstr" "id $grpidstr group $grpstr"349 ((iter++))350 done351 352 # dump large groups353 run_cmd "$IP nexthop list"354 log_test $? 0 "Dump large (x$ecmp) ecmp groups"355}356 357check_large_res_grp()358{359 local ipv=$1360 local buckets=$2361 local ipstr=""362 363 if [ $ipv -eq 4 ]; then364 ipstr="172.16.1.2"365 else366 ipstr="2001:db8:91::2"367 fi368 369 # create a resilient group with $buckets buckets and dump them370 run_cmd "$IP nexthop add id 100 via $ipstr dev veth1"371 run_cmd "$IP nexthop add id 1000 group 100 type resilient buckets $buckets"372 run_cmd "$IP nexthop bucket list"373 log_test $? 0 "Dump large (x$buckets) nexthop buckets"374}375 376get_route_dev()377{378 local pfx="$1"379 local out380 381 if out=$($IP -j route get "$pfx" | jq -re ".[0].dev"); then382 echo "$out"383 fi384}385 386check_route_dev()387{388 local pfx="$1"389 local expected="$2"390 local out391 392 out=$(get_route_dev "$pfx")393 394 check_output "$out" "$expected"395}396 397start_ip_monitor()398{399 local mtype=$1400 401 # start the monitor in the background402 tmpfile=`mktemp /var/run/nexthoptestXXX`403 mpid=`($IP monitor $mtype > $tmpfile & echo $!) 2>/dev/null`404 sleep 0.2405 echo "$mpid $tmpfile"406}407 408stop_ip_monitor()409{410 local mpid=$1411 local tmpfile=$2412 local el=$3413 414 # check the monitor results415 kill $mpid416 lines=`wc -l $tmpfile | cut "-d " -f1`417 test $lines -eq $el418 rc=$?419 rm -rf $tmpfile420 421 return $rc422}423 424check_nexthop_fdb_support()425{426 $IP nexthop help 2>&1 | grep -q fdb427 if [ $? -ne 0 ]; then428 echo "SKIP: iproute2 too old, missing fdb nexthop support"429 return $ksft_skip430 fi431}432 433check_nexthop_res_support()434{435 $IP nexthop help 2>&1 | grep -q resilient436 if [ $? -ne 0 ]; then437 echo "SKIP: iproute2 too old, missing resilient nexthop group support"438 return $ksft_skip439 fi440}441 442ipv6_fdb_grp_fcnal()443{444 local rc445 446 echo447 echo "IPv6 fdb groups functional"448 echo "--------------------------"449 450 check_nexthop_fdb_support451 if [ $? -eq $ksft_skip ]; then452 return $ksft_skip453 fi454 455 # create group with multiple nexthops456 run_cmd "$IP nexthop add id 61 via 2001:db8:91::2 fdb"457 run_cmd "$IP nexthop add id 62 via 2001:db8:91::3 fdb"458 run_cmd "$IP nexthop add id 102 group 61/62 fdb"459 check_nexthop "id 102" "id 102 group 61/62 fdb"460 log_test $? 0 "Fdb Nexthop group with multiple nexthops"461 462 ## get nexthop group463 run_cmd "$IP nexthop get id 102"464 check_nexthop "id 102" "id 102 group 61/62 fdb"465 log_test $? 0 "Get Fdb nexthop group by id"466 467 # fdb nexthop group can only contain fdb nexthops468 run_cmd "$IP nexthop add id 63 via 2001:db8:91::4"469 run_cmd "$IP nexthop add id 64 via 2001:db8:91::5"470 run_cmd "$IP nexthop add id 103 group 63/64 fdb"471 log_test $? 2 "Fdb Nexthop group with non-fdb nexthops"472 473 # Non fdb nexthop group can not contain fdb nexthops474 run_cmd "$IP nexthop add id 65 via 2001:db8:91::5 fdb"475 run_cmd "$IP nexthop add id 66 via 2001:db8:91::6 fdb"476 run_cmd "$IP nexthop add id 104 group 65/66"477 log_test $? 2 "Non-Fdb Nexthop group with fdb nexthops"478 479 # fdb nexthop cannot have blackhole480 run_cmd "$IP nexthop add id 67 blackhole fdb"481 log_test $? 2 "Fdb Nexthop with blackhole"482 483 # fdb nexthop with oif484 run_cmd "$IP nexthop add id 68 via 2001:db8:91::7 dev veth1 fdb"485 log_test $? 2 "Fdb Nexthop with oif"486 487 # fdb nexthop with onlink488 run_cmd "$IP nexthop add id 68 via 2001:db8:91::7 onlink fdb"489 log_test $? 2 "Fdb Nexthop with onlink"490 491 # fdb nexthop with encap492 run_cmd "$IP nexthop add id 69 encap mpls 101 via 2001:db8:91::8 dev veth1 fdb"493 log_test $? 2 "Fdb Nexthop with encap"494 495 run_cmd "$IP link add name vx10 type vxlan id 1010 local 2001:db8:91::9 remote 2001:db8:91::10 dstport 4789 nolearning noudpcsum tos inherit ttl 100"496 run_cmd "$BRIDGE fdb add 02:02:00:00:00:13 dev vx10 nhid 102 self"497 log_test $? 0 "Fdb mac add with nexthop group"498 499 ## fdb nexthops can only reference nexthop groups and not nexthops500 run_cmd "$BRIDGE fdb add 02:02:00:00:00:14 dev vx10 nhid 61 self"501 log_test $? 255 "Fdb mac add with nexthop"502 503 run_cmd "$IP -6 ro add 2001:db8:101::1/128 nhid 66"504 log_test $? 2 "Route add with fdb nexthop"505 506 run_cmd "$IP -6 ro add 2001:db8:101::1/128 nhid 103"507 log_test $? 2 "Route add with fdb nexthop group"508 509 run_cmd "$IP nexthop del id 61"510 run_cmd "$BRIDGE fdb get to 02:02:00:00:00:13 dev vx10 self"511 log_test $? 0 "Fdb entry after deleting a single nexthop"512 513 run_cmd "$IP nexthop del id 102"514 log_test $? 0 "Fdb nexthop delete"515 516 run_cmd "$BRIDGE fdb get to 02:02:00:00:00:13 dev vx10 self"517 log_test $? 254 "Fdb entry after deleting a nexthop group"518 519 $IP link del dev vx10520}521 522ipv4_fdb_grp_fcnal()523{524 local rc525 526 echo527 echo "IPv4 fdb groups functional"528 echo "--------------------------"529 530 check_nexthop_fdb_support531 if [ $? -eq $ksft_skip ]; then532 return $ksft_skip533 fi534 535 # create group with multiple nexthops536 run_cmd "$IP nexthop add id 12 via 172.16.1.2 fdb"537 run_cmd "$IP nexthop add id 13 via 172.16.1.3 fdb"538 run_cmd "$IP nexthop add id 102 group 12/13 fdb"539 check_nexthop "id 102" "id 102 group 12/13 fdb"540 log_test $? 0 "Fdb Nexthop group with multiple nexthops"541 542 # get nexthop group543 run_cmd "$IP nexthop get id 102"544 check_nexthop "id 102" "id 102 group 12/13 fdb"545 log_test $? 0 "Get Fdb nexthop group by id"546 547 # fdb nexthop group can only contain fdb nexthops548 run_cmd "$IP nexthop add id 14 via 172.16.1.2"549 run_cmd "$IP nexthop add id 15 via 172.16.1.3"550 run_cmd "$IP nexthop add id 103 group 14/15 fdb"551 log_test $? 2 "Fdb Nexthop group with non-fdb nexthops"552 553 # Non fdb nexthop group can not contain fdb nexthops554 run_cmd "$IP nexthop add id 16 via 172.16.1.2 fdb"555 run_cmd "$IP nexthop add id 17 via 172.16.1.3 fdb"556 run_cmd "$IP nexthop add id 104 group 14/15"557 log_test $? 2 "Non-Fdb Nexthop group with fdb nexthops"558 559 # fdb nexthop cannot have blackhole560 run_cmd "$IP nexthop add id 18 blackhole fdb"561 log_test $? 2 "Fdb Nexthop with blackhole"562 563 # fdb nexthop with oif564 run_cmd "$IP nexthop add id 16 via 172.16.1.2 dev veth1 fdb"565 log_test $? 2 "Fdb Nexthop with oif"566 567 # fdb nexthop with onlink568 run_cmd "$IP nexthop add id 16 via 172.16.1.2 onlink fdb"569 log_test $? 2 "Fdb Nexthop with onlink"570 571 # fdb nexthop with encap572 run_cmd "$IP nexthop add id 17 encap mpls 101 via 172.16.1.2 dev veth1 fdb"573 log_test $? 2 "Fdb Nexthop with encap"574 575 run_cmd "$IP link add name vx10 type vxlan id 1010 local 10.0.0.1 remote 10.0.0.2 dstport 4789 nolearning noudpcsum tos inherit ttl 100"576 run_cmd "$BRIDGE fdb add 02:02:00:00:00:13 dev vx10 nhid 102 self"577 log_test $? 0 "Fdb mac add with nexthop group"578 579 # fdb nexthops can only reference nexthop groups and not nexthops580 run_cmd "$BRIDGE fdb add 02:02:00:00:00:14 dev vx10 nhid 12 self"581 log_test $? 255 "Fdb mac add with nexthop"582 583 run_cmd "$IP ro add 172.16.0.0/22 nhid 15"584 log_test $? 2 "Route add with fdb nexthop"585 586 run_cmd "$IP ro add 172.16.0.0/22 nhid 103"587 log_test $? 2 "Route add with fdb nexthop group"588 589 run_cmd "$IP nexthop del id 12"590 run_cmd "$BRIDGE fdb get to 02:02:00:00:00:13 dev vx10 self"591 log_test $? 0 "Fdb entry after deleting a single nexthop"592 593 run_cmd "$IP nexthop del id 102"594 log_test $? 0 "Fdb nexthop delete"595 596 run_cmd "$BRIDGE fdb get to 02:02:00:00:00:13 dev vx10 self"597 log_test $? 254 "Fdb entry after deleting a nexthop group"598 599 $IP link del dev vx10600}601 602ipv4_mpath_select()603{604 local rc dev match h addr605 606 echo607 echo "IPv4 multipath selection"608 echo "------------------------"609 if [ ! -x "$(command -v jq)" ]; then610 echo "SKIP: Could not run test; need jq tool"611 return $ksft_skip612 fi613 614 # Use status of existing neighbor entry when determining nexthop for615 # multipath routes.616 local -A gws617 gws=([veth1]=172.16.1.2 [veth3]=172.16.2.2)618 local -A other_dev619 other_dev=([veth1]=veth3 [veth3]=veth1)620 621 run_cmd "$IP nexthop add id 1 via ${gws["veth1"]} dev veth1"622 run_cmd "$IP nexthop add id 2 via ${gws["veth3"]} dev veth3"623 run_cmd "$IP nexthop add id 1001 group 1/2"624 run_cmd "$IP ro add 172.16.101.0/24 nhid 1001"625 rc=0626 for dev in veth1 veth3; do627 match=0628 for h in {1..254}; do629 addr="172.16.101.$h"630 if [ "$(get_route_dev "$addr")" = "$dev" ]; then631 match=1632 break633 fi634 done635 if (( match == 0 )); then636 echo "SKIP: Did not find a route using device $dev"637 return $ksft_skip638 fi639 run_cmd "$IP neigh add ${gws[$dev]} dev $dev nud failed"640 if ! check_route_dev "$addr" "${other_dev[$dev]}"; then641 rc=1642 break643 fi644 run_cmd "$IP neigh del ${gws[$dev]} dev $dev"645 done646 log_test $rc 0 "Use valid neighbor during multipath selection"647 648 run_cmd "$IP neigh add 172.16.1.2 dev veth1 nud incomplete"649 run_cmd "$IP neigh add 172.16.2.2 dev veth3 nud incomplete"650 run_cmd "$IP route get 172.16.101.1"651 # if we did not crash, success652 log_test $rc 0 "Multipath selection with no valid neighbor"653}654 655ipv6_mpath_select()656{657 local rc dev match h addr658 659 echo660 echo "IPv6 multipath selection"661 echo "------------------------"662 if [ ! -x "$(command -v jq)" ]; then663 echo "SKIP: Could not run test; need jq tool"664 return $ksft_skip665 fi666 667 # Use status of existing neighbor entry when determining nexthop for668 # multipath routes.669 local -A gws670 gws=([veth1]=2001:db8:91::2 [veth3]=2001:db8:92::2)671 local -A other_dev672 other_dev=([veth1]=veth3 [veth3]=veth1)673 674 run_cmd "$IP nexthop add id 1 via ${gws["veth1"]} dev veth1"675 run_cmd "$IP nexthop add id 2 via ${gws["veth3"]} dev veth3"676 run_cmd "$IP nexthop add id 1001 group 1/2"677 run_cmd "$IP ro add 2001:db8:101::/64 nhid 1001"678 rc=0679 for dev in veth1 veth3; do680 match=0681 for h in {1..65535}; do682 addr=$(printf "2001:db8:101::%x" $h)683 if [ "$(get_route_dev "$addr")" = "$dev" ]; then684 match=1685 break686 fi687 done688 if (( match == 0 )); then689 echo "SKIP: Did not find a route using device $dev"690 return $ksft_skip691 fi692 run_cmd "$IP neigh add ${gws[$dev]} dev $dev nud failed"693 if ! check_route_dev "$addr" "${other_dev[$dev]}"; then694 rc=1695 break696 fi697 run_cmd "$IP neigh del ${gws[$dev]} dev $dev"698 done699 log_test $rc 0 "Use valid neighbor during multipath selection"700 701 run_cmd "$IP neigh add 2001:db8:91::2 dev veth1 nud incomplete"702 run_cmd "$IP neigh add 2001:db8:92::2 dev veth3 nud incomplete"703 run_cmd "$IP route get 2001:db8:101::1"704 # if we did not crash, success705 log_test $rc 0 "Multipath selection with no valid neighbor"706}707 708################################################################################709# basic operations (add, delete, replace) on nexthops and nexthop groups710#711# IPv6712 713ipv6_fcnal()714{715 local rc716 717 echo718 echo "IPv6"719 echo "----------------------"720 721 run_cmd "$IP nexthop add id 52 via 2001:db8:91::2 dev veth1"722 rc=$?723 log_test $rc 0 "Create nexthop with id, gw, dev"724 if [ $rc -ne 0 ]; then725 echo "Basic IPv6 create fails; can not continue"726 return 1727 fi728 729 run_cmd "$IP nexthop get id 52"730 log_test $? 0 "Get nexthop by id"731 check_nexthop "id 52" "id 52 via 2001:db8:91::2 dev veth1 scope link"732 733 run_cmd "$IP nexthop del id 52"734 log_test $? 0 "Delete nexthop by id"735 check_nexthop "id 52" ""736 737 #738 # gw, device spec739 #740 # gw validation, no device - fails since dev required741 run_cmd "$IP nexthop add id 52 via 2001:db8:92::3"742 log_test $? 2 "Create nexthop - gw only"743 744 # gw is not reachable throught given dev745 run_cmd "$IP nexthop add id 53 via 2001:db8:3::3 dev veth1"746 log_test $? 2 "Create nexthop - invalid gw+dev combination"747 748 # onlink arg overrides gw+dev lookup749 run_cmd "$IP nexthop add id 53 via 2001:db8:3::3 dev veth1 onlink"750 log_test $? 0 "Create nexthop - gw+dev and onlink"751 752 # admin down should delete nexthops753 set -e754 run_cmd "$IP -6 nexthop add id 55 via 2001:db8:91::3 dev veth1"755 run_cmd "$IP nexthop add id 56 via 2001:db8:91::4 dev veth1"756 run_cmd "$IP nexthop add id 57 via 2001:db8:91::5 dev veth1"757 run_cmd "$IP li set dev veth1 down"758 set +e759 check_nexthop "dev veth1" ""760 log_test $? 0 "Nexthops removed on admin down"761}762 763ipv6_grp_refs()764{765 if [ ! -x "$(command -v mausezahn)" ]; then766 echo "SKIP: Could not run test; need mausezahn tool"767 return768 fi769 770 run_cmd "$IP link set dev veth1 up"771 run_cmd "$IP link add veth1.10 link veth1 up type vlan id 10"772 run_cmd "$IP link add veth1.20 link veth1 up type vlan id 20"773 run_cmd "$IP -6 addr add 2001:db8:91::1/64 dev veth1.10"774 run_cmd "$IP -6 addr add 2001:db8:92::1/64 dev veth1.20"775 run_cmd "$IP -6 neigh add 2001:db8:91::2 lladdr 00:11:22:33:44:55 dev veth1.10"776 run_cmd "$IP -6 neigh add 2001:db8:92::2 lladdr 00:11:22:33:44:55 dev veth1.20"777 run_cmd "$IP nexthop add id 100 via 2001:db8:91::2 dev veth1.10"778 run_cmd "$IP nexthop add id 101 via 2001:db8:92::2 dev veth1.20"779 run_cmd "$IP nexthop add id 102 group 100"780 run_cmd "$IP route add 2001:db8:101::1/128 nhid 102"781 782 # create per-cpu dsts through nh 100783 run_cmd "ip netns exec $me mausezahn -6 veth1.10 -B 2001:db8:101::1 -A 2001:db8:91::1 -c 5 -t tcp "dp=1-1023, flags=syn" >/dev/null 2>&1"784 785 # remove nh 100 from the group to delete the route potentially leaving786 # a stale per-cpu dst which holds a reference to the nexthop's net787 # device and to the IPv6 route788 run_cmd "$IP nexthop replace id 102 group 101"789 run_cmd "$IP route del 2001:db8:101::1/128"790 791 # add both nexthops to the group so a reference is taken on them792 run_cmd "$IP nexthop replace id 102 group 100/101"793 794 # if the bug described in commit "net: nexthop: release IPv6 per-cpu795 # dsts when replacing a nexthop group" exists at this point we have796 # an unlinked IPv6 route (but not freed due to stale dst) with a797 # reference over the group so we delete the group which will again798 # only unlink it due to the route reference799 run_cmd "$IP nexthop del id 102"800 801 # delete the nexthop with stale dst, since we have an unlinked802 # group with a ref to it and an unlinked IPv6 route with ref to the803 # group, the nh will only be unlinked and not freed so the stale dst804 # remains forever and we get a net device refcount imbalance805 run_cmd "$IP nexthop del id 100"806 807 # if a reference was lost this command will hang because the net device808 # cannot be removed809 timeout -s KILL 5 ip netns exec $me ip link del veth1.10 >/dev/null 2>&1810 811 # we can't cleanup if the command is hung trying to delete the netdev812 if [ $? -eq 137 ]; then813 return 1814 fi815 816 # cleanup817 run_cmd "$IP link del veth1.20"818 run_cmd "$IP nexthop flush"819 820 return 0821}822 823ipv6_grp_fcnal()824{825 local rc826 827 echo828 echo "IPv6 groups functional"829 echo "----------------------"830 831 # basic functionality: create a nexthop group, default weight832 run_cmd "$IP nexthop add id 61 via 2001:db8:91::2 dev veth1"833 run_cmd "$IP nexthop add id 101 group 61"834 log_test $? 0 "Create nexthop group with single nexthop"835 836 # get nexthop group837 run_cmd "$IP nexthop get id 101"838 log_test $? 0 "Get nexthop group by id"839 check_nexthop "id 101" "id 101 group 61"840 841 # delete nexthop group842 run_cmd "$IP nexthop del id 101"843 log_test $? 0 "Delete nexthop group by id"844 check_nexthop "id 101" ""845 846 $IP nexthop flush >/dev/null 2>&1847 check_nexthop "id 101" ""848 849 #850 # create group with multiple nexthops - mix of gw and dev only851 #852 run_cmd "$IP nexthop add id 62 via 2001:db8:91::2 dev veth1"853 run_cmd "$IP nexthop add id 63 via 2001:db8:91::3 dev veth1"854 run_cmd "$IP nexthop add id 64 via 2001:db8:91::4 dev veth1"855 run_cmd "$IP nexthop add id 65 dev veth1"856 run_cmd "$IP nexthop add id 102 group 62/63/64/65"857 log_test $? 0 "Nexthop group with multiple nexthops"858 check_nexthop "id 102" "id 102 group 62/63/64/65"859 860 # Delete nexthop in a group and group is updated861 run_cmd "$IP nexthop del id 63"862 check_nexthop "id 102" "id 102 group 62/64/65"863 log_test $? 0 "Nexthop group updated when entry is deleted"864 865 # create group with multiple weighted nexthops866 run_cmd "$IP nexthop add id 63 via 2001:db8:91::3 dev veth1"867 run_cmd "$IP nexthop add id 103 group 62/63,2/64,3/65,4"868 log_test $? 0 "Nexthop group with weighted nexthops"869 check_nexthop "id 103" "id 103 group 62/63,2/64,3/65,4"870 871 # Delete nexthop in a weighted group and group is updated872 run_cmd "$IP nexthop del id 63"873 check_nexthop "id 103" "id 103 group 62/64,3/65,4"874 log_test $? 0 "Weighted nexthop group updated when entry is deleted"875 876 # admin down - nexthop is removed from group877 run_cmd "$IP li set dev veth1 down"878 check_nexthop "dev veth1" ""879 log_test $? 0 "Nexthops in groups removed on admin down"880 881 # expect groups to have been deleted as well882 check_nexthop "" ""883 884 run_cmd "$IP li set dev veth1 up"885 886 $IP nexthop flush >/dev/null 2>&1887 888 # group with nexthops using different devices889 set -e890 run_cmd "$IP nexthop add id 62 via 2001:db8:91::2 dev veth1"891 run_cmd "$IP nexthop add id 63 via 2001:db8:91::3 dev veth1"892 run_cmd "$IP nexthop add id 64 via 2001:db8:91::4 dev veth1"893 run_cmd "$IP nexthop add id 65 via 2001:db8:91::5 dev veth1"894 895 run_cmd "$IP nexthop add id 72 via 2001:db8:92::2 dev veth3"896 run_cmd "$IP nexthop add id 73 via 2001:db8:92::3 dev veth3"897 run_cmd "$IP nexthop add id 74 via 2001:db8:92::4 dev veth3"898 run_cmd "$IP nexthop add id 75 via 2001:db8:92::5 dev veth3"899 set +e900 901 # multiple groups with same nexthop902 run_cmd "$IP nexthop add id 104 group 62"903 run_cmd "$IP nexthop add id 105 group 62"904 check_nexthop "group" "id 104 group 62 id 105 group 62"905 log_test $? 0 "Multiple groups with same nexthop"906 907 run_cmd "$IP nexthop flush groups"908 [ $? -ne 0 ] && return 1909 910 # on admin down of veth1, it should be removed from the group911 run_cmd "$IP nexthop add id 105 group 62/63/72/73/64"912 run_cmd "$IP li set veth1 down"913 check_nexthop "id 105" "id 105 group 72/73"914 log_test $? 0 "Nexthops in group removed on admin down - mixed group"915 916 run_cmd "$IP nexthop add id 106 group 105/74"917 log_test $? 2 "Nexthop group can not have a group as an entry"918 919 # a group can have a blackhole entry only if it is the only920 # nexthop in the group. Needed for atomic replace with an921 # actual nexthop group922 run_cmd "$IP -6 nexthop add id 31 blackhole"923 run_cmd "$IP nexthop add id 107 group 31"924 log_test $? 0 "Nexthop group with a blackhole entry"925 926 run_cmd "$IP nexthop add id 108 group 31/24"927 log_test $? 2 "Nexthop group can not have a blackhole and another nexthop"928 929 ipv6_grp_refs930 log_test $? 0 "Nexthop group replace refcounts"931 932 #933 # 16-bit weights.934 #935 run_cmd "$IP nexthop add id 62 via 2001:db8:91::2 dev veth1"936 run_cmd "$IP nexthop add id 63 via 2001:db8:91::3 dev veth1"937 run_cmd "$IP nexthop add id 64 via 2001:db8:91::4 dev veth1"938 run_cmd "$IP nexthop add id 65 via 2001:db8:91::5 dev veth1"939 run_cmd "$IP nexthop add id 66 dev veth1"940 941 run_cmd "$IP nexthop add id 103 group 62,1000"942 if [[ $? == 0 ]]; then943 local GRP="id 103 group 62,254/63,255/64,256/65,257/66,65535"944 run_cmd "$IP nexthop replace $GRP"945 check_nexthop "id 103" "$GRP"946 rc=$?947 else948 rc=$ksft_skip949 fi950 951 $IP nexthop flush >/dev/null 2>&1952 953 log_test $rc 0 "16-bit weights"954}955 956ipv6_res_grp_fcnal()957{958 local rc959 960 echo961 echo "IPv6 resilient groups functional"962 echo "--------------------------------"963 964 check_nexthop_res_support965 if [ $? -eq $ksft_skip ]; then966 return $ksft_skip967 fi968 969 #970 # migration of nexthop buckets - equal weights971 #972 run_cmd "$IP nexthop add id 62 via 2001:db8:91::2 dev veth1"973 run_cmd "$IP nexthop add id 63 via 2001:db8:91::3 dev veth1"974 run_cmd "$IP nexthop add id 102 group 62/63 type resilient buckets 2 idle_timer 0"975 976 run_cmd "$IP nexthop del id 63"977 check_nexthop "id 102" \978 "id 102 group 62 type resilient buckets 2 idle_timer 0 unbalanced_timer 0 unbalanced_time 0"979 log_test $? 0 "Nexthop group updated when entry is deleted"980 check_nexthop_bucket "list id 102" \981 "id 102 index 0 nhid 62 id 102 index 1 nhid 62"982 log_test $? 0 "Nexthop buckets updated when entry is deleted"983 984 run_cmd "$IP nexthop add id 63 via 2001:db8:91::3 dev veth1"985 run_cmd "$IP nexthop replace id 102 group 62/63 type resilient buckets 2 idle_timer 0"986 check_nexthop "id 102" \987 "id 102 group 62/63 type resilient buckets 2 idle_timer 0 unbalanced_timer 0 unbalanced_time 0"988 log_test $? 0 "Nexthop group updated after replace"989 check_nexthop_bucket "list id 102" \990 "id 102 index 0 nhid 63 id 102 index 1 nhid 62"991 log_test $? 0 "Nexthop buckets updated after replace"992 993 $IP nexthop flush >/dev/null 2>&1994 995 #996 # migration of nexthop buckets - unequal weights997 #998 run_cmd "$IP nexthop add id 62 via 2001:db8:91::2 dev veth1"999 run_cmd "$IP nexthop add id 63 via 2001:db8:91::3 dev veth1"1000 run_cmd "$IP nexthop add id 102 group 62,3/63,1 type resilient buckets 4 idle_timer 0"1001 1002 run_cmd "$IP nexthop del id 63"1003 check_nexthop "id 102" \1004 "id 102 group 62,3 type resilient buckets 4 idle_timer 0 unbalanced_timer 0 unbalanced_time 0"1005 log_test $? 0 "Nexthop group updated when entry is deleted - nECMP"1006 check_nexthop_bucket "list id 102" \1007 "id 102 index 0 nhid 62 id 102 index 1 nhid 62 id 102 index 2 nhid 62 id 102 index 3 nhid 62"1008 log_test $? 0 "Nexthop buckets updated when entry is deleted - nECMP"1009 1010 run_cmd "$IP nexthop add id 63 via 2001:db8:91::3 dev veth1"1011 run_cmd "$IP nexthop replace id 102 group 62,3/63,1 type resilient buckets 4 idle_timer 0"1012 check_nexthop "id 102" \1013 "id 102 group 62,3/63 type resilient buckets 4 idle_timer 0 unbalanced_timer 0 unbalanced_time 0"1014 log_test $? 0 "Nexthop group updated after replace - nECMP"1015 check_nexthop_bucket "list id 102" \1016 "id 102 index 0 nhid 63 id 102 index 1 nhid 62 id 102 index 2 nhid 62 id 102 index 3 nhid 62"1017 log_test $? 0 "Nexthop buckets updated after replace - nECMP"1018 1019 #1020 # 16-bit weights.1021 #1022 run_cmd "$IP nexthop add id 62 via 2001:db8:91::2 dev veth1"1023 run_cmd "$IP nexthop add id 63 via 2001:db8:91::3 dev veth1"1024 run_cmd "$IP nexthop add id 64 via 2001:db8:91::4 dev veth1"1025 run_cmd "$IP nexthop add id 65 via 2001:db8:91::5 dev veth1"1026 run_cmd "$IP nexthop add id 66 dev veth1"1027 1028 run_cmd "$IP nexthop add id 103 group 62,1000 type resilient buckets 32"1029 if [[ $? == 0 ]]; then1030 local GRP="id 103 group 62,254/63,255/64,256/65,257/66,65535 $(:1031 )type resilient buckets 32 idle_timer 0 $(:1032 )unbalanced_timer 0"1033 run_cmd "$IP nexthop replace $GRP"1034 check_nexthop "id 103" "$GRP unbalanced_time 0"1035 rc=$?1036 else1037 rc=$ksft_skip1038 fi1039 1040 $IP nexthop flush >/dev/null 2>&11041 1042 log_test $rc 0 "16-bit weights"1043}1044 1045ipv6_fcnal_runtime()1046{1047 local rc1048 1049 echo1050 echo "IPv6 functional runtime"1051 echo "-----------------------"1052 1053 #1054 # IPv6 - the basics1055 #1056 run_cmd "$IP nexthop add id 81 via 2001:db8:91::2 dev veth1"1057 run_cmd "$IP ro add 2001:db8:101::1/128 nhid 81"1058 log_test $? 0 "Route add"1059 1060 run_cmd "$IP ro delete 2001:db8:101::1/128 nhid 81"1061 log_test $? 0 "Route delete"1062 1063 run_cmd "$IP ro add 2001:db8:101::1/128 nhid 81"1064 run_cmd "ip netns exec $me ping -c1 -w$PING_TIMEOUT 2001:db8:101::1"1065 log_test $? 0 "Ping with nexthop"1066 1067 run_cmd "$IP nexthop add id 82 via 2001:db8:92::2 dev veth3"1068 run_cmd "$IP nexthop add id 122 group 81/82"1069 run_cmd "$IP ro replace 2001:db8:101::1/128 nhid 122"1070 run_cmd "ip netns exec $me ping -c1 -w$PING_TIMEOUT 2001:db8:101::1"1071 log_test $? 0 "Ping - multipath"1072 1073 #1074 # IPv6 with blackhole nexthops1075 #1076 run_cmd "$IP -6 nexthop add id 83 blackhole"1077 run_cmd "$IP ro replace 2001:db8:101::1/128 nhid 83"1078 run_cmd "ip netns exec $me ping -c1 -w$PING_TIMEOUT 2001:db8:101::1"1079 log_test $? 2 "Ping - blackhole"1080 1081 run_cmd "$IP nexthop replace id 83 via 2001:db8:91::2 dev veth1"1082 run_cmd "ip netns exec $me ping -c1 -w$PING_TIMEOUT 2001:db8:101::1"1083 log_test $? 0 "Ping - blackhole replaced with gateway"1084 1085 run_cmd "$IP -6 nexthop replace id 83 blackhole"1086 run_cmd "ip netns exec $me ping -c1 -w$PING_TIMEOUT 2001:db8:101::1"1087 log_test $? 2 "Ping - gateway replaced by blackhole"1088 1089 run_cmd "$IP ro replace 2001:db8:101::1/128 nhid 122"1090 run_cmd "ip netns exec $me ping -c1 -w$PING_TIMEOUT 2001:db8:101::1"1091 if [ $? -eq 0 ]; then1092 run_cmd "$IP nexthop replace id 122 group 83"1093 run_cmd "ip netns exec $me ping -c1 -w$PING_TIMEOUT 2001:db8:101::1"1094 log_test $? 2 "Ping - group with blackhole"1095 1096 run_cmd "$IP nexthop replace id 122 group 81/82"1097 run_cmd "ip netns exec $me ping -c1 -w$PING_TIMEOUT 2001:db8:101::1"1098 log_test $? 0 "Ping - group blackhole replaced with gateways"1099 else1100 log_test 2 0 "Ping - multipath failed"1101 fi1102 1103 #1104 # device only and gw + dev only mix1105 #1106 run_cmd "$IP -6 nexthop add id 85 dev veth1"1107 run_cmd "$IP ro replace 2001:db8:101::1/128 nhid 85"1108 log_test $? 0 "IPv6 route with device only nexthop"1109 check_route6 "2001:db8:101::1" "2001:db8:101::1 nhid 85 dev veth1 metric 1024"1110 1111 run_cmd "$IP nexthop add id 123 group 81/85"1112 run_cmd "$IP ro replace 2001:db8:101::1/128 nhid 123"1113 log_test $? 0 "IPv6 multipath route with nexthop mix - dev only + gw"1114 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"1115 1116 #1117 # IPv6 route with v4 nexthop - not allowed1118 #1119 run_cmd "$IP ro delete 2001:db8:101::1/128"1120 run_cmd "$IP nexthop add id 84 via 172.16.1.1 dev veth1"1121 run_cmd "$IP ro add 2001:db8:101::1/128 nhid 84"1122 log_test $? 2 "IPv6 route can not have a v4 gateway"1123 1124 run_cmd "$IP ro replace 2001:db8:101::1/128 nhid 81"1125 run_cmd "$IP nexthop replace id 81 via 172.16.1.1 dev veth1"1126 log_test $? 2 "Nexthop replace - v6 route, v4 nexthop"1127 1128 run_cmd "$IP ro replace 2001:db8:101::1/128 nhid 122"1129 run_cmd "$IP nexthop replace id 81 via 172.16.1.1 dev veth1"1130 log_test $? 2 "Nexthop replace of group entry - v6 route, v4 nexthop"1131 1132 run_cmd "$IP nexthop add id 86 via 2001:db8:92::2 dev veth3"1133 run_cmd "$IP nexthop add id 87 via 172.16.1.1 dev veth1"1134 run_cmd "$IP nexthop add id 88 via 172.16.1.1 dev veth1"1135 run_cmd "$IP nexthop add id 124 group 86/87/88"1136 run_cmd "$IP ro replace 2001:db8:101::1/128 nhid 124"1137 log_test $? 2 "IPv6 route can not have a group with v4 and v6 gateways"1138 1139 run_cmd "$IP nexthop del id 88"1140 run_cmd "$IP ro replace 2001:db8:101::1/128 nhid 124"1141 log_test $? 2 "IPv6 route can not have a group with v4 and v6 gateways"1142 1143 run_cmd "$IP nexthop del id 87"1144 run_cmd "$IP ro replace 2001:db8:101::1/128 nhid 124"1145 log_test $? 0 "IPv6 route using a group after removing v4 gateways"1146 1147 run_cmd "$IP ro delete 2001:db8:101::1/128"1148 run_cmd "$IP nexthop add id 87 via 172.16.1.1 dev veth1"1149 run_cmd "$IP nexthop add id 88 via 172.16.1.1 dev veth1"1150 run_cmd "$IP nexthop replace id 124 group 86/87/88"1151 run_cmd "$IP ro replace 2001:db8:101::1/128 nhid 124"1152 log_test $? 2 "IPv6 route can not have a group with v4 and v6 gateways"1153 1154 run_cmd "$IP nexthop replace id 88 via 2001:db8:92::2 dev veth3"1155 run_cmd "$IP ro replace 2001:db8:101::1/128 nhid 124"1156 log_test $? 2 "IPv6 route can not have a group with v4 and v6 gateways"1157 1158 run_cmd "$IP nexthop replace id 87 via 2001:db8:92::2 dev veth3"1159 run_cmd "$IP ro replace 2001:db8:101::1/128 nhid 124"1160 log_test $? 0 "IPv6 route using a group after replacing v4 gateways"1161 1162 $IP nexthop flush >/dev/null 2>&11163 1164 #1165 # weird IPv6 cases1166 #1167 run_cmd "$IP nexthop add id 86 via 2001:db8:91::2 dev veth1"1168 run_cmd "$IP ro add 2001:db8:101::1/128 nhid 81"1169 1170 # route can not use prefsrc with nexthops1171 run_cmd "$IP ro add 2001:db8:101::2/128 nhid 86 from 2001:db8:91::1"1172 log_test $? 2 "IPv6 route can not use src routing with external nexthop"1173 1174 # check cleanup path on invalid metric1175 run_cmd "$IP ro add 2001:db8:101::2/128 nhid 86 congctl lock foo"1176 log_test $? 2 "IPv6 route with invalid metric"1177 1178 # rpfilter and default route1179 $IP nexthop flush >/dev/null 2>&11180 run_cmd "ip netns exec $me ip6tables -t mangle -I PREROUTING 1 -m rpfilter --invert -j DROP"1181 run_cmd "$IP nexthop add id 91 via 2001:db8:91::2 dev veth1"1182 run_cmd "$IP nexthop add id 92 via 2001:db8:92::2 dev veth3"1183 run_cmd "$IP nexthop add id 93 group 91/92"1184 run_cmd "$IP -6 ro add default nhid 91"1185 run_cmd "ip netns exec $me ping -c1 -w$PING_TIMEOUT 2001:db8:101::1"1186 log_test $? 0 "Nexthop with default route and rpfilter"1187 run_cmd "$IP -6 ro replace default nhid 93"1188 run_cmd "ip netns exec $me ping -c1 -w$PING_TIMEOUT 2001:db8:101::1"1189 log_test $? 0 "Nexthop with multipath default route and rpfilter"1190 1191 # TO-DO:1192 # existing route with old nexthop; append route with new nexthop1193 # existing route with old nexthop; replace route with new1194 # existing route with new nexthop; replace route with old1195 # route with src address and using nexthop - not allowed1196}1197 1198ipv6_large_grp()1199{1200 local ecmp=321201 1202 echo1203 echo "IPv6 large groups (x$ecmp)"1204 echo "---------------------"1205 1206 check_large_grp 6 $ecmp1207 1208 $IP nexthop flush >/dev/null 2>&11209}1210 1211ipv6_large_res_grp()1212{1213 echo1214 echo "IPv6 large resilient group (128k buckets)"1215 echo "-----------------------------------------"1216 1217 check_nexthop_res_support1218 if [ $? -eq $ksft_skip ]; then1219 return $ksft_skip1220 fi1221 1222 check_large_res_grp 6 $((128 * 1024))1223 1224 $IP nexthop flush >/dev/null 2>&11225}1226 1227ipv6_del_add_loop1()1228{1229 while :; do1230 $IP nexthop del id 1001231 $IP nexthop add id 100 via 2001:db8:91::2 dev veth11232 done >/dev/null 2>&11233}1234 1235ipv6_grp_replace_loop()1236{1237 while :; do1238 $IP nexthop replace id 102 group 100/1011239 done >/dev/null 2>&11240}1241 1242ipv6_torture()1243{1244 local pid11245 local pid21246 local pid31247 local pid41248 local pid51249 1250 echo1251 echo "IPv6 runtime torture"1252 echo "--------------------"1253 if [ ! -x "$(command -v mausezahn)" ]; then1254 echo "SKIP: Could not run test; need mausezahn tool"1255 return1256 fi1257 1258 run_cmd "$IP nexthop add id 100 via 2001:db8:91::2 dev veth1"1259 run_cmd "$IP nexthop add id 101 via 2001:db8:92::2 dev veth3"1260 run_cmd "$IP nexthop add id 102 group 100/101"1261 run_cmd "$IP route add 2001:db8:101::1 nhid 102"1262 run_cmd "$IP route add 2001:db8:101::2 nhid 102"1263 1264 ipv6_del_add_loop1 &1265 pid1=$!1266 ipv6_grp_replace_loop &1267 pid2=$!1268 ip netns exec $me ping -f 2001:db8:101::1 >/dev/null 2>&1 &1269 pid3=$!1270 ip netns exec $me ping -f 2001:db8:101::2 >/dev/null 2>&1 &1271 pid4=$!1272 ip netns exec $me mausezahn -6 veth1 -B 2001:db8:101::2 -A 2001:db8:91::1 -c 0 -t tcp "dp=1-1023, flags=syn" >/dev/null 2>&1 &1273 pid5=$!1274 1275 sleep 3001276 kill -9 $pid1 $pid2 $pid3 $pid4 $pid51277 wait $pid1 $pid2 $pid3 $pid4 $pid5 2>/dev/null1278 1279 # if we did not crash, success1280 log_test 0 0 "IPv6 torture test"1281}1282 1283ipv6_res_grp_replace_loop()1284{1285 while :; do1286 $IP nexthop replace id 102 group 100/101 type resilient1287 done >/dev/null 2>&11288}1289 1290ipv6_res_torture()1291{1292 local pid11293 local pid21294 local pid31295 local pid41296 local pid51297 1298 echo1299 echo "IPv6 runtime resilient nexthop group torture"1300 echo "--------------------------------------------"1301 1302 check_nexthop_res_support1303 if [ $? -eq $ksft_skip ]; then1304 return $ksft_skip1305 fi1306 1307 if [ ! -x "$(command -v mausezahn)" ]; then1308 echo "SKIP: Could not run test; need mausezahn tool"1309 return1310 fi1311 1312 run_cmd "$IP nexthop add id 100 via 2001:db8:91::2 dev veth1"1313 run_cmd "$IP nexthop add id 101 via 2001:db8:92::2 dev veth3"1314 run_cmd "$IP nexthop add id 102 group 100/101 type resilient buckets 512 idle_timer 0"1315 run_cmd "$IP route add 2001:db8:101::1 nhid 102"1316 run_cmd "$IP route add 2001:db8:101::2 nhid 102"1317 1318 ipv6_del_add_loop1 &1319 pid1=$!1320 ipv6_res_grp_replace_loop &1321 pid2=$!1322 ip netns exec $me ping -f 2001:db8:101::1 >/dev/null 2>&1 &1323 pid3=$!1324 ip netns exec $me ping -f 2001:db8:101::2 >/dev/null 2>&1 &1325 pid4=$!1326 ip netns exec $me mausezahn -6 veth1 \1327 -B 2001:db8:101::2 -A 2001:db8:91::1 -c 0 \1328 -t tcp "dp=1-1023, flags=syn" >/dev/null 2>&1 &1329 pid5=$!1330 1331 sleep 3001332 kill -9 $pid1 $pid2 $pid3 $pid4 $pid51333 wait $pid1 $pid2 $pid3 $pid4 $pid5 2>/dev/null1334 1335 # if we did not crash, success1336 log_test 0 0 "IPv6 resilient nexthop group torture test"1337}1338 1339ipv4_fcnal()1340{1341 local rc1342 1343 echo1344 echo "IPv4 functional"1345 echo "----------------------"1346 1347 #1348 # basic IPv4 ops - add, get, delete1349 #1350 run_cmd "$IP nexthop add id 12 via 172.16.1.2 dev veth1"1351 rc=$?1352 log_test $rc 0 "Create nexthop with id, gw, dev"1353 if [ $rc -ne 0 ]; then1354 echo "Basic IPv4 create fails; can not continue"1355 return 11356 fi1357 1358 run_cmd "$IP nexthop get id 12"1359 log_test $? 0 "Get nexthop by id"1360 check_nexthop "id 12" "id 12 via 172.16.1.2 dev veth1 scope link"1361 1362 run_cmd "$IP nexthop del id 12"1363 log_test $? 0 "Delete nexthop by id"1364 check_nexthop "id 52" ""1365 1366 #1367 # gw, device spec1368 #1369 # gw validation, no device - fails since dev is required1370 run_cmd "$IP nexthop add id 12 via 172.16.2.3"1371 log_test $? 2 "Create nexthop - gw only"1372 1373 # gw not reachable through given dev1374 run_cmd "$IP nexthop add id 13 via 172.16.3.2 dev veth1"1375 log_test $? 2 "Create nexthop - invalid gw+dev combination"1376 1377 # onlink flag overrides gw+dev lookup1378 run_cmd "$IP nexthop add id 13 via 172.16.3.2 dev veth1 onlink"1379 log_test $? 0 "Create nexthop - gw+dev and onlink"1380 1381 # admin down should delete nexthops1382 set -e1383 run_cmd "$IP nexthop add id 15 via 172.16.1.3 dev veth1"1384 run_cmd "$IP nexthop add id 16 via 172.16.1.4 dev veth1"1385 run_cmd "$IP nexthop add id 17 via 172.16.1.5 dev veth1"1386 run_cmd "$IP li set dev veth1 down"1387 set +e1388 check_nexthop "dev veth1" ""1389 log_test $? 0 "Nexthops removed on admin down"1390 1391 # nexthop route delete warning: route add with nhid and delete1392 # using device1393 run_cmd "$IP li set dev veth1 up"1394 run_cmd "$IP nexthop add id 12 via 172.16.1.3 dev veth1"1395 out1=`dmesg | grep "WARNING:.*fib_nh_match.*" | wc -l`1396 run_cmd "$IP route add 172.16.101.1/32 nhid 12"1397 run_cmd "$IP route delete 172.16.101.1/32 dev veth1"1398 out2=`dmesg | grep "WARNING:.*fib_nh_match.*" | wc -l`1399 [ $out1 -eq $out2 ]1400 rc=$?1401 log_test $rc 0 "Delete nexthop route warning"1402 run_cmd "$IP route delete 172.16.101.1/32 nhid 12"1403 run_cmd "$IP nexthop del id 12"1404 1405 run_cmd "$IP nexthop add id 21 via 172.16.1.6 dev veth1"1406 run_cmd "$IP ro add 172.16.101.0/24 nhid 21"1407 run_cmd "$IP ro del 172.16.101.0/24 nexthop via 172.16.1.7 dev veth1 nexthop via 172.16.1.8 dev veth1"1408 log_test $? 2 "Delete multipath route with only nh id based entry"1409 1410 run_cmd "$IP nexthop add id 22 via 172.16.1.6 dev veth1"1411 run_cmd "$IP ro add 172.16.102.0/24 nhid 22"1412 run_cmd "$IP ro del 172.16.102.0/24 dev veth1"1413 log_test $? 2 "Delete route when specifying only nexthop device"1414 1415 run_cmd "$IP ro del 172.16.102.0/24 via 172.16.1.6"1416 log_test $? 2 "Delete route when specifying only gateway"1417 1418 run_cmd "$IP ro del 172.16.102.0/24"1419 log_test $? 0 "Delete route when not specifying nexthop attributes"1420}1421 1422ipv4_grp_fcnal()1423{1424 local rc1425 1426 echo1427 echo "IPv4 groups functional"1428 echo "----------------------"1429 1430 # basic functionality: create a nexthop group, default weight1431 run_cmd "$IP nexthop add id 11 via 172.16.1.2 dev veth1"1432 run_cmd "$IP nexthop add id 101 group 11"1433 log_test $? 0 "Create nexthop group with single nexthop"1434 1435 # get nexthop group1436 run_cmd "$IP nexthop get id 101"1437 log_test $? 0 "Get nexthop group by id"1438 check_nexthop "id 101" "id 101 group 11"1439 1440 # delete nexthop group1441 run_cmd "$IP nexthop del id 101"1442 log_test $? 0 "Delete nexthop group by id"1443 check_nexthop "id 101" ""1444 1445 $IP nexthop flush >/dev/null 2>&11446 1447 #1448 # create group with multiple nexthops1449 run_cmd "$IP nexthop add id 12 via 172.16.1.2 dev veth1"1450 run_cmd "$IP nexthop add id 13 via 172.16.1.3 dev veth1"1451 run_cmd "$IP nexthop add id 14 via 172.16.1.4 dev veth1"1452 run_cmd "$IP nexthop add id 15 via 172.16.1.5 dev veth1"1453 run_cmd "$IP nexthop add id 102 group 12/13/14/15"1454 log_test $? 0 "Nexthop group with multiple nexthops"1455 check_nexthop "id 102" "id 102 group 12/13/14/15"1456 1457 # Delete nexthop in a group and group is updated1458 run_cmd "$IP nexthop del id 13"1459 check_nexthop "id 102" "id 102 group 12/14/15"1460 log_test $? 0 "Nexthop group updated when entry is deleted"1461 1462 # create group with multiple weighted nexthops1463 run_cmd "$IP nexthop add id 13 via 172.16.1.3 dev veth1"1464 run_cmd "$IP nexthop add id 103 group 12/13,2/14,3/15,4"1465 log_test $? 0 "Nexthop group with weighted nexthops"1466 check_nexthop "id 103" "id 103 group 12/13,2/14,3/15,4"1467 1468 # Delete nexthop in a weighted group and group is updated1469 run_cmd "$IP nexthop del id 13"1470 check_nexthop "id 103" "id 103 group 12/14,3/15,4"1471 log_test $? 0 "Weighted nexthop group updated when entry is deleted"1472 1473 # admin down - nexthop is removed from group1474 run_cmd "$IP li set dev veth1 down"1475 check_nexthop "dev veth1" ""1476 log_test $? 0 "Nexthops in groups removed on admin down"1477 1478 # expect groups to have been deleted as well1479 check_nexthop "" ""1480 1481 run_cmd "$IP li set dev veth1 up"1482 1483 $IP nexthop flush >/dev/null 2>&11484 1485 # group with nexthops using different devices1486 set -e1487 run_cmd "$IP nexthop add id 12 via 172.16.1.2 dev veth1"1488 run_cmd "$IP nexthop add id 13 via 172.16.1.3 dev veth1"1489 run_cmd "$IP nexthop add id 14 via 172.16.1.4 dev veth1"1490 run_cmd "$IP nexthop add id 15 via 172.16.1.5 dev veth1"1491 1492 run_cmd "$IP nexthop add id 22 via 172.16.2.2 dev veth3"1493 run_cmd "$IP nexthop add id 23 via 172.16.2.3 dev veth3"1494 run_cmd "$IP nexthop add id 24 via 172.16.2.4 dev veth3"1495 run_cmd "$IP nexthop add id 25 via 172.16.2.5 dev veth3"1496 set +e1497 1498 # multiple groups with same nexthop1499 run_cmd "$IP nexthop add id 104 group 12"1500 run_cmd "$IP nexthop add id 105 group 12"1501 check_nexthop "group" "id 104 group 12 id 105 group 12"1502 log_test $? 0 "Multiple groups with same nexthop"1503 1504 run_cmd "$IP nexthop flush groups"1505 [ $? -ne 0 ] && return 11506 1507 # on admin down of veth1, it should be removed from the group1508 run_cmd "$IP nexthop add id 105 group 12/13/22/23/14"1509 run_cmd "$IP li set veth1 down"1510 check_nexthop "id 105" "id 105 group 22/23"1511 log_test $? 0 "Nexthops in group removed on admin down - mixed group"1512 1513 run_cmd "$IP nexthop add id 106 group 105/24"1514 log_test $? 2 "Nexthop group can not have a group as an entry"1515 1516 # a group can have a blackhole entry only if it is the only1517 # nexthop in the group. Needed for atomic replace with an1518 # actual nexthop group1519 run_cmd "$IP nexthop add id 31 blackhole"1520 run_cmd "$IP nexthop add id 107 group 31"1521 log_test $? 0 "Nexthop group with a blackhole entry"1522 1523 run_cmd "$IP nexthop add id 108 group 31/24"1524 log_test $? 2 "Nexthop group can not have a blackhole and another nexthop"1525}1526 1527ipv4_res_grp_fcnal()1528{1529 local rc1530 1531 echo1532 echo "IPv4 resilient groups functional"1533 echo "--------------------------------"1534 1535 check_nexthop_res_support1536 if [ $? -eq $ksft_skip ]; then1537 return $ksft_skip1538 fi1539 1540 #1541 # migration of nexthop buckets - equal weights1542 #1543 run_cmd "$IP nexthop add id 12 via 172.16.1.2 dev veth1"1544 run_cmd "$IP nexthop add id 13 via 172.16.1.3 dev veth1"1545 run_cmd "$IP nexthop add id 102 group 12/13 type resilient buckets 2 idle_timer 0"1546 1547 run_cmd "$IP nexthop del id 13"1548 check_nexthop "id 102" \1549 "id 102 group 12 type resilient buckets 2 idle_timer 0 unbalanced_timer 0 unbalanced_time 0"1550 log_test $? 0 "Nexthop group updated when entry is deleted"1551 check_nexthop_bucket "list id 102" \1552 "id 102 index 0 nhid 12 id 102 index 1 nhid 12"1553 log_test $? 0 "Nexthop buckets updated when entry is deleted"1554 1555 run_cmd "$IP nexthop add id 13 via 172.16.1.3 dev veth1"1556 run_cmd "$IP nexthop replace id 102 group 12/13 type resilient buckets 2 idle_timer 0"1557 check_nexthop "id 102" \1558 "id 102 group 12/13 type resilient buckets 2 idle_timer 0 unbalanced_timer 0 unbalanced_time 0"1559 log_test $? 0 "Nexthop group updated after replace"1560 check_nexthop_bucket "list id 102" \1561 "id 102 index 0 nhid 13 id 102 index 1 nhid 12"1562 log_test $? 0 "Nexthop buckets updated after replace"1563 1564 $IP nexthop flush >/dev/null 2>&11565 1566 #1567 # migration of nexthop buckets - unequal weights1568 #1569 run_cmd "$IP nexthop add id 12 via 172.16.1.2 dev veth1"1570 run_cmd "$IP nexthop add id 13 via 172.16.1.3 dev veth1"1571 run_cmd "$IP nexthop add id 102 group 12,3/13,1 type resilient buckets 4 idle_timer 0"1572 1573 run_cmd "$IP nexthop del id 13"1574 check_nexthop "id 102" \1575 "id 102 group 12,3 type resilient buckets 4 idle_timer 0 unbalanced_timer 0 unbalanced_time 0"1576 log_test $? 0 "Nexthop group updated when entry is deleted - nECMP"1577 check_nexthop_bucket "list id 102" \1578 "id 102 index 0 nhid 12 id 102 index 1 nhid 12 id 102 index 2 nhid 12 id 102 index 3 nhid 12"1579 log_test $? 0 "Nexthop buckets updated when entry is deleted - nECMP"1580 1581 run_cmd "$IP nexthop add id 13 via 172.16.1.3 dev veth1"1582 run_cmd "$IP nexthop replace id 102 group 12,3/13,1 type resilient buckets 4 idle_timer 0"1583 check_nexthop "id 102" \1584 "id 102 group 12,3/13 type resilient buckets 4 idle_timer 0 unbalanced_timer 0 unbalanced_time 0"1585 log_test $? 0 "Nexthop group updated after replace - nECMP"1586 check_nexthop_bucket "list id 102" \1587 "id 102 index 0 nhid 13 id 102 index 1 nhid 12 id 102 index 2 nhid 12 id 102 index 3 nhid 12"1588 log_test $? 0 "Nexthop buckets updated after replace - nECMP"1589}1590 1591ipv4_withv6_fcnal()1592{1593 local lladdr1594 1595 set -e1596 lladdr=$(get_linklocal veth2 $peer)1597 run_cmd "$IP nexthop add id 11 via ${lladdr} dev veth1"1598 set +e1599 run_cmd "$IP ro add 172.16.101.1/32 nhid 11"1600 log_test $? 0 "IPv6 nexthop with IPv4 route"1601 check_route "172.16.101.1" "172.16.101.1 nhid 11 via inet6 ${lladdr} dev veth1"1602 1603 set -e1604 run_cmd "$IP nexthop add id 12 via 172.16.1.2 dev veth1"1605 run_cmd "$IP nexthop add id 101 group 11/12"1606 set +e1607 run_cmd "$IP ro replace 172.16.101.1/32 nhid 101"1608 log_test $? 0 "IPv6 nexthop with IPv4 route"1609 1610 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"1611 1612 run_cmd "$IP ro replace 172.16.101.1/32 via inet6 ${lladdr} dev veth1"1613 log_test $? 0 "IPv4 route with IPv6 gateway"1614 check_route "172.16.101.1" "172.16.101.1 via inet6 ${lladdr} dev veth1"1615 1616 run_cmd "$IP ro replace 172.16.101.1/32 via inet6 2001:db8:50::1 dev veth1"1617 log_test $? 2 "IPv4 route with invalid IPv6 gateway"1618}1619 1620ipv4_fcnal_runtime()1621{1622 local lladdr1623 local rc1624 1625 echo1626 echo "IPv4 functional runtime"1627 echo "-----------------------"1628 1629 run_cmd "$IP nexthop add id 21 via 172.16.1.2 dev veth1"1630 run_cmd "$IP ro add 172.16.101.1/32 nhid 21"1631 log_test $? 0 "Route add"1632 check_route "172.16.101.1" "172.16.101.1 nhid 21 via 172.16.1.2 dev veth1"1633 1634 run_cmd "$IP ro delete 172.16.101.1/32 nhid 21"1635 log_test $? 0 "Route delete"1636 1637 #1638 # scope mismatch1639 #1640 run_cmd "$IP nexthop add id 22 via 172.16.1.2 dev veth1"1641 run_cmd "$IP ro add 172.16.101.1/32 nhid 22 scope host"1642 log_test $? 2 "Route add - scope conflict with nexthop"1643 1644 run_cmd "$IP nexthop replace id 22 dev veth3"1645 run_cmd "$IP ro add 172.16.101.1/32 nhid 22 scope host"1646 run_cmd "$IP nexthop replace id 22 via 172.16.2.2 dev veth3"1647 log_test $? 2 "Nexthop replace with invalid scope for existing route"1648 1649 # check cleanup path on invalid metric1650 run_cmd "$IP ro add 172.16.101.2/32 nhid 22 congctl lock foo"1651 log_test $? 2 "IPv4 route with invalid metric"1652 1653 #1654 # add route with nexthop and check traffic1655 #1656 run_cmd "$IP nexthop replace id 21 via 172.16.1.2 dev veth1"1657 run_cmd "$IP ro replace 172.16.101.1/32 nhid 21"1658 run_cmd "ip netns exec $me ping -c1 -w$PING_TIMEOUT 172.16.101.1"1659 log_test $? 0 "Basic ping"1660 1661 run_cmd "$IP nexthop replace id 22 via 172.16.2.2 dev veth3"1662 run_cmd "$IP nexthop add id 122 group 21/22"1663 run_cmd "$IP ro replace 172.16.101.1/32 nhid 122"1664 run_cmd "ip netns exec $me ping -c1 -w$PING_TIMEOUT 172.16.101.1"1665 log_test $? 0 "Ping - multipath"1666 1667 run_cmd "$IP ro delete 172.16.101.1/32 nhid 122"1668 1669 #1670 # multiple default routes1671 # - tests fib_select_default1672 run_cmd "$IP nexthop add id 501 via 172.16.1.2 dev veth1"1673 run_cmd "$IP ro add default nhid 501"1674 run_cmd "$IP ro add default via 172.16.1.3 dev veth1 metric 20"1675 run_cmd "ip netns exec $me ping -c1 -w$PING_TIMEOUT 172.16.101.1"1676 log_test $? 0 "Ping - multiple default routes, nh first"1677 1678 # flip the order1679 run_cmd "$IP ro del default nhid 501"1680 run_cmd "$IP ro del default via 172.16.1.3 dev veth1 metric 20"1681 run_cmd "$IP ro add default via 172.16.1.2 dev veth1 metric 20"1682 run_cmd "$IP nexthop replace id 501 via 172.16.1.3 dev veth1"1683 run_cmd "$IP ro add default nhid 501 metric 20"1684 run_cmd "ip netns exec $me ping -c1 -w$PING_TIMEOUT 172.16.101.1"1685 log_test $? 0 "Ping - multiple default routes, nh second"1686 1687 run_cmd "$IP nexthop delete nhid 501"1688 run_cmd "$IP ro del default"1689 1690 #1691 # IPv4 with blackhole nexthops1692 #1693 run_cmd "$IP nexthop add id 23 blackhole"1694 run_cmd "$IP ro replace 172.16.101.1/32 nhid 23"1695 run_cmd "ip netns exec $me ping -c1 -w$PING_TIMEOUT 172.16.101.1"1696 log_test $? 2 "Ping - blackhole"1697 1698 run_cmd "$IP nexthop replace id 23 via 172.16.1.2 dev veth1"1699 run_cmd "ip netns exec $me ping -c1 -w$PING_TIMEOUT 172.16.101.1"1700 log_test $? 0 "Ping - blackhole replaced with gateway"1701 1702 run_cmd "$IP nexthop replace id 23 blackhole"1703 run_cmd "ip netns exec $me ping -c1 -w$PING_TIMEOUT 172.16.101.1"1704 log_test $? 2 "Ping - gateway replaced by blackhole"1705 1706 run_cmd "$IP ro replace 172.16.101.1/32 nhid 122"1707 run_cmd "ip netns exec $me ping -c1 -w$PING_TIMEOUT 172.16.101.1"1708 if [ $? -eq 0 ]; then1709 run_cmd "$IP nexthop replace id 122 group 23"1710 run_cmd "ip netns exec $me ping -c1 -w$PING_TIMEOUT 172.16.101.1"1711 log_test $? 2 "Ping - group with blackhole"1712 1713 run_cmd "$IP nexthop replace id 122 group 21/22"1714 run_cmd "ip netns exec $me ping -c1 -w$PING_TIMEOUT 172.16.101.1"1715 log_test $? 0 "Ping - group blackhole replaced with gateways"1716 else1717 log_test 2 0 "Ping - multipath failed"1718 fi1719 1720 #1721 # device only and gw + dev only mix1722 #1723 run_cmd "$IP nexthop add id 85 dev veth1"1724 run_cmd "$IP ro replace 172.16.101.1/32 nhid 85"1725 log_test $? 0 "IPv4 route with device only nexthop"1726 check_route "172.16.101.1" "172.16.101.1 nhid 85 dev veth1"1727 1728 run_cmd "$IP nexthop add id 123 group 21/85"1729 run_cmd "$IP ro replace 172.16.101.1/32 nhid 123"1730 log_test $? 0 "IPv4 multipath route with nexthop mix - dev only + gw"1731 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"1732 1733 #1734 # IPv4 with IPv61735 #1736 set -e1737 lladdr=$(get_linklocal veth2 $peer)1738 run_cmd "$IP nexthop add id 24 via ${lladdr} dev veth1"1739 set +e1740 run_cmd "$IP ro replace 172.16.101.1/32 nhid 24"1741 run_cmd "ip netns exec $me ping -c1 -w$PING_TIMEOUT 172.16.101.1"1742 log_test $? 0 "IPv6 nexthop with IPv4 route"1743 1744 $IP neigh sh | grep -q "${lladdr} dev veth1"1745 if [ $? -eq 1 ]; then1746 echo " WARNING: Neigh entry missing for ${lladdr}"1747 $IP neigh sh | grep 'dev veth1'1748 fi1749 1750 $IP neigh sh | grep -q "172.16.101.1 dev eth1"1751 if [ $? -eq 0 ]; then1752 echo " WARNING: Neigh entry exists for 172.16.101.1"1753 $IP neigh sh | grep 'dev veth1'1754 fi1755 1756 set -e1757 run_cmd "$IP nexthop add id 25 via 172.16.1.2 dev veth1"1758 run_cmd "$IP nexthop add id 101 group 24/25"1759 set +e1760 run_cmd "$IP ro replace 172.16.101.1/32 nhid 101"1761 log_test $? 0 "IPv4 route with mixed v4-v6 multipath route"1762 1763 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"1764 1765 run_cmd "ip netns exec $me ping -c1 -w$PING_TIMEOUT 172.16.101.1"1766 log_test $? 0 "IPv6 nexthop with IPv4 route"1767 1768 run_cmd "$IP ro replace 172.16.101.1/32 via inet6 ${lladdr} dev veth1"1769 run_cmd "ip netns exec $me ping -c1 -w$PING_TIMEOUT 172.16.101.1"1770 log_test $? 0 "IPv4 route with IPv6 gateway"1771 1772 $IP neigh sh | grep -q "${lladdr} dev veth1"1773 if [ $? -eq 1 ]; then1774 echo " WARNING: Neigh entry missing for ${lladdr}"1775 $IP neigh sh | grep 'dev veth1'1776 fi1777 1778 $IP neigh sh | grep -q "172.16.101.1 dev eth1"1779 if [ $? -eq 0 ]; then1780 echo " WARNING: Neigh entry exists for 172.16.101.1"1781 $IP neigh sh | grep 'dev veth1'1782 fi1783 1784 run_cmd "$IP ro del 172.16.101.1/32 via inet6 ${lladdr} dev veth1"1785 run_cmd "$IP -4 ro add default via inet6 ${lladdr} dev veth1"1786 run_cmd "ip netns exec $me ping -c1 -w$PING_TIMEOUT 172.16.101.1"1787 log_test $? 0 "IPv4 default route with IPv6 gateway"1788 1789 #1790 # MPLS as an example of LWT encap1791 #1792 run_cmd "$IP nexthop add id 51 encap mpls 101 via 172.16.1.2 dev veth1"1793 log_test $? 0 "IPv4 route with MPLS encap"1794 check_nexthop "id 51" "id 51 encap mpls 101 via 172.16.1.2 dev veth1 scope link"1795 log_test $? 0 "IPv4 route with MPLS encap - check"1796 1797 run_cmd "$IP nexthop add id 52 encap mpls 102 via inet6 2001:db8:91::2 dev veth1"1798 log_test $? 0 "IPv4 route with MPLS encap and v6 gateway"1799 check_nexthop "id 52" "id 52 encap mpls 102 via 2001:db8:91::2 dev veth1 scope link"1800 log_test $? 0 "IPv4 route with MPLS encap, v6 gw - check"1801}1802 1803ipv4_large_grp()1804{1805 local ecmp=321806 1807 echo1808 echo "IPv4 large groups (x$ecmp)"1809 echo "---------------------"1810 1811 check_large_grp 4 $ecmp1812 1813 $IP nexthop flush >/dev/null 2>&11814}1815 1816ipv4_large_res_grp()1817{1818 echo1819 echo "IPv4 large resilient group (128k buckets)"1820 echo "-----------------------------------------"1821 1822 check_nexthop_res_support1823 if [ $? -eq $ksft_skip ]; then1824 return $ksft_skip1825 fi1826 1827 check_large_res_grp 4 $((128 * 1024))1828 1829 $IP nexthop flush >/dev/null 2>&11830}1831 1832sysctl_nexthop_compat_mode_check()1833{1834 local sysctlname="net.ipv4.nexthop_compat_mode"1835 local lprefix=$11836 1837 IPE="ip netns exec $me"1838 1839 $IPE sysctl -q $sysctlname 2>&1 >/dev/null1840 if [ $? -ne 0 ]; then1841 echo "SKIP: kernel lacks nexthop compat mode sysctl control"1842 return $ksft_skip1843 fi1844 1845 out=$($IPE sysctl $sysctlname 2>/dev/null)1846 log_test $? 0 "$lprefix default nexthop compat mode check"1847 check_output "${out}" "$sysctlname = 1"1848}1849 1850sysctl_nexthop_compat_mode_set()1851{1852 local sysctlname="net.ipv4.nexthop_compat_mode"1853 local mode=$11854 local lprefix=$21855 1856 IPE="ip netns exec $me"1857 1858 out=$($IPE sysctl -w $sysctlname=$mode)1859 log_test $? 0 "$lprefix set compat mode - $mode"1860 check_output "${out}" "net.ipv4.nexthop_compat_mode = $mode"1861}1862 1863ipv6_compat_mode()1864{1865 local rc1866 1867 echo1868 echo "IPv6 nexthop api compat mode test"1869 echo "--------------------------------"1870 1871 sysctl_nexthop_compat_mode_check "IPv6"1872 if [ $? -eq $ksft_skip ]; then1873 return $ksft_skip1874 fi1875 1876 run_cmd "$IP nexthop add id 62 via 2001:db8:91::2 dev veth1"1877 run_cmd "$IP nexthop add id 63 via 2001:db8:91::3 dev veth1"1878 run_cmd "$IP nexthop add id 122 group 62/63"1879 ipmout=$(start_ip_monitor route)1880 1881 run_cmd "$IP -6 ro add 2001:db8:101::1/128 nhid 122"1882 # route add notification should contain expanded nexthops1883 stop_ip_monitor $ipmout 31884 log_test $? 0 "IPv6 compat mode on - route add notification"1885 1886 # route dump should contain expanded nexthops1887 check_route6 "2001:db8:101::1" "2001:db8:101::1 nhid 122 metric 1024 nexthop via 2001:db8:91::2 dev veth1 weight 1 nexthop via 2001:db8:91::3 dev veth1 weight 1"1888 log_test $? 0 "IPv6 compat mode on - route dump"1889 1890 # change in nexthop group should generate route notification1891 run_cmd "$IP nexthop add id 64 via 2001:db8:91::4 dev veth1"1892 ipmout=$(start_ip_monitor route)1893 run_cmd "$IP nexthop replace id 122 group 62/64"1894 stop_ip_monitor $ipmout 31895 1896 log_test $? 0 "IPv6 compat mode on - nexthop change"1897 1898 # set compat mode off1899 sysctl_nexthop_compat_mode_set 0 "IPv6"1900 1901 run_cmd "$IP -6 ro del 2001:db8:101::1/128 nhid 122"1902 1903 run_cmd "$IP nexthop add id 62 via 2001:db8:91::2 dev veth1"1904 run_cmd "$IP nexthop add id 63 via 2001:db8:91::3 dev veth1"1905 run_cmd "$IP nexthop add id 122 group 62/63"1906 ipmout=$(start_ip_monitor route)1907 1908 run_cmd "$IP -6 ro add 2001:db8:101::1/128 nhid 122"1909 # route add notification should not contain expanded nexthops1910 stop_ip_monitor $ipmout 11911 log_test $? 0 "IPv6 compat mode off - route add notification"1912 1913 # route dump should not contain expanded nexthops1914 check_route6 "2001:db8:101::1" "2001:db8:101::1 nhid 122 metric 1024"1915 log_test $? 0 "IPv6 compat mode off - route dump"1916 1917 # change in nexthop group should not generate route notification1918 run_cmd "$IP nexthop add id 64 via 2001:db8:91::4 dev veth1"1919 ipmout=$(start_ip_monitor route)1920 run_cmd "$IP nexthop replace id 122 group 62/64"1921 stop_ip_monitor $ipmout 01922 log_test $? 0 "IPv6 compat mode off - nexthop change"1923 1924 # nexthop delete should not generate route notification1925 ipmout=$(start_ip_monitor route)1926 run_cmd "$IP nexthop del id 122"1927 stop_ip_monitor $ipmout 01928 log_test $? 0 "IPv6 compat mode off - nexthop delete"1929 1930 # set compat mode back on1931 sysctl_nexthop_compat_mode_set 1 "IPv6"1932}1933 1934ipv4_compat_mode()1935{1936 local rc1937 1938 echo1939 echo "IPv4 nexthop api compat mode"1940 echo "----------------------------"1941 1942 sysctl_nexthop_compat_mode_check "IPv4"1943 if [ $? -eq $ksft_skip ]; then1944 return $ksft_skip1945 fi1946 1947 run_cmd "$IP nexthop add id 21 via 172.16.1.2 dev veth1"1948 run_cmd "$IP nexthop add id 22 via 172.16.1.2 dev veth1"1949 run_cmd "$IP nexthop add id 122 group 21/22"1950 ipmout=$(start_ip_monitor route)1951 1952 run_cmd "$IP ro add 172.16.101.1/32 nhid 122"1953 stop_ip_monitor $ipmout 31954 1955 # route add notification should contain expanded nexthops1956 log_test $? 0 "IPv4 compat mode on - route add notification"1957 1958 # route dump should contain expanded nexthops1959 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"1960 log_test $? 0 "IPv4 compat mode on - route dump"1961 1962 # change in nexthop group should generate route notification1963 run_cmd "$IP nexthop add id 23 via 172.16.1.3 dev veth1"1964 ipmout=$(start_ip_monitor route)1965 run_cmd "$IP nexthop replace id 122 group 21/23"1966 stop_ip_monitor $ipmout 31967 log_test $? 0 "IPv4 compat mode on - nexthop change"1968 1969 sysctl_nexthop_compat_mode_set 0 "IPv4"1970 1971 # cleanup1972 run_cmd "$IP ro del 172.16.101.1/32 nhid 122"1973 1974 ipmout=$(start_ip_monitor route)1975 run_cmd "$IP ro add 172.16.101.1/32 nhid 122"1976 stop_ip_monitor $ipmout 11977 # route add notification should not contain expanded nexthops1978 log_test $? 0 "IPv4 compat mode off - route add notification"1979 1980 # route dump should not contain expanded nexthops1981 check_route "172.16.101.1" "172.16.101.1 nhid 122"1982 log_test $? 0 "IPv4 compat mode off - route dump"1983 1984 # change in nexthop group should not generate route notification1985 ipmout=$(start_ip_monitor route)1986 run_cmd "$IP nexthop replace id 122 group 21/22"1987 stop_ip_monitor $ipmout 01988 log_test $? 0 "IPv4 compat mode off - nexthop change"1989 1990 # nexthop delete should not generate route notification1991 ipmout=$(start_ip_monitor route)1992 run_cmd "$IP nexthop del id 122"1993 stop_ip_monitor $ipmout 01994 log_test $? 0 "IPv4 compat mode off - nexthop delete"1995 1996 sysctl_nexthop_compat_mode_set 1 "IPv4"1997}1998 1999ipv4_del_add_loop1()2000{2001 while :; do2002 $IP nexthop del id 1002003 $IP nexthop add id 100 via 172.16.1.2 dev veth12004 done >/dev/null 2>&12005}2006 2007ipv4_grp_replace_loop()2008{2009 while :; do2010 $IP nexthop replace id 102 group 100/1012011 done >/dev/null 2>&12012}2013 2014ipv4_torture()2015{2016 local pid12017 local pid22018 local pid32019 local pid42020 local pid52021 2022 echo2023 echo "IPv4 runtime torture"2024 echo "--------------------"2025 if [ ! -x "$(command -v mausezahn)" ]; then2026 echo "SKIP: Could not run test; need mausezahn tool"2027 return2028 fi2029 2030 run_cmd "$IP nexthop add id 100 via 172.16.1.2 dev veth1"2031 run_cmd "$IP nexthop add id 101 via 172.16.2.2 dev veth3"2032 run_cmd "$IP nexthop add id 102 group 100/101"2033 run_cmd "$IP route add 172.16.101.1 nhid 102"2034 run_cmd "$IP route add 172.16.101.2 nhid 102"2035 2036 ipv4_del_add_loop1 &2037 pid1=$!2038 ipv4_grp_replace_loop &2039 pid2=$!2040 ip netns exec $me ping -f 172.16.101.1 >/dev/null 2>&1 &2041 pid3=$!2042 ip netns exec $me ping -f 172.16.101.2 >/dev/null 2>&1 &2043 pid4=$!2044 ip netns exec $me mausezahn veth1 -B 172.16.101.2 -A 172.16.1.1 -c 0 -t tcp "dp=1-1023, flags=syn" >/dev/null 2>&1 &2045 pid5=$!2046 2047 sleep 3002048 kill -9 $pid1 $pid2 $pid3 $pid4 $pid52049 wait $pid1 $pid2 $pid3 $pid4 $pid5 2>/dev/null2050 2051 # if we did not crash, success2052 log_test 0 0 "IPv4 torture test"2053}2054 2055ipv4_res_grp_replace_loop()2056{2057 while :; do2058 $IP nexthop replace id 102 group 100/101 type resilient2059 done >/dev/null 2>&12060}2061 2062ipv4_res_torture()2063{2064 local pid12065 local pid22066 local pid32067 local pid42068 local pid52069 2070 echo2071 echo "IPv4 runtime resilient nexthop group torture"2072 echo "--------------------------------------------"2073 2074 check_nexthop_res_support2075 if [ $? -eq $ksft_skip ]; then2076 return $ksft_skip2077 fi2078 2079 if [ ! -x "$(command -v mausezahn)" ]; then2080 echo "SKIP: Could not run test; need mausezahn tool"2081 return2082 fi2083 2084 run_cmd "$IP nexthop add id 100 via 172.16.1.2 dev veth1"2085 run_cmd "$IP nexthop add id 101 via 172.16.2.2 dev veth3"2086 run_cmd "$IP nexthop add id 102 group 100/101 type resilient buckets 512 idle_timer 0"2087 run_cmd "$IP route add 172.16.101.1 nhid 102"2088 run_cmd "$IP route add 172.16.101.2 nhid 102"2089 2090 ipv4_del_add_loop1 &2091 pid1=$!2092 ipv4_res_grp_replace_loop &2093 pid2=$!2094 ip netns exec $me ping -f 172.16.101.1 >/dev/null 2>&1 &2095 pid3=$!2096 ip netns exec $me ping -f 172.16.101.2 >/dev/null 2>&1 &2097 pid4=$!2098 ip netns exec $me mausezahn veth1 \2099 -B 172.16.101.2 -A 172.16.1.1 -c 0 \2100 -t tcp "dp=1-1023, flags=syn" >/dev/null 2>&1 &2101 pid5=$!2102 2103 sleep 3002104 kill -9 $pid1 $pid2 $pid3 $pid4 $pid52105 wait $pid1 $pid2 $pid3 $pid4 $pid5 2>/dev/null2106 2107 # if we did not crash, success2108 log_test 0 0 "IPv4 resilient nexthop group torture test"2109}2110 2111basic()2112{2113 echo2114 echo "Basic functional tests"2115 echo "----------------------"2116 run_cmd "$IP nexthop ls"2117 log_test $? 0 "List with nothing defined"2118 2119 run_cmd "$IP nexthop get id 1"2120 log_test $? 2 "Nexthop get on non-existent id"2121 2122 run_cmd "$IP nexthop del id 1"2123 log_test $? 2 "Nexthop del with non-existent id"2124 2125 run_cmd "$IP nexthop del id 1 group 1/2/3/4/5/6/7/8"2126 log_test $? 2 "Nexthop del with non-existent id and extra attributes"2127 2128 # attempt to create nh without a device or gw - fails2129 run_cmd "$IP nexthop add id 1"2130 log_test $? 2 "Nexthop with no device or gateway"2131 2132 # attempt to create nh with down device - fails2133 $IP li set veth1 down2134 run_cmd "$IP nexthop add id 1 dev veth1"2135 log_test $? 2 "Nexthop with down device"2136 2137 # create nh with linkdown device - fails2138 $IP li set veth1 up2139 ip -netns $peer li set veth2 down2140 run_cmd "$IP nexthop add id 1 dev veth1"2141 log_test $? 2 "Nexthop with device that is linkdown"2142 ip -netns $peer li set veth2 up2143 2144 # device only2145 run_cmd "$IP nexthop add id 1 dev veth1"2146 log_test $? 0 "Nexthop with device only"2147 2148 # create nh with duplicate id2149 run_cmd "$IP nexthop add id 1 dev veth3"2150 log_test $? 2 "Nexthop with duplicate id"2151 2152 # blackhole nexthop2153 run_cmd "$IP nexthop add id 2 blackhole"2154 log_test $? 0 "Blackhole nexthop"2155 2156 # blackhole nexthop can not have other specs2157 run_cmd "$IP nexthop replace id 2 blackhole dev veth1"2158 log_test $? 2 "Blackhole nexthop with other attributes"2159 2160 # blackhole nexthop should not be affected by the state of the loopback2161 # device2162 run_cmd "$IP link set dev lo down"2163 check_nexthop "id 2" "id 2 blackhole"2164 log_test $? 0 "Blackhole nexthop with loopback device down"2165 2166 run_cmd "$IP link set dev lo up"2167 2168 # Dump should not loop endlessly when maximum nexthop ID is configured.2169 run_cmd "$IP nexthop add id $((2**32-1)) blackhole"2170 run_cmd "timeout 5 $IP nexthop"2171 log_test $? 0 "Maximum nexthop ID dump"2172 2173 #2174 # groups2175 #2176 2177 run_cmd "$IP nexthop add id 101 group 1"2178 log_test $? 0 "Create group"2179 2180 run_cmd "$IP nexthop add id 102 group 2"2181 log_test $? 0 "Create group with blackhole nexthop"2182 2183 # multipath group can not have a blackhole as 1 path2184 run_cmd "$IP nexthop add id 103 group 1/2"2185 log_test $? 2 "Create multipath group where 1 path is a blackhole"2186 2187 # multipath group can not have a member replaced by a blackhole2188 run_cmd "$IP nexthop replace id 2 dev veth3"2189 run_cmd "$IP nexthop replace id 102 group 1/2"2190 run_cmd "$IP nexthop replace id 2 blackhole"2191 log_test $? 2 "Multipath group can not have a member replaced by blackhole"2192 2193 # attempt to create group with non-existent nexthop2194 run_cmd "$IP nexthop add id 103 group 12"2195 log_test $? 2 "Create group with non-existent nexthop"2196 2197 # attempt to create group with same nexthop2198 run_cmd "$IP nexthop add id 103 group 1/1"2199 log_test $? 2 "Create group with same nexthop multiple times"2200 2201 # replace nexthop with a group - fails2202 run_cmd "$IP nexthop replace id 2 group 1"2203 log_test $? 2 "Replace nexthop with nexthop group"2204 2205 # replace nexthop group with a nexthop - fails2206 run_cmd "$IP nexthop replace id 101 dev veth1"2207 log_test $? 2 "Replace nexthop group with nexthop"2208 2209 # nexthop group with other attributes fail2210 run_cmd "$IP nexthop add id 104 group 1 dev veth1"2211 log_test $? 2 "Nexthop group and device"2212 2213 # Tests to ensure that flushing works as expected.2214 run_cmd "$IP nexthop add id 105 blackhole proto 99"2215 run_cmd "$IP nexthop add id 106 blackhole proto 100"2216 run_cmd "$IP nexthop add id 107 blackhole proto 99"2217 run_cmd "$IP nexthop flush proto 99"2218 check_nexthop "id 105" ""2219 check_nexthop "id 106" "id 106 blackhole proto 100"2220 check_nexthop "id 107" ""2221 run_cmd "$IP nexthop flush proto 100"2222 check_nexthop "id 106" ""2223 2224 run_cmd "$IP nexthop flush proto 100"2225 log_test $? 0 "Test proto flush"2226 2227 run_cmd "$IP nexthop add id 104 group 1 blackhole"2228 log_test $? 2 "Nexthop group and blackhole"2229 2230 $IP nexthop flush >/dev/null 2>&12231 2232 # Test to ensure that flushing with a multi-part nexthop dump works as2233 # expected.2234 local batch_file=$(mktemp)2235 2236 for i in $(seq 1 $((64 * 1024))); do2237 echo "nexthop add id $i blackhole" >> $batch_file2238 done2239 2240 $IP -b $batch_file2241 $IP nexthop flush >/dev/null 2>&12242 [[ $($IP nexthop | wc -l) -eq 0 ]]2243 log_test $? 0 "Large scale nexthop flushing"2244 2245 rm $batch_file2246}2247 2248check_nexthop_buckets_balance()2249{2250 local nharg=$1; shift2251 local ret2252 2253 while (($# > 0)); do2254 local selector=$1; shift2255 local condition=$1; shift2256 local count2257 2258 count=$($IP -j nexthop bucket ${nharg} ${selector} | jq length)2259 (( $count $condition ))2260 ret=$?2261 if ((ret != 0)); then2262 return $ret2263 fi2264 done2265 2266 return 02267}2268 2269basic_res()2270{2271 echo2272 echo "Basic resilient nexthop group functional tests"2273 echo "----------------------------------------------"2274 2275 check_nexthop_res_support2276 if [ $? -eq $ksft_skip ]; then2277 return $ksft_skip2278 fi2279 2280 run_cmd "$IP nexthop add id 1 dev veth1"2281 2282 #2283 # resilient nexthop group addition2284 #2285 2286 run_cmd "$IP nexthop add id 101 group 1 type resilient buckets 8"2287 log_test $? 0 "Add a nexthop group with default parameters"2288 2289 run_cmd "$IP nexthop get id 101"2290 check_nexthop "id 101" \2291 "id 101 group 1 type resilient buckets 8 idle_timer 120 unbalanced_timer 0 unbalanced_time 0"2292 log_test $? 0 "Get a nexthop group with default parameters"2293 2294 run_cmd "$IP nexthop add id 102 group 1 type resilient2295 buckets 4 idle_timer 100 unbalanced_timer 5"2296 run_cmd "$IP nexthop get id 102"2297 check_nexthop "id 102" \2298 "id 102 group 1 type resilient buckets 4 idle_timer 100 unbalanced_timer 5 unbalanced_time 0"2299 log_test $? 0 "Get a nexthop group with non-default parameters"2300 2301 run_cmd "$IP nexthop add id 103 group 1 type resilient buckets 0"2302 log_test $? 2 "Add a nexthop group with 0 buckets"2303 2304 #2305 # resilient nexthop group replacement2306 #2307 2308 run_cmd "$IP nexthop replace id 101 group 1 type resilient2309 buckets 8 idle_timer 240 unbalanced_timer 80"2310 log_test $? 0 "Replace nexthop group parameters"2311 check_nexthop "id 101" \2312 "id 101 group 1 type resilient buckets 8 idle_timer 240 unbalanced_timer 80 unbalanced_time 0"2313 log_test $? 0 "Get a nexthop group after replacing parameters"2314 2315 run_cmd "$IP nexthop replace id 101 group 1 type resilient idle_timer 512"2316 log_test $? 0 "Replace idle timer"2317 check_nexthop "id 101" \2318 "id 101 group 1 type resilient buckets 8 idle_timer 512 unbalanced_timer 80 unbalanced_time 0"2319 log_test $? 0 "Get a nexthop group after replacing idle timer"2320 2321 run_cmd "$IP nexthop replace id 101 group 1 type resilient unbalanced_timer 256"2322 log_test $? 0 "Replace unbalanced timer"2323 check_nexthop "id 101" \2324 "id 101 group 1 type resilient buckets 8 idle_timer 512 unbalanced_timer 256 unbalanced_time 0"2325 log_test $? 0 "Get a nexthop group after replacing unbalanced timer"2326 2327 run_cmd "$IP nexthop replace id 101 group 1 type resilient"2328 log_test $? 0 "Replace with no parameters"2329 check_nexthop "id 101" \2330 "id 101 group 1 type resilient buckets 8 idle_timer 512 unbalanced_timer 256 unbalanced_time 0"2331 log_test $? 0 "Get a nexthop group after replacing no parameters"2332 2333 run_cmd "$IP nexthop replace id 101 group 1"2334 log_test $? 2 "Replace nexthop group type - implicit"2335 2336 run_cmd "$IP nexthop replace id 101 group 1 type mpath"2337 log_test $? 2 "Replace nexthop group type - explicit"2338 2339 run_cmd "$IP nexthop replace id 101 group 1 type resilient buckets 1024"2340 log_test $? 2 "Replace number of nexthop buckets"2341 2342 check_nexthop "id 101" \2343 "id 101 group 1 type resilient buckets 8 idle_timer 512 unbalanced_timer 256 unbalanced_time 0"2344 log_test $? 0 "Get a nexthop group after replacing with invalid parameters"2345 2346 #2347 # resilient nexthop buckets dump2348 #2349 2350 $IP nexthop flush >/dev/null 2>&12351 run_cmd "$IP nexthop add id 1 dev veth1"2352 run_cmd "$IP nexthop add id 2 dev veth3"2353 run_cmd "$IP nexthop add id 101 group 1/2 type resilient buckets 4"2354 run_cmd "$IP nexthop add id 201 group 1/2"2355 2356 check_nexthop_bucket "" \2357 "id 101 index 0 nhid 2 id 101 index 1 nhid 2 id 101 index 2 nhid 1 id 101 index 3 nhid 1"2358 log_test $? 0 "Dump all nexthop buckets"2359 2360 check_nexthop_bucket "list id 101" \2361 "id 101 index 0 nhid 2 id 101 index 1 nhid 2 id 101 index 2 nhid 1 id 101 index 3 nhid 1"2362 log_test $? 0 "Dump all nexthop buckets in a group"2363 2364 sleep 0.12365 (( $($IP -j nexthop bucket list id 101 |2366 jq '[.[] | select(.bucket.idle_time > 0 and2367 .bucket.idle_time < 2)] | length') == 4 ))2368 log_test $? 0 "All nexthop buckets report a positive near-zero idle time"2369 2370 check_nexthop_bucket "list dev veth1" \2371 "id 101 index 2 nhid 1 id 101 index 3 nhid 1"2372 log_test $? 0 "Dump all nexthop buckets with a specific nexthop device"2373 2374 check_nexthop_bucket "list nhid 2" \2375 "id 101 index 0 nhid 2 id 101 index 1 nhid 2"2376 log_test $? 0 "Dump all nexthop buckets with a specific nexthop identifier"2377 2378 run_cmd "$IP nexthop bucket list id 111"2379 log_test $? 2 "Dump all nexthop buckets in a non-existent group"2380 2381 run_cmd "$IP nexthop bucket list id 201"2382 log_test $? 2 "Dump all nexthop buckets in a non-resilient group"2383 2384 run_cmd "$IP nexthop bucket list dev bla"2385 log_test $? 255 "Dump all nexthop buckets using a non-existent device"2386 2387 run_cmd "$IP nexthop bucket list groups"2388 log_test $? 255 "Dump all nexthop buckets with invalid 'groups' keyword"2389 2390 run_cmd "$IP nexthop bucket list fdb"2391 log_test $? 255 "Dump all nexthop buckets with invalid 'fdb' keyword"2392 2393 # Dump should not loop endlessly when maximum nexthop ID is configured.2394 run_cmd "$IP nexthop add id $((2**32-1)) group 1/2 type resilient buckets 4"2395 run_cmd "timeout 5 $IP nexthop bucket"2396 log_test $? 0 "Maximum nexthop ID dump"2397 2398 #2399 # resilient nexthop buckets get requests2400 #2401 2402 check_nexthop_bucket "get id 101 index 0" "id 101 index 0 nhid 2"2403 log_test $? 0 "Get a valid nexthop bucket"2404 2405 run_cmd "$IP nexthop bucket get id 101 index 999"2406 log_test $? 2 "Get a nexthop bucket with valid group, but invalid index"2407 2408 run_cmd "$IP nexthop bucket get id 201 index 0"2409 log_test $? 2 "Get a nexthop bucket from a non-resilient group"2410 2411 run_cmd "$IP nexthop bucket get id 999 index 0"2412 log_test $? 2 "Get a nexthop bucket from a non-existent group"2413 2414 #2415 # tests for bucket migration2416 #2417 2418 $IP nexthop flush >/dev/null 2>&12419 2420 run_cmd "$IP nexthop add id 1 dev veth1"2421 run_cmd "$IP nexthop add id 2 dev veth3"2422 run_cmd "$IP nexthop add id 1012423 group 1/2 type resilient buckets 102424 idle_timer 1 unbalanced_timer 20"2425 2426 check_nexthop_buckets_balance "list id 101" \2427 "nhid 1" "== 5" \2428 "nhid 2" "== 5"2429 log_test $? 0 "Initial bucket allocation"2430 2431 run_cmd "$IP nexthop replace id 1012432 group 1,2/2,3 type resilient"2433 check_nexthop_buckets_balance "list id 101" \2434 "nhid 1" "== 4" \2435 "nhid 2" "== 6"2436 log_test $? 0 "Bucket allocation after replace"2437 2438 # Check that increase in idle timer does not make buckets appear busy.2439 run_cmd "$IP nexthop replace id 1012440 group 1,2/2,3 type resilient2441 idle_timer 10"2442 run_cmd "$IP nexthop replace id 1012443 group 1/2 type resilient"2444 check_nexthop_buckets_balance "list id 101" \2445 "nhid 1" "== 5" \2446 "nhid 2" "== 5"2447 log_test $? 0 "Buckets migrated after idle timer change"2448 2449 $IP nexthop flush >/dev/null 2>&12450}2451 2452################################################################################2453# usage2454 2455usage()2456{2457 cat <<EOF2458usage: ${0##*/} OPTS2459 2460 -t <test> Test(s) to run (default: all)2461 (options: $ALL_TESTS)2462 -4 IPv4 tests only2463 -6 IPv6 tests only2464 -p Pause on fail2465 -P Pause after each test before cleanup2466 -v verbose mode (show commands and output)2467 -w Timeout for ping2468 2469 Runtime test2470 -n num Number of nexthops to target2471 -N Use new style to install routes in DUT2472 2473done2474EOF2475}2476 2477################################################################################2478# main2479 2480while getopts :t:pP46hvw: o2481do2482 case $o in2483 t) TESTS=$OPTARG;;2484 4) TESTS=${IPV4_TESTS};;2485 6) TESTS=${IPV6_TESTS};;2486 p) PAUSE_ON_FAIL=yes;;2487 P) PAUSE=yes;;2488 v) VERBOSE=$(($VERBOSE + 1));;2489 w) PING_TIMEOUT=$OPTARG;;2490 h) usage; exit 0;;2491 *) usage; exit 1;;2492 esac2493done2494 2495# make sure we don't pause twice2496[ "${PAUSE}" = "yes" ] && PAUSE_ON_FAIL=no2497 2498if [ "$(id -u)" -ne 0 ];then2499 echo "SKIP: Need root privileges"2500 exit $ksft_skip;2501fi2502 2503if [ ! -x "$(command -v ip)" ]; then2504 echo "SKIP: Could not run test without ip tool"2505 exit $ksft_skip2506fi2507 2508ip help 2>&1 | grep -q nexthop2509if [ $? -ne 0 ]; then2510 echo "SKIP: iproute2 too old, missing nexthop command"2511 exit $ksft_skip2512fi2513 2514out=$(ip nexthop ls 2>&1 | grep -q "Operation not supported")2515if [ $? -eq 0 ]; then2516 echo "SKIP: kernel lacks nexthop support"2517 exit $ksft_skip2518fi2519 2520for t in $TESTS2521do2522 case $t in2523 none) IP="ip -netns $peer"; setup; exit 0;;2524 *) setup; $t; cleanup;;2525 esac2526done2527 2528if [ "$TESTS" != "none" ]; then2529 printf "\nTests passed: %3d\n" ${nsuccess}2530 printf "Tests failed: %3d\n" ${nfail}2531fi2532 2533exit $ret2534