brintos

brintos / linux-shallow public Read only

0
0
Text · 73.9 KiB · 77c83d9 Raw
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