1ec810535SDavid Ahern#!/bin/bash 2ec810535SDavid Ahern# SPDX-License-Identifier: GPL-2.0 3ec810535SDavid Ahern# 4ec810535SDavid Ahern# redirect test 5ec810535SDavid Ahern# 6ec810535SDavid Ahern# .253 +----+ 7ec810535SDavid Ahern# +----| r1 | 8ec810535SDavid Ahern# | +----+ 9ec810535SDavid Ahern# +----+ | |.1 10ec810535SDavid Ahern# | h1 |--------------+ | 10.1.1.0/30 2001:db8:1::0/126 11ec810535SDavid Ahern# +----+ .1 | |.2 12ec810535SDavid Ahern# 172.16.1/24 | +----+ +----+ 13ec810535SDavid Ahern# 2001:db8:16:1/64 +----| r2 |-------------------| h2 | 14ec810535SDavid Ahern# .254 +----+ .254 .2 +----+ 15ec810535SDavid Ahern# 172.16.2/24 16ec810535SDavid Ahern# 2001:db8:16:2/64 17ec810535SDavid Ahern# 18ec810535SDavid Ahern# Route from h1 to h2 goes through r1, eth1 - connection between r1 and r2. 19ec810535SDavid Ahern# Route on r1 changed to go to r2 via eth0. This causes a redirect to be sent 20ec810535SDavid Ahern# from r1 to h1 telling h1 to use r2 when talking to h2. 21ec810535SDavid Ahern 22ec810535SDavid AhernVERBOSE=0 23ec810535SDavid AhernPAUSE_ON_FAIL=no 24ec810535SDavid Ahern 25ec810535SDavid AhernH1_N1_IP=172.16.1.1 26ec810535SDavid AhernR1_N1_IP=172.16.1.253 27ec810535SDavid AhernR2_N1_IP=172.16.1.254 28ec810535SDavid Ahern 29ec810535SDavid AhernH1_N1_IP6=2001:db8:16:1::1 30ec810535SDavid AhernR1_N1_IP6=2001:db8:16:1::253 31ec810535SDavid AhernR2_N1_IP6=2001:db8:16:1::254 32ec810535SDavid Ahern 33ec810535SDavid AhernR1_R2_N1_IP=10.1.1.1 34ec810535SDavid AhernR2_R1_N1_IP=10.1.1.2 35ec810535SDavid Ahern 36ec810535SDavid AhernR1_R2_N1_IP6=2001:db8:1::1 37ec810535SDavid AhernR2_R1_N1_IP6=2001:db8:1::2 38ec810535SDavid Ahern 39ec810535SDavid AhernH2_N2=172.16.2.0/24 40ec810535SDavid AhernH2_N2_6=2001:db8:16:2::/64 41ec810535SDavid AhernH2_N2_IP=172.16.2.2 42ec810535SDavid AhernR2_N2_IP=172.16.2.254 43ec810535SDavid AhernH2_N2_IP6=2001:db8:16:2::2 44ec810535SDavid AhernR2_N2_IP6=2001:db8:16:2::254 45ec810535SDavid Ahern 46ec810535SDavid AhernVRF=red 47ec810535SDavid AhernVRF_TABLE=1111 48ec810535SDavid Ahern 49ec810535SDavid Ahern################################################################################ 50ec810535SDavid Ahern# helpers 51ec810535SDavid Ahern 52ec810535SDavid Ahernlog_section() 53ec810535SDavid Ahern{ 54ec810535SDavid Ahern echo 55ec810535SDavid Ahern echo "###########################################################################" 56ec810535SDavid Ahern echo "$*" 57ec810535SDavid Ahern echo "###########################################################################" 58ec810535SDavid Ahern echo 59ec810535SDavid Ahern} 60ec810535SDavid Ahern 61ec810535SDavid Ahernlog_test() 62ec810535SDavid Ahern{ 63ec810535SDavid Ahern local rc=$1 64ec810535SDavid Ahern local expected=$2 65ec810535SDavid Ahern local msg="$3" 66ec810535SDavid Ahern 67ec810535SDavid Ahern if [ ${rc} -eq ${expected} ]; then 68ec810535SDavid Ahern printf "TEST: %-60s [ OK ]\n" "${msg}" 69ec810535SDavid Ahern nsuccess=$((nsuccess+1)) 70ec810535SDavid Ahern else 71ec810535SDavid Ahern ret=1 72ec810535SDavid Ahern nfail=$((nfail+1)) 73ec810535SDavid Ahern printf "TEST: %-60s [FAIL]\n" "${msg}" 74ec810535SDavid Ahern if [ "${PAUSE_ON_FAIL}" = "yes" ]; then 75ec810535SDavid Ahern echo 76ec810535SDavid Ahern echo "hit enter to continue, 'q' to quit" 77ec810535SDavid Ahern read a 78ec810535SDavid Ahern [ "$a" = "q" ] && exit 1 79ec810535SDavid Ahern fi 80ec810535SDavid Ahern fi 81ec810535SDavid Ahern} 82ec810535SDavid Ahern 83ec810535SDavid Ahernrun_cmd() 84ec810535SDavid Ahern{ 85ec810535SDavid Ahern local cmd="$*" 86ec810535SDavid Ahern local out 87ec810535SDavid Ahern local rc 88ec810535SDavid Ahern 89ec810535SDavid Ahern if [ "$VERBOSE" = "1" ]; then 90ec810535SDavid Ahern echo "COMMAND: $cmd" 91ec810535SDavid Ahern fi 92ec810535SDavid Ahern 93ec810535SDavid Ahern out=$(eval $cmd 2>&1) 94ec810535SDavid Ahern rc=$? 95ec810535SDavid Ahern if [ "$VERBOSE" = "1" -a -n "$out" ]; then 96ec810535SDavid Ahern echo "$out" 97ec810535SDavid Ahern fi 98ec810535SDavid Ahern 99ec810535SDavid Ahern [ "$VERBOSE" = "1" ] && echo 100ec810535SDavid Ahern 101ec810535SDavid Ahern return $rc 102ec810535SDavid Ahern} 103ec810535SDavid Ahern 104ec810535SDavid Ahernget_linklocal() 105ec810535SDavid Ahern{ 106ec810535SDavid Ahern local ns=$1 107ec810535SDavid Ahern local dev=$2 108ec810535SDavid Ahern local addr 109ec810535SDavid Ahern 110ec810535SDavid Ahern addr=$(ip -netns $ns -6 -br addr show dev ${dev} | \ 111ec810535SDavid Ahern awk '{ 112ec810535SDavid Ahern for (i = 3; i <= NF; ++i) { 113ec810535SDavid Ahern if ($i ~ /^fe80/) 114ec810535SDavid Ahern print $i 115ec810535SDavid Ahern } 116ec810535SDavid Ahern }' 117ec810535SDavid Ahern ) 118ec810535SDavid Ahern addr=${addr/\/*} 119ec810535SDavid Ahern 120ec810535SDavid Ahern [ -z "$addr" ] && return 1 121ec810535SDavid Ahern 122ec810535SDavid Ahern echo $addr 123ec810535SDavid Ahern 124ec810535SDavid Ahern return 0 125ec810535SDavid Ahern} 126ec810535SDavid Ahern 127ec810535SDavid Ahern################################################################################ 128ec810535SDavid Ahern# setup and teardown 129ec810535SDavid Ahern 130ec810535SDavid Aherncleanup() 131ec810535SDavid Ahern{ 132ec810535SDavid Ahern local ns 133ec810535SDavid Ahern 134ec810535SDavid Ahern for ns in h1 h2 r1 r2; do 135ec810535SDavid Ahern ip netns del $ns 2>/dev/null 136ec810535SDavid Ahern done 137ec810535SDavid Ahern} 138ec810535SDavid Ahern 139ec810535SDavid Aherncreate_vrf() 140ec810535SDavid Ahern{ 141ec810535SDavid Ahern local ns=$1 142ec810535SDavid Ahern 143ec810535SDavid Ahern ip -netns ${ns} link add ${VRF} type vrf table ${VRF_TABLE} 144ec810535SDavid Ahern ip -netns ${ns} link set ${VRF} up 145ec810535SDavid Ahern ip -netns ${ns} route add vrf ${VRF} unreachable default metric 8192 146ec810535SDavid Ahern ip -netns ${ns} -6 route add vrf ${VRF} unreachable default metric 8192 147ec810535SDavid Ahern 148ec810535SDavid Ahern ip -netns ${ns} addr add 127.0.0.1/8 dev ${VRF} 149ec810535SDavid Ahern ip -netns ${ns} -6 addr add ::1 dev ${VRF} nodad 150ec810535SDavid Ahern 151ec810535SDavid Ahern ip -netns ${ns} ru del pref 0 152ec810535SDavid Ahern ip -netns ${ns} ru add pref 32765 from all lookup local 153ec810535SDavid Ahern ip -netns ${ns} -6 ru del pref 0 154ec810535SDavid Ahern ip -netns ${ns} -6 ru add pref 32765 from all lookup local 155ec810535SDavid Ahern} 156ec810535SDavid Ahern 157ec810535SDavid Ahernsetup() 158ec810535SDavid Ahern{ 159ec810535SDavid Ahern local ns 160ec810535SDavid Ahern 161ec810535SDavid Ahern # 162ec810535SDavid Ahern # create nodes as namespaces 163ec810535SDavid Ahern # 164ec810535SDavid Ahern for ns in h1 h2 r1 r2; do 165ec810535SDavid Ahern ip netns add $ns 166ec810535SDavid Ahern ip -netns $ns li set lo up 167ec810535SDavid Ahern 168ec810535SDavid Ahern case "${ns}" in 169ec810535SDavid Ahern h[12]) ip netns exec $ns sysctl -q -w net.ipv4.conf.all.accept_redirects=1 170ec810535SDavid Ahern ip netns exec $ns sysctl -q -w net.ipv6.conf.all.accept_redirects=1 171ec810535SDavid Ahern ip netns exec $ns sysctl -q -w net.ipv6.conf.all.keep_addr_on_down=1 172ec810535SDavid Ahern ;; 173ec810535SDavid Ahern r[12]) ip netns exec $ns sysctl -q -w net.ipv4.ip_forward=1 174ec810535SDavid Ahern ip netns exec $ns sysctl -q -w net.ipv4.conf.all.send_redirects=1 175ec810535SDavid Ahern 176ec810535SDavid Ahern ip netns exec $ns sysctl -q -w net.ipv6.conf.all.forwarding=1 177ec810535SDavid Ahern ip netns exec $ns sysctl -q -w net.ipv6.route.mtu_expires=10 178ec810535SDavid Ahern esac 179ec810535SDavid Ahern done 180ec810535SDavid Ahern 181ec810535SDavid Ahern # 182ec810535SDavid Ahern # create interconnects 183ec810535SDavid Ahern # 184ec810535SDavid Ahern ip -netns h1 li add eth0 type veth peer name r1h1 185ec810535SDavid Ahern ip -netns h1 li set r1h1 netns r1 name eth0 up 186ec810535SDavid Ahern 187ec810535SDavid Ahern ip -netns h1 li add eth1 type veth peer name r2h1 188ec810535SDavid Ahern ip -netns h1 li set r2h1 netns r2 name eth0 up 189ec810535SDavid Ahern 190ec810535SDavid Ahern ip -netns h2 li add eth0 type veth peer name r2h2 191ec810535SDavid Ahern ip -netns h2 li set eth0 up 192ec810535SDavid Ahern ip -netns h2 li set r2h2 netns r2 name eth2 up 193ec810535SDavid Ahern 194ec810535SDavid Ahern ip -netns r1 li add eth1 type veth peer name r2r1 195ec810535SDavid Ahern ip -netns r1 li set eth1 up 196ec810535SDavid Ahern ip -netns r1 li set r2r1 netns r2 name eth1 up 197ec810535SDavid Ahern 198ec810535SDavid Ahern # 199ec810535SDavid Ahern # h1 200ec810535SDavid Ahern # 201ec810535SDavid Ahern if [ "${WITH_VRF}" = "yes" ]; then 202ec810535SDavid Ahern create_vrf "h1" 203ec810535SDavid Ahern H1_VRF_ARG="vrf ${VRF}" 204ec810535SDavid Ahern H1_PING_ARG="-I ${VRF}" 205ec810535SDavid Ahern else 206ec810535SDavid Ahern H1_VRF_ARG= 207ec810535SDavid Ahern H1_PING_ARG= 208ec810535SDavid Ahern fi 209ec810535SDavid Ahern ip -netns h1 li add br0 type bridge 210ec810535SDavid Ahern if [ "${WITH_VRF}" = "yes" ]; then 211ec810535SDavid Ahern ip -netns h1 li set br0 vrf ${VRF} up 212ec810535SDavid Ahern else 213ec810535SDavid Ahern ip -netns h1 li set br0 up 214ec810535SDavid Ahern fi 215ec810535SDavid Ahern ip -netns h1 addr add dev br0 ${H1_N1_IP}/24 216ec810535SDavid Ahern ip -netns h1 -6 addr add dev br0 ${H1_N1_IP6}/64 nodad 217ec810535SDavid Ahern ip -netns h1 li set eth0 master br0 up 218ec810535SDavid Ahern ip -netns h1 li set eth1 master br0 up 219ec810535SDavid Ahern 220ec810535SDavid Ahern # 221ec810535SDavid Ahern # h2 222ec810535SDavid Ahern # 223ec810535SDavid Ahern ip -netns h2 addr add dev eth0 ${H2_N2_IP}/24 224ec810535SDavid Ahern ip -netns h2 ro add default via ${R2_N2_IP} dev eth0 225ec810535SDavid Ahern ip -netns h2 -6 addr add dev eth0 ${H2_N2_IP6}/64 nodad 226ec810535SDavid Ahern ip -netns h2 -6 ro add default via ${R2_N2_IP6} dev eth0 227ec810535SDavid Ahern 228ec810535SDavid Ahern # 229ec810535SDavid Ahern # r1 230ec810535SDavid Ahern # 231ec810535SDavid Ahern ip -netns r1 addr add dev eth0 ${R1_N1_IP}/24 232ec810535SDavid Ahern ip -netns r1 -6 addr add dev eth0 ${R1_N1_IP6}/64 nodad 233ec810535SDavid Ahern ip -netns r1 addr add dev eth1 ${R1_R2_N1_IP}/30 234ec810535SDavid Ahern ip -netns r1 -6 addr add dev eth1 ${R1_R2_N1_IP6}/126 nodad 235ec810535SDavid Ahern 236ec810535SDavid Ahern # 237ec810535SDavid Ahern # r2 238ec810535SDavid Ahern # 239ec810535SDavid Ahern ip -netns r2 addr add dev eth0 ${R2_N1_IP}/24 240ec810535SDavid Ahern ip -netns r2 -6 addr add dev eth0 ${R2_N1_IP6}/64 nodad 241ec810535SDavid Ahern ip -netns r2 addr add dev eth1 ${R2_R1_N1_IP}/30 242ec810535SDavid Ahern ip -netns r2 -6 addr add dev eth1 ${R2_R1_N1_IP6}/126 nodad 243ec810535SDavid Ahern ip -netns r2 addr add dev eth2 ${R2_N2_IP}/24 244ec810535SDavid Ahern ip -netns r2 -6 addr add dev eth2 ${R2_N2_IP6}/64 nodad 245ec810535SDavid Ahern 246ec810535SDavid Ahern sleep 2 247ec810535SDavid Ahern 248ec810535SDavid Ahern R1_LLADDR=$(get_linklocal r1 eth0) 249ec810535SDavid Ahern if [ $? -ne 0 ]; then 250ec810535SDavid Ahern echo "Error: Failed to get link-local address of r1's eth0" 251ec810535SDavid Ahern exit 1 252ec810535SDavid Ahern fi 253ec810535SDavid Ahern 254ec810535SDavid Ahern R2_LLADDR=$(get_linklocal r2 eth0) 255ec810535SDavid Ahern if [ $? -ne 0 ]; then 256ec810535SDavid Ahern echo "Error: Failed to get link-local address of r2's eth0" 257ec810535SDavid Ahern exit 1 258ec810535SDavid Ahern fi 259ec810535SDavid Ahern} 260ec810535SDavid Ahern 261ec810535SDavid Ahernchange_h2_mtu() 262ec810535SDavid Ahern{ 263ec810535SDavid Ahern local mtu=$1 264ec810535SDavid Ahern 265ec810535SDavid Ahern run_cmd ip -netns h2 li set eth0 mtu ${mtu} 266ec810535SDavid Ahern run_cmd ip -netns r2 li set eth2 mtu ${mtu} 267ec810535SDavid Ahern} 268ec810535SDavid Ahern 269ec810535SDavid Aherncheck_exception() 270ec810535SDavid Ahern{ 271ec810535SDavid Ahern local mtu="$1" 272ec810535SDavid Ahern local with_redirect="$2" 273ec810535SDavid Ahern local desc="$3" 274ec810535SDavid Ahern 275ec810535SDavid Ahern # From 172.16.1.101: icmp_seq=1 Redirect Host(New nexthop: 172.16.1.102) 276ec810535SDavid Ahern if [ "$VERBOSE" = "1" ]; then 277ec810535SDavid Ahern echo "Commands to check for exception:" 278ec810535SDavid Ahern run_cmd ip -netns h1 ro get ${H1_VRF_ARG} ${H2_N2_IP} 279ec810535SDavid Ahern run_cmd ip -netns h1 -6 ro get ${H1_VRF_ARG} ${H2_N2_IP6} 280ec810535SDavid Ahern fi 281ec810535SDavid Ahern 282ec810535SDavid Ahern if [ -n "${mtu}" ]; then 283ec810535SDavid Ahern mtu=" mtu ${mtu}" 284ec810535SDavid Ahern fi 285ec810535SDavid Ahern if [ "$with_redirect" = "yes" ]; then 286ec810535SDavid Ahern ip -netns h1 ro get ${H1_VRF_ARG} ${H2_N2_IP} | \ 287ec810535SDavid Ahern grep -q "cache <redirected> expires [0-9]*sec${mtu}" 288ec810535SDavid Ahern elif [ -n "${mtu}" ]; then 289ec810535SDavid Ahern ip -netns h1 ro get ${H1_VRF_ARG} ${H2_N2_IP} | \ 290ec810535SDavid Ahern grep -q "cache expires [0-9]*sec${mtu}" 291ec810535SDavid Ahern else 292ec810535SDavid Ahern ip -netns h1 ro get ${H1_VRF_ARG} ${H2_N2_IP} | \ 293ec810535SDavid Ahern grep -q "cache" 294ec810535SDavid Ahern fi 295ec810535SDavid Ahern log_test $? 0 "IPv4: ${desc}" 296ec810535SDavid Ahern 297ec810535SDavid Ahern if [ "$with_redirect" = "yes" ]; then 298ec810535SDavid Ahern ip -netns h1 -6 ro get ${H1_VRF_ARG} ${H2_N2_IP6} | grep -q "${H2_N2_IP6} from :: via ${R2_LLADDR} dev br0.*${mtu}" 299ec810535SDavid Ahern else 300ec810535SDavid Ahern ip -netns h1 -6 ro get ${H1_VRF_ARG} ${H2_N2_IP6} | grep -q "${mtu}" 301ec810535SDavid Ahern fi 302ec810535SDavid Ahern log_test $? 0 "IPv6: ${desc}" 303ec810535SDavid Ahern} 304ec810535SDavid Ahern 305ec810535SDavid Ahernrun_ping() 306ec810535SDavid Ahern{ 307ec810535SDavid Ahern local sz=$1 308ec810535SDavid Ahern 309ec810535SDavid Ahern run_cmd ip netns exec h1 ping -q -M want -i 0.2 -c 10 -w 2 -s ${sz} ${H1_PING_ARG} ${H2_N2_IP} 310ec810535SDavid Ahern run_cmd ip netns exec h1 ${ping6} -q -M want -i 0.2 -c 10 -w 2 -s ${sz} ${H1_PING_ARG} ${H2_N2_IP6} 311ec810535SDavid Ahern} 312ec810535SDavid Ahern 313ec810535SDavid Ahernreplace_route_legacy() 314ec810535SDavid Ahern{ 315ec810535SDavid Ahern # r1 to h2 via r2 and eth0 316ec810535SDavid Ahern run_cmd ip -netns r1 ro replace ${H2_N2} via ${R2_N1_IP} dev eth0 317ec810535SDavid Ahern run_cmd ip -netns r1 -6 ro replace ${H2_N2_6} via ${R2_LLADDR} dev eth0 318ec810535SDavid Ahern} 319ec810535SDavid Ahern 320ec810535SDavid Aherninitial_route_legacy() 321ec810535SDavid Ahern{ 322ec810535SDavid Ahern # r1 to h2 via r2 and eth1 323ec810535SDavid Ahern run_cmd ip -netns r1 ro add ${H2_N2} via ${R2_R1_N1_IP} dev eth1 324ec810535SDavid Ahern run_cmd ip -netns r1 -6 ro add ${H2_N2_6} via ${R2_R1_N1_IP6} dev eth1 325ec810535SDavid Ahern 326ec810535SDavid Ahern # h1 to h2 via r1 327ec810535SDavid Ahern # - IPv6 redirect only works if gateway is the LLA 328ec810535SDavid Ahern run_cmd ip -netns h1 ro add ${H1_VRF_ARG} ${H2_N2} via ${R1_N1_IP} dev br0 329ec810535SDavid Ahern run_cmd ip -netns h1 -6 ro add ${H1_VRF_ARG} ${H2_N2_6} via ${R1_LLADDR} dev br0 330ec810535SDavid Ahern} 331ec810535SDavid Ahern 332ec810535SDavid Aherncheck_connectivity() 333ec810535SDavid Ahern{ 334ec810535SDavid Ahern local rc 335ec810535SDavid Ahern 336ec810535SDavid Ahern run_cmd ip netns exec h1 ping -c1 -w1 ${H1_PING_ARG} ${H2_N2_IP} 337ec810535SDavid Ahern rc=$? 338ec810535SDavid Ahern run_cmd ip netns exec h1 ${ping6} -c1 -w1 ${H1_PING_ARG} ${H2_N2_IP6} 339ec810535SDavid Ahern [ $? -ne 0 ] && rc=$? 340ec810535SDavid Ahern 341ec810535SDavid Ahern return $rc 342ec810535SDavid Ahern} 343ec810535SDavid Ahern 344ec810535SDavid Aherndo_test() 345ec810535SDavid Ahern{ 346ec810535SDavid Ahern local ttype="$1" 347ec810535SDavid Ahern 348ec810535SDavid Ahern eval initial_route_${ttype} 349ec810535SDavid Ahern 350ec810535SDavid Ahern # verify connectivity 351ec810535SDavid Ahern check_connectivity 352ec810535SDavid Ahern if [ $? -ne 0 ]; then 353ec810535SDavid Ahern echo "Error: Basic connectivity is broken" 354ec810535SDavid Ahern ret=1 355ec810535SDavid Ahern return 356ec810535SDavid Ahern fi 357ec810535SDavid Ahern 358ec810535SDavid Ahern # redirect exception followed by mtu 359ec810535SDavid Ahern eval replace_route_${ttype} 360ec810535SDavid Ahern run_ping 64 361ec810535SDavid Ahern check_exception "" "yes" "redirect exception" 362ec810535SDavid Ahern 363ec810535SDavid Ahern check_connectivity 364ec810535SDavid Ahern if [ $? -ne 0 ]; then 365ec810535SDavid Ahern echo "Error: Basic connectivity is broken after redirect" 366ec810535SDavid Ahern ret=1 367ec810535SDavid Ahern return 368ec810535SDavid Ahern fi 369ec810535SDavid Ahern 370ec810535SDavid Ahern change_h2_mtu 1300 371ec810535SDavid Ahern run_ping 1350 372ec810535SDavid Ahern check_exception "1300" "yes" "redirect exception plus mtu" 373ec810535SDavid Ahern 374ec810535SDavid Ahern # remove exceptions and restore routing 375ec810535SDavid Ahern change_h2_mtu 1500 376ec810535SDavid Ahern ip -netns h1 li set br0 down 377ec810535SDavid Ahern ip -netns h1 li set br0 up 378ec810535SDavid Ahern eval initial_route_${ttype} 379ec810535SDavid Ahern 380ec810535SDavid Ahern check_connectivity 381ec810535SDavid Ahern if [ $? -ne 0 ]; then 382ec810535SDavid Ahern echo "Error: Basic connectivity is broken after reset" 383ec810535SDavid Ahern ret=1 384ec810535SDavid Ahern return 385ec810535SDavid Ahern fi 386ec810535SDavid Ahern check_exception "" "no" "routing reset" 387ec810535SDavid Ahern 388ec810535SDavid Ahern # MTU exception followed by redirect 389ec810535SDavid Ahern change_h2_mtu 1300 390ec810535SDavid Ahern run_ping 1350 391ec810535SDavid Ahern check_exception "1300" "no" "mtu exception" 392ec810535SDavid Ahern 393ec810535SDavid Ahern eval replace_route_${ttype} 394ec810535SDavid Ahern run_ping 64 395ec810535SDavid Ahern check_exception "1300" "yes" "mtu exception plus redirect" 396ec810535SDavid Ahern 397ec810535SDavid Ahern check_connectivity 398ec810535SDavid Ahern if [ $? -ne 0 ]; then 399ec810535SDavid Ahern echo "Error: Basic connectivity is broken after redirect" 400ec810535SDavid Ahern ret=1 401ec810535SDavid Ahern return 402ec810535SDavid Ahern fi 403ec810535SDavid Ahern} 404ec810535SDavid Ahern 405ec810535SDavid Ahern################################################################################ 406ec810535SDavid Ahern# usage 407ec810535SDavid Ahern 408ec810535SDavid Ahernusage() 409ec810535SDavid Ahern{ 410ec810535SDavid Ahern cat <<EOF 411ec810535SDavid Ahernusage: ${0##*/} OPTS 412ec810535SDavid Ahern 413ec810535SDavid Ahern -p Pause on fail 414ec810535SDavid Ahern -v verbose mode (show commands and output) 415ec810535SDavid AhernEOF 416ec810535SDavid Ahern} 417ec810535SDavid Ahern 418ec810535SDavid Ahern################################################################################ 419ec810535SDavid Ahern# main 420ec810535SDavid Ahern 421ec810535SDavid Ahern# Some systems don't have a ping6 binary anymore 422ec810535SDavid Ahernwhich ping6 > /dev/null 2>&1 && ping6=$(which ping6) || ping6=$(which ping) 423ec810535SDavid Ahern 424ec810535SDavid Ahernret=0 425ec810535SDavid Ahernnsuccess=0 426ec810535SDavid Ahernnfail=0 427ec810535SDavid Ahern 428ec810535SDavid Ahernwhile getopts :pv o 429ec810535SDavid Aherndo 430ec810535SDavid Ahern case $o in 431ec810535SDavid Ahern p) PAUSE_ON_FAIL=yes;; 432ec810535SDavid Ahern v) VERBOSE=$(($VERBOSE + 1));; 433ec810535SDavid Ahern *) usage; exit 1;; 434ec810535SDavid Ahern esac 435ec810535SDavid Aherndone 436ec810535SDavid Ahern 437ec810535SDavid Aherntrap cleanup EXIT 438ec810535SDavid Ahern 439ec810535SDavid Aherncleanup 440ec810535SDavid AhernWITH_VRF=no 441ec810535SDavid Ahernsetup 442ec810535SDavid Ahern 443ec810535SDavid Ahernlog_section "Legacy routing" 444ec810535SDavid Aherndo_test "legacy" 445ec810535SDavid Ahern 446ec810535SDavid Aherncleanup 447ec810535SDavid Ahernlog_section "Legacy routing with VRF" 448ec810535SDavid AhernWITH_VRF=yes 449ec810535SDavid Ahernsetup 450ec810535SDavid Aherndo_test "legacy" 451ec810535SDavid Ahern 452ec810535SDavid Ahernprintf "\nTests passed: %3d\n" ${nsuccess} 453ec810535SDavid Ahernprintf "Tests failed: %3d\n" ${nfail} 454ec810535SDavid Ahern 455ec810535SDavid Ahernexit $ret 456