1*4882a593Smuzhiyun#!/bin/bash 2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0 3*4882a593Smuzhiyun# 4*4882a593Smuzhiyun# ns: me | ns: peer | ns: remote 5*4882a593Smuzhiyun# 2001:db8:91::1 | 2001:db8:91::2 | 6*4882a593Smuzhiyun# 172.16.1.1 | 172.16.1.2 | 7*4882a593Smuzhiyun# veth1 <---|---> veth2 | 8*4882a593Smuzhiyun# | veth5 <--|--> veth6 172.16.101.1 9*4882a593Smuzhiyun# veth3 <---|---> veth4 | 2001:db8:101::1 10*4882a593Smuzhiyun# 172.16.2.1 | 172.16.2.2 | 11*4882a593Smuzhiyun# 2001:db8:92::1 | 2001:db8:92::2 | 12*4882a593Smuzhiyun# 13*4882a593Smuzhiyun# This test is for checking IPv4 and IPv6 FIB behavior with nexthop 14*4882a593Smuzhiyun# objects. Device reference counts and network namespace cleanup tested 15*4882a593Smuzhiyun# by use of network namespace for peer. 16*4882a593Smuzhiyun 17*4882a593Smuzhiyunret=0 18*4882a593Smuzhiyun# Kselftest framework requirement - SKIP code is 4. 19*4882a593Smuzhiyunksft_skip=4 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun# all tests in this script. Can be overridden with -t option 22*4882a593SmuzhiyunIPV4_TESTS="ipv4_fcnal ipv4_grp_fcnal ipv4_withv6_fcnal ipv4_fcnal_runtime ipv4_large_grp ipv4_compat_mode ipv4_fdb_grp_fcnal ipv4_torture" 23*4882a593SmuzhiyunIPV6_TESTS="ipv6_fcnal ipv6_grp_fcnal ipv6_fcnal_runtime ipv6_large_grp ipv6_compat_mode ipv6_fdb_grp_fcnal ipv6_torture" 24*4882a593Smuzhiyun 25*4882a593SmuzhiyunALL_TESTS="basic ${IPV4_TESTS} ${IPV6_TESTS}" 26*4882a593SmuzhiyunTESTS="${ALL_TESTS}" 27*4882a593SmuzhiyunVERBOSE=0 28*4882a593SmuzhiyunPAUSE_ON_FAIL=no 29*4882a593SmuzhiyunPAUSE=no 30*4882a593Smuzhiyun 31*4882a593Smuzhiyunnsid=100 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun################################################################################ 34*4882a593Smuzhiyun# utilities 35*4882a593Smuzhiyun 36*4882a593Smuzhiyunlog_test() 37*4882a593Smuzhiyun{ 38*4882a593Smuzhiyun local rc=$1 39*4882a593Smuzhiyun local expected=$2 40*4882a593Smuzhiyun local msg="$3" 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun if [ ${rc} -eq ${expected} ]; then 43*4882a593Smuzhiyun printf "TEST: %-60s [ OK ]\n" "${msg}" 44*4882a593Smuzhiyun nsuccess=$((nsuccess+1)) 45*4882a593Smuzhiyun else 46*4882a593Smuzhiyun ret=1 47*4882a593Smuzhiyun nfail=$((nfail+1)) 48*4882a593Smuzhiyun printf "TEST: %-60s [FAIL]\n" "${msg}" 49*4882a593Smuzhiyun if [ "$VERBOSE" = "1" ]; then 50*4882a593Smuzhiyun echo " rc=$rc, expected $expected" 51*4882a593Smuzhiyun fi 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun if [ "${PAUSE_ON_FAIL}" = "yes" ]; then 54*4882a593Smuzhiyun echo 55*4882a593Smuzhiyun echo "hit enter to continue, 'q' to quit" 56*4882a593Smuzhiyun read a 57*4882a593Smuzhiyun [ "$a" = "q" ] && exit 1 58*4882a593Smuzhiyun fi 59*4882a593Smuzhiyun fi 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun if [ "${PAUSE}" = "yes" ]; then 62*4882a593Smuzhiyun echo 63*4882a593Smuzhiyun echo "hit enter to continue, 'q' to quit" 64*4882a593Smuzhiyun read a 65*4882a593Smuzhiyun [ "$a" = "q" ] && exit 1 66*4882a593Smuzhiyun fi 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun [ "$VERBOSE" = "1" ] && echo 69*4882a593Smuzhiyun} 70*4882a593Smuzhiyun 71*4882a593Smuzhiyunrun_cmd() 72*4882a593Smuzhiyun{ 73*4882a593Smuzhiyun local cmd="$1" 74*4882a593Smuzhiyun local out 75*4882a593Smuzhiyun local stderr="2>/dev/null" 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun if [ "$VERBOSE" = "1" ]; then 78*4882a593Smuzhiyun printf "COMMAND: $cmd\n" 79*4882a593Smuzhiyun stderr= 80*4882a593Smuzhiyun fi 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun out=$(eval $cmd $stderr) 83*4882a593Smuzhiyun rc=$? 84*4882a593Smuzhiyun if [ "$VERBOSE" = "1" -a -n "$out" ]; then 85*4882a593Smuzhiyun echo " $out" 86*4882a593Smuzhiyun fi 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun return $rc 89*4882a593Smuzhiyun} 90*4882a593Smuzhiyun 91*4882a593Smuzhiyunget_linklocal() 92*4882a593Smuzhiyun{ 93*4882a593Smuzhiyun local dev=$1 94*4882a593Smuzhiyun local ns 95*4882a593Smuzhiyun local addr 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun [ -n "$2" ] && ns="-netns $2" 98*4882a593Smuzhiyun addr=$(ip $ns -6 -br addr show dev ${dev} | \ 99*4882a593Smuzhiyun awk '{ 100*4882a593Smuzhiyun for (i = 3; i <= NF; ++i) { 101*4882a593Smuzhiyun if ($i ~ /^fe80/) 102*4882a593Smuzhiyun print $i 103*4882a593Smuzhiyun } 104*4882a593Smuzhiyun }' 105*4882a593Smuzhiyun ) 106*4882a593Smuzhiyun addr=${addr/\/*} 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun [ -z "$addr" ] && return 1 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun echo $addr 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun return 0 113*4882a593Smuzhiyun} 114*4882a593Smuzhiyun 115*4882a593Smuzhiyuncreate_ns() 116*4882a593Smuzhiyun{ 117*4882a593Smuzhiyun local n=${1} 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun ip netns del ${n} 2>/dev/null 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun set -e 122*4882a593Smuzhiyun ip netns add ${n} 123*4882a593Smuzhiyun ip netns set ${n} $((nsid++)) 124*4882a593Smuzhiyun ip -netns ${n} addr add 127.0.0.1/8 dev lo 125*4882a593Smuzhiyun ip -netns ${n} link set lo up 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun ip netns exec ${n} sysctl -qw net.ipv4.ip_forward=1 128*4882a593Smuzhiyun ip netns exec ${n} sysctl -qw net.ipv4.fib_multipath_use_neigh=1 129*4882a593Smuzhiyun ip netns exec ${n} sysctl -qw net.ipv4.conf.default.ignore_routes_with_linkdown=1 130*4882a593Smuzhiyun ip netns exec ${n} sysctl -qw net.ipv6.conf.all.keep_addr_on_down=1 131*4882a593Smuzhiyun ip netns exec ${n} sysctl -qw net.ipv6.conf.all.forwarding=1 132*4882a593Smuzhiyun ip netns exec ${n} sysctl -qw net.ipv6.conf.default.forwarding=1 133*4882a593Smuzhiyun ip netns exec ${n} sysctl -qw net.ipv6.conf.default.ignore_routes_with_linkdown=1 134*4882a593Smuzhiyun ip netns exec ${n} sysctl -qw net.ipv6.conf.all.accept_dad=0 135*4882a593Smuzhiyun ip netns exec ${n} sysctl -qw net.ipv6.conf.default.accept_dad=0 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun set +e 138*4882a593Smuzhiyun} 139*4882a593Smuzhiyun 140*4882a593Smuzhiyunsetup() 141*4882a593Smuzhiyun{ 142*4882a593Smuzhiyun cleanup 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun create_ns me 145*4882a593Smuzhiyun create_ns peer 146*4882a593Smuzhiyun create_ns remote 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun IP="ip -netns me" 149*4882a593Smuzhiyun BRIDGE="bridge -netns me" 150*4882a593Smuzhiyun set -e 151*4882a593Smuzhiyun $IP li add veth1 type veth peer name veth2 152*4882a593Smuzhiyun $IP li set veth1 up 153*4882a593Smuzhiyun $IP addr add 172.16.1.1/24 dev veth1 154*4882a593Smuzhiyun $IP -6 addr add 2001:db8:91::1/64 dev veth1 nodad 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun $IP li add veth3 type veth peer name veth4 157*4882a593Smuzhiyun $IP li set veth3 up 158*4882a593Smuzhiyun $IP addr add 172.16.2.1/24 dev veth3 159*4882a593Smuzhiyun $IP -6 addr add 2001:db8:92::1/64 dev veth3 nodad 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun $IP li set veth2 netns peer up 162*4882a593Smuzhiyun ip -netns peer addr add 172.16.1.2/24 dev veth2 163*4882a593Smuzhiyun ip -netns peer -6 addr add 2001:db8:91::2/64 dev veth2 nodad 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun $IP li set veth4 netns peer up 166*4882a593Smuzhiyun ip -netns peer addr add 172.16.2.2/24 dev veth4 167*4882a593Smuzhiyun ip -netns peer -6 addr add 2001:db8:92::2/64 dev veth4 nodad 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun ip -netns remote li add veth5 type veth peer name veth6 170*4882a593Smuzhiyun ip -netns remote li set veth5 up 171*4882a593Smuzhiyun ip -netns remote addr add dev veth5 172.16.101.1/24 172*4882a593Smuzhiyun ip -netns remote -6 addr add dev veth5 2001:db8:101::1/64 nodad 173*4882a593Smuzhiyun ip -netns remote ro add 172.16.0.0/22 via 172.16.101.2 174*4882a593Smuzhiyun ip -netns remote -6 ro add 2001:db8:90::/40 via 2001:db8:101::2 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun ip -netns remote li set veth6 netns peer up 177*4882a593Smuzhiyun ip -netns peer addr add dev veth6 172.16.101.2/24 178*4882a593Smuzhiyun ip -netns peer -6 addr add dev veth6 2001:db8:101::2/64 nodad 179*4882a593Smuzhiyun set +e 180*4882a593Smuzhiyun} 181*4882a593Smuzhiyun 182*4882a593Smuzhiyuncleanup() 183*4882a593Smuzhiyun{ 184*4882a593Smuzhiyun local ns 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun for ns in me peer remote; do 187*4882a593Smuzhiyun ip netns del ${ns} 2>/dev/null 188*4882a593Smuzhiyun done 189*4882a593Smuzhiyun} 190*4882a593Smuzhiyun 191*4882a593Smuzhiyuncheck_output() 192*4882a593Smuzhiyun{ 193*4882a593Smuzhiyun local out="$1" 194*4882a593Smuzhiyun local expected="$2" 195*4882a593Smuzhiyun local rc=0 196*4882a593Smuzhiyun 197*4882a593Smuzhiyun [ "${out}" = "${expected}" ] && return 0 198*4882a593Smuzhiyun 199*4882a593Smuzhiyun if [ -z "${out}" ]; then 200*4882a593Smuzhiyun if [ "$VERBOSE" = "1" ]; then 201*4882a593Smuzhiyun printf "\nNo entry found\n" 202*4882a593Smuzhiyun printf "Expected:\n" 203*4882a593Smuzhiyun printf " ${expected}\n" 204*4882a593Smuzhiyun fi 205*4882a593Smuzhiyun return 1 206*4882a593Smuzhiyun fi 207*4882a593Smuzhiyun 208*4882a593Smuzhiyun out=$(echo ${out}) 209*4882a593Smuzhiyun if [ "${out}" != "${expected}" ]; then 210*4882a593Smuzhiyun rc=1 211*4882a593Smuzhiyun if [ "${VERBOSE}" = "1" ]; then 212*4882a593Smuzhiyun printf " Unexpected entry. Have:\n" 213*4882a593Smuzhiyun printf " ${out}\n" 214*4882a593Smuzhiyun printf " Expected:\n" 215*4882a593Smuzhiyun printf " ${expected}\n\n" 216*4882a593Smuzhiyun else 217*4882a593Smuzhiyun echo " WARNING: Unexpected route entry" 218*4882a593Smuzhiyun fi 219*4882a593Smuzhiyun fi 220*4882a593Smuzhiyun 221*4882a593Smuzhiyun return $rc 222*4882a593Smuzhiyun} 223*4882a593Smuzhiyun 224*4882a593Smuzhiyuncheck_nexthop() 225*4882a593Smuzhiyun{ 226*4882a593Smuzhiyun local nharg="$1" 227*4882a593Smuzhiyun local expected="$2" 228*4882a593Smuzhiyun local out 229*4882a593Smuzhiyun 230*4882a593Smuzhiyun out=$($IP nexthop ls ${nharg} 2>/dev/null) 231*4882a593Smuzhiyun 232*4882a593Smuzhiyun check_output "${out}" "${expected}" 233*4882a593Smuzhiyun} 234*4882a593Smuzhiyun 235*4882a593Smuzhiyuncheck_route() 236*4882a593Smuzhiyun{ 237*4882a593Smuzhiyun local pfx="$1" 238*4882a593Smuzhiyun local expected="$2" 239*4882a593Smuzhiyun local out 240*4882a593Smuzhiyun 241*4882a593Smuzhiyun out=$($IP route ls match ${pfx} 2>/dev/null) 242*4882a593Smuzhiyun 243*4882a593Smuzhiyun check_output "${out}" "${expected}" 244*4882a593Smuzhiyun} 245*4882a593Smuzhiyun 246*4882a593Smuzhiyuncheck_route6() 247*4882a593Smuzhiyun{ 248*4882a593Smuzhiyun local pfx="$1" 249*4882a593Smuzhiyun local expected="$2" 250*4882a593Smuzhiyun local out 251*4882a593Smuzhiyun 252*4882a593Smuzhiyun out=$($IP -6 route ls match ${pfx} 2>/dev/null | sed -e 's/pref medium//') 253*4882a593Smuzhiyun 254*4882a593Smuzhiyun check_output "${out}" "${expected}" 255*4882a593Smuzhiyun} 256*4882a593Smuzhiyun 257*4882a593Smuzhiyuncheck_large_grp() 258*4882a593Smuzhiyun{ 259*4882a593Smuzhiyun local ipv=$1 260*4882a593Smuzhiyun local ecmp=$2 261*4882a593Smuzhiyun local grpnum=100 262*4882a593Smuzhiyun local nhidstart=100 263*4882a593Smuzhiyun local grpidstart=1000 264*4882a593Smuzhiyun local iter=0 265*4882a593Smuzhiyun local nhidstr="" 266*4882a593Smuzhiyun local grpidstr="" 267*4882a593Smuzhiyun local grpstr="" 268*4882a593Smuzhiyun local ipstr="" 269*4882a593Smuzhiyun 270*4882a593Smuzhiyun if [ $ipv -eq 4 ]; then 271*4882a593Smuzhiyun ipstr="172.16.1." 272*4882a593Smuzhiyun else 273*4882a593Smuzhiyun ipstr="2001:db8:91::" 274*4882a593Smuzhiyun fi 275*4882a593Smuzhiyun 276*4882a593Smuzhiyun # 277*4882a593Smuzhiyun # Create $grpnum groups with specified $ecmp and dump them 278*4882a593Smuzhiyun # 279*4882a593Smuzhiyun 280*4882a593Smuzhiyun # create nexthops with different gateways 281*4882a593Smuzhiyun iter=2 282*4882a593Smuzhiyun while [ $iter -le $(($ecmp + 1)) ] 283*4882a593Smuzhiyun do 284*4882a593Smuzhiyun nhidstr="$(($nhidstart + $iter))" 285*4882a593Smuzhiyun run_cmd "$IP nexthop add id $nhidstr via $ipstr$iter dev veth1" 286*4882a593Smuzhiyun check_nexthop "id $nhidstr" "id $nhidstr via $ipstr$iter dev veth1 scope link" 287*4882a593Smuzhiyun 288*4882a593Smuzhiyun if [ $iter -le $ecmp ]; then 289*4882a593Smuzhiyun grpstr+="$nhidstr/" 290*4882a593Smuzhiyun else 291*4882a593Smuzhiyun grpstr+="$nhidstr" 292*4882a593Smuzhiyun fi 293*4882a593Smuzhiyun ((iter++)) 294*4882a593Smuzhiyun done 295*4882a593Smuzhiyun 296*4882a593Smuzhiyun # create duplicate large ecmp groups 297*4882a593Smuzhiyun iter=0 298*4882a593Smuzhiyun while [ $iter -le $grpnum ] 299*4882a593Smuzhiyun do 300*4882a593Smuzhiyun grpidstr="$(($grpidstart + $iter))" 301*4882a593Smuzhiyun run_cmd "$IP nexthop add id $grpidstr group $grpstr" 302*4882a593Smuzhiyun check_nexthop "id $grpidstr" "id $grpidstr group $grpstr" 303*4882a593Smuzhiyun ((iter++)) 304*4882a593Smuzhiyun done 305*4882a593Smuzhiyun 306*4882a593Smuzhiyun # dump large groups 307*4882a593Smuzhiyun run_cmd "$IP nexthop list" 308*4882a593Smuzhiyun log_test $? 0 "Dump large (x$ecmp) ecmp groups" 309*4882a593Smuzhiyun} 310*4882a593Smuzhiyun 311*4882a593Smuzhiyunstart_ip_monitor() 312*4882a593Smuzhiyun{ 313*4882a593Smuzhiyun local mtype=$1 314*4882a593Smuzhiyun 315*4882a593Smuzhiyun # start the monitor in the background 316*4882a593Smuzhiyun tmpfile=`mktemp /var/run/nexthoptestXXX` 317*4882a593Smuzhiyun mpid=`($IP monitor $mtype > $tmpfile & echo $!) 2>/dev/null` 318*4882a593Smuzhiyun sleep 0.2 319*4882a593Smuzhiyun echo "$mpid $tmpfile" 320*4882a593Smuzhiyun} 321*4882a593Smuzhiyun 322*4882a593Smuzhiyunstop_ip_monitor() 323*4882a593Smuzhiyun{ 324*4882a593Smuzhiyun local mpid=$1 325*4882a593Smuzhiyun local tmpfile=$2 326*4882a593Smuzhiyun local el=$3 327*4882a593Smuzhiyun 328*4882a593Smuzhiyun # check the monitor results 329*4882a593Smuzhiyun kill $mpid 330*4882a593Smuzhiyun lines=`wc -l $tmpfile | cut "-d " -f1` 331*4882a593Smuzhiyun test $lines -eq $el 332*4882a593Smuzhiyun rc=$? 333*4882a593Smuzhiyun rm -rf $tmpfile 334*4882a593Smuzhiyun 335*4882a593Smuzhiyun return $rc 336*4882a593Smuzhiyun} 337*4882a593Smuzhiyun 338*4882a593Smuzhiyuncheck_nexthop_fdb_support() 339*4882a593Smuzhiyun{ 340*4882a593Smuzhiyun $IP nexthop help 2>&1 | grep -q fdb 341*4882a593Smuzhiyun if [ $? -ne 0 ]; then 342*4882a593Smuzhiyun echo "SKIP: iproute2 too old, missing fdb nexthop support" 343*4882a593Smuzhiyun return $ksft_skip 344*4882a593Smuzhiyun fi 345*4882a593Smuzhiyun} 346*4882a593Smuzhiyun 347*4882a593Smuzhiyunipv6_fdb_grp_fcnal() 348*4882a593Smuzhiyun{ 349*4882a593Smuzhiyun local rc 350*4882a593Smuzhiyun 351*4882a593Smuzhiyun echo 352*4882a593Smuzhiyun echo "IPv6 fdb groups functional" 353*4882a593Smuzhiyun echo "--------------------------" 354*4882a593Smuzhiyun 355*4882a593Smuzhiyun check_nexthop_fdb_support 356*4882a593Smuzhiyun if [ $? -eq $ksft_skip ]; then 357*4882a593Smuzhiyun return $ksft_skip 358*4882a593Smuzhiyun fi 359*4882a593Smuzhiyun 360*4882a593Smuzhiyun # create group with multiple nexthops 361*4882a593Smuzhiyun run_cmd "$IP nexthop add id 61 via 2001:db8:91::2 fdb" 362*4882a593Smuzhiyun run_cmd "$IP nexthop add id 62 via 2001:db8:91::3 fdb" 363*4882a593Smuzhiyun run_cmd "$IP nexthop add id 102 group 61/62 fdb" 364*4882a593Smuzhiyun check_nexthop "id 102" "id 102 group 61/62 fdb" 365*4882a593Smuzhiyun log_test $? 0 "Fdb Nexthop group with multiple nexthops" 366*4882a593Smuzhiyun 367*4882a593Smuzhiyun ## get nexthop group 368*4882a593Smuzhiyun run_cmd "$IP nexthop get id 102" 369*4882a593Smuzhiyun check_nexthop "id 102" "id 102 group 61/62 fdb" 370*4882a593Smuzhiyun log_test $? 0 "Get Fdb nexthop group by id" 371*4882a593Smuzhiyun 372*4882a593Smuzhiyun # fdb nexthop group can only contain fdb nexthops 373*4882a593Smuzhiyun run_cmd "$IP nexthop add id 63 via 2001:db8:91::4" 374*4882a593Smuzhiyun run_cmd "$IP nexthop add id 64 via 2001:db8:91::5" 375*4882a593Smuzhiyun run_cmd "$IP nexthop add id 103 group 63/64 fdb" 376*4882a593Smuzhiyun log_test $? 2 "Fdb Nexthop group with non-fdb nexthops" 377*4882a593Smuzhiyun 378*4882a593Smuzhiyun # Non fdb nexthop group can not contain fdb nexthops 379*4882a593Smuzhiyun run_cmd "$IP nexthop add id 65 via 2001:db8:91::5 fdb" 380*4882a593Smuzhiyun run_cmd "$IP nexthop add id 66 via 2001:db8:91::6 fdb" 381*4882a593Smuzhiyun run_cmd "$IP nexthop add id 104 group 65/66" 382*4882a593Smuzhiyun log_test $? 2 "Non-Fdb Nexthop group with fdb nexthops" 383*4882a593Smuzhiyun 384*4882a593Smuzhiyun # fdb nexthop cannot have blackhole 385*4882a593Smuzhiyun run_cmd "$IP nexthop add id 67 blackhole fdb" 386*4882a593Smuzhiyun log_test $? 2 "Fdb Nexthop with blackhole" 387*4882a593Smuzhiyun 388*4882a593Smuzhiyun # fdb nexthop with oif 389*4882a593Smuzhiyun run_cmd "$IP nexthop add id 68 via 2001:db8:91::7 dev veth1 fdb" 390*4882a593Smuzhiyun log_test $? 2 "Fdb Nexthop with oif" 391*4882a593Smuzhiyun 392*4882a593Smuzhiyun # fdb nexthop with onlink 393*4882a593Smuzhiyun run_cmd "$IP nexthop add id 68 via 2001:db8:91::7 onlink fdb" 394*4882a593Smuzhiyun log_test $? 2 "Fdb Nexthop with onlink" 395*4882a593Smuzhiyun 396*4882a593Smuzhiyun # fdb nexthop with encap 397*4882a593Smuzhiyun run_cmd "$IP nexthop add id 69 encap mpls 101 via 2001:db8:91::8 dev veth1 fdb" 398*4882a593Smuzhiyun log_test $? 2 "Fdb Nexthop with encap" 399*4882a593Smuzhiyun 400*4882a593Smuzhiyun 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" 401*4882a593Smuzhiyun run_cmd "$BRIDGE fdb add 02:02:00:00:00:13 dev vx10 nhid 102 self" 402*4882a593Smuzhiyun log_test $? 0 "Fdb mac add with nexthop group" 403*4882a593Smuzhiyun 404*4882a593Smuzhiyun ## fdb nexthops can only reference nexthop groups and not nexthops 405*4882a593Smuzhiyun run_cmd "$BRIDGE fdb add 02:02:00:00:00:14 dev vx10 nhid 61 self" 406*4882a593Smuzhiyun log_test $? 255 "Fdb mac add with nexthop" 407*4882a593Smuzhiyun 408*4882a593Smuzhiyun run_cmd "$IP -6 ro add 2001:db8:101::1/128 nhid 66" 409*4882a593Smuzhiyun log_test $? 2 "Route add with fdb nexthop" 410*4882a593Smuzhiyun 411*4882a593Smuzhiyun run_cmd "$IP -6 ro add 2001:db8:101::1/128 nhid 103" 412*4882a593Smuzhiyun log_test $? 2 "Route add with fdb nexthop group" 413*4882a593Smuzhiyun 414*4882a593Smuzhiyun run_cmd "$IP nexthop del id 61" 415*4882a593Smuzhiyun run_cmd "$BRIDGE fdb get to 02:02:00:00:00:13 dev vx10 self" 416*4882a593Smuzhiyun log_test $? 0 "Fdb entry after deleting a single nexthop" 417*4882a593Smuzhiyun 418*4882a593Smuzhiyun run_cmd "$IP nexthop del id 102" 419*4882a593Smuzhiyun log_test $? 0 "Fdb nexthop delete" 420*4882a593Smuzhiyun 421*4882a593Smuzhiyun run_cmd "$BRIDGE fdb get to 02:02:00:00:00:13 dev vx10 self" 422*4882a593Smuzhiyun log_test $? 254 "Fdb entry after deleting a nexthop group" 423*4882a593Smuzhiyun 424*4882a593Smuzhiyun $IP link del dev vx10 425*4882a593Smuzhiyun} 426*4882a593Smuzhiyun 427*4882a593Smuzhiyunipv4_fdb_grp_fcnal() 428*4882a593Smuzhiyun{ 429*4882a593Smuzhiyun local rc 430*4882a593Smuzhiyun 431*4882a593Smuzhiyun echo 432*4882a593Smuzhiyun echo "IPv4 fdb groups functional" 433*4882a593Smuzhiyun echo "--------------------------" 434*4882a593Smuzhiyun 435*4882a593Smuzhiyun check_nexthop_fdb_support 436*4882a593Smuzhiyun if [ $? -eq $ksft_skip ]; then 437*4882a593Smuzhiyun return $ksft_skip 438*4882a593Smuzhiyun fi 439*4882a593Smuzhiyun 440*4882a593Smuzhiyun # create group with multiple nexthops 441*4882a593Smuzhiyun run_cmd "$IP nexthop add id 12 via 172.16.1.2 fdb" 442*4882a593Smuzhiyun run_cmd "$IP nexthop add id 13 via 172.16.1.3 fdb" 443*4882a593Smuzhiyun run_cmd "$IP nexthop add id 102 group 12/13 fdb" 444*4882a593Smuzhiyun check_nexthop "id 102" "id 102 group 12/13 fdb" 445*4882a593Smuzhiyun log_test $? 0 "Fdb Nexthop group with multiple nexthops" 446*4882a593Smuzhiyun 447*4882a593Smuzhiyun # get nexthop group 448*4882a593Smuzhiyun run_cmd "$IP nexthop get id 102" 449*4882a593Smuzhiyun check_nexthop "id 102" "id 102 group 12/13 fdb" 450*4882a593Smuzhiyun log_test $? 0 "Get Fdb nexthop group by id" 451*4882a593Smuzhiyun 452*4882a593Smuzhiyun # fdb nexthop group can only contain fdb nexthops 453*4882a593Smuzhiyun run_cmd "$IP nexthop add id 14 via 172.16.1.2" 454*4882a593Smuzhiyun run_cmd "$IP nexthop add id 15 via 172.16.1.3" 455*4882a593Smuzhiyun run_cmd "$IP nexthop add id 103 group 14/15 fdb" 456*4882a593Smuzhiyun log_test $? 2 "Fdb Nexthop group with non-fdb nexthops" 457*4882a593Smuzhiyun 458*4882a593Smuzhiyun # Non fdb nexthop group can not contain fdb nexthops 459*4882a593Smuzhiyun run_cmd "$IP nexthop add id 16 via 172.16.1.2 fdb" 460*4882a593Smuzhiyun run_cmd "$IP nexthop add id 17 via 172.16.1.3 fdb" 461*4882a593Smuzhiyun run_cmd "$IP nexthop add id 104 group 14/15" 462*4882a593Smuzhiyun log_test $? 2 "Non-Fdb Nexthop group with fdb nexthops" 463*4882a593Smuzhiyun 464*4882a593Smuzhiyun # fdb nexthop cannot have blackhole 465*4882a593Smuzhiyun run_cmd "$IP nexthop add id 18 blackhole fdb" 466*4882a593Smuzhiyun log_test $? 2 "Fdb Nexthop with blackhole" 467*4882a593Smuzhiyun 468*4882a593Smuzhiyun # fdb nexthop with oif 469*4882a593Smuzhiyun run_cmd "$IP nexthop add id 16 via 172.16.1.2 dev veth1 fdb" 470*4882a593Smuzhiyun log_test $? 2 "Fdb Nexthop with oif" 471*4882a593Smuzhiyun 472*4882a593Smuzhiyun # fdb nexthop with onlink 473*4882a593Smuzhiyun run_cmd "$IP nexthop add id 16 via 172.16.1.2 onlink fdb" 474*4882a593Smuzhiyun log_test $? 2 "Fdb Nexthop with onlink" 475*4882a593Smuzhiyun 476*4882a593Smuzhiyun # fdb nexthop with encap 477*4882a593Smuzhiyun run_cmd "$IP nexthop add id 17 encap mpls 101 via 172.16.1.2 dev veth1 fdb" 478*4882a593Smuzhiyun log_test $? 2 "Fdb Nexthop with encap" 479*4882a593Smuzhiyun 480*4882a593Smuzhiyun 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" 481*4882a593Smuzhiyun run_cmd "$BRIDGE fdb add 02:02:00:00:00:13 dev vx10 nhid 102 self" 482*4882a593Smuzhiyun log_test $? 0 "Fdb mac add with nexthop group" 483*4882a593Smuzhiyun 484*4882a593Smuzhiyun # fdb nexthops can only reference nexthop groups and not nexthops 485*4882a593Smuzhiyun run_cmd "$BRIDGE fdb add 02:02:00:00:00:14 dev vx10 nhid 12 self" 486*4882a593Smuzhiyun log_test $? 255 "Fdb mac add with nexthop" 487*4882a593Smuzhiyun 488*4882a593Smuzhiyun run_cmd "$IP ro add 172.16.0.0/22 nhid 15" 489*4882a593Smuzhiyun log_test $? 2 "Route add with fdb nexthop" 490*4882a593Smuzhiyun 491*4882a593Smuzhiyun run_cmd "$IP ro add 172.16.0.0/22 nhid 103" 492*4882a593Smuzhiyun log_test $? 2 "Route add with fdb nexthop group" 493*4882a593Smuzhiyun 494*4882a593Smuzhiyun run_cmd "$IP nexthop del id 12" 495*4882a593Smuzhiyun run_cmd "$BRIDGE fdb get to 02:02:00:00:00:13 dev vx10 self" 496*4882a593Smuzhiyun log_test $? 0 "Fdb entry after deleting a single nexthop" 497*4882a593Smuzhiyun 498*4882a593Smuzhiyun run_cmd "$IP nexthop del id 102" 499*4882a593Smuzhiyun log_test $? 0 "Fdb nexthop delete" 500*4882a593Smuzhiyun 501*4882a593Smuzhiyun run_cmd "$BRIDGE fdb get to 02:02:00:00:00:13 dev vx10 self" 502*4882a593Smuzhiyun log_test $? 254 "Fdb entry after deleting a nexthop group" 503*4882a593Smuzhiyun 504*4882a593Smuzhiyun $IP link del dev vx10 505*4882a593Smuzhiyun} 506*4882a593Smuzhiyun 507*4882a593Smuzhiyun################################################################################ 508*4882a593Smuzhiyun# basic operations (add, delete, replace) on nexthops and nexthop groups 509*4882a593Smuzhiyun# 510*4882a593Smuzhiyun# IPv6 511*4882a593Smuzhiyun 512*4882a593Smuzhiyunipv6_fcnal() 513*4882a593Smuzhiyun{ 514*4882a593Smuzhiyun local rc 515*4882a593Smuzhiyun 516*4882a593Smuzhiyun echo 517*4882a593Smuzhiyun echo "IPv6" 518*4882a593Smuzhiyun echo "----------------------" 519*4882a593Smuzhiyun 520*4882a593Smuzhiyun run_cmd "$IP nexthop add id 52 via 2001:db8:91::2 dev veth1" 521*4882a593Smuzhiyun rc=$? 522*4882a593Smuzhiyun log_test $rc 0 "Create nexthop with id, gw, dev" 523*4882a593Smuzhiyun if [ $rc -ne 0 ]; then 524*4882a593Smuzhiyun echo "Basic IPv6 create fails; can not continue" 525*4882a593Smuzhiyun return 1 526*4882a593Smuzhiyun fi 527*4882a593Smuzhiyun 528*4882a593Smuzhiyun run_cmd "$IP nexthop get id 52" 529*4882a593Smuzhiyun log_test $? 0 "Get nexthop by id" 530*4882a593Smuzhiyun check_nexthop "id 52" "id 52 via 2001:db8:91::2 dev veth1 scope link" 531*4882a593Smuzhiyun 532*4882a593Smuzhiyun run_cmd "$IP nexthop del id 52" 533*4882a593Smuzhiyun log_test $? 0 "Delete nexthop by id" 534*4882a593Smuzhiyun check_nexthop "id 52" "" 535*4882a593Smuzhiyun 536*4882a593Smuzhiyun # 537*4882a593Smuzhiyun # gw, device spec 538*4882a593Smuzhiyun # 539*4882a593Smuzhiyun # gw validation, no device - fails since dev required 540*4882a593Smuzhiyun run_cmd "$IP nexthop add id 52 via 2001:db8:92::3" 541*4882a593Smuzhiyun log_test $? 2 "Create nexthop - gw only" 542*4882a593Smuzhiyun 543*4882a593Smuzhiyun # gw is not reachable throught given dev 544*4882a593Smuzhiyun run_cmd "$IP nexthop add id 53 via 2001:db8:3::3 dev veth1" 545*4882a593Smuzhiyun log_test $? 2 "Create nexthop - invalid gw+dev combination" 546*4882a593Smuzhiyun 547*4882a593Smuzhiyun # onlink arg overrides gw+dev lookup 548*4882a593Smuzhiyun run_cmd "$IP nexthop add id 53 via 2001:db8:3::3 dev veth1 onlink" 549*4882a593Smuzhiyun log_test $? 0 "Create nexthop - gw+dev and onlink" 550*4882a593Smuzhiyun 551*4882a593Smuzhiyun # admin down should delete nexthops 552*4882a593Smuzhiyun set -e 553*4882a593Smuzhiyun run_cmd "$IP -6 nexthop add id 55 via 2001:db8:91::3 dev veth1" 554*4882a593Smuzhiyun run_cmd "$IP nexthop add id 56 via 2001:db8:91::4 dev veth1" 555*4882a593Smuzhiyun run_cmd "$IP nexthop add id 57 via 2001:db8:91::5 dev veth1" 556*4882a593Smuzhiyun run_cmd "$IP li set dev veth1 down" 557*4882a593Smuzhiyun set +e 558*4882a593Smuzhiyun check_nexthop "dev veth1" "" 559*4882a593Smuzhiyun log_test $? 0 "Nexthops removed on admin down" 560*4882a593Smuzhiyun} 561*4882a593Smuzhiyun 562*4882a593Smuzhiyunipv6_grp_fcnal() 563*4882a593Smuzhiyun{ 564*4882a593Smuzhiyun local rc 565*4882a593Smuzhiyun 566*4882a593Smuzhiyun echo 567*4882a593Smuzhiyun echo "IPv6 groups functional" 568*4882a593Smuzhiyun echo "----------------------" 569*4882a593Smuzhiyun 570*4882a593Smuzhiyun # basic functionality: create a nexthop group, default weight 571*4882a593Smuzhiyun run_cmd "$IP nexthop add id 61 via 2001:db8:91::2 dev veth1" 572*4882a593Smuzhiyun run_cmd "$IP nexthop add id 101 group 61" 573*4882a593Smuzhiyun log_test $? 0 "Create nexthop group with single nexthop" 574*4882a593Smuzhiyun 575*4882a593Smuzhiyun # get nexthop group 576*4882a593Smuzhiyun run_cmd "$IP nexthop get id 101" 577*4882a593Smuzhiyun log_test $? 0 "Get nexthop group by id" 578*4882a593Smuzhiyun check_nexthop "id 101" "id 101 group 61" 579*4882a593Smuzhiyun 580*4882a593Smuzhiyun # delete nexthop group 581*4882a593Smuzhiyun run_cmd "$IP nexthop del id 101" 582*4882a593Smuzhiyun log_test $? 0 "Delete nexthop group by id" 583*4882a593Smuzhiyun check_nexthop "id 101" "" 584*4882a593Smuzhiyun 585*4882a593Smuzhiyun $IP nexthop flush >/dev/null 2>&1 586*4882a593Smuzhiyun check_nexthop "id 101" "" 587*4882a593Smuzhiyun 588*4882a593Smuzhiyun # 589*4882a593Smuzhiyun # create group with multiple nexthops - mix of gw and dev only 590*4882a593Smuzhiyun # 591*4882a593Smuzhiyun run_cmd "$IP nexthop add id 62 via 2001:db8:91::2 dev veth1" 592*4882a593Smuzhiyun run_cmd "$IP nexthop add id 63 via 2001:db8:91::3 dev veth1" 593*4882a593Smuzhiyun run_cmd "$IP nexthop add id 64 via 2001:db8:91::4 dev veth1" 594*4882a593Smuzhiyun run_cmd "$IP nexthop add id 65 dev veth1" 595*4882a593Smuzhiyun run_cmd "$IP nexthop add id 102 group 62/63/64/65" 596*4882a593Smuzhiyun log_test $? 0 "Nexthop group with multiple nexthops" 597*4882a593Smuzhiyun check_nexthop "id 102" "id 102 group 62/63/64/65" 598*4882a593Smuzhiyun 599*4882a593Smuzhiyun # Delete nexthop in a group and group is updated 600*4882a593Smuzhiyun run_cmd "$IP nexthop del id 63" 601*4882a593Smuzhiyun check_nexthop "id 102" "id 102 group 62/64/65" 602*4882a593Smuzhiyun log_test $? 0 "Nexthop group updated when entry is deleted" 603*4882a593Smuzhiyun 604*4882a593Smuzhiyun # create group with multiple weighted nexthops 605*4882a593Smuzhiyun run_cmd "$IP nexthop add id 63 via 2001:db8:91::3 dev veth1" 606*4882a593Smuzhiyun run_cmd "$IP nexthop add id 103 group 62/63,2/64,3/65,4" 607*4882a593Smuzhiyun log_test $? 0 "Nexthop group with weighted nexthops" 608*4882a593Smuzhiyun check_nexthop "id 103" "id 103 group 62/63,2/64,3/65,4" 609*4882a593Smuzhiyun 610*4882a593Smuzhiyun # Delete nexthop in a weighted group and group is updated 611*4882a593Smuzhiyun run_cmd "$IP nexthop del id 63" 612*4882a593Smuzhiyun check_nexthop "id 103" "id 103 group 62/64,3/65,4" 613*4882a593Smuzhiyun log_test $? 0 "Weighted nexthop group updated when entry is deleted" 614*4882a593Smuzhiyun 615*4882a593Smuzhiyun # admin down - nexthop is removed from group 616*4882a593Smuzhiyun run_cmd "$IP li set dev veth1 down" 617*4882a593Smuzhiyun check_nexthop "dev veth1" "" 618*4882a593Smuzhiyun log_test $? 0 "Nexthops in groups removed on admin down" 619*4882a593Smuzhiyun 620*4882a593Smuzhiyun # expect groups to have been deleted as well 621*4882a593Smuzhiyun check_nexthop "" "" 622*4882a593Smuzhiyun 623*4882a593Smuzhiyun run_cmd "$IP li set dev veth1 up" 624*4882a593Smuzhiyun 625*4882a593Smuzhiyun $IP nexthop flush >/dev/null 2>&1 626*4882a593Smuzhiyun 627*4882a593Smuzhiyun # group with nexthops using different devices 628*4882a593Smuzhiyun set -e 629*4882a593Smuzhiyun run_cmd "$IP nexthop add id 62 via 2001:db8:91::2 dev veth1" 630*4882a593Smuzhiyun run_cmd "$IP nexthop add id 63 via 2001:db8:91::3 dev veth1" 631*4882a593Smuzhiyun run_cmd "$IP nexthop add id 64 via 2001:db8:91::4 dev veth1" 632*4882a593Smuzhiyun run_cmd "$IP nexthop add id 65 via 2001:db8:91::5 dev veth1" 633*4882a593Smuzhiyun 634*4882a593Smuzhiyun run_cmd "$IP nexthop add id 72 via 2001:db8:92::2 dev veth3" 635*4882a593Smuzhiyun run_cmd "$IP nexthop add id 73 via 2001:db8:92::3 dev veth3" 636*4882a593Smuzhiyun run_cmd "$IP nexthop add id 74 via 2001:db8:92::4 dev veth3" 637*4882a593Smuzhiyun run_cmd "$IP nexthop add id 75 via 2001:db8:92::5 dev veth3" 638*4882a593Smuzhiyun set +e 639*4882a593Smuzhiyun 640*4882a593Smuzhiyun # multiple groups with same nexthop 641*4882a593Smuzhiyun run_cmd "$IP nexthop add id 104 group 62" 642*4882a593Smuzhiyun run_cmd "$IP nexthop add id 105 group 62" 643*4882a593Smuzhiyun check_nexthop "group" "id 104 group 62 id 105 group 62" 644*4882a593Smuzhiyun log_test $? 0 "Multiple groups with same nexthop" 645*4882a593Smuzhiyun 646*4882a593Smuzhiyun run_cmd "$IP nexthop flush groups" 647*4882a593Smuzhiyun [ $? -ne 0 ] && return 1 648*4882a593Smuzhiyun 649*4882a593Smuzhiyun # on admin down of veth1, it should be removed from the group 650*4882a593Smuzhiyun run_cmd "$IP nexthop add id 105 group 62/63/72/73/64" 651*4882a593Smuzhiyun run_cmd "$IP li set veth1 down" 652*4882a593Smuzhiyun check_nexthop "id 105" "id 105 group 72/73" 653*4882a593Smuzhiyun log_test $? 0 "Nexthops in group removed on admin down - mixed group" 654*4882a593Smuzhiyun 655*4882a593Smuzhiyun run_cmd "$IP nexthop add id 106 group 105/74" 656*4882a593Smuzhiyun log_test $? 2 "Nexthop group can not have a group as an entry" 657*4882a593Smuzhiyun 658*4882a593Smuzhiyun # a group can have a blackhole entry only if it is the only 659*4882a593Smuzhiyun # nexthop in the group. Needed for atomic replace with an 660*4882a593Smuzhiyun # actual nexthop group 661*4882a593Smuzhiyun run_cmd "$IP -6 nexthop add id 31 blackhole" 662*4882a593Smuzhiyun run_cmd "$IP nexthop add id 107 group 31" 663*4882a593Smuzhiyun log_test $? 0 "Nexthop group with a blackhole entry" 664*4882a593Smuzhiyun 665*4882a593Smuzhiyun run_cmd "$IP nexthop add id 108 group 31/24" 666*4882a593Smuzhiyun log_test $? 2 "Nexthop group can not have a blackhole and another nexthop" 667*4882a593Smuzhiyun} 668*4882a593Smuzhiyun 669*4882a593Smuzhiyunipv6_fcnal_runtime() 670*4882a593Smuzhiyun{ 671*4882a593Smuzhiyun local rc 672*4882a593Smuzhiyun 673*4882a593Smuzhiyun echo 674*4882a593Smuzhiyun echo "IPv6 functional runtime" 675*4882a593Smuzhiyun echo "-----------------------" 676*4882a593Smuzhiyun 677*4882a593Smuzhiyun # 678*4882a593Smuzhiyun # IPv6 - the basics 679*4882a593Smuzhiyun # 680*4882a593Smuzhiyun run_cmd "$IP nexthop add id 81 via 2001:db8:91::2 dev veth1" 681*4882a593Smuzhiyun run_cmd "$IP ro add 2001:db8:101::1/128 nhid 81" 682*4882a593Smuzhiyun log_test $? 0 "Route add" 683*4882a593Smuzhiyun 684*4882a593Smuzhiyun run_cmd "$IP ro delete 2001:db8:101::1/128 nhid 81" 685*4882a593Smuzhiyun log_test $? 0 "Route delete" 686*4882a593Smuzhiyun 687*4882a593Smuzhiyun run_cmd "$IP ro add 2001:db8:101::1/128 nhid 81" 688*4882a593Smuzhiyun run_cmd "ip netns exec me ping -c1 -w1 2001:db8:101::1" 689*4882a593Smuzhiyun log_test $? 0 "Ping with nexthop" 690*4882a593Smuzhiyun 691*4882a593Smuzhiyun run_cmd "$IP nexthop add id 82 via 2001:db8:92::2 dev veth3" 692*4882a593Smuzhiyun run_cmd "$IP nexthop add id 122 group 81/82" 693*4882a593Smuzhiyun run_cmd "$IP ro replace 2001:db8:101::1/128 nhid 122" 694*4882a593Smuzhiyun run_cmd "ip netns exec me ping -c1 -w1 2001:db8:101::1" 695*4882a593Smuzhiyun log_test $? 0 "Ping - multipath" 696*4882a593Smuzhiyun 697*4882a593Smuzhiyun # 698*4882a593Smuzhiyun # IPv6 with blackhole nexthops 699*4882a593Smuzhiyun # 700*4882a593Smuzhiyun run_cmd "$IP -6 nexthop add id 83 blackhole" 701*4882a593Smuzhiyun run_cmd "$IP ro replace 2001:db8:101::1/128 nhid 83" 702*4882a593Smuzhiyun run_cmd "ip netns exec me ping -c1 -w1 2001:db8:101::1" 703*4882a593Smuzhiyun log_test $? 2 "Ping - blackhole" 704*4882a593Smuzhiyun 705*4882a593Smuzhiyun run_cmd "$IP nexthop replace id 83 via 2001:db8:91::2 dev veth1" 706*4882a593Smuzhiyun run_cmd "ip netns exec me ping -c1 -w1 2001:db8:101::1" 707*4882a593Smuzhiyun log_test $? 0 "Ping - blackhole replaced with gateway" 708*4882a593Smuzhiyun 709*4882a593Smuzhiyun run_cmd "$IP -6 nexthop replace id 83 blackhole" 710*4882a593Smuzhiyun run_cmd "ip netns exec me ping -c1 -w1 2001:db8:101::1" 711*4882a593Smuzhiyun log_test $? 2 "Ping - gateway replaced by blackhole" 712*4882a593Smuzhiyun 713*4882a593Smuzhiyun run_cmd "$IP ro replace 2001:db8:101::1/128 nhid 122" 714*4882a593Smuzhiyun run_cmd "ip netns exec me ping -c1 -w1 2001:db8:101::1" 715*4882a593Smuzhiyun if [ $? -eq 0 ]; then 716*4882a593Smuzhiyun run_cmd "$IP nexthop replace id 122 group 83" 717*4882a593Smuzhiyun run_cmd "ip netns exec me ping -c1 -w1 2001:db8:101::1" 718*4882a593Smuzhiyun log_test $? 2 "Ping - group with blackhole" 719*4882a593Smuzhiyun 720*4882a593Smuzhiyun run_cmd "$IP nexthop replace id 122 group 81/82" 721*4882a593Smuzhiyun run_cmd "ip netns exec me ping -c1 -w1 2001:db8:101::1" 722*4882a593Smuzhiyun log_test $? 0 "Ping - group blackhole replaced with gateways" 723*4882a593Smuzhiyun else 724*4882a593Smuzhiyun log_test 2 0 "Ping - multipath failed" 725*4882a593Smuzhiyun fi 726*4882a593Smuzhiyun 727*4882a593Smuzhiyun # 728*4882a593Smuzhiyun # device only and gw + dev only mix 729*4882a593Smuzhiyun # 730*4882a593Smuzhiyun run_cmd "$IP -6 nexthop add id 85 dev veth1" 731*4882a593Smuzhiyun run_cmd "$IP ro replace 2001:db8:101::1/128 nhid 85" 732*4882a593Smuzhiyun log_test $? 0 "IPv6 route with device only nexthop" 733*4882a593Smuzhiyun check_route6 "2001:db8:101::1" "2001:db8:101::1 nhid 85 dev veth1 metric 1024" 734*4882a593Smuzhiyun 735*4882a593Smuzhiyun run_cmd "$IP nexthop add id 123 group 81/85" 736*4882a593Smuzhiyun run_cmd "$IP ro replace 2001:db8:101::1/128 nhid 123" 737*4882a593Smuzhiyun log_test $? 0 "IPv6 multipath route with nexthop mix - dev only + gw" 738*4882a593Smuzhiyun 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" 739*4882a593Smuzhiyun 740*4882a593Smuzhiyun # 741*4882a593Smuzhiyun # IPv6 route with v4 nexthop - not allowed 742*4882a593Smuzhiyun # 743*4882a593Smuzhiyun run_cmd "$IP ro delete 2001:db8:101::1/128" 744*4882a593Smuzhiyun run_cmd "$IP nexthop add id 84 via 172.16.1.1 dev veth1" 745*4882a593Smuzhiyun run_cmd "$IP ro add 2001:db8:101::1/128 nhid 84" 746*4882a593Smuzhiyun log_test $? 2 "IPv6 route can not have a v4 gateway" 747*4882a593Smuzhiyun 748*4882a593Smuzhiyun run_cmd "$IP ro replace 2001:db8:101::1/128 nhid 81" 749*4882a593Smuzhiyun run_cmd "$IP nexthop replace id 81 via 172.16.1.1 dev veth1" 750*4882a593Smuzhiyun log_test $? 2 "Nexthop replace - v6 route, v4 nexthop" 751*4882a593Smuzhiyun 752*4882a593Smuzhiyun run_cmd "$IP ro replace 2001:db8:101::1/128 nhid 122" 753*4882a593Smuzhiyun run_cmd "$IP nexthop replace id 81 via 172.16.1.1 dev veth1" 754*4882a593Smuzhiyun log_test $? 2 "Nexthop replace of group entry - v6 route, v4 nexthop" 755*4882a593Smuzhiyun 756*4882a593Smuzhiyun run_cmd "$IP nexthop add id 86 via 2001:db8:92::2 dev veth3" 757*4882a593Smuzhiyun run_cmd "$IP nexthop add id 87 via 172.16.1.1 dev veth1" 758*4882a593Smuzhiyun run_cmd "$IP nexthop add id 88 via 172.16.1.1 dev veth1" 759*4882a593Smuzhiyun run_cmd "$IP nexthop add id 124 group 86/87/88" 760*4882a593Smuzhiyun run_cmd "$IP ro replace 2001:db8:101::1/128 nhid 124" 761*4882a593Smuzhiyun log_test $? 2 "IPv6 route can not have a group with v4 and v6 gateways" 762*4882a593Smuzhiyun 763*4882a593Smuzhiyun run_cmd "$IP nexthop del id 88" 764*4882a593Smuzhiyun run_cmd "$IP ro replace 2001:db8:101::1/128 nhid 124" 765*4882a593Smuzhiyun log_test $? 2 "IPv6 route can not have a group with v4 and v6 gateways" 766*4882a593Smuzhiyun 767*4882a593Smuzhiyun run_cmd "$IP nexthop del id 87" 768*4882a593Smuzhiyun run_cmd "$IP ro replace 2001:db8:101::1/128 nhid 124" 769*4882a593Smuzhiyun log_test $? 0 "IPv6 route using a group after removing v4 gateways" 770*4882a593Smuzhiyun 771*4882a593Smuzhiyun run_cmd "$IP ro delete 2001:db8:101::1/128" 772*4882a593Smuzhiyun run_cmd "$IP nexthop add id 87 via 172.16.1.1 dev veth1" 773*4882a593Smuzhiyun run_cmd "$IP nexthop add id 88 via 172.16.1.1 dev veth1" 774*4882a593Smuzhiyun run_cmd "$IP nexthop replace id 124 group 86/87/88" 775*4882a593Smuzhiyun run_cmd "$IP ro replace 2001:db8:101::1/128 nhid 124" 776*4882a593Smuzhiyun log_test $? 2 "IPv6 route can not have a group with v4 and v6 gateways" 777*4882a593Smuzhiyun 778*4882a593Smuzhiyun run_cmd "$IP nexthop replace id 88 via 2001:db8:92::2 dev veth3" 779*4882a593Smuzhiyun run_cmd "$IP ro replace 2001:db8:101::1/128 nhid 124" 780*4882a593Smuzhiyun log_test $? 2 "IPv6 route can not have a group with v4 and v6 gateways" 781*4882a593Smuzhiyun 782*4882a593Smuzhiyun run_cmd "$IP nexthop replace id 87 via 2001:db8:92::2 dev veth3" 783*4882a593Smuzhiyun run_cmd "$IP ro replace 2001:db8:101::1/128 nhid 124" 784*4882a593Smuzhiyun log_test $? 0 "IPv6 route using a group after replacing v4 gateways" 785*4882a593Smuzhiyun 786*4882a593Smuzhiyun $IP nexthop flush >/dev/null 2>&1 787*4882a593Smuzhiyun 788*4882a593Smuzhiyun # 789*4882a593Smuzhiyun # weird IPv6 cases 790*4882a593Smuzhiyun # 791*4882a593Smuzhiyun run_cmd "$IP nexthop add id 86 via 2001:db8:91::2 dev veth1" 792*4882a593Smuzhiyun run_cmd "$IP ro add 2001:db8:101::1/128 nhid 81" 793*4882a593Smuzhiyun 794*4882a593Smuzhiyun # rpfilter and default route 795*4882a593Smuzhiyun $IP nexthop flush >/dev/null 2>&1 796*4882a593Smuzhiyun run_cmd "ip netns exec me ip6tables -t mangle -I PREROUTING 1 -m rpfilter --invert -j DROP" 797*4882a593Smuzhiyun run_cmd "$IP nexthop add id 91 via 2001:db8:91::2 dev veth1" 798*4882a593Smuzhiyun run_cmd "$IP nexthop add id 92 via 2001:db8:92::2 dev veth3" 799*4882a593Smuzhiyun run_cmd "$IP nexthop add id 93 group 91/92" 800*4882a593Smuzhiyun run_cmd "$IP -6 ro add default nhid 91" 801*4882a593Smuzhiyun run_cmd "ip netns exec me ping -c1 -w1 2001:db8:101::1" 802*4882a593Smuzhiyun log_test $? 0 "Nexthop with default route and rpfilter" 803*4882a593Smuzhiyun run_cmd "$IP -6 ro replace default nhid 93" 804*4882a593Smuzhiyun run_cmd "ip netns exec me ping -c1 -w1 2001:db8:101::1" 805*4882a593Smuzhiyun log_test $? 0 "Nexthop with multipath default route and rpfilter" 806*4882a593Smuzhiyun 807*4882a593Smuzhiyun # TO-DO: 808*4882a593Smuzhiyun # existing route with old nexthop; append route with new nexthop 809*4882a593Smuzhiyun # existing route with old nexthop; replace route with new 810*4882a593Smuzhiyun # existing route with new nexthop; replace route with old 811*4882a593Smuzhiyun # route with src address and using nexthop - not allowed 812*4882a593Smuzhiyun} 813*4882a593Smuzhiyun 814*4882a593Smuzhiyunipv6_large_grp() 815*4882a593Smuzhiyun{ 816*4882a593Smuzhiyun local ecmp=32 817*4882a593Smuzhiyun 818*4882a593Smuzhiyun echo 819*4882a593Smuzhiyun echo "IPv6 large groups (x$ecmp)" 820*4882a593Smuzhiyun echo "---------------------" 821*4882a593Smuzhiyun 822*4882a593Smuzhiyun check_large_grp 6 $ecmp 823*4882a593Smuzhiyun 824*4882a593Smuzhiyun $IP nexthop flush >/dev/null 2>&1 825*4882a593Smuzhiyun} 826*4882a593Smuzhiyun 827*4882a593Smuzhiyunipv6_del_add_loop1() 828*4882a593Smuzhiyun{ 829*4882a593Smuzhiyun while :; do 830*4882a593Smuzhiyun $IP nexthop del id 100 831*4882a593Smuzhiyun $IP nexthop add id 100 via 2001:db8:91::2 dev veth1 832*4882a593Smuzhiyun done >/dev/null 2>&1 833*4882a593Smuzhiyun} 834*4882a593Smuzhiyun 835*4882a593Smuzhiyunipv6_grp_replace_loop() 836*4882a593Smuzhiyun{ 837*4882a593Smuzhiyun while :; do 838*4882a593Smuzhiyun $IP nexthop replace id 102 group 100/101 839*4882a593Smuzhiyun done >/dev/null 2>&1 840*4882a593Smuzhiyun} 841*4882a593Smuzhiyun 842*4882a593Smuzhiyunipv6_torture() 843*4882a593Smuzhiyun{ 844*4882a593Smuzhiyun local pid1 845*4882a593Smuzhiyun local pid2 846*4882a593Smuzhiyun local pid3 847*4882a593Smuzhiyun local pid4 848*4882a593Smuzhiyun local pid5 849*4882a593Smuzhiyun 850*4882a593Smuzhiyun echo 851*4882a593Smuzhiyun echo "IPv6 runtime torture" 852*4882a593Smuzhiyun echo "--------------------" 853*4882a593Smuzhiyun if [ ! -x "$(command -v mausezahn)" ]; then 854*4882a593Smuzhiyun echo "SKIP: Could not run test; need mausezahn tool" 855*4882a593Smuzhiyun return 856*4882a593Smuzhiyun fi 857*4882a593Smuzhiyun 858*4882a593Smuzhiyun run_cmd "$IP nexthop add id 100 via 2001:db8:91::2 dev veth1" 859*4882a593Smuzhiyun run_cmd "$IP nexthop add id 101 via 2001:db8:92::2 dev veth3" 860*4882a593Smuzhiyun run_cmd "$IP nexthop add id 102 group 100/101" 861*4882a593Smuzhiyun run_cmd "$IP route add 2001:db8:101::1 nhid 102" 862*4882a593Smuzhiyun run_cmd "$IP route add 2001:db8:101::2 nhid 102" 863*4882a593Smuzhiyun 864*4882a593Smuzhiyun ipv6_del_add_loop1 & 865*4882a593Smuzhiyun pid1=$! 866*4882a593Smuzhiyun ipv6_grp_replace_loop & 867*4882a593Smuzhiyun pid2=$! 868*4882a593Smuzhiyun ip netns exec me ping -f 2001:db8:101::1 >/dev/null 2>&1 & 869*4882a593Smuzhiyun pid3=$! 870*4882a593Smuzhiyun ip netns exec me ping -f 2001:db8:101::2 >/dev/null 2>&1 & 871*4882a593Smuzhiyun pid4=$! 872*4882a593Smuzhiyun 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 & 873*4882a593Smuzhiyun pid5=$! 874*4882a593Smuzhiyun 875*4882a593Smuzhiyun sleep 300 876*4882a593Smuzhiyun kill -9 $pid1 $pid2 $pid3 $pid4 $pid5 877*4882a593Smuzhiyun 878*4882a593Smuzhiyun # if we did not crash, success 879*4882a593Smuzhiyun log_test 0 0 "IPv6 torture test" 880*4882a593Smuzhiyun} 881*4882a593Smuzhiyun 882*4882a593Smuzhiyun 883*4882a593Smuzhiyunipv4_fcnal() 884*4882a593Smuzhiyun{ 885*4882a593Smuzhiyun local rc 886*4882a593Smuzhiyun 887*4882a593Smuzhiyun echo 888*4882a593Smuzhiyun echo "IPv4 functional" 889*4882a593Smuzhiyun echo "----------------------" 890*4882a593Smuzhiyun 891*4882a593Smuzhiyun # 892*4882a593Smuzhiyun # basic IPv4 ops - add, get, delete 893*4882a593Smuzhiyun # 894*4882a593Smuzhiyun run_cmd "$IP nexthop add id 12 via 172.16.1.2 dev veth1" 895*4882a593Smuzhiyun rc=$? 896*4882a593Smuzhiyun log_test $rc 0 "Create nexthop with id, gw, dev" 897*4882a593Smuzhiyun if [ $rc -ne 0 ]; then 898*4882a593Smuzhiyun echo "Basic IPv4 create fails; can not continue" 899*4882a593Smuzhiyun return 1 900*4882a593Smuzhiyun fi 901*4882a593Smuzhiyun 902*4882a593Smuzhiyun run_cmd "$IP nexthop get id 12" 903*4882a593Smuzhiyun log_test $? 0 "Get nexthop by id" 904*4882a593Smuzhiyun check_nexthop "id 12" "id 12 via 172.16.1.2 dev veth1 scope link" 905*4882a593Smuzhiyun 906*4882a593Smuzhiyun run_cmd "$IP nexthop del id 12" 907*4882a593Smuzhiyun log_test $? 0 "Delete nexthop by id" 908*4882a593Smuzhiyun check_nexthop "id 52" "" 909*4882a593Smuzhiyun 910*4882a593Smuzhiyun # 911*4882a593Smuzhiyun # gw, device spec 912*4882a593Smuzhiyun # 913*4882a593Smuzhiyun # gw validation, no device - fails since dev is required 914*4882a593Smuzhiyun run_cmd "$IP nexthop add id 12 via 172.16.2.3" 915*4882a593Smuzhiyun log_test $? 2 "Create nexthop - gw only" 916*4882a593Smuzhiyun 917*4882a593Smuzhiyun # gw not reachable through given dev 918*4882a593Smuzhiyun run_cmd "$IP nexthop add id 13 via 172.16.3.2 dev veth1" 919*4882a593Smuzhiyun log_test $? 2 "Create nexthop - invalid gw+dev combination" 920*4882a593Smuzhiyun 921*4882a593Smuzhiyun # onlink flag overrides gw+dev lookup 922*4882a593Smuzhiyun run_cmd "$IP nexthop add id 13 via 172.16.3.2 dev veth1 onlink" 923*4882a593Smuzhiyun log_test $? 0 "Create nexthop - gw+dev and onlink" 924*4882a593Smuzhiyun 925*4882a593Smuzhiyun # admin down should delete nexthops 926*4882a593Smuzhiyun set -e 927*4882a593Smuzhiyun run_cmd "$IP nexthop add id 15 via 172.16.1.3 dev veth1" 928*4882a593Smuzhiyun run_cmd "$IP nexthop add id 16 via 172.16.1.4 dev veth1" 929*4882a593Smuzhiyun run_cmd "$IP nexthop add id 17 via 172.16.1.5 dev veth1" 930*4882a593Smuzhiyun run_cmd "$IP li set dev veth1 down" 931*4882a593Smuzhiyun set +e 932*4882a593Smuzhiyun check_nexthop "dev veth1" "" 933*4882a593Smuzhiyun log_test $? 0 "Nexthops removed on admin down" 934*4882a593Smuzhiyun 935*4882a593Smuzhiyun # nexthop route delete warning: route add with nhid and delete 936*4882a593Smuzhiyun # using device 937*4882a593Smuzhiyun run_cmd "$IP li set dev veth1 up" 938*4882a593Smuzhiyun run_cmd "$IP nexthop add id 12 via 172.16.1.3 dev veth1" 939*4882a593Smuzhiyun out1=`dmesg | grep "WARNING:.*fib_nh_match.*" | wc -l` 940*4882a593Smuzhiyun run_cmd "$IP route add 172.16.101.1/32 nhid 12" 941*4882a593Smuzhiyun run_cmd "$IP route delete 172.16.101.1/32 dev veth1" 942*4882a593Smuzhiyun out2=`dmesg | grep "WARNING:.*fib_nh_match.*" | wc -l` 943*4882a593Smuzhiyun [ $out1 -eq $out2 ] 944*4882a593Smuzhiyun rc=$? 945*4882a593Smuzhiyun log_test $rc 0 "Delete nexthop route warning" 946*4882a593Smuzhiyun run_cmd "$IP route delete 172.16.101.1/32 nhid 12" 947*4882a593Smuzhiyun run_cmd "$IP nexthop del id 12" 948*4882a593Smuzhiyun 949*4882a593Smuzhiyun run_cmd "$IP nexthop add id 21 via 172.16.1.6 dev veth1" 950*4882a593Smuzhiyun run_cmd "$IP ro add 172.16.101.0/24 nhid 21" 951*4882a593Smuzhiyun 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" 952*4882a593Smuzhiyun log_test $? 2 "Delete multipath route with only nh id based entry" 953*4882a593Smuzhiyun 954*4882a593Smuzhiyun run_cmd "$IP nexthop add id 22 via 172.16.1.6 dev veth1" 955*4882a593Smuzhiyun run_cmd "$IP ro add 172.16.102.0/24 nhid 22" 956*4882a593Smuzhiyun run_cmd "$IP ro del 172.16.102.0/24 dev veth1" 957*4882a593Smuzhiyun log_test $? 2 "Delete route when specifying only nexthop device" 958*4882a593Smuzhiyun 959*4882a593Smuzhiyun run_cmd "$IP ro del 172.16.102.0/24 via 172.16.1.6" 960*4882a593Smuzhiyun log_test $? 2 "Delete route when specifying only gateway" 961*4882a593Smuzhiyun 962*4882a593Smuzhiyun run_cmd "$IP ro del 172.16.102.0/24" 963*4882a593Smuzhiyun log_test $? 0 "Delete route when not specifying nexthop attributes" 964*4882a593Smuzhiyun} 965*4882a593Smuzhiyun 966*4882a593Smuzhiyunipv4_grp_fcnal() 967*4882a593Smuzhiyun{ 968*4882a593Smuzhiyun local rc 969*4882a593Smuzhiyun 970*4882a593Smuzhiyun echo 971*4882a593Smuzhiyun echo "IPv4 groups functional" 972*4882a593Smuzhiyun echo "----------------------" 973*4882a593Smuzhiyun 974*4882a593Smuzhiyun # basic functionality: create a nexthop group, default weight 975*4882a593Smuzhiyun run_cmd "$IP nexthop add id 11 via 172.16.1.2 dev veth1" 976*4882a593Smuzhiyun run_cmd "$IP nexthop add id 101 group 11" 977*4882a593Smuzhiyun log_test $? 0 "Create nexthop group with single nexthop" 978*4882a593Smuzhiyun 979*4882a593Smuzhiyun # get nexthop group 980*4882a593Smuzhiyun run_cmd "$IP nexthop get id 101" 981*4882a593Smuzhiyun log_test $? 0 "Get nexthop group by id" 982*4882a593Smuzhiyun check_nexthop "id 101" "id 101 group 11" 983*4882a593Smuzhiyun 984*4882a593Smuzhiyun # delete nexthop group 985*4882a593Smuzhiyun run_cmd "$IP nexthop del id 101" 986*4882a593Smuzhiyun log_test $? 0 "Delete nexthop group by id" 987*4882a593Smuzhiyun check_nexthop "id 101" "" 988*4882a593Smuzhiyun 989*4882a593Smuzhiyun $IP nexthop flush >/dev/null 2>&1 990*4882a593Smuzhiyun 991*4882a593Smuzhiyun # 992*4882a593Smuzhiyun # create group with multiple nexthops 993*4882a593Smuzhiyun run_cmd "$IP nexthop add id 12 via 172.16.1.2 dev veth1" 994*4882a593Smuzhiyun run_cmd "$IP nexthop add id 13 via 172.16.1.3 dev veth1" 995*4882a593Smuzhiyun run_cmd "$IP nexthop add id 14 via 172.16.1.4 dev veth1" 996*4882a593Smuzhiyun run_cmd "$IP nexthop add id 15 via 172.16.1.5 dev veth1" 997*4882a593Smuzhiyun run_cmd "$IP nexthop add id 102 group 12/13/14/15" 998*4882a593Smuzhiyun log_test $? 0 "Nexthop group with multiple nexthops" 999*4882a593Smuzhiyun check_nexthop "id 102" "id 102 group 12/13/14/15" 1000*4882a593Smuzhiyun 1001*4882a593Smuzhiyun # Delete nexthop in a group and group is updated 1002*4882a593Smuzhiyun run_cmd "$IP nexthop del id 13" 1003*4882a593Smuzhiyun check_nexthop "id 102" "id 102 group 12/14/15" 1004*4882a593Smuzhiyun log_test $? 0 "Nexthop group updated when entry is deleted" 1005*4882a593Smuzhiyun 1006*4882a593Smuzhiyun # create group with multiple weighted nexthops 1007*4882a593Smuzhiyun run_cmd "$IP nexthop add id 13 via 172.16.1.3 dev veth1" 1008*4882a593Smuzhiyun run_cmd "$IP nexthop add id 103 group 12/13,2/14,3/15,4" 1009*4882a593Smuzhiyun log_test $? 0 "Nexthop group with weighted nexthops" 1010*4882a593Smuzhiyun check_nexthop "id 103" "id 103 group 12/13,2/14,3/15,4" 1011*4882a593Smuzhiyun 1012*4882a593Smuzhiyun # Delete nexthop in a weighted group and group is updated 1013*4882a593Smuzhiyun run_cmd "$IP nexthop del id 13" 1014*4882a593Smuzhiyun check_nexthop "id 103" "id 103 group 12/14,3/15,4" 1015*4882a593Smuzhiyun log_test $? 0 "Weighted nexthop group updated when entry is deleted" 1016*4882a593Smuzhiyun 1017*4882a593Smuzhiyun # admin down - nexthop is removed from group 1018*4882a593Smuzhiyun run_cmd "$IP li set dev veth1 down" 1019*4882a593Smuzhiyun check_nexthop "dev veth1" "" 1020*4882a593Smuzhiyun log_test $? 0 "Nexthops in groups removed on admin down" 1021*4882a593Smuzhiyun 1022*4882a593Smuzhiyun # expect groups to have been deleted as well 1023*4882a593Smuzhiyun check_nexthop "" "" 1024*4882a593Smuzhiyun 1025*4882a593Smuzhiyun run_cmd "$IP li set dev veth1 up" 1026*4882a593Smuzhiyun 1027*4882a593Smuzhiyun $IP nexthop flush >/dev/null 2>&1 1028*4882a593Smuzhiyun 1029*4882a593Smuzhiyun # group with nexthops using different devices 1030*4882a593Smuzhiyun set -e 1031*4882a593Smuzhiyun run_cmd "$IP nexthop add id 12 via 172.16.1.2 dev veth1" 1032*4882a593Smuzhiyun run_cmd "$IP nexthop add id 13 via 172.16.1.3 dev veth1" 1033*4882a593Smuzhiyun run_cmd "$IP nexthop add id 14 via 172.16.1.4 dev veth1" 1034*4882a593Smuzhiyun run_cmd "$IP nexthop add id 15 via 172.16.1.5 dev veth1" 1035*4882a593Smuzhiyun 1036*4882a593Smuzhiyun run_cmd "$IP nexthop add id 22 via 172.16.2.2 dev veth3" 1037*4882a593Smuzhiyun run_cmd "$IP nexthop add id 23 via 172.16.2.3 dev veth3" 1038*4882a593Smuzhiyun run_cmd "$IP nexthop add id 24 via 172.16.2.4 dev veth3" 1039*4882a593Smuzhiyun run_cmd "$IP nexthop add id 25 via 172.16.2.5 dev veth3" 1040*4882a593Smuzhiyun set +e 1041*4882a593Smuzhiyun 1042*4882a593Smuzhiyun # multiple groups with same nexthop 1043*4882a593Smuzhiyun run_cmd "$IP nexthop add id 104 group 12" 1044*4882a593Smuzhiyun run_cmd "$IP nexthop add id 105 group 12" 1045*4882a593Smuzhiyun check_nexthop "group" "id 104 group 12 id 105 group 12" 1046*4882a593Smuzhiyun log_test $? 0 "Multiple groups with same nexthop" 1047*4882a593Smuzhiyun 1048*4882a593Smuzhiyun run_cmd "$IP nexthop flush groups" 1049*4882a593Smuzhiyun [ $? -ne 0 ] && return 1 1050*4882a593Smuzhiyun 1051*4882a593Smuzhiyun # on admin down of veth1, it should be removed from the group 1052*4882a593Smuzhiyun run_cmd "$IP nexthop add id 105 group 12/13/22/23/14" 1053*4882a593Smuzhiyun run_cmd "$IP li set veth1 down" 1054*4882a593Smuzhiyun check_nexthop "id 105" "id 105 group 22/23" 1055*4882a593Smuzhiyun log_test $? 0 "Nexthops in group removed on admin down - mixed group" 1056*4882a593Smuzhiyun 1057*4882a593Smuzhiyun run_cmd "$IP nexthop add id 106 group 105/24" 1058*4882a593Smuzhiyun log_test $? 2 "Nexthop group can not have a group as an entry" 1059*4882a593Smuzhiyun 1060*4882a593Smuzhiyun # a group can have a blackhole entry only if it is the only 1061*4882a593Smuzhiyun # nexthop in the group. Needed for atomic replace with an 1062*4882a593Smuzhiyun # actual nexthop group 1063*4882a593Smuzhiyun run_cmd "$IP nexthop add id 31 blackhole" 1064*4882a593Smuzhiyun run_cmd "$IP nexthop add id 107 group 31" 1065*4882a593Smuzhiyun log_test $? 0 "Nexthop group with a blackhole entry" 1066*4882a593Smuzhiyun 1067*4882a593Smuzhiyun run_cmd "$IP nexthop add id 108 group 31/24" 1068*4882a593Smuzhiyun log_test $? 2 "Nexthop group can not have a blackhole and another nexthop" 1069*4882a593Smuzhiyun} 1070*4882a593Smuzhiyun 1071*4882a593Smuzhiyunipv4_withv6_fcnal() 1072*4882a593Smuzhiyun{ 1073*4882a593Smuzhiyun local lladdr 1074*4882a593Smuzhiyun 1075*4882a593Smuzhiyun set -e 1076*4882a593Smuzhiyun lladdr=$(get_linklocal veth2 peer) 1077*4882a593Smuzhiyun run_cmd "$IP nexthop add id 11 via ${lladdr} dev veth1" 1078*4882a593Smuzhiyun set +e 1079*4882a593Smuzhiyun run_cmd "$IP ro add 172.16.101.1/32 nhid 11" 1080*4882a593Smuzhiyun log_test $? 0 "IPv6 nexthop with IPv4 route" 1081*4882a593Smuzhiyun check_route "172.16.101.1" "172.16.101.1 nhid 11 via inet6 ${lladdr} dev veth1" 1082*4882a593Smuzhiyun 1083*4882a593Smuzhiyun set -e 1084*4882a593Smuzhiyun run_cmd "$IP nexthop add id 12 via 172.16.1.2 dev veth1" 1085*4882a593Smuzhiyun run_cmd "$IP nexthop add id 101 group 11/12" 1086*4882a593Smuzhiyun set +e 1087*4882a593Smuzhiyun run_cmd "$IP ro replace 172.16.101.1/32 nhid 101" 1088*4882a593Smuzhiyun log_test $? 0 "IPv6 nexthop with IPv4 route" 1089*4882a593Smuzhiyun 1090*4882a593Smuzhiyun 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" 1091*4882a593Smuzhiyun 1092*4882a593Smuzhiyun run_cmd "$IP ro replace 172.16.101.1/32 via inet6 ${lladdr} dev veth1" 1093*4882a593Smuzhiyun log_test $? 0 "IPv4 route with IPv6 gateway" 1094*4882a593Smuzhiyun check_route "172.16.101.1" "172.16.101.1 via inet6 ${lladdr} dev veth1" 1095*4882a593Smuzhiyun 1096*4882a593Smuzhiyun run_cmd "$IP ro replace 172.16.101.1/32 via inet6 2001:db8:50::1 dev veth1" 1097*4882a593Smuzhiyun log_test $? 2 "IPv4 route with invalid IPv6 gateway" 1098*4882a593Smuzhiyun} 1099*4882a593Smuzhiyun 1100*4882a593Smuzhiyunipv4_fcnal_runtime() 1101*4882a593Smuzhiyun{ 1102*4882a593Smuzhiyun local lladdr 1103*4882a593Smuzhiyun local rc 1104*4882a593Smuzhiyun 1105*4882a593Smuzhiyun echo 1106*4882a593Smuzhiyun echo "IPv4 functional runtime" 1107*4882a593Smuzhiyun echo "-----------------------" 1108*4882a593Smuzhiyun 1109*4882a593Smuzhiyun run_cmd "$IP nexthop add id 21 via 172.16.1.2 dev veth1" 1110*4882a593Smuzhiyun run_cmd "$IP ro add 172.16.101.1/32 nhid 21" 1111*4882a593Smuzhiyun log_test $? 0 "Route add" 1112*4882a593Smuzhiyun check_route "172.16.101.1" "172.16.101.1 nhid 21 via 172.16.1.2 dev veth1" 1113*4882a593Smuzhiyun 1114*4882a593Smuzhiyun run_cmd "$IP ro delete 172.16.101.1/32 nhid 21" 1115*4882a593Smuzhiyun log_test $? 0 "Route delete" 1116*4882a593Smuzhiyun 1117*4882a593Smuzhiyun # 1118*4882a593Smuzhiyun # scope mismatch 1119*4882a593Smuzhiyun # 1120*4882a593Smuzhiyun run_cmd "$IP nexthop add id 22 via 172.16.1.2 dev veth1" 1121*4882a593Smuzhiyun run_cmd "$IP ro add 172.16.101.1/32 nhid 22 scope host" 1122*4882a593Smuzhiyun log_test $? 2 "Route add - scope conflict with nexthop" 1123*4882a593Smuzhiyun 1124*4882a593Smuzhiyun run_cmd "$IP nexthop replace id 22 dev veth3" 1125*4882a593Smuzhiyun run_cmd "$IP ro add 172.16.101.1/32 nhid 22 scope host" 1126*4882a593Smuzhiyun run_cmd "$IP nexthop replace id 22 via 172.16.2.2 dev veth3" 1127*4882a593Smuzhiyun log_test $? 2 "Nexthop replace with invalid scope for existing route" 1128*4882a593Smuzhiyun 1129*4882a593Smuzhiyun # 1130*4882a593Smuzhiyun # add route with nexthop and check traffic 1131*4882a593Smuzhiyun # 1132*4882a593Smuzhiyun run_cmd "$IP nexthop replace id 21 via 172.16.1.2 dev veth1" 1133*4882a593Smuzhiyun run_cmd "$IP ro replace 172.16.101.1/32 nhid 21" 1134*4882a593Smuzhiyun run_cmd "ip netns exec me ping -c1 -w1 172.16.101.1" 1135*4882a593Smuzhiyun log_test $? 0 "Basic ping" 1136*4882a593Smuzhiyun 1137*4882a593Smuzhiyun run_cmd "$IP nexthop replace id 22 via 172.16.2.2 dev veth3" 1138*4882a593Smuzhiyun run_cmd "$IP nexthop add id 122 group 21/22" 1139*4882a593Smuzhiyun run_cmd "$IP ro replace 172.16.101.1/32 nhid 122" 1140*4882a593Smuzhiyun run_cmd "ip netns exec me ping -c1 -w1 172.16.101.1" 1141*4882a593Smuzhiyun log_test $? 0 "Ping - multipath" 1142*4882a593Smuzhiyun 1143*4882a593Smuzhiyun run_cmd "$IP ro delete 172.16.101.1/32 nhid 122" 1144*4882a593Smuzhiyun 1145*4882a593Smuzhiyun # 1146*4882a593Smuzhiyun # multiple default routes 1147*4882a593Smuzhiyun # - tests fib_select_default 1148*4882a593Smuzhiyun run_cmd "$IP nexthop add id 501 via 172.16.1.2 dev veth1" 1149*4882a593Smuzhiyun run_cmd "$IP ro add default nhid 501" 1150*4882a593Smuzhiyun run_cmd "$IP ro add default via 172.16.1.3 dev veth1 metric 20" 1151*4882a593Smuzhiyun run_cmd "ip netns exec me ping -c1 -w1 172.16.101.1" 1152*4882a593Smuzhiyun log_test $? 0 "Ping - multiple default routes, nh first" 1153*4882a593Smuzhiyun 1154*4882a593Smuzhiyun # flip the order 1155*4882a593Smuzhiyun run_cmd "$IP ro del default nhid 501" 1156*4882a593Smuzhiyun run_cmd "$IP ro del default via 172.16.1.3 dev veth1 metric 20" 1157*4882a593Smuzhiyun run_cmd "$IP ro add default via 172.16.1.2 dev veth1 metric 20" 1158*4882a593Smuzhiyun run_cmd "$IP nexthop replace id 501 via 172.16.1.3 dev veth1" 1159*4882a593Smuzhiyun run_cmd "$IP ro add default nhid 501 metric 20" 1160*4882a593Smuzhiyun run_cmd "ip netns exec me ping -c1 -w1 172.16.101.1" 1161*4882a593Smuzhiyun log_test $? 0 "Ping - multiple default routes, nh second" 1162*4882a593Smuzhiyun 1163*4882a593Smuzhiyun run_cmd "$IP nexthop delete nhid 501" 1164*4882a593Smuzhiyun run_cmd "$IP ro del default" 1165*4882a593Smuzhiyun 1166*4882a593Smuzhiyun # 1167*4882a593Smuzhiyun # IPv4 with blackhole nexthops 1168*4882a593Smuzhiyun # 1169*4882a593Smuzhiyun run_cmd "$IP nexthop add id 23 blackhole" 1170*4882a593Smuzhiyun run_cmd "$IP ro replace 172.16.101.1/32 nhid 23" 1171*4882a593Smuzhiyun run_cmd "ip netns exec me ping -c1 -w1 172.16.101.1" 1172*4882a593Smuzhiyun log_test $? 2 "Ping - blackhole" 1173*4882a593Smuzhiyun 1174*4882a593Smuzhiyun run_cmd "$IP nexthop replace id 23 via 172.16.1.2 dev veth1" 1175*4882a593Smuzhiyun run_cmd "ip netns exec me ping -c1 -w1 172.16.101.1" 1176*4882a593Smuzhiyun log_test $? 0 "Ping - blackhole replaced with gateway" 1177*4882a593Smuzhiyun 1178*4882a593Smuzhiyun run_cmd "$IP nexthop replace id 23 blackhole" 1179*4882a593Smuzhiyun run_cmd "ip netns exec me ping -c1 -w1 172.16.101.1" 1180*4882a593Smuzhiyun log_test $? 2 "Ping - gateway replaced by blackhole" 1181*4882a593Smuzhiyun 1182*4882a593Smuzhiyun run_cmd "$IP ro replace 172.16.101.1/32 nhid 122" 1183*4882a593Smuzhiyun run_cmd "ip netns exec me ping -c1 -w1 172.16.101.1" 1184*4882a593Smuzhiyun if [ $? -eq 0 ]; then 1185*4882a593Smuzhiyun run_cmd "$IP nexthop replace id 122 group 23" 1186*4882a593Smuzhiyun run_cmd "ip netns exec me ping -c1 -w1 172.16.101.1" 1187*4882a593Smuzhiyun log_test $? 2 "Ping - group with blackhole" 1188*4882a593Smuzhiyun 1189*4882a593Smuzhiyun run_cmd "$IP nexthop replace id 122 group 21/22" 1190*4882a593Smuzhiyun run_cmd "ip netns exec me ping -c1 -w1 172.16.101.1" 1191*4882a593Smuzhiyun log_test $? 0 "Ping - group blackhole replaced with gateways" 1192*4882a593Smuzhiyun else 1193*4882a593Smuzhiyun log_test 2 0 "Ping - multipath failed" 1194*4882a593Smuzhiyun fi 1195*4882a593Smuzhiyun 1196*4882a593Smuzhiyun # 1197*4882a593Smuzhiyun # device only and gw + dev only mix 1198*4882a593Smuzhiyun # 1199*4882a593Smuzhiyun run_cmd "$IP nexthop add id 85 dev veth1" 1200*4882a593Smuzhiyun run_cmd "$IP ro replace 172.16.101.1/32 nhid 85" 1201*4882a593Smuzhiyun log_test $? 0 "IPv4 route with device only nexthop" 1202*4882a593Smuzhiyun check_route "172.16.101.1" "172.16.101.1 nhid 85 dev veth1" 1203*4882a593Smuzhiyun 1204*4882a593Smuzhiyun run_cmd "$IP nexthop add id 123 group 21/85" 1205*4882a593Smuzhiyun run_cmd "$IP ro replace 172.16.101.1/32 nhid 123" 1206*4882a593Smuzhiyun log_test $? 0 "IPv4 multipath route with nexthop mix - dev only + gw" 1207*4882a593Smuzhiyun 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" 1208*4882a593Smuzhiyun 1209*4882a593Smuzhiyun # 1210*4882a593Smuzhiyun # IPv4 with IPv6 1211*4882a593Smuzhiyun # 1212*4882a593Smuzhiyun set -e 1213*4882a593Smuzhiyun lladdr=$(get_linklocal veth2 peer) 1214*4882a593Smuzhiyun run_cmd "$IP nexthop add id 24 via ${lladdr} dev veth1" 1215*4882a593Smuzhiyun set +e 1216*4882a593Smuzhiyun run_cmd "$IP ro replace 172.16.101.1/32 nhid 24" 1217*4882a593Smuzhiyun run_cmd "ip netns exec me ping -c1 -w1 172.16.101.1" 1218*4882a593Smuzhiyun log_test $? 0 "IPv6 nexthop with IPv4 route" 1219*4882a593Smuzhiyun 1220*4882a593Smuzhiyun $IP neigh sh | grep -q "${lladdr} dev veth1" 1221*4882a593Smuzhiyun if [ $? -eq 1 ]; then 1222*4882a593Smuzhiyun echo " WARNING: Neigh entry missing for ${lladdr}" 1223*4882a593Smuzhiyun $IP neigh sh | grep 'dev veth1' 1224*4882a593Smuzhiyun fi 1225*4882a593Smuzhiyun 1226*4882a593Smuzhiyun $IP neigh sh | grep -q "172.16.101.1 dev eth1" 1227*4882a593Smuzhiyun if [ $? -eq 0 ]; then 1228*4882a593Smuzhiyun echo " WARNING: Neigh entry exists for 172.16.101.1" 1229*4882a593Smuzhiyun $IP neigh sh | grep 'dev veth1' 1230*4882a593Smuzhiyun fi 1231*4882a593Smuzhiyun 1232*4882a593Smuzhiyun set -e 1233*4882a593Smuzhiyun run_cmd "$IP nexthop add id 25 via 172.16.1.2 dev veth1" 1234*4882a593Smuzhiyun run_cmd "$IP nexthop add id 101 group 24/25" 1235*4882a593Smuzhiyun set +e 1236*4882a593Smuzhiyun run_cmd "$IP ro replace 172.16.101.1/32 nhid 101" 1237*4882a593Smuzhiyun log_test $? 0 "IPv4 route with mixed v4-v6 multipath route" 1238*4882a593Smuzhiyun 1239*4882a593Smuzhiyun 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" 1240*4882a593Smuzhiyun 1241*4882a593Smuzhiyun run_cmd "ip netns exec me ping -c1 -w1 172.16.101.1" 1242*4882a593Smuzhiyun log_test $? 0 "IPv6 nexthop with IPv4 route" 1243*4882a593Smuzhiyun 1244*4882a593Smuzhiyun run_cmd "$IP ro replace 172.16.101.1/32 via inet6 ${lladdr} dev veth1" 1245*4882a593Smuzhiyun run_cmd "ip netns exec me ping -c1 -w1 172.16.101.1" 1246*4882a593Smuzhiyun log_test $? 0 "IPv4 route with IPv6 gateway" 1247*4882a593Smuzhiyun 1248*4882a593Smuzhiyun $IP neigh sh | grep -q "${lladdr} dev veth1" 1249*4882a593Smuzhiyun if [ $? -eq 1 ]; then 1250*4882a593Smuzhiyun echo " WARNING: Neigh entry missing for ${lladdr}" 1251*4882a593Smuzhiyun $IP neigh sh | grep 'dev veth1' 1252*4882a593Smuzhiyun fi 1253*4882a593Smuzhiyun 1254*4882a593Smuzhiyun $IP neigh sh | grep -q "172.16.101.1 dev eth1" 1255*4882a593Smuzhiyun if [ $? -eq 0 ]; then 1256*4882a593Smuzhiyun echo " WARNING: Neigh entry exists for 172.16.101.1" 1257*4882a593Smuzhiyun $IP neigh sh | grep 'dev veth1' 1258*4882a593Smuzhiyun fi 1259*4882a593Smuzhiyun 1260*4882a593Smuzhiyun run_cmd "$IP ro del 172.16.101.1/32 via inet6 ${lladdr} dev veth1" 1261*4882a593Smuzhiyun run_cmd "$IP -4 ro add default via inet6 ${lladdr} dev veth1" 1262*4882a593Smuzhiyun run_cmd "ip netns exec me ping -c1 -w1 172.16.101.1" 1263*4882a593Smuzhiyun log_test $? 0 "IPv4 default route with IPv6 gateway" 1264*4882a593Smuzhiyun 1265*4882a593Smuzhiyun # 1266*4882a593Smuzhiyun # MPLS as an example of LWT encap 1267*4882a593Smuzhiyun # 1268*4882a593Smuzhiyun run_cmd "$IP nexthop add id 51 encap mpls 101 via 172.16.1.2 dev veth1" 1269*4882a593Smuzhiyun log_test $? 0 "IPv4 route with MPLS encap" 1270*4882a593Smuzhiyun check_nexthop "id 51" "id 51 encap mpls 101 via 172.16.1.2 dev veth1 scope link" 1271*4882a593Smuzhiyun log_test $? 0 "IPv4 route with MPLS encap - check" 1272*4882a593Smuzhiyun 1273*4882a593Smuzhiyun run_cmd "$IP nexthop add id 52 encap mpls 102 via inet6 2001:db8:91::2 dev veth1" 1274*4882a593Smuzhiyun log_test $? 0 "IPv4 route with MPLS encap and v6 gateway" 1275*4882a593Smuzhiyun check_nexthop "id 52" "id 52 encap mpls 102 via 2001:db8:91::2 dev veth1 scope link" 1276*4882a593Smuzhiyun log_test $? 0 "IPv4 route with MPLS encap, v6 gw - check" 1277*4882a593Smuzhiyun} 1278*4882a593Smuzhiyun 1279*4882a593Smuzhiyunipv4_large_grp() 1280*4882a593Smuzhiyun{ 1281*4882a593Smuzhiyun local ecmp=32 1282*4882a593Smuzhiyun 1283*4882a593Smuzhiyun echo 1284*4882a593Smuzhiyun echo "IPv4 large groups (x$ecmp)" 1285*4882a593Smuzhiyun echo "---------------------" 1286*4882a593Smuzhiyun 1287*4882a593Smuzhiyun check_large_grp 4 $ecmp 1288*4882a593Smuzhiyun 1289*4882a593Smuzhiyun $IP nexthop flush >/dev/null 2>&1 1290*4882a593Smuzhiyun} 1291*4882a593Smuzhiyun 1292*4882a593Smuzhiyunsysctl_nexthop_compat_mode_check() 1293*4882a593Smuzhiyun{ 1294*4882a593Smuzhiyun local sysctlname="net.ipv4.nexthop_compat_mode" 1295*4882a593Smuzhiyun local lprefix=$1 1296*4882a593Smuzhiyun 1297*4882a593Smuzhiyun IPE="ip netns exec me" 1298*4882a593Smuzhiyun 1299*4882a593Smuzhiyun $IPE sysctl -q $sysctlname 2>&1 >/dev/null 1300*4882a593Smuzhiyun if [ $? -ne 0 ]; then 1301*4882a593Smuzhiyun echo "SKIP: kernel lacks nexthop compat mode sysctl control" 1302*4882a593Smuzhiyun return $ksft_skip 1303*4882a593Smuzhiyun fi 1304*4882a593Smuzhiyun 1305*4882a593Smuzhiyun out=$($IPE sysctl $sysctlname 2>/dev/null) 1306*4882a593Smuzhiyun log_test $? 0 "$lprefix default nexthop compat mode check" 1307*4882a593Smuzhiyun check_output "${out}" "$sysctlname = 1" 1308*4882a593Smuzhiyun} 1309*4882a593Smuzhiyun 1310*4882a593Smuzhiyunsysctl_nexthop_compat_mode_set() 1311*4882a593Smuzhiyun{ 1312*4882a593Smuzhiyun local sysctlname="net.ipv4.nexthop_compat_mode" 1313*4882a593Smuzhiyun local mode=$1 1314*4882a593Smuzhiyun local lprefix=$2 1315*4882a593Smuzhiyun 1316*4882a593Smuzhiyun IPE="ip netns exec me" 1317*4882a593Smuzhiyun 1318*4882a593Smuzhiyun out=$($IPE sysctl -w $sysctlname=$mode) 1319*4882a593Smuzhiyun log_test $? 0 "$lprefix set compat mode - $mode" 1320*4882a593Smuzhiyun check_output "${out}" "net.ipv4.nexthop_compat_mode = $mode" 1321*4882a593Smuzhiyun} 1322*4882a593Smuzhiyun 1323*4882a593Smuzhiyunipv6_compat_mode() 1324*4882a593Smuzhiyun{ 1325*4882a593Smuzhiyun local rc 1326*4882a593Smuzhiyun 1327*4882a593Smuzhiyun echo 1328*4882a593Smuzhiyun echo "IPv6 nexthop api compat mode test" 1329*4882a593Smuzhiyun echo "--------------------------------" 1330*4882a593Smuzhiyun 1331*4882a593Smuzhiyun sysctl_nexthop_compat_mode_check "IPv6" 1332*4882a593Smuzhiyun if [ $? -eq $ksft_skip ]; then 1333*4882a593Smuzhiyun return $ksft_skip 1334*4882a593Smuzhiyun fi 1335*4882a593Smuzhiyun 1336*4882a593Smuzhiyun run_cmd "$IP nexthop add id 62 via 2001:db8:91::2 dev veth1" 1337*4882a593Smuzhiyun run_cmd "$IP nexthop add id 63 via 2001:db8:91::3 dev veth1" 1338*4882a593Smuzhiyun run_cmd "$IP nexthop add id 122 group 62/63" 1339*4882a593Smuzhiyun ipmout=$(start_ip_monitor route) 1340*4882a593Smuzhiyun 1341*4882a593Smuzhiyun run_cmd "$IP -6 ro add 2001:db8:101::1/128 nhid 122" 1342*4882a593Smuzhiyun # route add notification should contain expanded nexthops 1343*4882a593Smuzhiyun stop_ip_monitor $ipmout 3 1344*4882a593Smuzhiyun log_test $? 0 "IPv6 compat mode on - route add notification" 1345*4882a593Smuzhiyun 1346*4882a593Smuzhiyun # route dump should contain expanded nexthops 1347*4882a593Smuzhiyun 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" 1348*4882a593Smuzhiyun log_test $? 0 "IPv6 compat mode on - route dump" 1349*4882a593Smuzhiyun 1350*4882a593Smuzhiyun # change in nexthop group should generate route notification 1351*4882a593Smuzhiyun run_cmd "$IP nexthop add id 64 via 2001:db8:91::4 dev veth1" 1352*4882a593Smuzhiyun ipmout=$(start_ip_monitor route) 1353*4882a593Smuzhiyun run_cmd "$IP nexthop replace id 122 group 62/64" 1354*4882a593Smuzhiyun stop_ip_monitor $ipmout 3 1355*4882a593Smuzhiyun 1356*4882a593Smuzhiyun log_test $? 0 "IPv6 compat mode on - nexthop change" 1357*4882a593Smuzhiyun 1358*4882a593Smuzhiyun # set compat mode off 1359*4882a593Smuzhiyun sysctl_nexthop_compat_mode_set 0 "IPv6" 1360*4882a593Smuzhiyun 1361*4882a593Smuzhiyun run_cmd "$IP -6 ro del 2001:db8:101::1/128 nhid 122" 1362*4882a593Smuzhiyun 1363*4882a593Smuzhiyun run_cmd "$IP nexthop add id 62 via 2001:db8:91::2 dev veth1" 1364*4882a593Smuzhiyun run_cmd "$IP nexthop add id 63 via 2001:db8:91::3 dev veth1" 1365*4882a593Smuzhiyun run_cmd "$IP nexthop add id 122 group 62/63" 1366*4882a593Smuzhiyun ipmout=$(start_ip_monitor route) 1367*4882a593Smuzhiyun 1368*4882a593Smuzhiyun run_cmd "$IP -6 ro add 2001:db8:101::1/128 nhid 122" 1369*4882a593Smuzhiyun # route add notification should not contain expanded nexthops 1370*4882a593Smuzhiyun stop_ip_monitor $ipmout 1 1371*4882a593Smuzhiyun log_test $? 0 "IPv6 compat mode off - route add notification" 1372*4882a593Smuzhiyun 1373*4882a593Smuzhiyun # route dump should not contain expanded nexthops 1374*4882a593Smuzhiyun check_route6 "2001:db8:101::1" "2001:db8:101::1 nhid 122 metric 1024" 1375*4882a593Smuzhiyun log_test $? 0 "IPv6 compat mode off - route dump" 1376*4882a593Smuzhiyun 1377*4882a593Smuzhiyun # change in nexthop group should not generate route notification 1378*4882a593Smuzhiyun run_cmd "$IP nexthop add id 64 via 2001:db8:91::4 dev veth1" 1379*4882a593Smuzhiyun ipmout=$(start_ip_monitor route) 1380*4882a593Smuzhiyun run_cmd "$IP nexthop replace id 122 group 62/64" 1381*4882a593Smuzhiyun stop_ip_monitor $ipmout 0 1382*4882a593Smuzhiyun log_test $? 0 "IPv6 compat mode off - nexthop change" 1383*4882a593Smuzhiyun 1384*4882a593Smuzhiyun # nexthop delete should not generate route notification 1385*4882a593Smuzhiyun ipmout=$(start_ip_monitor route) 1386*4882a593Smuzhiyun run_cmd "$IP nexthop del id 122" 1387*4882a593Smuzhiyun stop_ip_monitor $ipmout 0 1388*4882a593Smuzhiyun log_test $? 0 "IPv6 compat mode off - nexthop delete" 1389*4882a593Smuzhiyun 1390*4882a593Smuzhiyun # set compat mode back on 1391*4882a593Smuzhiyun sysctl_nexthop_compat_mode_set 1 "IPv6" 1392*4882a593Smuzhiyun} 1393*4882a593Smuzhiyun 1394*4882a593Smuzhiyunipv4_compat_mode() 1395*4882a593Smuzhiyun{ 1396*4882a593Smuzhiyun local rc 1397*4882a593Smuzhiyun 1398*4882a593Smuzhiyun echo 1399*4882a593Smuzhiyun echo "IPv4 nexthop api compat mode" 1400*4882a593Smuzhiyun echo "----------------------------" 1401*4882a593Smuzhiyun 1402*4882a593Smuzhiyun sysctl_nexthop_compat_mode_check "IPv4" 1403*4882a593Smuzhiyun if [ $? -eq $ksft_skip ]; then 1404*4882a593Smuzhiyun return $ksft_skip 1405*4882a593Smuzhiyun fi 1406*4882a593Smuzhiyun 1407*4882a593Smuzhiyun run_cmd "$IP nexthop add id 21 via 172.16.1.2 dev veth1" 1408*4882a593Smuzhiyun run_cmd "$IP nexthop add id 22 via 172.16.1.2 dev veth1" 1409*4882a593Smuzhiyun run_cmd "$IP nexthop add id 122 group 21/22" 1410*4882a593Smuzhiyun ipmout=$(start_ip_monitor route) 1411*4882a593Smuzhiyun 1412*4882a593Smuzhiyun run_cmd "$IP ro add 172.16.101.1/32 nhid 122" 1413*4882a593Smuzhiyun stop_ip_monitor $ipmout 3 1414*4882a593Smuzhiyun 1415*4882a593Smuzhiyun # route add notification should contain expanded nexthops 1416*4882a593Smuzhiyun log_test $? 0 "IPv4 compat mode on - route add notification" 1417*4882a593Smuzhiyun 1418*4882a593Smuzhiyun # route dump should contain expanded nexthops 1419*4882a593Smuzhiyun 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" 1420*4882a593Smuzhiyun log_test $? 0 "IPv4 compat mode on - route dump" 1421*4882a593Smuzhiyun 1422*4882a593Smuzhiyun # change in nexthop group should generate route notification 1423*4882a593Smuzhiyun run_cmd "$IP nexthop add id 23 via 172.16.1.3 dev veth1" 1424*4882a593Smuzhiyun ipmout=$(start_ip_monitor route) 1425*4882a593Smuzhiyun run_cmd "$IP nexthop replace id 122 group 21/23" 1426*4882a593Smuzhiyun stop_ip_monitor $ipmout 3 1427*4882a593Smuzhiyun log_test $? 0 "IPv4 compat mode on - nexthop change" 1428*4882a593Smuzhiyun 1429*4882a593Smuzhiyun sysctl_nexthop_compat_mode_set 0 "IPv4" 1430*4882a593Smuzhiyun 1431*4882a593Smuzhiyun # cleanup 1432*4882a593Smuzhiyun run_cmd "$IP ro del 172.16.101.1/32 nhid 122" 1433*4882a593Smuzhiyun 1434*4882a593Smuzhiyun ipmout=$(start_ip_monitor route) 1435*4882a593Smuzhiyun run_cmd "$IP ro add 172.16.101.1/32 nhid 122" 1436*4882a593Smuzhiyun stop_ip_monitor $ipmout 1 1437*4882a593Smuzhiyun # route add notification should not contain expanded nexthops 1438*4882a593Smuzhiyun log_test $? 0 "IPv4 compat mode off - route add notification" 1439*4882a593Smuzhiyun 1440*4882a593Smuzhiyun # route dump should not contain expanded nexthops 1441*4882a593Smuzhiyun check_route "172.16.101.1" "172.16.101.1 nhid 122" 1442*4882a593Smuzhiyun log_test $? 0 "IPv4 compat mode off - route dump" 1443*4882a593Smuzhiyun 1444*4882a593Smuzhiyun # change in nexthop group should not generate route notification 1445*4882a593Smuzhiyun ipmout=$(start_ip_monitor route) 1446*4882a593Smuzhiyun run_cmd "$IP nexthop replace id 122 group 21/22" 1447*4882a593Smuzhiyun stop_ip_monitor $ipmout 0 1448*4882a593Smuzhiyun log_test $? 0 "IPv4 compat mode off - nexthop change" 1449*4882a593Smuzhiyun 1450*4882a593Smuzhiyun # nexthop delete should not generate route notification 1451*4882a593Smuzhiyun ipmout=$(start_ip_monitor route) 1452*4882a593Smuzhiyun run_cmd "$IP nexthop del id 122" 1453*4882a593Smuzhiyun stop_ip_monitor $ipmout 0 1454*4882a593Smuzhiyun log_test $? 0 "IPv4 compat mode off - nexthop delete" 1455*4882a593Smuzhiyun 1456*4882a593Smuzhiyun sysctl_nexthop_compat_mode_set 1 "IPv4" 1457*4882a593Smuzhiyun} 1458*4882a593Smuzhiyun 1459*4882a593Smuzhiyunipv4_del_add_loop1() 1460*4882a593Smuzhiyun{ 1461*4882a593Smuzhiyun while :; do 1462*4882a593Smuzhiyun $IP nexthop del id 100 1463*4882a593Smuzhiyun $IP nexthop add id 100 via 172.16.1.2 dev veth1 1464*4882a593Smuzhiyun done >/dev/null 2>&1 1465*4882a593Smuzhiyun} 1466*4882a593Smuzhiyun 1467*4882a593Smuzhiyunipv4_grp_replace_loop() 1468*4882a593Smuzhiyun{ 1469*4882a593Smuzhiyun while :; do 1470*4882a593Smuzhiyun $IP nexthop replace id 102 group 100/101 1471*4882a593Smuzhiyun done >/dev/null 2>&1 1472*4882a593Smuzhiyun} 1473*4882a593Smuzhiyun 1474*4882a593Smuzhiyunipv4_torture() 1475*4882a593Smuzhiyun{ 1476*4882a593Smuzhiyun local pid1 1477*4882a593Smuzhiyun local pid2 1478*4882a593Smuzhiyun local pid3 1479*4882a593Smuzhiyun local pid4 1480*4882a593Smuzhiyun local pid5 1481*4882a593Smuzhiyun 1482*4882a593Smuzhiyun echo 1483*4882a593Smuzhiyun echo "IPv4 runtime torture" 1484*4882a593Smuzhiyun echo "--------------------" 1485*4882a593Smuzhiyun if [ ! -x "$(command -v mausezahn)" ]; then 1486*4882a593Smuzhiyun echo "SKIP: Could not run test; need mausezahn tool" 1487*4882a593Smuzhiyun return 1488*4882a593Smuzhiyun fi 1489*4882a593Smuzhiyun 1490*4882a593Smuzhiyun run_cmd "$IP nexthop add id 100 via 172.16.1.2 dev veth1" 1491*4882a593Smuzhiyun run_cmd "$IP nexthop add id 101 via 172.16.2.2 dev veth3" 1492*4882a593Smuzhiyun run_cmd "$IP nexthop add id 102 group 100/101" 1493*4882a593Smuzhiyun run_cmd "$IP route add 172.16.101.1 nhid 102" 1494*4882a593Smuzhiyun run_cmd "$IP route add 172.16.101.2 nhid 102" 1495*4882a593Smuzhiyun 1496*4882a593Smuzhiyun ipv4_del_add_loop1 & 1497*4882a593Smuzhiyun pid1=$! 1498*4882a593Smuzhiyun ipv4_grp_replace_loop & 1499*4882a593Smuzhiyun pid2=$! 1500*4882a593Smuzhiyun ip netns exec me ping -f 172.16.101.1 >/dev/null 2>&1 & 1501*4882a593Smuzhiyun pid3=$! 1502*4882a593Smuzhiyun ip netns exec me ping -f 172.16.101.2 >/dev/null 2>&1 & 1503*4882a593Smuzhiyun pid4=$! 1504*4882a593Smuzhiyun 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 & 1505*4882a593Smuzhiyun pid5=$! 1506*4882a593Smuzhiyun 1507*4882a593Smuzhiyun sleep 300 1508*4882a593Smuzhiyun kill -9 $pid1 $pid2 $pid3 $pid4 $pid5 1509*4882a593Smuzhiyun 1510*4882a593Smuzhiyun # if we did not crash, success 1511*4882a593Smuzhiyun log_test 0 0 "IPv4 torture test" 1512*4882a593Smuzhiyun} 1513*4882a593Smuzhiyun 1514*4882a593Smuzhiyunbasic() 1515*4882a593Smuzhiyun{ 1516*4882a593Smuzhiyun echo 1517*4882a593Smuzhiyun echo "Basic functional tests" 1518*4882a593Smuzhiyun echo "----------------------" 1519*4882a593Smuzhiyun run_cmd "$IP nexthop ls" 1520*4882a593Smuzhiyun log_test $? 0 "List with nothing defined" 1521*4882a593Smuzhiyun 1522*4882a593Smuzhiyun run_cmd "$IP nexthop get id 1" 1523*4882a593Smuzhiyun log_test $? 2 "Nexthop get on non-existent id" 1524*4882a593Smuzhiyun 1525*4882a593Smuzhiyun # attempt to create nh without a device or gw - fails 1526*4882a593Smuzhiyun run_cmd "$IP nexthop add id 1" 1527*4882a593Smuzhiyun log_test $? 2 "Nexthop with no device or gateway" 1528*4882a593Smuzhiyun 1529*4882a593Smuzhiyun # attempt to create nh with down device - fails 1530*4882a593Smuzhiyun $IP li set veth1 down 1531*4882a593Smuzhiyun run_cmd "$IP nexthop add id 1 dev veth1" 1532*4882a593Smuzhiyun log_test $? 2 "Nexthop with down device" 1533*4882a593Smuzhiyun 1534*4882a593Smuzhiyun # create nh with linkdown device - fails 1535*4882a593Smuzhiyun $IP li set veth1 up 1536*4882a593Smuzhiyun ip -netns peer li set veth2 down 1537*4882a593Smuzhiyun run_cmd "$IP nexthop add id 1 dev veth1" 1538*4882a593Smuzhiyun log_test $? 2 "Nexthop with device that is linkdown" 1539*4882a593Smuzhiyun ip -netns peer li set veth2 up 1540*4882a593Smuzhiyun 1541*4882a593Smuzhiyun # device only 1542*4882a593Smuzhiyun run_cmd "$IP nexthop add id 1 dev veth1" 1543*4882a593Smuzhiyun log_test $? 0 "Nexthop with device only" 1544*4882a593Smuzhiyun 1545*4882a593Smuzhiyun # create nh with duplicate id 1546*4882a593Smuzhiyun run_cmd "$IP nexthop add id 1 dev veth3" 1547*4882a593Smuzhiyun log_test $? 2 "Nexthop with duplicate id" 1548*4882a593Smuzhiyun 1549*4882a593Smuzhiyun # blackhole nexthop 1550*4882a593Smuzhiyun run_cmd "$IP nexthop add id 2 blackhole" 1551*4882a593Smuzhiyun log_test $? 0 "Blackhole nexthop" 1552*4882a593Smuzhiyun 1553*4882a593Smuzhiyun # blackhole nexthop can not have other specs 1554*4882a593Smuzhiyun run_cmd "$IP nexthop replace id 2 blackhole dev veth1" 1555*4882a593Smuzhiyun log_test $? 2 "Blackhole nexthop with other attributes" 1556*4882a593Smuzhiyun 1557*4882a593Smuzhiyun # 1558*4882a593Smuzhiyun # groups 1559*4882a593Smuzhiyun # 1560*4882a593Smuzhiyun 1561*4882a593Smuzhiyun run_cmd "$IP nexthop add id 101 group 1" 1562*4882a593Smuzhiyun log_test $? 0 "Create group" 1563*4882a593Smuzhiyun 1564*4882a593Smuzhiyun run_cmd "$IP nexthop add id 102 group 2" 1565*4882a593Smuzhiyun log_test $? 0 "Create group with blackhole nexthop" 1566*4882a593Smuzhiyun 1567*4882a593Smuzhiyun # multipath group can not have a blackhole as 1 path 1568*4882a593Smuzhiyun run_cmd "$IP nexthop add id 103 group 1/2" 1569*4882a593Smuzhiyun log_test $? 2 "Create multipath group where 1 path is a blackhole" 1570*4882a593Smuzhiyun 1571*4882a593Smuzhiyun # multipath group can not have a member replaced by a blackhole 1572*4882a593Smuzhiyun run_cmd "$IP nexthop replace id 2 dev veth3" 1573*4882a593Smuzhiyun run_cmd "$IP nexthop replace id 102 group 1/2" 1574*4882a593Smuzhiyun run_cmd "$IP nexthop replace id 2 blackhole" 1575*4882a593Smuzhiyun log_test $? 2 "Multipath group can not have a member replaced by blackhole" 1576*4882a593Smuzhiyun 1577*4882a593Smuzhiyun # attempt to create group with non-existent nexthop 1578*4882a593Smuzhiyun run_cmd "$IP nexthop add id 103 group 12" 1579*4882a593Smuzhiyun log_test $? 2 "Create group with non-existent nexthop" 1580*4882a593Smuzhiyun 1581*4882a593Smuzhiyun # attempt to create group with same nexthop 1582*4882a593Smuzhiyun run_cmd "$IP nexthop add id 103 group 1/1" 1583*4882a593Smuzhiyun log_test $? 2 "Create group with same nexthop multiple times" 1584*4882a593Smuzhiyun 1585*4882a593Smuzhiyun # replace nexthop with a group - fails 1586*4882a593Smuzhiyun run_cmd "$IP nexthop replace id 2 group 1" 1587*4882a593Smuzhiyun log_test $? 2 "Replace nexthop with nexthop group" 1588*4882a593Smuzhiyun 1589*4882a593Smuzhiyun # replace nexthop group with a nexthop - fails 1590*4882a593Smuzhiyun run_cmd "$IP nexthop replace id 101 dev veth1" 1591*4882a593Smuzhiyun log_test $? 2 "Replace nexthop group with nexthop" 1592*4882a593Smuzhiyun 1593*4882a593Smuzhiyun # nexthop group with other attributes fail 1594*4882a593Smuzhiyun run_cmd "$IP nexthop add id 104 group 1 dev veth1" 1595*4882a593Smuzhiyun log_test $? 2 "Nexthop group and device" 1596*4882a593Smuzhiyun 1597*4882a593Smuzhiyun # Tests to ensure that flushing works as expected. 1598*4882a593Smuzhiyun run_cmd "$IP nexthop add id 105 blackhole proto 99" 1599*4882a593Smuzhiyun run_cmd "$IP nexthop add id 106 blackhole proto 100" 1600*4882a593Smuzhiyun run_cmd "$IP nexthop add id 107 blackhole proto 99" 1601*4882a593Smuzhiyun run_cmd "$IP nexthop flush proto 99" 1602*4882a593Smuzhiyun check_nexthop "id 105" "" 1603*4882a593Smuzhiyun check_nexthop "id 106" "id 106 blackhole proto 100" 1604*4882a593Smuzhiyun check_nexthop "id 107" "" 1605*4882a593Smuzhiyun run_cmd "$IP nexthop flush proto 100" 1606*4882a593Smuzhiyun check_nexthop "id 106" "" 1607*4882a593Smuzhiyun 1608*4882a593Smuzhiyun run_cmd "$IP nexthop flush proto 100" 1609*4882a593Smuzhiyun log_test $? 0 "Test proto flush" 1610*4882a593Smuzhiyun 1611*4882a593Smuzhiyun run_cmd "$IP nexthop add id 104 group 1 blackhole" 1612*4882a593Smuzhiyun log_test $? 2 "Nexthop group and blackhole" 1613*4882a593Smuzhiyun 1614*4882a593Smuzhiyun $IP nexthop flush >/dev/null 2>&1 1615*4882a593Smuzhiyun} 1616*4882a593Smuzhiyun 1617*4882a593Smuzhiyun################################################################################ 1618*4882a593Smuzhiyun# usage 1619*4882a593Smuzhiyun 1620*4882a593Smuzhiyunusage() 1621*4882a593Smuzhiyun{ 1622*4882a593Smuzhiyun cat <<EOF 1623*4882a593Smuzhiyunusage: ${0##*/} OPTS 1624*4882a593Smuzhiyun 1625*4882a593Smuzhiyun -t <test> Test(s) to run (default: all) 1626*4882a593Smuzhiyun (options: $ALL_TESTS) 1627*4882a593Smuzhiyun -4 IPv4 tests only 1628*4882a593Smuzhiyun -6 IPv6 tests only 1629*4882a593Smuzhiyun -p Pause on fail 1630*4882a593Smuzhiyun -P Pause after each test before cleanup 1631*4882a593Smuzhiyun -v verbose mode (show commands and output) 1632*4882a593Smuzhiyun 1633*4882a593Smuzhiyun Runtime test 1634*4882a593Smuzhiyun -n num Number of nexthops to target 1635*4882a593Smuzhiyun -N Use new style to install routes in DUT 1636*4882a593Smuzhiyun 1637*4882a593Smuzhiyundone 1638*4882a593SmuzhiyunEOF 1639*4882a593Smuzhiyun} 1640*4882a593Smuzhiyun 1641*4882a593Smuzhiyun################################################################################ 1642*4882a593Smuzhiyun# main 1643*4882a593Smuzhiyun 1644*4882a593Smuzhiyunwhile getopts :t:pP46hv o 1645*4882a593Smuzhiyundo 1646*4882a593Smuzhiyun case $o in 1647*4882a593Smuzhiyun t) TESTS=$OPTARG;; 1648*4882a593Smuzhiyun 4) TESTS=${IPV4_TESTS};; 1649*4882a593Smuzhiyun 6) TESTS=${IPV6_TESTS};; 1650*4882a593Smuzhiyun p) PAUSE_ON_FAIL=yes;; 1651*4882a593Smuzhiyun P) PAUSE=yes;; 1652*4882a593Smuzhiyun v) VERBOSE=$(($VERBOSE + 1));; 1653*4882a593Smuzhiyun h) usage; exit 0;; 1654*4882a593Smuzhiyun *) usage; exit 1;; 1655*4882a593Smuzhiyun esac 1656*4882a593Smuzhiyundone 1657*4882a593Smuzhiyun 1658*4882a593Smuzhiyun# make sure we don't pause twice 1659*4882a593Smuzhiyun[ "${PAUSE}" = "yes" ] && PAUSE_ON_FAIL=no 1660*4882a593Smuzhiyun 1661*4882a593Smuzhiyunif [ "$(id -u)" -ne 0 ];then 1662*4882a593Smuzhiyun echo "SKIP: Need root privileges" 1663*4882a593Smuzhiyun exit $ksft_skip; 1664*4882a593Smuzhiyunfi 1665*4882a593Smuzhiyun 1666*4882a593Smuzhiyunif [ ! -x "$(command -v ip)" ]; then 1667*4882a593Smuzhiyun echo "SKIP: Could not run test without ip tool" 1668*4882a593Smuzhiyun exit $ksft_skip 1669*4882a593Smuzhiyunfi 1670*4882a593Smuzhiyun 1671*4882a593Smuzhiyunip help 2>&1 | grep -q nexthop 1672*4882a593Smuzhiyunif [ $? -ne 0 ]; then 1673*4882a593Smuzhiyun echo "SKIP: iproute2 too old, missing nexthop command" 1674*4882a593Smuzhiyun exit $ksft_skip 1675*4882a593Smuzhiyunfi 1676*4882a593Smuzhiyun 1677*4882a593Smuzhiyunout=$(ip nexthop ls 2>&1 | grep -q "Operation not supported") 1678*4882a593Smuzhiyunif [ $? -eq 0 ]; then 1679*4882a593Smuzhiyun echo "SKIP: kernel lacks nexthop support" 1680*4882a593Smuzhiyun exit $ksft_skip 1681*4882a593Smuzhiyunfi 1682*4882a593Smuzhiyun 1683*4882a593Smuzhiyunfor t in $TESTS 1684*4882a593Smuzhiyundo 1685*4882a593Smuzhiyun case $t in 1686*4882a593Smuzhiyun none) IP="ip -netns peer"; setup; exit 0;; 1687*4882a593Smuzhiyun *) setup; $t; cleanup;; 1688*4882a593Smuzhiyun esac 1689*4882a593Smuzhiyundone 1690*4882a593Smuzhiyun 1691*4882a593Smuzhiyunif [ "$TESTS" != "none" ]; then 1692*4882a593Smuzhiyun printf "\nTests passed: %3d\n" ${nsuccess} 1693*4882a593Smuzhiyun printf "Tests failed: %3d\n" ${nfail} 1694*4882a593Smuzhiyunfi 1695*4882a593Smuzhiyun 1696*4882a593Smuzhiyunexit $ret 1697