brintos

brintos / linux-shallow public Read only

0
0
Text · 24.6 KiB · 1b3b462 Raw
874 lines · bash
1# SPDX-License-Identifier: GPL-2.02#3# Various helpers and tests to verify FIB offload.4 5__fib_trap_check()6{7	local ns=$1; shift8	local family=$1; shift9	local route=$1; shift10	local should_fail=$1; shift11	local ret12 13	ip -n $ns -j -p -$family route show $route \14		| jq -e '.[]["flags"] | contains(["trap"])' &> /dev/null15	ret=$?16	if [[ $should_fail == "true" ]]; then17		if [[ $ret -ne 0 ]]; then18			return 019		else20			return 121		fi22	fi23 24	return $ret25}26 27fib_trap_check()28{29	local ns=$1; shift30	local family=$1; shift31	local route=$1; shift32	local should_fail=$1; shift33 34	busywait 5000 __fib_trap_check $ns $family "$route" $should_fail35}36 37fib4_trap_check()38{39	local ns=$1; shift40	local route=$1; shift41	local should_fail=$1; shift42 43	fib_trap_check $ns 4 "$route" $should_fail44}45 46fib6_trap_check()47{48	local ns=$1; shift49	local route=$1; shift50	local should_fail=$1; shift51 52	fib_trap_check $ns 6 "$route" $should_fail53}54 55fib_ipv4_identical_routes_test()56{57	local ns=$1; shift58	local i59 60	RET=061 62	for i in $(seq 1 3); do63		ip -n $ns link add name dummy$i type dummy64		ip -n $ns link set dev dummy$i up65	done66 67	ip -n $ns route add 192.0.2.0/24 dev dummy1 tos 0 metric 102468	fib4_trap_check $ns "192.0.2.0/24 dev dummy1 tos 0 metric 1024" false69	check_err $? "Route not in hardware when should"70 71	ip -n $ns route append 192.0.2.0/24 dev dummy2 tos 0 metric 102472	fib4_trap_check $ns "192.0.2.0/24 dev dummy2 tos 0 metric 1024" true73	check_err $? "Appended route in hardware when should not"74 75	ip -n $ns route prepend 192.0.2.0/24 dev dummy3 tos 0 metric 102476	fib4_trap_check $ns "192.0.2.0/24 dev dummy3 tos 0 metric 1024" false77	check_err $? "Prepended route not in hardware when should"78 79	fib4_trap_check $ns "192.0.2.0/24 dev dummy1 tos 0 metric 1024" true80	check_err $? "Route was not replaced in hardware by prepended one"81 82	log_test "IPv4 identical routes"83 84	for i in $(seq 1 3); do85		ip -n $ns link del dev dummy$i86	done87}88 89fib_ipv4_tos_test()90{91	local ns=$1; shift92 93	RET=094 95	ip -n $ns link add name dummy1 type dummy96	ip -n $ns link set dev dummy1 up97 98	ip -n $ns route add 192.0.2.0/24 dev dummy1 tos 0 metric 102499	fib4_trap_check $ns "192.0.2.0/24 dev dummy1 tos 0 metric 1024" false100	check_err $? "Route not in hardware when should"101 102	ip -n $ns route add 192.0.2.0/24 dev dummy1 tos 8 metric 1024103	fib4_trap_check $ns "192.0.2.0/24 dev dummy1 tos 8 metric 1024" false104	check_err $? "Highest TOS route not in hardware when should"105 106	fib4_trap_check $ns "192.0.2.0/24 dev dummy1 tos 0 metric 1024" true107	check_err $? "Lowest TOS route still in hardware when should not"108 109	ip -n $ns route add 192.0.2.0/24 dev dummy1 tos 4 metric 1024110	fib4_trap_check $ns "192.0.2.0/24 dev dummy1 tos 4 metric 1024" true111	check_err $? "Middle TOS route in hardware when should not"112 113	log_test "IPv4 routes with TOS"114 115	ip -n $ns link del dev dummy1116}117 118fib_ipv4_metric_test()119{120	local ns=$1; shift121 122	RET=0123 124	ip -n $ns link add name dummy1 type dummy125	ip -n $ns link set dev dummy1 up126 127	ip -n $ns route add 192.0.2.0/24 dev dummy1 metric 1024128	fib4_trap_check $ns "192.0.2.0/24 dev dummy1 metric 1024" false129	check_err $? "Route not in hardware when should"130 131	ip -n $ns route add 192.0.2.0/24 dev dummy1 metric 1022132	fib4_trap_check $ns "192.0.2.0/24 dev dummy1 metric 1022" false133	check_err $? "Lowest metric route not in hardware when should"134 135	fib4_trap_check $ns "192.0.2.0/24 dev dummy1 metric 1024" true136	check_err $? "Highest metric route still in hardware when should not"137 138	ip -n $ns route add 192.0.2.0/24 dev dummy1 metric 1023139	fib4_trap_check $ns "192.0.2.0/24 dev dummy1 metric 1023" true140	check_err $? "Middle metric route in hardware when should not"141 142	log_test "IPv4 routes with metric"143 144	ip -n $ns link del dev dummy1145}146 147fib_ipv4_replace_test()148{149	local ns=$1; shift150	local i151 152	RET=0153 154	for i in $(seq 1 2); do155		ip -n $ns link add name dummy$i type dummy156		ip -n $ns link set dev dummy$i up157	done158 159	ip -n $ns route add 192.0.2.0/24 dev dummy1 metric 1024160	fib4_trap_check $ns "192.0.2.0/24 dev dummy1 metric 1024" false161	check_err $? "Route not in hardware when should"162 163	ip -n $ns route replace 192.0.2.0/24 dev dummy2 metric 1024164	fib4_trap_check $ns "192.0.2.0/24 dev dummy2 metric 1024" false165	check_err $? "Replacement route not in hardware when should"166 167	# Add a route with an higher metric and make sure that replacing it168	# does not affect the lower metric one.169	ip -n $ns route add 192.0.2.0/24 dev dummy1 metric 1025170	ip -n $ns route replace 192.0.2.0/24 dev dummy2 metric 1025171 172	fib4_trap_check $ns "192.0.2.0/24 dev dummy2 metric 1024" false173	check_err $? "Lowest metric route not in hardware when should"174	fib4_trap_check $ns "192.0.2.0/24 dev dummy2 metric 1025" true175	check_err $? "Highest metric route in hardware when should not"176 177	log_test "IPv4 route replace"178 179	for i in $(seq 1 2); do180		ip -n $ns link del dev dummy$i181	done182}183 184fib_ipv4_delete_test()185{186	local ns=$1; shift187	local metric188 189	RET=0190 191	ip -n $ns link add name dummy1 type dummy192	ip -n $ns link set dev dummy1 up193 194	# Insert multiple routes with the same prefix and length and varying195	# metrics. Make sure that throughout delete operations the lowest196	# metric route is the one in hardware.197	for metric in $(seq 1024 1026); do198		ip -n $ns route add 192.0.2.0/24 dev dummy1 metric $metric199	done200 201	fib4_trap_check $ns "192.0.2.0/24 dev dummy1 metric 1024" false202	check_err $? "Route not in hardware when should"203 204	ip -n $ns route del 192.0.2.0/24 dev dummy1 metric 1024205	fib4_trap_check $ns "192.0.2.0/24 dev dummy1 metric 1025" false206	check_err $? "Lowest metric route not in hardware when should"207 208	ip -n $ns route del 192.0.2.0/24 dev dummy1 metric 1026209	fib4_trap_check $ns "192.0.2.0/24 dev dummy1 metric 1025" false210	check_err $? "Sole route not in hardware when should"211 212	log_test "IPv4 route delete"213 214	ip -n $ns link del dev dummy1215}216 217fib_ipv4_plen_test()218{219	local ns=$1; shift220 221	RET=0222 223	ip -n $ns link add name dummy1 type dummy224	ip -n $ns link set dev dummy1 up225 226	# Add two routes with the same key and different prefix length and227	# make sure both are in hardware. It can be verified that both are228	# sharing the same leaf by checking the /proc/net/fib_trie229	ip -n $ns route add 192.0.2.0/24 dev dummy1230	ip -n $ns route add 192.0.2.0/25 dev dummy1231 232	fib4_trap_check $ns "192.0.2.0/24 dev dummy1" false233	check_err $? "/24 not in hardware when should"234 235	fib4_trap_check $ns "192.0.2.0/25 dev dummy1" false236	check_err $? "/25 not in hardware when should"237 238	log_test "IPv4 routes with different prefix length"239 240	ip -n $ns link del dev dummy1241}242 243fib_ipv4_replay_metric_test()244{245	local ns=$1; shift246	local devlink_dev=$1; shift247 248	RET=0249 250	ip -n $ns link add name dummy1 type dummy251	ip -n $ns link set dev dummy1 up252 253	ip -n $ns route add 192.0.2.0/24 dev dummy1 metric 1024254	ip -n $ns route add 192.0.2.0/24 dev dummy1 metric 1025255 256	devlink -N $ns dev reload $devlink_dev257 258	fib4_trap_check $ns "192.0.2.0/24 dev dummy1 metric 1024" false259	check_err $? "Lowest metric route not in hardware when should"260 261	fib4_trap_check $ns "192.0.2.0/24 dev dummy1 metric 1025" true262	check_err $? "Highest metric route in hardware when should not"263 264	log_test "IPv4 routes replay - metric"265 266	ip -n $ns link del dev dummy1267}268 269fib_ipv4_replay_tos_test()270{271	local ns=$1; shift272	local devlink_dev=$1; shift273 274	RET=0275 276	ip -n $ns link add name dummy1 type dummy277	ip -n $ns link set dev dummy1 up278 279	ip -n $ns route add 192.0.2.0/24 dev dummy1 tos 0280	ip -n $ns route add 192.0.2.0/24 dev dummy1 tos 4281 282	devlink -N $ns dev reload $devlink_dev283 284	fib4_trap_check $ns "192.0.2.0/24 dev dummy1 tos 4" false285	check_err $? "Highest TOS route not in hardware when should"286 287	fib4_trap_check $ns "192.0.2.0/24 dev dummy1 tos 0" true288	check_err $? "Lowest TOS route in hardware when should not"289 290	log_test "IPv4 routes replay - TOS"291 292	ip -n $ns link del dev dummy1293}294 295fib_ipv4_replay_plen_test()296{297	local ns=$1; shift298	local devlink_dev=$1; shift299 300	RET=0301 302	ip -n $ns link add name dummy1 type dummy303	ip -n $ns link set dev dummy1 up304 305	ip -n $ns route add 192.0.2.0/24 dev dummy1306	ip -n $ns route add 192.0.2.0/25 dev dummy1307 308	devlink -N $ns dev reload $devlink_dev309 310	fib4_trap_check $ns "192.0.2.0/24 dev dummy1" false311	check_err $? "/24 not in hardware when should"312 313	fib4_trap_check $ns "192.0.2.0/25 dev dummy1" false314	check_err $? "/25 not in hardware when should"315 316	log_test "IPv4 routes replay - prefix length"317 318	ip -n $ns link del dev dummy1319}320 321fib_ipv4_flush_test()322{323	local ns=$1; shift324	local metric325 326	RET=0327 328	ip -n $ns link add name dummy1 type dummy329	ip -n $ns link set dev dummy1 up330 331	# Exercise the routes flushing code paths by inserting various332	# prefix routes on a netdev and then deleting it.333	for metric in $(seq 1 20); do334		ip -n $ns route add 192.0.2.0/24 dev dummy1 metric $metric335	done336 337	ip -n $ns link del dev dummy1338 339	log_test "IPv4 routes flushing"340}341 342fib_ipv6_add_test()343{344	local ns=$1; shift345 346	RET=0347 348	for i in $(seq 1 2); do349		ip -n $ns link add name dummy$i type dummy350		ip -n $ns link set dev dummy$i up351	done352 353	ip -n $ns route add 2001:db8:1::/64 dev dummy1 metric 1024354	fib6_trap_check $ns "2001:db8:1::/64 dev dummy1 metric 1024" false355	check_err $? "Route not in hardware when should"356 357	ip -n $ns route append 2001:db8:1::/64 dev dummy2 metric 1024358	fib6_trap_check $ns "2001:db8:1::/64 dev dummy2 metric 1024" true359	check_err $? "Route in hardware when should not"360 361	fib6_trap_check $ns "2001:db8:1::/64 dev dummy1 metric 1024" false362	check_err $? "Route not in hardware after appending route"363 364	log_test "IPv6 single route add"365 366	for i in $(seq 1 2); do367		ip -n $ns link del dev dummy$i368	done369}370 371fib_ipv6_metric_test()372{373	local ns=$1; shift374 375	RET=0376 377	ip -n $ns link add name dummy1 type dummy378	ip -n $ns link set dev dummy1 up379 380	ip -n $ns route add 2001:db8:1::/64 dev dummy1 metric 1024381	fib6_trap_check $ns "2001:db8:1::/64 dev dummy1 metric 1024" false382	check_err $? "Route not in hardware when should"383 384	ip -n $ns route add 2001:db8:1::/64 dev dummy1 metric 1022385	fib6_trap_check $ns "2001:db8:1::/64 dev dummy1 metric 1022" false386	check_err $? "Lowest metric route not in hardware when should"387 388	fib6_trap_check $ns "2001:db8:1::/64 dev dummy1 metric 1024" true389	check_err $? "Highest metric route still in hardware when should not"390 391	ip -n $ns route add 2001:db8:1::/64 dev dummy1 metric 1023392	fib6_trap_check $ns "2001:db8:1::/64 dev dummy1 metric 1023" true393	check_err $? "Middle metric route in hardware when should not"394 395	log_test "IPv6 routes with metric"396 397	ip -n $ns link del dev dummy1398}399 400fib_ipv6_append_single_test()401{402	local ns=$1; shift403 404	# When an IPv6 multipath route is added without the 'nexthop' keyword,405	# different code paths are taken compared to when the keyword is used.406	# This test tries to verify the former.407	RET=0408 409	for i in $(seq 1 2); do410		ip -n $ns link add name dummy$i type dummy411		ip -n $ns link set dev dummy$i up412		ip -n $ns address add 2001:db8:$i::1/64 dev dummy$i413	done414 415	ip -n $ns route add 2001:db8:10::/64 via 2001:db8:1::2 metric 1024416	fib6_trap_check $ns "2001:db8:10::/64 metric 1024" false417	check_err $? "Route not in hardware when should"418 419	ip -n $ns route append 2001:db8:10::/64 via 2001:db8:2::2 metric 1024420	fib6_trap_check $ns "2001:db8:10::/64 metric 1024" false421	check_err $? "Route not in hardware after appending"422 423	ip -n $ns route add 2001:db8:10::/64 via 2001:db8:1::2 metric 1025424	fib6_trap_check $ns "2001:db8:10::/64 metric 1025" true425	check_err $? "Route in hardware when should not"426 427	ip -n $ns route append 2001:db8:10::/64 via 2001:db8:2::2 metric 1025428	fib6_trap_check $ns "2001:db8:10::/64 metric 1025" true429	check_err $? "Route in hardware when should not after appending"430 431	fib6_trap_check $ns "2001:db8:10::/64 metric 1024" false432	check_err $? "Lowest metric route not in hardware when should"433 434	log_test "IPv6 append single route without 'nexthop' keyword"435 436	for i in $(seq 1 2); do437		ip -n $ns link del dev dummy$i438	done439}440 441fib_ipv6_replace_single_test()442{443	local ns=$1; shift444	local i445 446	RET=0447 448	for i in $(seq 1 2); do449		ip -n $ns link add name dummy$i type dummy450		ip -n $ns link set dev dummy$i up451	done452 453	ip -n $ns route add 2001:db8:1::/64 dev dummy1 metric 1024454	fib6_trap_check $ns "2001:db8:1::/64 dev dummy1 metric 1024" false455	check_err $? "Route not in hardware when should"456 457	ip -n $ns route replace 2001:db8:1::/64 dev dummy2 metric 1024458	fib6_trap_check $ns "2001:db8:1::/64 dev dummy2 metric 1024" false459	check_err $? "Replacement route not in hardware when should"460 461	# Add a route with an higher metric and make sure that replacing it462	# does not affect the lower metric one.463	ip -n $ns route add 2001:db8:1::/64 dev dummy1 metric 1025464	ip -n $ns route replace 2001:db8:1::/64 dev dummy2 metric 1025465 466	fib6_trap_check $ns "2001:db8:1::/64 dev dummy2 metric 1024" false467	check_err $? "Lowest metric route not in hardware when should"468	fib6_trap_check $ns "2001:db8:1::/64 dev dummy2 metric 1025" true469	check_err $? "Highest metric route in hardware when should not"470 471	log_test "IPv6 single route replace"472 473	for i in $(seq 1 2); do474		ip -n $ns link del dev dummy$i475	done476}477 478fib_ipv6_metric_multipath_test()479{480	local ns=$1; shift481 482	RET=0483 484	for i in $(seq 1 2); do485		ip -n $ns link add name dummy$i type dummy486		ip -n $ns link set dev dummy$i up487		ip -n $ns address add 2001:db8:$i::1/64 dev dummy$i488	done489 490	ip -n $ns route add 2001:db8:10::/64 metric 1024 \491		nexthop via 2001:db8:1::2 dev dummy1 \492		nexthop via 2001:db8:2::2 dev dummy2493	fib6_trap_check $ns "2001:db8:10::/64 metric 1024" false494	check_err $? "Route not in hardware when should"495 496	ip -n $ns route add 2001:db8:10::/64 metric 1022 \497		nexthop via 2001:db8:1::2 dev dummy1 \498		nexthop via 2001:db8:2::2 dev dummy2499	fib6_trap_check $ns "2001:db8:10::/64 metric 1022" false500	check_err $? "Lowest metric route not in hardware when should"501 502	ip -n $ns route add 2001:db8:10::/64 metric 1023 \503		nexthop via 2001:db8:1::2 dev dummy1 \504		nexthop via 2001:db8:2::2 dev dummy2505	fib6_trap_check $ns "2001:db8:10::/64 metric 1024" true506	check_err $? "Highest metric route still in hardware when should not"507 508	fib6_trap_check $ns "2001:db8:10::/64 metric 1023" true509	check_err $? "Middle metric route in hardware when should not"510 511	log_test "IPv6 multipath routes with metric"512 513	for i in $(seq 1 2); do514		ip -n $ns link del dev dummy$i515	done516}517 518fib_ipv6_append_multipath_test()519{520	local ns=$1; shift521 522	RET=0523 524	for i in $(seq 1 3); do525		ip -n $ns link add name dummy$i type dummy526		ip -n $ns link set dev dummy$i up527		ip -n $ns address add 2001:db8:$i::1/64 dev dummy$i528	done529 530	ip -n $ns route add 2001:db8:10::/64 metric 1024 \531		nexthop via 2001:db8:1::2 dev dummy1532	fib6_trap_check $ns "2001:db8:10::/64 metric 1024" false533	check_err $? "Route not in hardware when should"534 535	ip -n $ns route append 2001:db8:10::/64 metric 1024 \536		nexthop via 2001:db8:2::2 dev dummy2 \537		nexthop via 2001:db8:3::2 dev dummy3538	fib6_trap_check $ns "2001:db8:10::/64 metric 1024" false539	check_err $? "Route not in hardware after appending"540 541	ip -n $ns route add 2001:db8:10::/64 metric 1025 \542		nexthop via 2001:db8:1::2 dev dummy1543	fib6_trap_check $ns "2001:db8:10::/64 metric 1025" true544	check_err $? "Route in hardware when should not"545 546	ip -n $ns route append 2001:db8:10::/64 metric 1025 \547		nexthop via 2001:db8:2::2 dev dummy2 \548		nexthop via 2001:db8:3::2 dev dummy3549	fib6_trap_check $ns "2001:db8:10::/64 metric 1025" true550	check_err $? "Route in hardware when should not after appending"551 552	fib6_trap_check $ns "2001:db8:10::/64 metric 1024" false553	check_err $? "Lowest metric route not in hardware when should"554 555	log_test "IPv6 append multipath route with 'nexthop' keyword"556 557	for i in $(seq 1 3); do558		ip -n $ns link del dev dummy$i559	done560}561 562fib_ipv6_replace_multipath_test()563{564	local ns=$1; shift565	local i566 567	RET=0568 569	for i in $(seq 1 3); do570		ip -n $ns link add name dummy$i type dummy571		ip -n $ns link set dev dummy$i up572		ip -n $ns address add 2001:db8:$i::1/64 dev dummy$i573	done574 575	ip -n $ns route add 2001:db8:10::/64 metric 1024 \576		nexthop via 2001:db8:1::2 dev dummy1 \577		nexthop via 2001:db8:2::2 dev dummy2578	fib6_trap_check $ns "2001:db8:10::/64 metric 1024" false579	check_err $? "Route not in hardware when should"580 581	ip -n $ns route replace 2001:db8:10::/64 metric 1024 \582		nexthop via 2001:db8:1::2 dev dummy1 \583		nexthop via 2001:db8:3::2 dev dummy3584	fib6_trap_check $ns "2001:db8:10::/64 metric 1024" false585	check_err $? "Replacement route not in hardware when should"586 587	# Add a route with an higher metric and make sure that replacing it588	# does not affect the lower metric one.589	ip -n $ns route add 2001:db8:10::/64 metric 1025 \590		nexthop via 2001:db8:1::2 dev dummy1 \591		nexthop via 2001:db8:2::2 dev dummy2592	ip -n $ns route replace 2001:db8:10::/64 metric 1025 \593		nexthop via 2001:db8:1::2 dev dummy1 \594		nexthop via 2001:db8:3::2 dev dummy3595 596	fib6_trap_check $ns "2001:db8:10::/64 metric 1024" false597	check_err $? "Lowest metric route not in hardware when should"598	fib6_trap_check $ns "2001:db8:10::/64 metric 1025" true599	check_err $? "Highest metric route in hardware when should not"600 601	log_test "IPv6 multipath route replace"602 603	for i in $(seq 1 3); do604		ip -n $ns link del dev dummy$i605	done606}607 608fib_ipv6_append_multipath_to_single_test()609{610	local ns=$1; shift611 612	# Test that when the first route in the leaf is not a multipath route613	# and we try to append a multipath route with the same metric to it, it614	# is not notified.615	RET=0616 617	for i in $(seq 1 2); do618		ip -n $ns link add name dummy$i type dummy619		ip -n $ns link set dev dummy$i up620		ip -n $ns address add 2001:db8:$i::1/64 dev dummy$i621	done622 623	ip -n $ns route add 2001:db8:10::/64 dev dummy1 metric 1024624	fib6_trap_check $ns "2001:db8:10::/64 dev dummy1 metric 1024" false625	check_err $? "Route not in hardware when should"626 627	ip -n $ns route append 2001:db8:10::/64 metric 1024 \628		nexthop via 2001:db8:2::2 dev dummy2629	fib6_trap_check $ns "2001:db8:10::/64 dev dummy2 metric 1024" true630	check_err $? "Route in hardware when should not"631 632	fib6_trap_check $ns "2001:db8:10::/64 dev dummy1 metric 1024" false633	check_err $? "Route not in hardware after append"634 635	log_test "IPv6 append multipath route to non-multipath route"636 637	for i in $(seq 1 2); do638		ip -n $ns link del dev dummy$i639	done640}641 642fib_ipv6_delete_single_test()643{644	local ns=$1; shift645 646	# Test various deletion scenarios, where only a single route is647	# deleted from the FIB node.648	for i in $(seq 1 2); do649		ip -n $ns link add name dummy$i type dummy650		ip -n $ns link set dev dummy$i up651		ip -n $ns address add 2001:db8:$i::1/64 dev dummy$i652	done653 654	# Test deletion of a single route when it is the only route in the FIB655	# node.656	RET=0657 658	ip -n $ns route add 2001:db8:10::/64 dev dummy1 metric 1024659	ip -n $ns route del 2001:db8:10::/64 dev dummy1 metric 1024660 661	log_test "IPv6 delete sole single route"662 663	# Test that deletion of last route does not affect the first one.664	RET=0665 666	ip -n $ns route add 2001:db8:10::/64 dev dummy1 metric 1024667	ip -n $ns route add 2001:db8:10::/64 dev dummy1 metric 1025668	ip -n $ns route del 2001:db8:10::/64 dev dummy1 metric 1025669 670	fib6_trap_check $ns "2001:db8:10::/64 dev dummy1 metric 1024" false671	check_err $? "Route not in hardware after deleting higher metric route"672 673	log_test "IPv6 delete single route not in hardware"674 675	ip -n $ns route del 2001:db8:10::/64 dev dummy1 metric 1024676 677	# Test that first route is replaced by next single route in the FIB678	# node.679	RET=0680 681	ip -n $ns route add 2001:db8:10::/64 dev dummy1 metric 1024682	ip -n $ns route add 2001:db8:10::/64 dev dummy1 metric 1025683	ip -n $ns route del 2001:db8:10::/64 dev dummy1 metric 1024684 685	fib6_trap_check $ns "2001:db8:10::/64 dev dummy1 metric 1025" false686	check_err $? "Route not in hardware after deleting lowest metric route"687 688	log_test "IPv6 delete single route - replaced by single"689 690	ip -n $ns route del 2001:db8:10::/64 dev dummy1 metric 1025691 692	# Test that first route is replaced by next multipath route in the FIB693	# node.694	RET=0695 696	ip -n $ns route add 2001:db8:10::/64 dev dummy1 metric 1024697	ip -n $ns route add 2001:db8:10::/64 metric 1025 \698		nexthop via 2001:db8:1::2 dev dummy1 \699		nexthop via 2001:db8:2::2 dev dummy2700	ip -n $ns route del 2001:db8:10::/64 dev dummy1 metric 1024701 702	fib6_trap_check $ns "2001:db8:10::/64 metric 1025" false703	check_err $? "Route not in hardware after deleting lowest metric route"704 705	log_test "IPv6 delete single route - replaced by multipath"706 707	ip -n $ns route del 2001:db8:10::/64 metric 1025708 709	# Test deletion of a single nexthop from a multipath route.710	ip -n $ns route add 2001:db8:10::/64 metric 1024 \711		nexthop via 2001:db8:1::2 dev dummy1 \712		nexthop via 2001:db8:2::2 dev dummy2713	ip -n $ns route del 2001:db8:10::/64 metric 1024 \714		nexthop via 2001:db8:1::2 dev dummy1715 716	fib6_trap_check $ns "2001:db8:10::/64 metric 1024" false717	check_err $? "Route not in hardware after deleting a single nexthop"718 719	log_test "IPv6 delete single nexthop"720 721	ip -n $ns route del 2001:db8:10::/64 metric 1024722 723	for i in $(seq 1 2); do724		ip -n $ns link del dev dummy$i725	done726}727 728fib_ipv6_delete_multipath_test()729{730	local ns=$1; shift731 732	# Test various deletion scenarios, where an entire multipath route is733	# deleted from the FIB node.734	for i in $(seq 1 2); do735		ip -n $ns link add name dummy$i type dummy736		ip -n $ns link set dev dummy$i up737		ip -n $ns address add 2001:db8:$i::1/64 dev dummy$i738	done739 740	# Test deletion of a multipath route when it is the only route in the741	# FIB node.742	RET=0743 744	ip -n $ns route add 2001:db8:10::/64 metric 1024 \745		nexthop via 2001:db8:1::2 dev dummy1 \746		nexthop via 2001:db8:2::2 dev dummy2747	ip -n $ns route del 2001:db8:10::/64 metric 1024748 749	log_test "IPv6 delete sole multipath route"750 751	# Test that deletion of last route does not affect the first one.752	RET=0753 754	ip -n $ns route add 2001:db8:10::/64 metric 1024 \755		nexthop via 2001:db8:1::2 dev dummy1 \756		nexthop via 2001:db8:2::2 dev dummy2757	ip -n $ns route add 2001:db8:10::/64 metric 1025 \758		nexthop via 2001:db8:1::2 dev dummy1 \759		nexthop via 2001:db8:2::2 dev dummy2760	ip -n $ns route del 2001:db8:10::/64 metric 1025761 762	fib6_trap_check $ns "2001:db8:10::/64 metric 1024" false763	check_err $? "Route not in hardware after deleting higher metric route"764 765	log_test "IPv6 delete multipath route not in hardware"766 767	ip -n $ns route del 2001:db8:10::/64 metric 1024768 769	# Test that first route is replaced by next single route in the FIB770	# node.771	RET=0772 773	ip -n $ns route add 2001:db8:10::/64 metric 1024 \774		nexthop via 2001:db8:1::2 dev dummy1 \775		nexthop via 2001:db8:2::2 dev dummy2776	ip -n $ns route add 2001:db8:10::/64 dev dummy1 metric 1025777	ip -n $ns route del 2001:db8:10::/64 metric 1024778 779	fib6_trap_check $ns "2001:db8:10::/64 dev dummy1 metric 1025" false780	check_err $? "Route not in hardware after deleting lowest metric route"781 782	log_test "IPv6 delete multipath route - replaced by single"783 784	ip -n $ns route del 2001:db8:10::/64 dev dummy1 metric 1025785 786	# Test that first route is replaced by next multipath route in the FIB787	# node.788	RET=0789 790	ip -n $ns route add 2001:db8:10::/64 metric 1024 \791		nexthop via 2001:db8:1::2 dev dummy1 \792		nexthop via 2001:db8:2::2 dev dummy2793	ip -n $ns route add 2001:db8:10::/64 metric 1025 \794		nexthop via 2001:db8:1::2 dev dummy1 \795		nexthop via 2001:db8:2::2 dev dummy2796	ip -n $ns route del 2001:db8:10::/64 metric 1024797 798	fib6_trap_check $ns "2001:db8:10::/64 metric 1025" false799	check_err $? "Route not in hardware after deleting lowest metric route"800 801	log_test "IPv6 delete multipath route - replaced by multipath"802 803	ip -n $ns route del 2001:db8:10::/64 metric 1025804 805	for i in $(seq 1 2); do806		ip -n $ns link del dev dummy$i807	done808}809 810fib_ipv6_replay_single_test()811{812	local ns=$1; shift813	local devlink_dev=$1; shift814 815	RET=0816 817	for i in $(seq 1 2); do818		ip -n $ns link add name dummy$i type dummy819		ip -n $ns link set dev dummy$i up820	done821 822	ip -n $ns route add 2001:db8:1::/64 dev dummy1823	ip -n $ns route append 2001:db8:1::/64 dev dummy2824 825	devlink -N $ns dev reload $devlink_dev826 827	fib6_trap_check $ns "2001:db8:1::/64 dev dummy1" false828	check_err $? "First route not in hardware when should"829 830	fib6_trap_check $ns "2001:db8:1::/64 dev dummy2" true831	check_err $? "Second route in hardware when should not"832 833	log_test "IPv6 routes replay - single route"834 835	for i in $(seq 1 2); do836		ip -n $ns link del dev dummy$i837	done838}839 840fib_ipv6_replay_multipath_test()841{842	local ns=$1; shift843	local devlink_dev=$1; shift844 845	RET=0846 847	for i in $(seq 1 2); do848		ip -n $ns link add name dummy$i type dummy849		ip -n $ns link set dev dummy$i up850		ip -n $ns address add 2001:db8:$i::1/64 dev dummy$i851	done852 853	ip -n $ns route add 2001:db8:10::/64 metric 1024 \854		nexthop via 2001:db8:1::2 dev dummy1 \855		nexthop via 2001:db8:2::2 dev dummy2856	ip -n $ns route add 2001:db8:10::/64 metric 1025 \857		nexthop via 2001:db8:1::2 dev dummy1 \858		nexthop via 2001:db8:2::2 dev dummy2859 860	devlink -N $ns dev reload $devlink_dev861 862	fib6_trap_check $ns "2001:db8:10::/64 metric 1024" false863	check_err $? "First route not in hardware when should"864 865	fib6_trap_check $ns "2001:db8:10::/64 metric 1025" true866	check_err $? "Second route in hardware when should not"867 868	log_test "IPv6 routes replay - multipath route"869 870	for i in $(seq 1 2); do871		ip -n $ns link del dev dummy$i872	done873}874