1*4882a593Smuzhiyun#!/bin/bash 2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0 3*4882a593Smuzhiyun# 4*4882a593Smuzhiyun# Various combinations of VRF with xfrms and qdisc. 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun# Kselftest framework requirement - SKIP code is 4. 7*4882a593Smuzhiyunksft_skip=4 8*4882a593Smuzhiyun 9*4882a593SmuzhiyunPAUSE_ON_FAIL=no 10*4882a593SmuzhiyunVERBOSE=0 11*4882a593Smuzhiyunret=0 12*4882a593Smuzhiyun 13*4882a593SmuzhiyunHOST1_4=192.168.1.1 14*4882a593SmuzhiyunHOST2_4=192.168.1.2 15*4882a593SmuzhiyunHOST1_6=2001:db8:1::1 16*4882a593SmuzhiyunHOST2_6=2001:db8:1::2 17*4882a593Smuzhiyun 18*4882a593SmuzhiyunXFRM1_4=10.0.1.1 19*4882a593SmuzhiyunXFRM2_4=10.0.1.2 20*4882a593SmuzhiyunXFRM1_6=fc00:1000::1 21*4882a593SmuzhiyunXFRM2_6=fc00:1000::2 22*4882a593SmuzhiyunIF_ID=123 23*4882a593Smuzhiyun 24*4882a593SmuzhiyunVRF=red 25*4882a593SmuzhiyunTABLE=300 26*4882a593Smuzhiyun 27*4882a593SmuzhiyunAUTH_1=0xd94fcfea65fddf21dc6e0d24a0253508 28*4882a593SmuzhiyunAUTH_2=0xdc6e0d24a0253508d94fcfea65fddf21 29*4882a593SmuzhiyunENC_1=0xfc46c20f8048be9725930ff3fb07ac2a91f0347dffeacf62 30*4882a593SmuzhiyunENC_2=0x3fb07ac2a91f0347dffeacf62fc46c20f8048be9725930ff 31*4882a593SmuzhiyunSPI_1=0x02122b77 32*4882a593SmuzhiyunSPI_2=0x2b770212 33*4882a593Smuzhiyun 34*4882a593Smuzhiyunwhich ping6 > /dev/null 2>&1 && ping6=$(which ping6) || ping6=$(which ping) 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun################################################################################ 37*4882a593Smuzhiyun# 38*4882a593Smuzhiyunlog_test() 39*4882a593Smuzhiyun{ 40*4882a593Smuzhiyun local rc=$1 41*4882a593Smuzhiyun local expected=$2 42*4882a593Smuzhiyun local msg="$3" 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun if [ ${rc} -eq ${expected} ]; then 45*4882a593Smuzhiyun printf "TEST: %-60s [ OK ]\n" "${msg}" 46*4882a593Smuzhiyun nsuccess=$((nsuccess+1)) 47*4882a593Smuzhiyun else 48*4882a593Smuzhiyun ret=1 49*4882a593Smuzhiyun nfail=$((nfail+1)) 50*4882a593Smuzhiyun printf "TEST: %-60s [FAIL]\n" "${msg}" 51*4882a593Smuzhiyun if [ "${PAUSE_ON_FAIL}" = "yes" ]; then 52*4882a593Smuzhiyun echo 53*4882a593Smuzhiyun echo "hit enter to continue, 'q' to quit" 54*4882a593Smuzhiyun read a 55*4882a593Smuzhiyun [ "$a" = "q" ] && exit 1 56*4882a593Smuzhiyun fi 57*4882a593Smuzhiyun fi 58*4882a593Smuzhiyun} 59*4882a593Smuzhiyun 60*4882a593Smuzhiyunrun_cmd_host1() 61*4882a593Smuzhiyun{ 62*4882a593Smuzhiyun local cmd="$*" 63*4882a593Smuzhiyun local out 64*4882a593Smuzhiyun local rc 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun if [ "$VERBOSE" = "1" ]; then 67*4882a593Smuzhiyun printf " COMMAND: $cmd\n" 68*4882a593Smuzhiyun fi 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun out=$(eval ip netns exec host1 $cmd 2>&1) 71*4882a593Smuzhiyun rc=$? 72*4882a593Smuzhiyun if [ "$VERBOSE" = "1" ]; then 73*4882a593Smuzhiyun if [ -n "$out" ]; then 74*4882a593Smuzhiyun echo 75*4882a593Smuzhiyun echo " $out" 76*4882a593Smuzhiyun fi 77*4882a593Smuzhiyun echo 78*4882a593Smuzhiyun fi 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun return $rc 81*4882a593Smuzhiyun} 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun################################################################################ 84*4882a593Smuzhiyun# create namespaces for hosts and sws 85*4882a593Smuzhiyun 86*4882a593Smuzhiyuncreate_vrf() 87*4882a593Smuzhiyun{ 88*4882a593Smuzhiyun local ns=$1 89*4882a593Smuzhiyun local vrf=$2 90*4882a593Smuzhiyun local table=$3 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun if [ -n "${ns}" ]; then 93*4882a593Smuzhiyun ns="-netns ${ns}" 94*4882a593Smuzhiyun fi 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun ip ${ns} link add ${vrf} type vrf table ${table} 97*4882a593Smuzhiyun ip ${ns} link set ${vrf} up 98*4882a593Smuzhiyun ip ${ns} route add vrf ${vrf} unreachable default metric 8192 99*4882a593Smuzhiyun ip ${ns} -6 route add vrf ${vrf} unreachable default metric 8192 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun ip ${ns} addr add 127.0.0.1/8 dev ${vrf} 102*4882a593Smuzhiyun ip ${ns} -6 addr add ::1 dev ${vrf} nodad 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun ip ${ns} ru del pref 0 105*4882a593Smuzhiyun ip ${ns} ru add pref 32765 from all lookup local 106*4882a593Smuzhiyun ip ${ns} -6 ru del pref 0 107*4882a593Smuzhiyun ip ${ns} -6 ru add pref 32765 from all lookup local 108*4882a593Smuzhiyun} 109*4882a593Smuzhiyun 110*4882a593Smuzhiyuncreate_ns() 111*4882a593Smuzhiyun{ 112*4882a593Smuzhiyun local ns=$1 113*4882a593Smuzhiyun local addr=$2 114*4882a593Smuzhiyun local addr6=$3 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun [ -z "${addr}" ] && addr="-" 117*4882a593Smuzhiyun [ -z "${addr6}" ] && addr6="-" 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun ip netns add ${ns} 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun ip -netns ${ns} link set lo up 122*4882a593Smuzhiyun if [ "${addr}" != "-" ]; then 123*4882a593Smuzhiyun ip -netns ${ns} addr add dev lo ${addr} 124*4882a593Smuzhiyun fi 125*4882a593Smuzhiyun if [ "${addr6}" != "-" ]; then 126*4882a593Smuzhiyun ip -netns ${ns} -6 addr add dev lo ${addr6} 127*4882a593Smuzhiyun fi 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun ip -netns ${ns} ro add unreachable default metric 8192 130*4882a593Smuzhiyun ip -netns ${ns} -6 ro add unreachable default metric 8192 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun ip netns exec ${ns} sysctl -qw net.ipv4.ip_forward=1 133*4882a593Smuzhiyun ip netns exec ${ns} sysctl -qw net.ipv6.conf.all.keep_addr_on_down=1 134*4882a593Smuzhiyun ip netns exec ${ns} sysctl -qw net.ipv6.conf.all.forwarding=1 135*4882a593Smuzhiyun ip netns exec ${ns} sysctl -qw net.ipv6.conf.default.forwarding=1 136*4882a593Smuzhiyun ip netns exec ${ns} sysctl -qw net.ipv6.conf.default.accept_dad=0 137*4882a593Smuzhiyun} 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun# create veth pair to connect namespaces and apply addresses. 140*4882a593Smuzhiyunconnect_ns() 141*4882a593Smuzhiyun{ 142*4882a593Smuzhiyun local ns1=$1 143*4882a593Smuzhiyun local ns1_dev=$2 144*4882a593Smuzhiyun local ns1_addr=$3 145*4882a593Smuzhiyun local ns1_addr6=$4 146*4882a593Smuzhiyun local ns2=$5 147*4882a593Smuzhiyun local ns2_dev=$6 148*4882a593Smuzhiyun local ns2_addr=$7 149*4882a593Smuzhiyun local ns2_addr6=$8 150*4882a593Smuzhiyun local ns1arg 151*4882a593Smuzhiyun local ns2arg 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun if [ -n "${ns1}" ]; then 154*4882a593Smuzhiyun ns1arg="-netns ${ns1}" 155*4882a593Smuzhiyun fi 156*4882a593Smuzhiyun if [ -n "${ns2}" ]; then 157*4882a593Smuzhiyun ns2arg="-netns ${ns2}" 158*4882a593Smuzhiyun fi 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun ip ${ns1arg} li add ${ns1_dev} type veth peer name tmp 161*4882a593Smuzhiyun ip ${ns1arg} li set ${ns1_dev} up 162*4882a593Smuzhiyun ip ${ns1arg} li set tmp netns ${ns2} name ${ns2_dev} 163*4882a593Smuzhiyun ip ${ns2arg} li set ${ns2_dev} up 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun if [ "${ns1_addr}" != "-" ]; then 166*4882a593Smuzhiyun ip ${ns1arg} addr add dev ${ns1_dev} ${ns1_addr} 167*4882a593Smuzhiyun ip ${ns2arg} addr add dev ${ns2_dev} ${ns2_addr} 168*4882a593Smuzhiyun fi 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun if [ "${ns1_addr6}" != "-" ]; then 171*4882a593Smuzhiyun ip ${ns1arg} addr add dev ${ns1_dev} ${ns1_addr6} nodad 172*4882a593Smuzhiyun ip ${ns2arg} addr add dev ${ns2_dev} ${ns2_addr6} nodad 173*4882a593Smuzhiyun fi 174*4882a593Smuzhiyun} 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun################################################################################ 177*4882a593Smuzhiyun 178*4882a593Smuzhiyuncleanup() 179*4882a593Smuzhiyun{ 180*4882a593Smuzhiyun ip netns del host1 181*4882a593Smuzhiyun ip netns del host2 182*4882a593Smuzhiyun} 183*4882a593Smuzhiyun 184*4882a593Smuzhiyunsetup() 185*4882a593Smuzhiyun{ 186*4882a593Smuzhiyun create_ns "host1" 187*4882a593Smuzhiyun create_ns "host2" 188*4882a593Smuzhiyun 189*4882a593Smuzhiyun connect_ns "host1" eth0 ${HOST1_4}/24 ${HOST1_6}/64 \ 190*4882a593Smuzhiyun "host2" eth0 ${HOST2_4}/24 ${HOST2_6}/64 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun create_vrf "host1" ${VRF} ${TABLE} 193*4882a593Smuzhiyun ip -netns host1 link set dev eth0 master ${VRF} 194*4882a593Smuzhiyun} 195*4882a593Smuzhiyun 196*4882a593Smuzhiyuncleanup_xfrm() 197*4882a593Smuzhiyun{ 198*4882a593Smuzhiyun for ns in host1 host2 199*4882a593Smuzhiyun do 200*4882a593Smuzhiyun for x in state policy 201*4882a593Smuzhiyun do 202*4882a593Smuzhiyun ip -netns ${ns} xfrm ${x} flush 203*4882a593Smuzhiyun ip -6 -netns ${ns} xfrm ${x} flush 204*4882a593Smuzhiyun done 205*4882a593Smuzhiyun done 206*4882a593Smuzhiyun} 207*4882a593Smuzhiyun 208*4882a593Smuzhiyunsetup_xfrm() 209*4882a593Smuzhiyun{ 210*4882a593Smuzhiyun local h1_4=$1 211*4882a593Smuzhiyun local h2_4=$2 212*4882a593Smuzhiyun local h1_6=$3 213*4882a593Smuzhiyun local h2_6=$4 214*4882a593Smuzhiyun local devarg="$5" 215*4882a593Smuzhiyun 216*4882a593Smuzhiyun # 217*4882a593Smuzhiyun # policy 218*4882a593Smuzhiyun # 219*4882a593Smuzhiyun 220*4882a593Smuzhiyun # host1 - IPv4 out 221*4882a593Smuzhiyun ip -netns host1 xfrm policy add \ 222*4882a593Smuzhiyun src ${h1_4} dst ${h2_4} ${devarg} dir out \ 223*4882a593Smuzhiyun tmpl src ${HOST1_4} dst ${HOST2_4} proto esp mode tunnel 224*4882a593Smuzhiyun 225*4882a593Smuzhiyun # host2 - IPv4 in 226*4882a593Smuzhiyun ip -netns host2 xfrm policy add \ 227*4882a593Smuzhiyun src ${h1_4} dst ${h2_4} dir in \ 228*4882a593Smuzhiyun tmpl src ${HOST1_4} dst ${HOST2_4} proto esp mode tunnel 229*4882a593Smuzhiyun 230*4882a593Smuzhiyun # host1 - IPv4 in 231*4882a593Smuzhiyun ip -netns host1 xfrm policy add \ 232*4882a593Smuzhiyun src ${h2_4} dst ${h1_4} ${devarg} dir in \ 233*4882a593Smuzhiyun tmpl src ${HOST2_4} dst ${HOST1_4} proto esp mode tunnel 234*4882a593Smuzhiyun 235*4882a593Smuzhiyun # host2 - IPv4 out 236*4882a593Smuzhiyun ip -netns host2 xfrm policy add \ 237*4882a593Smuzhiyun src ${h2_4} dst ${h1_4} dir out \ 238*4882a593Smuzhiyun tmpl src ${HOST2_4} dst ${HOST1_4} proto esp mode tunnel 239*4882a593Smuzhiyun 240*4882a593Smuzhiyun 241*4882a593Smuzhiyun # host1 - IPv6 out 242*4882a593Smuzhiyun ip -6 -netns host1 xfrm policy add \ 243*4882a593Smuzhiyun src ${h1_6} dst ${h2_6} ${devarg} dir out \ 244*4882a593Smuzhiyun tmpl src ${HOST1_6} dst ${HOST2_6} proto esp mode tunnel 245*4882a593Smuzhiyun 246*4882a593Smuzhiyun # host2 - IPv6 in 247*4882a593Smuzhiyun ip -6 -netns host2 xfrm policy add \ 248*4882a593Smuzhiyun src ${h1_6} dst ${h2_6} dir in \ 249*4882a593Smuzhiyun tmpl src ${HOST1_6} dst ${HOST2_6} proto esp mode tunnel 250*4882a593Smuzhiyun 251*4882a593Smuzhiyun # host1 - IPv6 in 252*4882a593Smuzhiyun ip -6 -netns host1 xfrm policy add \ 253*4882a593Smuzhiyun src ${h2_6} dst ${h1_6} ${devarg} dir in \ 254*4882a593Smuzhiyun tmpl src ${HOST2_6} dst ${HOST1_6} proto esp mode tunnel 255*4882a593Smuzhiyun 256*4882a593Smuzhiyun # host2 - IPv6 out 257*4882a593Smuzhiyun ip -6 -netns host2 xfrm policy add \ 258*4882a593Smuzhiyun src ${h2_6} dst ${h1_6} dir out \ 259*4882a593Smuzhiyun tmpl src ${HOST2_6} dst ${HOST1_6} proto esp mode tunnel 260*4882a593Smuzhiyun 261*4882a593Smuzhiyun # 262*4882a593Smuzhiyun # state 263*4882a593Smuzhiyun # 264*4882a593Smuzhiyun ip -netns host1 xfrm state add src ${HOST1_4} dst ${HOST2_4} \ 265*4882a593Smuzhiyun proto esp spi ${SPI_1} reqid 0 mode tunnel \ 266*4882a593Smuzhiyun replay-window 4 replay-oseq 0x4 \ 267*4882a593Smuzhiyun auth-trunc 'hmac(md5)' ${AUTH_1} 96 \ 268*4882a593Smuzhiyun enc 'cbc(des3_ede)' ${ENC_1} \ 269*4882a593Smuzhiyun sel src ${h1_4} dst ${h2_4} ${devarg} 270*4882a593Smuzhiyun 271*4882a593Smuzhiyun ip -netns host2 xfrm state add src ${HOST1_4} dst ${HOST2_4} \ 272*4882a593Smuzhiyun proto esp spi ${SPI_1} reqid 0 mode tunnel \ 273*4882a593Smuzhiyun replay-window 4 replay-oseq 0x4 \ 274*4882a593Smuzhiyun auth-trunc 'hmac(md5)' ${AUTH_1} 96 \ 275*4882a593Smuzhiyun enc 'cbc(des3_ede)' ${ENC_1} \ 276*4882a593Smuzhiyun sel src ${h1_4} dst ${h2_4} 277*4882a593Smuzhiyun 278*4882a593Smuzhiyun 279*4882a593Smuzhiyun ip -netns host1 xfrm state add src ${HOST2_4} dst ${HOST1_4} \ 280*4882a593Smuzhiyun proto esp spi ${SPI_2} reqid 0 mode tunnel \ 281*4882a593Smuzhiyun replay-window 4 replay-oseq 0x4 \ 282*4882a593Smuzhiyun auth-trunc 'hmac(md5)' ${AUTH_2} 96 \ 283*4882a593Smuzhiyun enc 'cbc(des3_ede)' ${ENC_2} \ 284*4882a593Smuzhiyun sel src ${h2_4} dst ${h1_4} ${devarg} 285*4882a593Smuzhiyun 286*4882a593Smuzhiyun ip -netns host2 xfrm state add src ${HOST2_4} dst ${HOST1_4} \ 287*4882a593Smuzhiyun proto esp spi ${SPI_2} reqid 0 mode tunnel \ 288*4882a593Smuzhiyun replay-window 4 replay-oseq 0x4 \ 289*4882a593Smuzhiyun auth-trunc 'hmac(md5)' ${AUTH_2} 96 \ 290*4882a593Smuzhiyun enc 'cbc(des3_ede)' ${ENC_2} \ 291*4882a593Smuzhiyun sel src ${h2_4} dst ${h1_4} 292*4882a593Smuzhiyun 293*4882a593Smuzhiyun 294*4882a593Smuzhiyun ip -6 -netns host1 xfrm state add src ${HOST1_6} dst ${HOST2_6} \ 295*4882a593Smuzhiyun proto esp spi ${SPI_1} reqid 0 mode tunnel \ 296*4882a593Smuzhiyun replay-window 4 replay-oseq 0x4 \ 297*4882a593Smuzhiyun auth-trunc 'hmac(md5)' ${AUTH_1} 96 \ 298*4882a593Smuzhiyun enc 'cbc(des3_ede)' ${ENC_1} \ 299*4882a593Smuzhiyun sel src ${h1_6} dst ${h2_6} ${devarg} 300*4882a593Smuzhiyun 301*4882a593Smuzhiyun ip -6 -netns host2 xfrm state add src ${HOST1_6} dst ${HOST2_6} \ 302*4882a593Smuzhiyun proto esp spi ${SPI_1} reqid 0 mode tunnel \ 303*4882a593Smuzhiyun replay-window 4 replay-oseq 0x4 \ 304*4882a593Smuzhiyun auth-trunc 'hmac(md5)' ${AUTH_1} 96 \ 305*4882a593Smuzhiyun enc 'cbc(des3_ede)' ${ENC_1} \ 306*4882a593Smuzhiyun sel src ${h1_6} dst ${h2_6} 307*4882a593Smuzhiyun 308*4882a593Smuzhiyun 309*4882a593Smuzhiyun ip -6 -netns host1 xfrm state add src ${HOST2_6} dst ${HOST1_6} \ 310*4882a593Smuzhiyun proto esp spi ${SPI_2} reqid 0 mode tunnel \ 311*4882a593Smuzhiyun replay-window 4 replay-oseq 0x4 \ 312*4882a593Smuzhiyun auth-trunc 'hmac(md5)' ${AUTH_2} 96 \ 313*4882a593Smuzhiyun enc 'cbc(des3_ede)' ${ENC_2} \ 314*4882a593Smuzhiyun sel src ${h2_6} dst ${h1_6} ${devarg} 315*4882a593Smuzhiyun 316*4882a593Smuzhiyun ip -6 -netns host2 xfrm state add src ${HOST2_6} dst ${HOST1_6} \ 317*4882a593Smuzhiyun proto esp spi ${SPI_2} reqid 0 mode tunnel \ 318*4882a593Smuzhiyun replay-window 4 replay-oseq 0x4 \ 319*4882a593Smuzhiyun auth-trunc 'hmac(md5)' ${AUTH_2} 96 \ 320*4882a593Smuzhiyun enc 'cbc(des3_ede)' ${ENC_2} \ 321*4882a593Smuzhiyun sel src ${h2_6} dst ${h1_6} 322*4882a593Smuzhiyun} 323*4882a593Smuzhiyun 324*4882a593Smuzhiyuncleanup_xfrm_dev() 325*4882a593Smuzhiyun{ 326*4882a593Smuzhiyun ip -netns host1 li del xfrm0 327*4882a593Smuzhiyun ip -netns host2 addr del ${XFRM2_4}/24 dev eth0 328*4882a593Smuzhiyun ip -netns host2 addr del ${XFRM2_6}/64 dev eth0 329*4882a593Smuzhiyun} 330*4882a593Smuzhiyun 331*4882a593Smuzhiyunsetup_xfrm_dev() 332*4882a593Smuzhiyun{ 333*4882a593Smuzhiyun local vrfarg="vrf ${VRF}" 334*4882a593Smuzhiyun 335*4882a593Smuzhiyun ip -netns host1 li add type xfrm dev eth0 if_id ${IF_ID} 336*4882a593Smuzhiyun ip -netns host1 li set xfrm0 ${vrfarg} up 337*4882a593Smuzhiyun ip -netns host1 addr add ${XFRM1_4}/24 dev xfrm0 338*4882a593Smuzhiyun ip -netns host1 addr add ${XFRM1_6}/64 dev xfrm0 339*4882a593Smuzhiyun 340*4882a593Smuzhiyun ip -netns host2 addr add ${XFRM2_4}/24 dev eth0 341*4882a593Smuzhiyun ip -netns host2 addr add ${XFRM2_6}/64 dev eth0 342*4882a593Smuzhiyun 343*4882a593Smuzhiyun setup_xfrm ${XFRM1_4} ${XFRM2_4} ${XFRM1_6} ${XFRM2_6} "if_id ${IF_ID}" 344*4882a593Smuzhiyun} 345*4882a593Smuzhiyun 346*4882a593Smuzhiyunrun_tests() 347*4882a593Smuzhiyun{ 348*4882a593Smuzhiyun cleanup_xfrm 349*4882a593Smuzhiyun 350*4882a593Smuzhiyun # no IPsec 351*4882a593Smuzhiyun run_cmd_host1 ip vrf exec ${VRF} ping -c1 -w1 ${HOST2_4} 352*4882a593Smuzhiyun log_test $? 0 "IPv4 no xfrm policy" 353*4882a593Smuzhiyun run_cmd_host1 ip vrf exec ${VRF} ${ping6} -c1 -w1 ${HOST2_6} 354*4882a593Smuzhiyun log_test $? 0 "IPv6 no xfrm policy" 355*4882a593Smuzhiyun 356*4882a593Smuzhiyun # xfrm without VRF in sel 357*4882a593Smuzhiyun setup_xfrm ${HOST1_4} ${HOST2_4} ${HOST1_6} ${HOST2_6} 358*4882a593Smuzhiyun run_cmd_host1 ip vrf exec ${VRF} ping -c1 -w1 ${HOST2_4} 359*4882a593Smuzhiyun log_test $? 0 "IPv4 xfrm policy based on address" 360*4882a593Smuzhiyun run_cmd_host1 ip vrf exec ${VRF} ${ping6} -c1 -w1 ${HOST2_6} 361*4882a593Smuzhiyun log_test $? 0 "IPv6 xfrm policy based on address" 362*4882a593Smuzhiyun cleanup_xfrm 363*4882a593Smuzhiyun 364*4882a593Smuzhiyun # xfrm with VRF in sel 365*4882a593Smuzhiyun # Known failure: ipv4 resets the flow oif after the lookup. Fix is 366*4882a593Smuzhiyun # not straightforward. 367*4882a593Smuzhiyun # setup_xfrm ${HOST1_4} ${HOST2_4} ${HOST1_6} ${HOST2_6} "dev ${VRF}" 368*4882a593Smuzhiyun # run_cmd_host1 ip vrf exec ${VRF} ping -c1 -w1 ${HOST2_4} 369*4882a593Smuzhiyun # log_test $? 0 "IPv4 xfrm policy with VRF in selector" 370*4882a593Smuzhiyun run_cmd_host1 ip vrf exec ${VRF} ${ping6} -c1 -w1 ${HOST2_6} 371*4882a593Smuzhiyun log_test $? 0 "IPv6 xfrm policy with VRF in selector" 372*4882a593Smuzhiyun cleanup_xfrm 373*4882a593Smuzhiyun 374*4882a593Smuzhiyun # xfrm with enslaved device in sel 375*4882a593Smuzhiyun # Known failures: combined with the above, __xfrm{4,6}_selector_match 376*4882a593Smuzhiyun # needs to consider both l3mdev and enslaved device index. 377*4882a593Smuzhiyun # setup_xfrm ${HOST1_4} ${HOST2_4} ${HOST1_6} ${HOST2_6} "dev eth0" 378*4882a593Smuzhiyun # run_cmd_host1 ip vrf exec ${VRF} ping -c1 -w1 ${HOST2_4} 379*4882a593Smuzhiyun # log_test $? 0 "IPv4 xfrm policy with enslaved device in selector" 380*4882a593Smuzhiyun # run_cmd_host1 ip vrf exec ${VRF} ${ping6} -c1 -w1 ${HOST2_6} 381*4882a593Smuzhiyun # log_test $? 0 "IPv6 xfrm policy with enslaved device in selector" 382*4882a593Smuzhiyun # cleanup_xfrm 383*4882a593Smuzhiyun 384*4882a593Smuzhiyun # xfrm device 385*4882a593Smuzhiyun setup_xfrm_dev 386*4882a593Smuzhiyun run_cmd_host1 ip vrf exec ${VRF} ping -c1 -w1 ${XFRM2_4} 387*4882a593Smuzhiyun log_test $? 0 "IPv4 xfrm policy with xfrm device" 388*4882a593Smuzhiyun run_cmd_host1 ip vrf exec ${VRF} ${ping6} -c1 -w1 ${XFRM2_6} 389*4882a593Smuzhiyun log_test $? 0 "IPv6 xfrm policy with xfrm device" 390*4882a593Smuzhiyun cleanup_xfrm_dev 391*4882a593Smuzhiyun} 392*4882a593Smuzhiyun 393*4882a593Smuzhiyun################################################################################ 394*4882a593Smuzhiyun# usage 395*4882a593Smuzhiyun 396*4882a593Smuzhiyunusage() 397*4882a593Smuzhiyun{ 398*4882a593Smuzhiyun cat <<EOF 399*4882a593Smuzhiyunusage: ${0##*/} OPTS 400*4882a593Smuzhiyun 401*4882a593Smuzhiyun -p Pause on fail 402*4882a593Smuzhiyun -v verbose mode (show commands and output) 403*4882a593Smuzhiyun 404*4882a593Smuzhiyundone 405*4882a593SmuzhiyunEOF 406*4882a593Smuzhiyun} 407*4882a593Smuzhiyun 408*4882a593Smuzhiyun################################################################################ 409*4882a593Smuzhiyun# main 410*4882a593Smuzhiyun 411*4882a593Smuzhiyunwhile getopts :pv o 412*4882a593Smuzhiyundo 413*4882a593Smuzhiyun case $o in 414*4882a593Smuzhiyun p) PAUSE_ON_FAIL=yes;; 415*4882a593Smuzhiyun v) VERBOSE=$(($VERBOSE + 1));; 416*4882a593Smuzhiyun h) usage; exit 0;; 417*4882a593Smuzhiyun *) usage; exit 1;; 418*4882a593Smuzhiyun esac 419*4882a593Smuzhiyundone 420*4882a593Smuzhiyun 421*4882a593Smuzhiyuncleanup 2>/dev/null 422*4882a593Smuzhiyunsetup 423*4882a593Smuzhiyun 424*4882a593Smuzhiyunecho 425*4882a593Smuzhiyunecho "No qdisc on VRF device" 426*4882a593Smuzhiyunrun_tests 427*4882a593Smuzhiyun 428*4882a593Smuzhiyunrun_cmd_host1 tc qdisc add dev ${VRF} root netem delay 100ms 429*4882a593Smuzhiyunecho 430*4882a593Smuzhiyunecho "netem qdisc on VRF device" 431*4882a593Smuzhiyunrun_tests 432*4882a593Smuzhiyun 433*4882a593Smuzhiyunprintf "\nTests passed: %3d\n" ${nsuccess} 434*4882a593Smuzhiyunprintf "Tests failed: %3d\n" ${nfail} 435*4882a593Smuzhiyun 436*4882a593Smuzhiyunexit $ret 437