1735ab2f6SDavid Ahern#!/bin/bash 2735ab2f6SDavid Ahern# SPDX-License-Identifier: GPL-2.0 3735ab2f6SDavid Ahern# 4735ab2f6SDavid Ahern# Validate cached routes in fib{6}_nh that is used by multiple prefixes. 5735ab2f6SDavid Ahern# Validate a different # exception is generated in h0 for each remote host. 6735ab2f6SDavid Ahern# 7735ab2f6SDavid Ahern# h1 8735ab2f6SDavid Ahern# / 9735ab2f6SDavid Ahern# h0 - r1 - h2 10735ab2f6SDavid Ahern# \ 11735ab2f6SDavid Ahern# h3 12735ab2f6SDavid Ahern# 13735ab2f6SDavid Ahern# routing in h0 to hN is done with nexthop objects. 14735ab2f6SDavid Ahern 15735ab2f6SDavid AhernPAUSE_ON_FAIL=no 16735ab2f6SDavid AhernVERBOSE=0 17735ab2f6SDavid Ahern 18e84622ceSDavid Ahernwhich ping6 > /dev/null 2>&1 && ping6=$(which ping6) || ping6=$(which ping) 19e84622ceSDavid Ahern 20735ab2f6SDavid Ahern################################################################################ 21735ab2f6SDavid Ahern# helpers 22735ab2f6SDavid Ahern 23735ab2f6SDavid Ahernlog_test() 24735ab2f6SDavid Ahern{ 25735ab2f6SDavid Ahern local rc=$1 26735ab2f6SDavid Ahern local expected=$2 27735ab2f6SDavid Ahern local msg="$3" 28735ab2f6SDavid Ahern 29735ab2f6SDavid Ahern if [ ${rc} -eq ${expected} ]; then 30735ab2f6SDavid Ahern printf "TEST: %-60s [ OK ]\n" "${msg}" 31735ab2f6SDavid Ahern nsuccess=$((nsuccess+1)) 32735ab2f6SDavid Ahern else 33735ab2f6SDavid Ahern ret=1 34735ab2f6SDavid Ahern nfail=$((nfail+1)) 35735ab2f6SDavid Ahern printf "TEST: %-60s [FAIL]\n" "${msg}" 36735ab2f6SDavid Ahern if [ "${PAUSE_ON_FAIL}" = "yes" ]; then 37735ab2f6SDavid Ahern echo 38735ab2f6SDavid Ahern echo "hit enter to continue, 'q' to quit" 39735ab2f6SDavid Ahern read a 40735ab2f6SDavid Ahern [ "$a" = "q" ] && exit 1 41735ab2f6SDavid Ahern fi 42735ab2f6SDavid Ahern fi 43735ab2f6SDavid Ahern 44735ab2f6SDavid Ahern [ "$VERBOSE" = "1" ] && echo 45735ab2f6SDavid Ahern} 46735ab2f6SDavid Ahern 47735ab2f6SDavid Ahernrun_cmd() 48735ab2f6SDavid Ahern{ 49735ab2f6SDavid Ahern local cmd="$*" 50735ab2f6SDavid Ahern local out 51735ab2f6SDavid Ahern local rc 52735ab2f6SDavid Ahern 53735ab2f6SDavid Ahern if [ "$VERBOSE" = "1" ]; then 54735ab2f6SDavid Ahern echo "COMMAND: $cmd" 55735ab2f6SDavid Ahern fi 56735ab2f6SDavid Ahern 57735ab2f6SDavid Ahern out=$(eval $cmd 2>&1) 58735ab2f6SDavid Ahern rc=$? 59735ab2f6SDavid Ahern if [ "$VERBOSE" = "1" -a -n "$out" ]; then 60735ab2f6SDavid Ahern echo "$out" 61735ab2f6SDavid Ahern fi 62735ab2f6SDavid Ahern 63735ab2f6SDavid Ahern [ "$VERBOSE" = "1" ] && echo 64735ab2f6SDavid Ahern 65735ab2f6SDavid Ahern return $rc 66735ab2f6SDavid Ahern} 67735ab2f6SDavid Ahern 68735ab2f6SDavid Ahern################################################################################ 69735ab2f6SDavid Ahern# config 70735ab2f6SDavid Ahern 71735ab2f6SDavid Aherncreate_ns() 72735ab2f6SDavid Ahern{ 73735ab2f6SDavid Ahern local ns=${1} 74735ab2f6SDavid Ahern 75735ab2f6SDavid Ahern ip netns del ${ns} 2>/dev/null 76735ab2f6SDavid Ahern 77735ab2f6SDavid Ahern ip netns add ${ns} 78735ab2f6SDavid Ahern ip -netns ${ns} addr add 127.0.0.1/8 dev lo 79735ab2f6SDavid Ahern ip -netns ${ns} link set lo up 80735ab2f6SDavid Ahern 81735ab2f6SDavid Ahern ip netns exec ${ns} sysctl -q -w net.ipv6.conf.all.keep_addr_on_down=1 82735ab2f6SDavid Ahern case ${ns} in 83735ab2f6SDavid Ahern h*) 84735ab2f6SDavid Ahern ip netns exec $ns sysctl -q -w net.ipv6.conf.all.forwarding=0 85735ab2f6SDavid Ahern ;; 86735ab2f6SDavid Ahern r*) 87735ab2f6SDavid Ahern ip netns exec $ns sysctl -q -w net.ipv4.ip_forward=1 88735ab2f6SDavid Ahern ip netns exec $ns sysctl -q -w net.ipv6.conf.all.forwarding=1 89735ab2f6SDavid Ahern ;; 90735ab2f6SDavid Ahern esac 91735ab2f6SDavid Ahern} 92735ab2f6SDavid Ahern 93735ab2f6SDavid Ahernsetup() 94735ab2f6SDavid Ahern{ 95735ab2f6SDavid Ahern local ns 96735ab2f6SDavid Ahern local i 97735ab2f6SDavid Ahern 98735ab2f6SDavid Ahern #set -e 99735ab2f6SDavid Ahern 100735ab2f6SDavid Ahern for ns in h0 r1 h1 h2 h3 101735ab2f6SDavid Ahern do 102735ab2f6SDavid Ahern create_ns ${ns} 103735ab2f6SDavid Ahern done 104735ab2f6SDavid Ahern 105735ab2f6SDavid Ahern # 106735ab2f6SDavid Ahern # create interconnects 107735ab2f6SDavid Ahern # 108735ab2f6SDavid Ahern 109735ab2f6SDavid Ahern for i in 0 1 2 3 110735ab2f6SDavid Ahern do 111735ab2f6SDavid Ahern ip -netns h${i} li add eth0 type veth peer name r1h${i} 112735ab2f6SDavid Ahern ip -netns h${i} li set eth0 up 113735ab2f6SDavid Ahern ip -netns h${i} li set r1h${i} netns r1 name eth${i} up 114735ab2f6SDavid Ahern 115735ab2f6SDavid Ahern ip -netns h${i} addr add dev eth0 172.16.10${i}.1/24 116735ab2f6SDavid Ahern ip -netns h${i} -6 addr add dev eth0 2001:db8:10${i}::1/64 117735ab2f6SDavid Ahern ip -netns r1 addr add dev eth${i} 172.16.10${i}.254/24 118735ab2f6SDavid Ahern ip -netns r1 -6 addr add dev eth${i} 2001:db8:10${i}::64/64 119735ab2f6SDavid Ahern done 120735ab2f6SDavid Ahern 121735ab2f6SDavid Ahern ip -netns h0 nexthop add id 4 via 172.16.100.254 dev eth0 122735ab2f6SDavid Ahern ip -netns h0 nexthop add id 6 via 2001:db8:100::64 dev eth0 123735ab2f6SDavid Ahern 124735ab2f6SDavid Ahern # routing from h0 to h1-h3 and back 125735ab2f6SDavid Ahern for i in 1 2 3 126735ab2f6SDavid Ahern do 127735ab2f6SDavid Ahern ip -netns h0 ro add 172.16.10${i}.0/24 nhid 4 128735ab2f6SDavid Ahern ip -netns h${i} ro add 172.16.100.0/24 via 172.16.10${i}.254 129735ab2f6SDavid Ahern 130735ab2f6SDavid Ahern ip -netns h0 -6 ro add 2001:db8:10${i}::/64 nhid 6 131735ab2f6SDavid Ahern ip -netns h${i} -6 ro add 2001:db8:100::/64 via 2001:db8:10${i}::64 132735ab2f6SDavid Ahern done 133735ab2f6SDavid Ahern 134735ab2f6SDavid Ahern if [ "$VERBOSE" = "1" ]; then 135735ab2f6SDavid Ahern echo 136735ab2f6SDavid Ahern echo "host 1 config" 137735ab2f6SDavid Ahern ip -netns h0 li sh 138735ab2f6SDavid Ahern ip -netns h0 ro sh 139735ab2f6SDavid Ahern ip -netns h0 -6 ro sh 140735ab2f6SDavid Ahern fi 141735ab2f6SDavid Ahern 142735ab2f6SDavid Ahern #set +e 143735ab2f6SDavid Ahern} 144735ab2f6SDavid Ahern 145735ab2f6SDavid Aherncleanup() 146735ab2f6SDavid Ahern{ 147651149f6SPaolo Pisati for n in h0 r1 h1 h2 h3 148735ab2f6SDavid Ahern do 149735ab2f6SDavid Ahern ip netns del ${n} 2>/dev/null 150735ab2f6SDavid Ahern done 151735ab2f6SDavid Ahern} 152735ab2f6SDavid Ahern 153735ab2f6SDavid Ahernchange_mtu() 154735ab2f6SDavid Ahern{ 155735ab2f6SDavid Ahern local hostid=$1 156735ab2f6SDavid Ahern local mtu=$2 157735ab2f6SDavid Ahern 158735ab2f6SDavid Ahern run_cmd ip -netns h${hostid} li set eth0 mtu ${mtu} 159735ab2f6SDavid Ahern run_cmd ip -netns r1 li set eth${hostid} mtu ${mtu} 160735ab2f6SDavid Ahern} 161735ab2f6SDavid Ahern 162735ab2f6SDavid Ahern################################################################################ 163735ab2f6SDavid Ahern# validate exceptions 164735ab2f6SDavid Ahern 165735ab2f6SDavid Ahernvalidate_v4_exception() 166735ab2f6SDavid Ahern{ 167735ab2f6SDavid Ahern local i=$1 168735ab2f6SDavid Ahern local mtu=$2 169735ab2f6SDavid Ahern local ping_sz=$3 170735ab2f6SDavid Ahern local dst="172.16.10${i}.1" 171735ab2f6SDavid Ahern local h0=172.16.100.1 172735ab2f6SDavid Ahern local r1=172.16.100.254 173735ab2f6SDavid Ahern local rc 174735ab2f6SDavid Ahern 175735ab2f6SDavid Ahern if [ ${ping_sz} != "0" ]; then 176735ab2f6SDavid Ahern run_cmd ip netns exec h0 ping -s ${ping_sz} -c5 -w5 ${dst} 177735ab2f6SDavid Ahern fi 178735ab2f6SDavid Ahern 179735ab2f6SDavid Ahern if [ "$VERBOSE" = "1" ]; then 180735ab2f6SDavid Ahern echo "Route get" 181735ab2f6SDavid Ahern ip -netns h0 ro get ${dst} 182735ab2f6SDavid Ahern echo "Searching for:" 183735ab2f6SDavid Ahern echo " cache .* mtu ${mtu}" 184735ab2f6SDavid Ahern echo 185735ab2f6SDavid Ahern fi 186735ab2f6SDavid Ahern 187735ab2f6SDavid Ahern ip -netns h0 ro get ${dst} | \ 188735ab2f6SDavid Ahern grep -q "cache .* mtu ${mtu}" 189735ab2f6SDavid Ahern rc=$? 190735ab2f6SDavid Ahern 191735ab2f6SDavid Ahern log_test $rc 0 "IPv4: host 0 to host ${i}, mtu ${mtu}" 192735ab2f6SDavid Ahern} 193735ab2f6SDavid Ahern 194735ab2f6SDavid Ahernvalidate_v6_exception() 195735ab2f6SDavid Ahern{ 196735ab2f6SDavid Ahern local i=$1 197735ab2f6SDavid Ahern local mtu=$2 198735ab2f6SDavid Ahern local ping_sz=$3 199735ab2f6SDavid Ahern local dst="2001:db8:10${i}::1" 200735ab2f6SDavid Ahern local h0=2001:db8:100::1 201735ab2f6SDavid Ahern local r1=2001:db8:100::64 202735ab2f6SDavid Ahern local rc 203735ab2f6SDavid Ahern 204735ab2f6SDavid Ahern if [ ${ping_sz} != "0" ]; then 205e84622ceSDavid Ahern run_cmd ip netns exec h0 ${ping6} -s ${ping_sz} -c5 -w5 ${dst} 206735ab2f6SDavid Ahern fi 207735ab2f6SDavid Ahern 208735ab2f6SDavid Ahern if [ "$VERBOSE" = "1" ]; then 209735ab2f6SDavid Ahern echo "Route get" 210735ab2f6SDavid Ahern ip -netns h0 -6 ro get ${dst} 211735ab2f6SDavid Ahern echo "Searching for:" 212*d01b4a92SHangbin Liu echo " ${dst}.* via ${r1} dev eth0 src ${h0} .* mtu ${mtu}" 213735ab2f6SDavid Ahern echo 214735ab2f6SDavid Ahern fi 215735ab2f6SDavid Ahern 216735ab2f6SDavid Ahern ip -netns h0 -6 ro get ${dst} | \ 217*d01b4a92SHangbin Liu grep -q "${dst}.* via ${r1} dev eth0 src ${h0} .* mtu ${mtu}" 218735ab2f6SDavid Ahern rc=$? 219735ab2f6SDavid Ahern 220735ab2f6SDavid Ahern log_test $rc 0 "IPv6: host 0 to host ${i}, mtu ${mtu}" 221735ab2f6SDavid Ahern} 222735ab2f6SDavid Ahern 223735ab2f6SDavid Ahern################################################################################ 224735ab2f6SDavid Ahern# main 225735ab2f6SDavid Ahern 226735ab2f6SDavid Ahernwhile getopts :pv o 227735ab2f6SDavid Aherndo 228735ab2f6SDavid Ahern case $o in 229735ab2f6SDavid Ahern p) PAUSE_ON_FAIL=yes;; 230735ab2f6SDavid Ahern v) VERBOSE=1;; 231735ab2f6SDavid Ahern esac 232735ab2f6SDavid Aherndone 233735ab2f6SDavid Ahern 234735ab2f6SDavid Aherncleanup 235735ab2f6SDavid Ahernsetup 236735ab2f6SDavid Ahernsleep 2 237735ab2f6SDavid Ahern 238735ab2f6SDavid Aherncpus=$(cat /sys/devices/system/cpu/online) 239735ab2f6SDavid Aherncpus="$(seq ${cpus/-/ })" 240735ab2f6SDavid Ahernret=0 241735ab2f6SDavid Ahernfor i in 1 2 3 242735ab2f6SDavid Aherndo 243735ab2f6SDavid Ahern # generate a cached route per-cpu 244735ab2f6SDavid Ahern for c in ${cpus}; do 245735ab2f6SDavid Ahern run_cmd taskset -c ${c} ip netns exec h0 ping -c1 -w1 172.16.10${i}.1 246735ab2f6SDavid Ahern [ $? -ne 0 ] && printf "\nERROR: ping to h${i} failed\n" && ret=1 247735ab2f6SDavid Ahern 248e84622ceSDavid Ahern run_cmd taskset -c ${c} ip netns exec h0 ${ping6} -c1 -w1 2001:db8:10${i}::1 249735ab2f6SDavid Ahern [ $? -ne 0 ] && printf "\nERROR: ping6 to h${i} failed\n" && ret=1 250735ab2f6SDavid Ahern 251735ab2f6SDavid Ahern [ $ret -ne 0 ] && break 252735ab2f6SDavid Ahern done 253735ab2f6SDavid Ahern [ $ret -ne 0 ] && break 254735ab2f6SDavid Aherndone 255735ab2f6SDavid Ahern 256735ab2f6SDavid Ahernif [ $ret -eq 0 ]; then 257735ab2f6SDavid Ahern # generate different exceptions in h0 for h1, h2 and h3 258735ab2f6SDavid Ahern change_mtu 1 1300 259735ab2f6SDavid Ahern validate_v4_exception 1 1300 1350 260735ab2f6SDavid Ahern validate_v6_exception 1 1300 1350 261735ab2f6SDavid Ahern echo 262735ab2f6SDavid Ahern 263735ab2f6SDavid Ahern change_mtu 2 1350 264735ab2f6SDavid Ahern validate_v4_exception 2 1350 1400 265735ab2f6SDavid Ahern validate_v6_exception 2 1350 1400 266735ab2f6SDavid Ahern echo 267735ab2f6SDavid Ahern 268735ab2f6SDavid Ahern change_mtu 3 1400 269735ab2f6SDavid Ahern validate_v4_exception 3 1400 1450 270735ab2f6SDavid Ahern validate_v6_exception 3 1400 1450 271735ab2f6SDavid Ahern echo 272735ab2f6SDavid Ahern 273735ab2f6SDavid Ahern validate_v4_exception 1 1300 0 274735ab2f6SDavid Ahern validate_v6_exception 1 1300 0 275735ab2f6SDavid Ahern echo 276735ab2f6SDavid Ahern 277735ab2f6SDavid Ahern validate_v4_exception 2 1350 0 278735ab2f6SDavid Ahern validate_v6_exception 2 1350 0 279735ab2f6SDavid Ahern echo 280735ab2f6SDavid Ahern 281735ab2f6SDavid Ahern validate_v4_exception 3 1400 0 282735ab2f6SDavid Ahern validate_v6_exception 3 1400 0 283735ab2f6SDavid Ahern 284735ab2f6SDavid Ahern # targeted deletes to trigger cleanup paths in kernel 285735ab2f6SDavid Ahern ip -netns h0 ro del 172.16.102.0/24 nhid 4 286735ab2f6SDavid Ahern ip -netns h0 -6 ro del 2001:db8:102::/64 nhid 6 287735ab2f6SDavid Ahern 288735ab2f6SDavid Ahern ip -netns h0 nexthop del id 4 289735ab2f6SDavid Ahern ip -netns h0 nexthop del id 6 290735ab2f6SDavid Ahernfi 291735ab2f6SDavid Ahern 292735ab2f6SDavid Aherncleanup 293