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 8399513cfaSDavid Ahernlog_debug() 8499513cfaSDavid Ahern{ 8599513cfaSDavid Ahern if [ "$VERBOSE" = "1" ]; then 8699513cfaSDavid Ahern echo "$*" 8799513cfaSDavid Ahern fi 8899513cfaSDavid Ahern} 8999513cfaSDavid Ahern 90ec810535SDavid Ahernrun_cmd() 91ec810535SDavid Ahern{ 92ec810535SDavid Ahern local cmd="$*" 93ec810535SDavid Ahern local out 94ec810535SDavid Ahern local rc 95ec810535SDavid Ahern 96ec810535SDavid Ahern if [ "$VERBOSE" = "1" ]; then 97ec810535SDavid Ahern echo "COMMAND: $cmd" 98ec810535SDavid Ahern fi 99ec810535SDavid Ahern 100ec810535SDavid Ahern out=$(eval $cmd 2>&1) 101ec810535SDavid Ahern rc=$? 102ec810535SDavid Ahern if [ "$VERBOSE" = "1" -a -n "$out" ]; then 103ec810535SDavid Ahern echo "$out" 104ec810535SDavid Ahern fi 105ec810535SDavid Ahern 106ec810535SDavid Ahern [ "$VERBOSE" = "1" ] && echo 107ec810535SDavid Ahern 108ec810535SDavid Ahern return $rc 109ec810535SDavid Ahern} 110ec810535SDavid Ahern 111ec810535SDavid Ahernget_linklocal() 112ec810535SDavid Ahern{ 113ec810535SDavid Ahern local ns=$1 114ec810535SDavid Ahern local dev=$2 115ec810535SDavid Ahern local addr 116ec810535SDavid Ahern 117ec810535SDavid Ahern addr=$(ip -netns $ns -6 -br addr show dev ${dev} | \ 118ec810535SDavid Ahern awk '{ 119ec810535SDavid Ahern for (i = 3; i <= NF; ++i) { 120ec810535SDavid Ahern if ($i ~ /^fe80/) 121ec810535SDavid Ahern print $i 122ec810535SDavid Ahern } 123ec810535SDavid Ahern }' 124ec810535SDavid Ahern ) 125ec810535SDavid Ahern addr=${addr/\/*} 126ec810535SDavid Ahern 127ec810535SDavid Ahern [ -z "$addr" ] && return 1 128ec810535SDavid Ahern 129ec810535SDavid Ahern echo $addr 130ec810535SDavid Ahern 131ec810535SDavid Ahern return 0 132ec810535SDavid Ahern} 133ec810535SDavid Ahern 134ec810535SDavid Ahern################################################################################ 135ec810535SDavid Ahern# setup and teardown 136ec810535SDavid Ahern 137ec810535SDavid Aherncleanup() 138ec810535SDavid Ahern{ 139ec810535SDavid Ahern local ns 140ec810535SDavid Ahern 141ec810535SDavid Ahern for ns in h1 h2 r1 r2; do 142ec810535SDavid Ahern ip netns del $ns 2>/dev/null 143ec810535SDavid Ahern done 144ec810535SDavid Ahern} 145ec810535SDavid Ahern 146ec810535SDavid Aherncreate_vrf() 147ec810535SDavid Ahern{ 148ec810535SDavid Ahern local ns=$1 149ec810535SDavid Ahern 150ec810535SDavid Ahern ip -netns ${ns} link add ${VRF} type vrf table ${VRF_TABLE} 151ec810535SDavid Ahern ip -netns ${ns} link set ${VRF} up 152ec810535SDavid Ahern ip -netns ${ns} route add vrf ${VRF} unreachable default metric 8192 153ec810535SDavid Ahern ip -netns ${ns} -6 route add vrf ${VRF} unreachable default metric 8192 154ec810535SDavid Ahern 155ec810535SDavid Ahern ip -netns ${ns} addr add 127.0.0.1/8 dev ${VRF} 156ec810535SDavid Ahern ip -netns ${ns} -6 addr add ::1 dev ${VRF} nodad 157ec810535SDavid Ahern 158ec810535SDavid Ahern ip -netns ${ns} ru del pref 0 159ec810535SDavid Ahern ip -netns ${ns} ru add pref 32765 from all lookup local 160ec810535SDavid Ahern ip -netns ${ns} -6 ru del pref 0 161ec810535SDavid Ahern ip -netns ${ns} -6 ru add pref 32765 from all lookup local 162ec810535SDavid Ahern} 163ec810535SDavid Ahern 164ec810535SDavid Ahernsetup() 165ec810535SDavid Ahern{ 166ec810535SDavid Ahern local ns 167ec810535SDavid Ahern 168ec810535SDavid Ahern # 169ec810535SDavid Ahern # create nodes as namespaces 170ec810535SDavid Ahern # 171ec810535SDavid Ahern for ns in h1 h2 r1 r2; do 172ec810535SDavid Ahern ip netns add $ns 173ec810535SDavid Ahern ip -netns $ns li set lo up 174ec810535SDavid Ahern 175ec810535SDavid Ahern case "${ns}" in 176ec810535SDavid Ahern h[12]) ip netns exec $ns sysctl -q -w net.ipv4.conf.all.accept_redirects=1 17799513cfaSDavid Ahern ip netns exec $ns sysctl -q -w net.ipv6.conf.all.forwarding=0 178ec810535SDavid Ahern ip netns exec $ns sysctl -q -w net.ipv6.conf.all.accept_redirects=1 179ec810535SDavid Ahern ip netns exec $ns sysctl -q -w net.ipv6.conf.all.keep_addr_on_down=1 180ec810535SDavid Ahern ;; 181ec810535SDavid Ahern r[12]) ip netns exec $ns sysctl -q -w net.ipv4.ip_forward=1 182ec810535SDavid Ahern ip netns exec $ns sysctl -q -w net.ipv4.conf.all.send_redirects=1 183ec810535SDavid Ahern 184ec810535SDavid Ahern ip netns exec $ns sysctl -q -w net.ipv6.conf.all.forwarding=1 185ec810535SDavid Ahern ip netns exec $ns sysctl -q -w net.ipv6.route.mtu_expires=10 186ec810535SDavid Ahern esac 187ec810535SDavid Ahern done 188ec810535SDavid Ahern 189ec810535SDavid Ahern # 190ec810535SDavid Ahern # create interconnects 191ec810535SDavid Ahern # 192ec810535SDavid Ahern ip -netns h1 li add eth0 type veth peer name r1h1 193ec810535SDavid Ahern ip -netns h1 li set r1h1 netns r1 name eth0 up 194ec810535SDavid Ahern 195ec810535SDavid Ahern ip -netns h1 li add eth1 type veth peer name r2h1 196ec810535SDavid Ahern ip -netns h1 li set r2h1 netns r2 name eth0 up 197ec810535SDavid Ahern 198ec810535SDavid Ahern ip -netns h2 li add eth0 type veth peer name r2h2 199ec810535SDavid Ahern ip -netns h2 li set eth0 up 200ec810535SDavid Ahern ip -netns h2 li set r2h2 netns r2 name eth2 up 201ec810535SDavid Ahern 202ec810535SDavid Ahern ip -netns r1 li add eth1 type veth peer name r2r1 203ec810535SDavid Ahern ip -netns r1 li set eth1 up 204ec810535SDavid Ahern ip -netns r1 li set r2r1 netns r2 name eth1 up 205ec810535SDavid Ahern 206ec810535SDavid Ahern # 207ec810535SDavid Ahern # h1 208ec810535SDavid Ahern # 209ec810535SDavid Ahern if [ "${WITH_VRF}" = "yes" ]; then 210ec810535SDavid Ahern create_vrf "h1" 211ec810535SDavid Ahern H1_VRF_ARG="vrf ${VRF}" 212ec810535SDavid Ahern H1_PING_ARG="-I ${VRF}" 213ec810535SDavid Ahern else 214ec810535SDavid Ahern H1_VRF_ARG= 215ec810535SDavid Ahern H1_PING_ARG= 216ec810535SDavid Ahern fi 217ec810535SDavid Ahern ip -netns h1 li add br0 type bridge 218ec810535SDavid Ahern if [ "${WITH_VRF}" = "yes" ]; then 219ec810535SDavid Ahern ip -netns h1 li set br0 vrf ${VRF} up 220ec810535SDavid Ahern else 221ec810535SDavid Ahern ip -netns h1 li set br0 up 222ec810535SDavid Ahern fi 223ec810535SDavid Ahern ip -netns h1 addr add dev br0 ${H1_N1_IP}/24 224ec810535SDavid Ahern ip -netns h1 -6 addr add dev br0 ${H1_N1_IP6}/64 nodad 225ec810535SDavid Ahern ip -netns h1 li set eth0 master br0 up 226ec810535SDavid Ahern ip -netns h1 li set eth1 master br0 up 227ec810535SDavid Ahern 228ec810535SDavid Ahern # 229ec810535SDavid Ahern # h2 230ec810535SDavid Ahern # 231ec810535SDavid Ahern ip -netns h2 addr add dev eth0 ${H2_N2_IP}/24 232ec810535SDavid Ahern ip -netns h2 ro add default via ${R2_N2_IP} dev eth0 233ec810535SDavid Ahern ip -netns h2 -6 addr add dev eth0 ${H2_N2_IP6}/64 nodad 234ec810535SDavid Ahern ip -netns h2 -6 ro add default via ${R2_N2_IP6} dev eth0 235ec810535SDavid Ahern 236ec810535SDavid Ahern # 237ec810535SDavid Ahern # r1 238ec810535SDavid Ahern # 239ec810535SDavid Ahern ip -netns r1 addr add dev eth0 ${R1_N1_IP}/24 240ec810535SDavid Ahern ip -netns r1 -6 addr add dev eth0 ${R1_N1_IP6}/64 nodad 241ec810535SDavid Ahern ip -netns r1 addr add dev eth1 ${R1_R2_N1_IP}/30 242ec810535SDavid Ahern ip -netns r1 -6 addr add dev eth1 ${R1_R2_N1_IP6}/126 nodad 243ec810535SDavid Ahern 244ec810535SDavid Ahern # 245ec810535SDavid Ahern # r2 246ec810535SDavid Ahern # 247ec810535SDavid Ahern ip -netns r2 addr add dev eth0 ${R2_N1_IP}/24 248ec810535SDavid Ahern ip -netns r2 -6 addr add dev eth0 ${R2_N1_IP6}/64 nodad 249ec810535SDavid Ahern ip -netns r2 addr add dev eth1 ${R2_R1_N1_IP}/30 250ec810535SDavid Ahern ip -netns r2 -6 addr add dev eth1 ${R2_R1_N1_IP6}/126 nodad 251ec810535SDavid Ahern ip -netns r2 addr add dev eth2 ${R2_N2_IP}/24 252ec810535SDavid Ahern ip -netns r2 -6 addr add dev eth2 ${R2_N2_IP6}/64 nodad 253ec810535SDavid Ahern 254ec810535SDavid Ahern sleep 2 255ec810535SDavid Ahern 256ec810535SDavid Ahern R1_LLADDR=$(get_linklocal r1 eth0) 257ec810535SDavid Ahern if [ $? -ne 0 ]; then 258ec810535SDavid Ahern echo "Error: Failed to get link-local address of r1's eth0" 259ec810535SDavid Ahern exit 1 260ec810535SDavid Ahern fi 26199513cfaSDavid Ahern log_debug "initial gateway is R1's lladdr = ${R1_LLADDR}" 262ec810535SDavid Ahern 263ec810535SDavid Ahern R2_LLADDR=$(get_linklocal r2 eth0) 264ec810535SDavid Ahern if [ $? -ne 0 ]; then 265ec810535SDavid Ahern echo "Error: Failed to get link-local address of r2's eth0" 266ec810535SDavid Ahern exit 1 267ec810535SDavid Ahern fi 26899513cfaSDavid Ahern log_debug "initial gateway is R2's lladdr = ${R2_LLADDR}" 269ec810535SDavid Ahern} 270ec810535SDavid Ahern 271ec810535SDavid Ahernchange_h2_mtu() 272ec810535SDavid Ahern{ 273ec810535SDavid Ahern local mtu=$1 274ec810535SDavid Ahern 275ec810535SDavid Ahern run_cmd ip -netns h2 li set eth0 mtu ${mtu} 276ec810535SDavid Ahern run_cmd ip -netns r2 li set eth2 mtu ${mtu} 277ec810535SDavid Ahern} 278ec810535SDavid Ahern 279ec810535SDavid Aherncheck_exception() 280ec810535SDavid Ahern{ 281ec810535SDavid Ahern local mtu="$1" 282ec810535SDavid Ahern local with_redirect="$2" 283ec810535SDavid Ahern local desc="$3" 284ec810535SDavid Ahern 285ec810535SDavid Ahern # From 172.16.1.101: icmp_seq=1 Redirect Host(New nexthop: 172.16.1.102) 286ec810535SDavid Ahern if [ "$VERBOSE" = "1" ]; then 287ec810535SDavid Ahern echo "Commands to check for exception:" 288ec810535SDavid Ahern run_cmd ip -netns h1 ro get ${H1_VRF_ARG} ${H2_N2_IP} 289ec810535SDavid Ahern run_cmd ip -netns h1 -6 ro get ${H1_VRF_ARG} ${H2_N2_IP6} 290ec810535SDavid Ahern fi 291ec810535SDavid Ahern 292ec810535SDavid Ahern if [ -n "${mtu}" ]; then 293ec810535SDavid Ahern mtu=" mtu ${mtu}" 294ec810535SDavid Ahern fi 295ec810535SDavid Ahern if [ "$with_redirect" = "yes" ]; then 296ec810535SDavid Ahern ip -netns h1 ro get ${H1_VRF_ARG} ${H2_N2_IP} | \ 297ec810535SDavid Ahern grep -q "cache <redirected> expires [0-9]*sec${mtu}" 298ec810535SDavid Ahern elif [ -n "${mtu}" ]; then 299ec810535SDavid Ahern ip -netns h1 ro get ${H1_VRF_ARG} ${H2_N2_IP} | \ 300ec810535SDavid Ahern grep -q "cache expires [0-9]*sec${mtu}" 301ec810535SDavid Ahern else 30299513cfaSDavid Ahern # want to verify that neither mtu nor redirected appears in 30399513cfaSDavid Ahern # the route get output. The -v will wipe out the cache line 30499513cfaSDavid Ahern # if either are set so the last grep -q will not find a match 305ec810535SDavid Ahern ip -netns h1 ro get ${H1_VRF_ARG} ${H2_N2_IP} | \ 30699513cfaSDavid Ahern grep -E -v 'mtu|redirected' | grep -q "cache" 307ec810535SDavid Ahern fi 308ec810535SDavid Ahern log_test $? 0 "IPv4: ${desc}" 309ec810535SDavid Ahern 310ec810535SDavid Ahern if [ "$with_redirect" = "yes" ]; then 31199513cfaSDavid Ahern ip -netns h1 -6 ro get ${H1_VRF_ARG} ${H2_N2_IP6} | \ 31299513cfaSDavid Ahern grep -q "${H2_N2_IP6} from :: via ${R2_LLADDR} dev br0.*${mtu}" 31399513cfaSDavid Ahern elif [ -n "${mtu}" ]; then 31499513cfaSDavid Ahern ip -netns h1 -6 ro get ${H1_VRF_ARG} ${H2_N2_IP6} | \ 31599513cfaSDavid Ahern grep -q "${mtu}" 316ec810535SDavid Ahern else 31799513cfaSDavid Ahern # IPv6 is a bit harder. First strip out the match if it 31899513cfaSDavid Ahern # contains an mtu exception and then look for the first 31999513cfaSDavid Ahern # gateway - R1's lladdr 32099513cfaSDavid Ahern ip -netns h1 -6 ro get ${H1_VRF_ARG} ${H2_N2_IP6} | \ 32199513cfaSDavid Ahern grep -v "mtu" | grep -q "${R1_LLADDR}" 322ec810535SDavid Ahern fi 323ec810535SDavid Ahern log_test $? 0 "IPv6: ${desc}" 324ec810535SDavid Ahern} 325ec810535SDavid Ahern 326ec810535SDavid Ahernrun_ping() 327ec810535SDavid Ahern{ 328ec810535SDavid Ahern local sz=$1 329ec810535SDavid Ahern 33099513cfaSDavid Ahern run_cmd ip netns exec h1 ping -q -M want -i 0.5 -c 10 -w 2 -s ${sz} ${H1_PING_ARG} ${H2_N2_IP} 33199513cfaSDavid Ahern run_cmd ip netns exec h1 ${ping6} -q -M want -i 0.5 -c 10 -w 2 -s ${sz} ${H1_PING_ARG} ${H2_N2_IP6} 332ec810535SDavid Ahern} 333ec810535SDavid Ahern 334ec810535SDavid Ahernreplace_route_legacy() 335ec810535SDavid Ahern{ 336ec810535SDavid Ahern # r1 to h2 via r2 and eth0 337ec810535SDavid Ahern run_cmd ip -netns r1 ro replace ${H2_N2} via ${R2_N1_IP} dev eth0 338ec810535SDavid Ahern run_cmd ip -netns r1 -6 ro replace ${H2_N2_6} via ${R2_LLADDR} dev eth0 339ec810535SDavid Ahern} 340ec810535SDavid Ahern 34199513cfaSDavid Ahernreset_route_legacy() 34299513cfaSDavid Ahern{ 34399513cfaSDavid Ahern run_cmd ip -netns r1 ro del ${H2_N2} 34499513cfaSDavid Ahern run_cmd ip -netns r1 -6 ro del ${H2_N2_6} 34599513cfaSDavid Ahern 34699513cfaSDavid Ahern run_cmd ip -netns h1 ro del ${H1_VRF_ARG} ${H2_N2} 34799513cfaSDavid Ahern run_cmd ip -netns h1 -6 ro del ${H1_VRF_ARG} ${H2_N2_6} 34899513cfaSDavid Ahern 34999513cfaSDavid Ahern initial_route_legacy 35099513cfaSDavid Ahern} 35199513cfaSDavid Ahern 352ec810535SDavid Aherninitial_route_legacy() 353ec810535SDavid Ahern{ 354ec810535SDavid Ahern # r1 to h2 via r2 and eth1 355ec810535SDavid Ahern run_cmd ip -netns r1 ro add ${H2_N2} via ${R2_R1_N1_IP} dev eth1 356ec810535SDavid Ahern run_cmd ip -netns r1 -6 ro add ${H2_N2_6} via ${R2_R1_N1_IP6} dev eth1 357ec810535SDavid Ahern 358ec810535SDavid Ahern # h1 to h2 via r1 359ec810535SDavid Ahern # - IPv6 redirect only works if gateway is the LLA 360ec810535SDavid Ahern run_cmd ip -netns h1 ro add ${H1_VRF_ARG} ${H2_N2} via ${R1_N1_IP} dev br0 361ec810535SDavid Ahern run_cmd ip -netns h1 -6 ro add ${H1_VRF_ARG} ${H2_N2_6} via ${R1_LLADDR} dev br0 362ec810535SDavid Ahern} 363ec810535SDavid Ahern 364ec810535SDavid Aherncheck_connectivity() 365ec810535SDavid Ahern{ 366ec810535SDavid Ahern local rc 367ec810535SDavid Ahern 368ec810535SDavid Ahern run_cmd ip netns exec h1 ping -c1 -w1 ${H1_PING_ARG} ${H2_N2_IP} 369ec810535SDavid Ahern rc=$? 370ec810535SDavid Ahern run_cmd ip netns exec h1 ${ping6} -c1 -w1 ${H1_PING_ARG} ${H2_N2_IP6} 371ec810535SDavid Ahern [ $? -ne 0 ] && rc=$? 372ec810535SDavid Ahern 373ec810535SDavid Ahern return $rc 374ec810535SDavid Ahern} 375ec810535SDavid Ahern 376ec810535SDavid Aherndo_test() 377ec810535SDavid Ahern{ 378ec810535SDavid Ahern local ttype="$1" 379ec810535SDavid Ahern 380ec810535SDavid Ahern eval initial_route_${ttype} 381ec810535SDavid Ahern 382ec810535SDavid Ahern # verify connectivity 383ec810535SDavid Ahern check_connectivity 384ec810535SDavid Ahern if [ $? -ne 0 ]; then 385ec810535SDavid Ahern echo "Error: Basic connectivity is broken" 386ec810535SDavid Ahern ret=1 387ec810535SDavid Ahern return 388ec810535SDavid Ahern fi 389ec810535SDavid Ahern 390ec810535SDavid Ahern # redirect exception followed by mtu 391ec810535SDavid Ahern eval replace_route_${ttype} 392ec810535SDavid Ahern run_ping 64 393ec810535SDavid Ahern check_exception "" "yes" "redirect exception" 394ec810535SDavid Ahern 395ec810535SDavid Ahern check_connectivity 396ec810535SDavid Ahern if [ $? -ne 0 ]; then 397ec810535SDavid Ahern echo "Error: Basic connectivity is broken after redirect" 398ec810535SDavid Ahern ret=1 399ec810535SDavid Ahern return 400ec810535SDavid Ahern fi 401ec810535SDavid Ahern 402ec810535SDavid Ahern change_h2_mtu 1300 403ec810535SDavid Ahern run_ping 1350 404ec810535SDavid Ahern check_exception "1300" "yes" "redirect exception plus mtu" 405ec810535SDavid Ahern 406ec810535SDavid Ahern # remove exceptions and restore routing 407ec810535SDavid Ahern change_h2_mtu 1500 40899513cfaSDavid Ahern eval reset_route_${ttype} 409ec810535SDavid Ahern 410ec810535SDavid Ahern check_connectivity 411ec810535SDavid Ahern if [ $? -ne 0 ]; then 412ec810535SDavid Ahern echo "Error: Basic connectivity is broken after reset" 413ec810535SDavid Ahern ret=1 414ec810535SDavid Ahern return 415ec810535SDavid Ahern fi 416ec810535SDavid Ahern check_exception "" "no" "routing reset" 417ec810535SDavid Ahern 418ec810535SDavid Ahern # MTU exception followed by redirect 419ec810535SDavid Ahern change_h2_mtu 1300 420ec810535SDavid Ahern run_ping 1350 421ec810535SDavid Ahern check_exception "1300" "no" "mtu exception" 422ec810535SDavid Ahern 423ec810535SDavid Ahern eval replace_route_${ttype} 424ec810535SDavid Ahern run_ping 64 425ec810535SDavid Ahern check_exception "1300" "yes" "mtu exception plus redirect" 426ec810535SDavid Ahern 427ec810535SDavid Ahern check_connectivity 428ec810535SDavid Ahern if [ $? -ne 0 ]; then 429ec810535SDavid Ahern echo "Error: Basic connectivity is broken after redirect" 430ec810535SDavid Ahern ret=1 431ec810535SDavid Ahern return 432ec810535SDavid Ahern fi 433ec810535SDavid Ahern} 434ec810535SDavid Ahern 435ec810535SDavid Ahern################################################################################ 436ec810535SDavid Ahern# usage 437ec810535SDavid Ahern 438ec810535SDavid Ahernusage() 439ec810535SDavid Ahern{ 440ec810535SDavid Ahern cat <<EOF 441ec810535SDavid Ahernusage: ${0##*/} OPTS 442ec810535SDavid Ahern 443ec810535SDavid Ahern -p Pause on fail 444ec810535SDavid Ahern -v verbose mode (show commands and output) 445ec810535SDavid AhernEOF 446ec810535SDavid Ahern} 447ec810535SDavid Ahern 448ec810535SDavid Ahern################################################################################ 449ec810535SDavid Ahern# main 450ec810535SDavid Ahern 451ec810535SDavid Ahern# Some systems don't have a ping6 binary anymore 452ec810535SDavid Ahernwhich ping6 > /dev/null 2>&1 && ping6=$(which ping6) || ping6=$(which ping) 453ec810535SDavid Ahern 454ec810535SDavid Ahernret=0 455ec810535SDavid Ahernnsuccess=0 456ec810535SDavid Ahernnfail=0 457ec810535SDavid Ahern 458ec810535SDavid Ahernwhile getopts :pv o 459ec810535SDavid Aherndo 460ec810535SDavid Ahern case $o in 461ec810535SDavid Ahern p) PAUSE_ON_FAIL=yes;; 462ec810535SDavid Ahern v) VERBOSE=$(($VERBOSE + 1));; 463ec810535SDavid Ahern *) usage; exit 1;; 464ec810535SDavid Ahern esac 465ec810535SDavid Aherndone 466ec810535SDavid Ahern 467ec810535SDavid Aherntrap cleanup EXIT 468ec810535SDavid Ahern 469ec810535SDavid Aherncleanup 470ec810535SDavid AhernWITH_VRF=no 471ec810535SDavid Ahernsetup 472ec810535SDavid Ahern 473ec810535SDavid Ahernlog_section "Legacy routing" 474ec810535SDavid Aherndo_test "legacy" 475ec810535SDavid Ahern 476ec810535SDavid Aherncleanup 477ec810535SDavid Ahernlog_section "Legacy routing with VRF" 478ec810535SDavid AhernWITH_VRF=yes 479ec810535SDavid Ahernsetup 480ec810535SDavid Aherndo_test "legacy" 481ec810535SDavid Ahern 482ec810535SDavid Ahernprintf "\nTests passed: %3d\n" ${nsuccess} 483ec810535SDavid Ahernprintf "Tests failed: %3d\n" ${nfail} 484ec810535SDavid Ahern 485ec810535SDavid Ahernexit $ret 486