brintos

brintos / linux-shallow public Read only

0
0
Text · 12.7 KiB · 88ddae0 Raw
491 lines · bash
1#!/bin/bash2# SPDX-License-Identifier: GPL-2.03 4# +-------------------------+5# |  H1                     |6# |               $h1 +     |7# |      192.0.2.2/24 |     |8# |  2001:db8:1::2/64 |     |9# +-------------------|-----+10#                     |11# +-------------------|----------------------+12# |                   |                   R1 |13# |             $rp11 +                      |14# |      192.0.2.1/24                        |15# |  2001:db8:1::1/64                        |16# |                                          |17# |  + $rp12              + $rp13            |18# |  | 169.254.2.12/24    | 169.254.3.13/24  |19# |  | fe80:2::12/64      | fe80:3::13/64    |20# +--|--------------------|------------------+21#    |                    |22# +--|--------------------|------------------+23# |  + $rp22              + $rp23            |24# |    169.254.2.22/24      169.254.3.23/24  |25# |    fe80:2::22/64        fe80:3::23/64    |26# |                                          |27# |             $rp21 +                      |28# |   198.51.100.1/24 |                      |29# |  2001:db8:2::1/64 |                   R2 |30# +-------------------|----------------------+31#                     |32# +-------------------|-----+33# |                   |     |34# |               $h2 +     |35# |   198.51.100.2/24       |36# |  2001:db8:2::2/64    H2 |37# +-------------------------+38 39ALL_TESTS="40	ping_ipv441	ping_ipv642	multipath_test43	multipath16_test44	nh_stats_test_v445	nh_stats_test_v646"47NUM_NETIFS=848source lib.sh49source router_mpath_nh_lib.sh50 51h1_create()52{53	vrf_create "vrf-h1"54	ip link set dev $h1 master vrf-h155 56	ip link set dev vrf-h1 up57	ip link set dev $h1 up58 59	ip address add 192.0.2.2/24 dev $h160	ip address add 2001:db8:1::2/64 dev $h161 62	ip route add 198.51.100.0/24 vrf vrf-h1 nexthop via 192.0.2.163	ip route add 2001:db8:2::/64 vrf vrf-h1 nexthop via 2001:db8:1::164}65 66h1_destroy()67{68	ip route del 2001:db8:2::/64 vrf vrf-h169	ip route del 198.51.100.0/24 vrf vrf-h170 71	ip address del 2001:db8:1::2/64 dev $h172	ip address del 192.0.2.2/24 dev $h173 74	ip link set dev $h1 down75	vrf_destroy "vrf-h1"76}77 78h2_create()79{80	vrf_create "vrf-h2"81	ip link set dev $h2 master vrf-h282 83	ip link set dev vrf-h2 up84	ip link set dev $h2 up85 86	ip address add 198.51.100.2/24 dev $h287	ip address add 2001:db8:2::2/64 dev $h288 89	ip route add 192.0.2.0/24 vrf vrf-h2 nexthop via 198.51.100.190	ip route add 2001:db8:1::/64 vrf vrf-h2 nexthop via 2001:db8:2::191}92 93h2_destroy()94{95	ip route del 2001:db8:1::/64 vrf vrf-h296	ip route del 192.0.2.0/24 vrf vrf-h297 98	ip address del 2001:db8:2::2/64 dev $h299	ip address del 198.51.100.2/24 dev $h2100 101	ip link set dev $h2 down102	vrf_destroy "vrf-h2"103}104 105router1_create()106{107	vrf_create "vrf-r1"108	ip link set dev $rp11 master vrf-r1109	ip link set dev $rp12 master vrf-r1110	ip link set dev $rp13 master vrf-r1111 112	ip link set dev vrf-r1 up113	ip link set dev $rp11 up114	ip link set dev $rp12 up115	ip link set dev $rp13 up116 117	ip address add 192.0.2.1/24 dev $rp11118	ip address add 2001:db8:1::1/64 dev $rp11119 120	ip address add 169.254.2.12/24 dev $rp12121	ip address add fe80:2::12/64 dev $rp12122 123	ip address add 169.254.3.13/24 dev $rp13124	ip address add fe80:3::13/64 dev $rp13125}126 127router1_destroy()128{129	ip route del 2001:db8:2::/64 vrf vrf-r1130	ip route del 198.51.100.0/24 vrf vrf-r1131 132	ip address del fe80:3::13/64 dev $rp13133	ip address del 169.254.3.13/24 dev $rp13134 135	ip address del fe80:2::12/64 dev $rp12136	ip address del 169.254.2.12/24 dev $rp12137 138	ip address del 2001:db8:1::1/64 dev $rp11139	ip address del 192.0.2.1/24 dev $rp11140 141	ip nexthop del id 103142	ip nexthop del id 101143	ip nexthop del id 102144	ip nexthop del id 106145	ip nexthop del id 104146	ip nexthop del id 105147 148	ip link set dev $rp13 down149	ip link set dev $rp12 down150	ip link set dev $rp11 down151 152	vrf_destroy "vrf-r1"153}154 155router2_create()156{157	vrf_create "vrf-r2"158	ip link set dev $rp21 master vrf-r2159	ip link set dev $rp22 master vrf-r2160	ip link set dev $rp23 master vrf-r2161 162	ip link set dev vrf-r2 up163	ip link set dev $rp21 up164	ip link set dev $rp22 up165	ip link set dev $rp23 up166 167	ip address add 198.51.100.1/24 dev $rp21168	ip address add 2001:db8:2::1/64 dev $rp21169 170	ip address add 169.254.2.22/24 dev $rp22171	ip address add fe80:2::22/64 dev $rp22172 173	ip address add 169.254.3.23/24 dev $rp23174	ip address add fe80:3::23/64 dev $rp23175}176 177router2_destroy()178{179	ip route del 2001:db8:1::/64 vrf vrf-r2180	ip route del 192.0.2.0/24 vrf vrf-r2181 182	ip address del fe80:3::23/64 dev $rp23183	ip address del 169.254.3.23/24 dev $rp23184 185	ip address del fe80:2::22/64 dev $rp22186	ip address del 169.254.2.22/24 dev $rp22187 188	ip address del 2001:db8:2::1/64 dev $rp21189	ip address del 198.51.100.1/24 dev $rp21190 191	ip nexthop del id 201192	ip nexthop del id 202193	ip nexthop del id 204194	ip nexthop del id 205195 196	ip link set dev $rp23 down197	ip link set dev $rp22 down198	ip link set dev $rp21 down199 200	vrf_destroy "vrf-r2"201}202 203routing_nh_obj()204{205	ip nexthop add id 101 via 169.254.2.22 dev $rp12206	ip nexthop add id 102 via 169.254.3.23 dev $rp13207	ip nexthop add id 103 group 101/102 type resilient buckets 512 \208		idle_timer 0209	ip route add 198.51.100.0/24 vrf vrf-r1 nhid 103210 211	ip nexthop add id 104 via fe80:2::22 dev $rp12212	ip nexthop add id 105 via fe80:3::23 dev $rp13213	ip nexthop add id 106 group 104/105 type resilient buckets 512 \214		idle_timer 0215	ip route add 2001:db8:2::/64 vrf vrf-r1 nhid 106216 217	ip nexthop add id 201 via 169.254.2.12 dev $rp22218	ip nexthop add id 202 via 169.254.3.13 dev $rp23219	ip nexthop add id 203 group 201/202 type resilient buckets 512 \220		idle_timer 0221	ip route add 192.0.2.0/24 vrf vrf-r2 nhid 203222 223	ip nexthop add id 204 via fe80:2::12 dev $rp22224	ip nexthop add id 205 via fe80:3::13 dev $rp23225	ip nexthop add id 206 group 204/205 type resilient buckets 512 \226		idle_timer 0227	ip route add 2001:db8:1::/64 vrf vrf-r2 nhid 206228}229 230multipath4_test()231{232	local desc=$1; shift233	local weight_rp12=$1; shift234	local weight_rp13=$1; shift235	local ports=${1-sp=1024,dp=0-32768}; shift236 237	local t0_rp12 t0_rp13 t1_rp12 t1_rp13238	local packets_rp12 packets_rp13239 240	# Transmit multiple flows from h1 to h2 and make sure they are241	# distributed between both multipath links (rp12 and rp13)242	# according to the provided weights.243	sysctl_set net.ipv4.fib_multipath_hash_policy 1244 245	t0_rp12=$(link_stats_tx_packets_get $rp12)246	t0_rp13=$(link_stats_tx_packets_get $rp13)247 248	ip vrf exec vrf-h1 $MZ $h1 -q -p 64 -A 192.0.2.2 -B 198.51.100.2 \249		-d $MZ_DELAY -t udp "$ports"250	sleep 1251 252	t1_rp12=$(link_stats_tx_packets_get $rp12)253	t1_rp13=$(link_stats_tx_packets_get $rp13)254 255	let "packets_rp12 = $t1_rp12 - $t0_rp12"256	let "packets_rp13 = $t1_rp13 - $t0_rp13"257	multipath_eval "$desc" $weight_rp12 $weight_rp13 $packets_rp12 $packets_rp13258 259	# Restore settings.260	sysctl_restore net.ipv4.fib_multipath_hash_policy261}262 263multipath6_l4_test()264{265	local desc=$1; shift266	local weight_rp12=$1; shift267	local weight_rp13=$1; shift268	local ports=${1-sp=1024,dp=0-32768}; shift269 270	local t0_rp12 t0_rp13 t1_rp12 t1_rp13271	local packets_rp12 packets_rp13272 273	# Transmit multiple flows from h1 to h2 and make sure they are274	# distributed between both multipath links (rp12 and rp13)275	# according to the provided weights.276	sysctl_set net.ipv6.fib_multipath_hash_policy 1277 278	t0_rp12=$(link_stats_tx_packets_get $rp12)279	t0_rp13=$(link_stats_tx_packets_get $rp13)280 281	$MZ $h1 -6 -q -p 64 -A 2001:db8:1::2 -B 2001:db8:2::2 \282		-d $MZ_DELAY -t udp "$ports"283	sleep 1284 285	t1_rp12=$(link_stats_tx_packets_get $rp12)286	t1_rp13=$(link_stats_tx_packets_get $rp13)287 288	let "packets_rp12 = $t1_rp12 - $t0_rp12"289	let "packets_rp13 = $t1_rp13 - $t0_rp13"290	multipath_eval "$desc" $weight_rp12 $weight_rp13 $packets_rp12 $packets_rp13291 292	sysctl_restore net.ipv6.fib_multipath_hash_policy293}294 295multipath_test()296{297	# Without an idle timer, weight replacement should happen immediately.298	log_info "Running multipath tests without an idle timer"299	ip nexthop replace id 103 group 101/102 type resilient idle_timer 0300	ip nexthop replace id 106 group 104/105 type resilient idle_timer 0301 302	log_info "Running IPv4 multipath tests"303	ip nexthop replace id 103 group 101,1/102,1 type resilient304	multipath4_test "ECMP" 1 1305	ip nexthop replace id 103 group 101,2/102,1 type resilient306	multipath4_test "Weighted MP 2:1" 2 1307	ip nexthop replace id 103 group 101,11/102,45 type resilient308	multipath4_test "Weighted MP 11:45" 11 45309 310	ip nexthop replace id 103 group 101,1/102,1 type resilient311 312	log_info "Running IPv6 L4 hash multipath tests"313	ip nexthop replace id 106 group 104,1/105,1 type resilient314	multipath6_l4_test "ECMP" 1 1315	ip nexthop replace id 106 group 104,2/105,1 type resilient316	multipath6_l4_test "Weighted MP 2:1" 2 1317	ip nexthop replace id 106 group 104,11/105,45 type resilient318	multipath6_l4_test "Weighted MP 11:45" 11 45319 320	ip nexthop replace id 106 group 104,1/105,1 type resilient321 322	# With an idle timer, weight replacement should not happen, so the323	# expected ratio should always be the initial one (1:1).324	log_info "Running multipath tests with an idle timer of 120 seconds"325	ip nexthop replace id 103 group 101/102 type resilient idle_timer 120326	ip nexthop replace id 106 group 104/105 type resilient idle_timer 120327 328	log_info "Running IPv4 multipath tests"329	ip nexthop replace id 103 group 101,1/102,1 type resilient330	multipath4_test "ECMP" 1 1331	ip nexthop replace id 103 group 101,2/102,1 type resilient332	multipath4_test "Weighted MP 2:1" 1 1333	ip nexthop replace id 103 group 101,11/102,45 type resilient334	multipath4_test "Weighted MP 11:45" 1 1335 336	ip nexthop replace id 103 group 101,1/102,1 type resilient337 338	log_info "Running IPv6 L4 hash multipath tests"339	ip nexthop replace id 106 group 104,1/105,1 type resilient340	multipath6_l4_test "ECMP" 1 1341	ip nexthop replace id 106 group 104,2/105,1 type resilient342	multipath6_l4_test "Weighted MP 2:1" 1 1343	ip nexthop replace id 106 group 104,11/105,45 type resilient344	multipath6_l4_test "Weighted MP 11:45" 1 1345 346	ip nexthop replace id 106 group 104,1/105,1 type resilient347 348	# With a short idle timer and enough idle time, weight replacement349	# should happen.350	log_info "Running multipath tests with an idle timer of 5 seconds"351	ip nexthop replace id 103 group 101/102 type resilient idle_timer 5352	ip nexthop replace id 106 group 104/105 type resilient idle_timer 5353 354	log_info "Running IPv4 multipath tests"355	sleep 10356	ip nexthop replace id 103 group 101,1/102,1 type resilient357	multipath4_test "ECMP" 1 1358	sleep 10359	ip nexthop replace id 103 group 101,2/102,1 type resilient360	multipath4_test "Weighted MP 2:1" 2 1361	sleep 10362	ip nexthop replace id 103 group 101,11/102,45 type resilient363	multipath4_test "Weighted MP 11:45" 11 45364 365	ip nexthop replace id 103 group 101,1/102,1 type resilient366 367	log_info "Running IPv6 L4 hash multipath tests"368	sleep 10369	ip nexthop replace id 106 group 104,1/105,1 type resilient370	multipath6_l4_test "ECMP" 1 1371	sleep 10372	ip nexthop replace id 106 group 104,2/105,1 type resilient373	multipath6_l4_test "Weighted MP 2:1" 2 1374	sleep 10375	ip nexthop replace id 106 group 104,11/105,45 type resilient376	multipath6_l4_test "Weighted MP 11:45" 11 45377 378	ip nexthop replace id 106 group 104,1/105,1 type resilient379}380 381multipath16_test()382{383	check_nhgw16 104 || return384 385	log_info "Running 16-bit IPv4 multipath tests"386	ip nexthop replace id 103 group 101/102 type resilient idle_timer 0387 388	ip nexthop replace id 103 group 101,65535/102,65535 type resilient389	multipath4_test "65535:65535" 65535 65535390 391	ip nexthop replace id 103 group 101,128/102,512 type resilient392	multipath4_test "128:512" 128 512393 394	ip nexthop replace id 103 group 101,255/102,65535 type resilient395	omit_on_slow \396		multipath4_test "255:65535" 255 65535 sp=1024-1026,dp=0-65535397 398	ip nexthop replace id 103 group 101,1/102,1 type resilient399 400	log_info "Running 16-bit IPv6 L4 hash multipath tests"401	ip nexthop replace id 106 group 104/105 type resilient idle_timer 0402 403	ip nexthop replace id 106 group 104,65535/105,65535 type resilient404	multipath6_l4_test "65535:65535" 65535 65535405 406	ip nexthop replace id 106 group 104,128/105,512 type resilient407	multipath6_l4_test "128:512" 128 512408 409	ip nexthop replace id 106 group 104,255/105,65535 type resilient410	omit_on_slow \411		multipath6_l4_test "255:65535" 255 65535 sp=1024-1026,dp=0-65535412 413	ip nexthop replace id 106 group 104,1/105,1 type resilient414}415 416nh_stats_test_v4()417{418	__nh_stats_test_v4 resilient419}420 421nh_stats_test_v6()422{423	__nh_stats_test_v6 resilient424}425 426setup_prepare()427{428	h1=${NETIFS[p1]}429	rp11=${NETIFS[p2]}430 431	rp12=${NETIFS[p3]}432	rp22=${NETIFS[p4]}433 434	rp13=${NETIFS[p5]}435	rp23=${NETIFS[p6]}436 437	rp21=${NETIFS[p7]}438	h2=${NETIFS[p8]}439 440	vrf_prepare441 442	h1_create443	h2_create444 445	router1_create446	router2_create447 448	forwarding_enable449}450 451cleanup()452{453	pre_cleanup454 455	forwarding_restore456 457	router2_destroy458	router1_destroy459 460	h2_destroy461	h1_destroy462 463	vrf_cleanup464}465 466ping_ipv4()467{468	ping_test $h1 198.51.100.2469}470 471ping_ipv6()472{473	ping6_test $h1 2001:db8:2::2474}475 476ip nexthop ls >/dev/null 2>&1477if [ $? -ne 0 ]; then478	echo "Nexthop objects not supported; skipping tests"479	exit $ksft_skip480fi481 482trap cleanup EXIT483 484setup_prepare485setup_wait486routing_nh_obj487 488tests_run489 490exit $EXIT_STATUS491