1*3ed61b89SJustin Iurman#!/bin/bash 2*3ed61b89SJustin Iurman# SPDX-License-Identifier: GPL-2.0+ 3*3ed61b89SJustin Iurman# 4*3ed61b89SJustin Iurman# Author: Justin Iurman <[email protected]> 5*3ed61b89SJustin Iurman# 6*3ed61b89SJustin Iurman# WARNING 7*3ed61b89SJustin Iurman# ------- 8*3ed61b89SJustin Iurman# This is just a dummy script that triggers encap cases with possible dst cache 9*3ed61b89SJustin Iurman# reference loops in affected lwt users (see list below). Some cases are 10*3ed61b89SJustin Iurman# pathological configurations for simplicity, others are valid. Overall, we 11*3ed61b89SJustin Iurman# don't want this issue to happen, no matter what. In order to catch any 12*3ed61b89SJustin Iurman# reference loops, kmemleak MUST be used. The results alone are always blindly 13*3ed61b89SJustin Iurman# successful, don't rely on them. Note that the following tests may crash the 14*3ed61b89SJustin Iurman# kernel if the fix to prevent lwtunnel_{input|output|xmit}() reentry loops is 15*3ed61b89SJustin Iurman# not present. 16*3ed61b89SJustin Iurman# 17*3ed61b89SJustin Iurman# Affected lwt users so far (please update accordingly if needed): 18*3ed61b89SJustin Iurman# - ila_lwt (output only) 19*3ed61b89SJustin Iurman# - ioam6_iptunnel (output only) 20*3ed61b89SJustin Iurman# - rpl_iptunnel (both input and output) 21*3ed61b89SJustin Iurman# - seg6_iptunnel (both input and output) 22*3ed61b89SJustin Iurman 23*3ed61b89SJustin Iurmansource lib.sh 24*3ed61b89SJustin Iurman 25*3ed61b89SJustin Iurmancheck_compatibility() 26*3ed61b89SJustin Iurman{ 27*3ed61b89SJustin Iurman setup_ns tmp_node &>/dev/null 28*3ed61b89SJustin Iurman if [ $? != 0 ]; then 29*3ed61b89SJustin Iurman echo "SKIP: Cannot create netns." 30*3ed61b89SJustin Iurman exit $ksft_skip 31*3ed61b89SJustin Iurman fi 32*3ed61b89SJustin Iurman 33*3ed61b89SJustin Iurman ip link add name veth0 netns $tmp_node type veth \ 34*3ed61b89SJustin Iurman peer name veth1 netns $tmp_node &>/dev/null 35*3ed61b89SJustin Iurman local ret=$? 36*3ed61b89SJustin Iurman 37*3ed61b89SJustin Iurman ip -netns $tmp_node link set veth0 up &>/dev/null 38*3ed61b89SJustin Iurman ret=$((ret + $?)) 39*3ed61b89SJustin Iurman 40*3ed61b89SJustin Iurman ip -netns $tmp_node link set veth1 up &>/dev/null 41*3ed61b89SJustin Iurman ret=$((ret + $?)) 42*3ed61b89SJustin Iurman 43*3ed61b89SJustin Iurman if [ $ret != 0 ]; then 44*3ed61b89SJustin Iurman echo "SKIP: Cannot configure links." 45*3ed61b89SJustin Iurman cleanup_ns $tmp_node 46*3ed61b89SJustin Iurman exit $ksft_skip 47*3ed61b89SJustin Iurman fi 48*3ed61b89SJustin Iurman 49*3ed61b89SJustin Iurman lsmod 2>/dev/null | grep -q "ila" 50*3ed61b89SJustin Iurman ila_lsmod=$? 51*3ed61b89SJustin Iurman [ $ila_lsmod != 0 ] && modprobe ila &>/dev/null 52*3ed61b89SJustin Iurman 53*3ed61b89SJustin Iurman ip -netns $tmp_node route add 2001:db8:1::/64 \ 54*3ed61b89SJustin Iurman encap ila 1:2:3:4 csum-mode no-action ident-type luid \ 55*3ed61b89SJustin Iurman hook-type output \ 56*3ed61b89SJustin Iurman dev veth0 &>/dev/null 57*3ed61b89SJustin Iurman 58*3ed61b89SJustin Iurman ip -netns $tmp_node route add 2001:db8:2::/64 \ 59*3ed61b89SJustin Iurman encap ioam6 trace prealloc type 0x800000 ns 0 size 4 \ 60*3ed61b89SJustin Iurman dev veth0 &>/dev/null 61*3ed61b89SJustin Iurman 62*3ed61b89SJustin Iurman ip -netns $tmp_node route add 2001:db8:3::/64 \ 63*3ed61b89SJustin Iurman encap rpl segs 2001:db8:3::1 dev veth0 &>/dev/null 64*3ed61b89SJustin Iurman 65*3ed61b89SJustin Iurman ip -netns $tmp_node route add 2001:db8:4::/64 \ 66*3ed61b89SJustin Iurman encap seg6 mode inline segs 2001:db8:4::1 dev veth0 &>/dev/null 67*3ed61b89SJustin Iurman 68*3ed61b89SJustin Iurman ip -netns $tmp_node -6 route 2>/dev/null | grep -q "encap ila" 69*3ed61b89SJustin Iurman skip_ila=$? 70*3ed61b89SJustin Iurman 71*3ed61b89SJustin Iurman ip -netns $tmp_node -6 route 2>/dev/null | grep -q "encap ioam6" 72*3ed61b89SJustin Iurman skip_ioam6=$? 73*3ed61b89SJustin Iurman 74*3ed61b89SJustin Iurman ip -netns $tmp_node -6 route 2>/dev/null | grep -q "encap rpl" 75*3ed61b89SJustin Iurman skip_rpl=$? 76*3ed61b89SJustin Iurman 77*3ed61b89SJustin Iurman ip -netns $tmp_node -6 route 2>/dev/null | grep -q "encap seg6" 78*3ed61b89SJustin Iurman skip_seg6=$? 79*3ed61b89SJustin Iurman 80*3ed61b89SJustin Iurman cleanup_ns $tmp_node 81*3ed61b89SJustin Iurman} 82*3ed61b89SJustin Iurman 83*3ed61b89SJustin Iurmansetup() 84*3ed61b89SJustin Iurman{ 85*3ed61b89SJustin Iurman setup_ns alpha beta gamma &>/dev/null 86*3ed61b89SJustin Iurman 87*3ed61b89SJustin Iurman ip link add name veth-alpha netns $alpha type veth \ 88*3ed61b89SJustin Iurman peer name veth-betaL netns $beta &>/dev/null 89*3ed61b89SJustin Iurman 90*3ed61b89SJustin Iurman ip link add name veth-betaR netns $beta type veth \ 91*3ed61b89SJustin Iurman peer name veth-gamma netns $gamma &>/dev/null 92*3ed61b89SJustin Iurman 93*3ed61b89SJustin Iurman ip -netns $alpha link set veth-alpha name veth0 &>/dev/null 94*3ed61b89SJustin Iurman ip -netns $beta link set veth-betaL name veth0 &>/dev/null 95*3ed61b89SJustin Iurman ip -netns $beta link set veth-betaR name veth1 &>/dev/null 96*3ed61b89SJustin Iurman ip -netns $gamma link set veth-gamma name veth0 &>/dev/null 97*3ed61b89SJustin Iurman 98*3ed61b89SJustin Iurman ip -netns $alpha addr add 2001:db8:1::2/64 dev veth0 &>/dev/null 99*3ed61b89SJustin Iurman ip -netns $alpha link set veth0 up &>/dev/null 100*3ed61b89SJustin Iurman ip -netns $alpha link set lo up &>/dev/null 101*3ed61b89SJustin Iurman ip -netns $alpha route add 2001:db8:2::/64 \ 102*3ed61b89SJustin Iurman via 2001:db8:1::1 dev veth0 &>/dev/null 103*3ed61b89SJustin Iurman 104*3ed61b89SJustin Iurman ip -netns $beta addr add 2001:db8:1::1/64 dev veth0 &>/dev/null 105*3ed61b89SJustin Iurman ip -netns $beta addr add 2001:db8:2::1/64 dev veth1 &>/dev/null 106*3ed61b89SJustin Iurman ip -netns $beta link set veth0 up &>/dev/null 107*3ed61b89SJustin Iurman ip -netns $beta link set veth1 up &>/dev/null 108*3ed61b89SJustin Iurman ip -netns $beta link set lo up &>/dev/null 109*3ed61b89SJustin Iurman ip -netns $beta route del 2001:db8:2::/64 110*3ed61b89SJustin Iurman ip -netns $beta route add 2001:db8:2::/64 dev veth1 111*3ed61b89SJustin Iurman ip netns exec $beta \ 112*3ed61b89SJustin Iurman sysctl -wq net.ipv6.conf.all.forwarding=1 &>/dev/null 113*3ed61b89SJustin Iurman 114*3ed61b89SJustin Iurman ip -netns $gamma addr add 2001:db8:2::2/64 dev veth0 &>/dev/null 115*3ed61b89SJustin Iurman ip -netns $gamma link set veth0 up &>/dev/null 116*3ed61b89SJustin Iurman ip -netns $gamma link set lo up &>/dev/null 117*3ed61b89SJustin Iurman ip -netns $gamma route add 2001:db8:1::/64 \ 118*3ed61b89SJustin Iurman via 2001:db8:2::1 dev veth0 &>/dev/null 119*3ed61b89SJustin Iurman 120*3ed61b89SJustin Iurman sleep 1 121*3ed61b89SJustin Iurman 122*3ed61b89SJustin Iurman ip netns exec $alpha ping6 -c 5 -W 1 2001:db8:2::2 &>/dev/null 123*3ed61b89SJustin Iurman if [ $? != 0 ]; then 124*3ed61b89SJustin Iurman echo "SKIP: Setup failed." 125*3ed61b89SJustin Iurman exit $ksft_skip 126*3ed61b89SJustin Iurman fi 127*3ed61b89SJustin Iurman 128*3ed61b89SJustin Iurman sleep 1 129*3ed61b89SJustin Iurman} 130*3ed61b89SJustin Iurman 131*3ed61b89SJustin Iurmancleanup() 132*3ed61b89SJustin Iurman{ 133*3ed61b89SJustin Iurman cleanup_ns $alpha $beta $gamma 134*3ed61b89SJustin Iurman [ $ila_lsmod != 0 ] && modprobe -r ila &>/dev/null 135*3ed61b89SJustin Iurman} 136*3ed61b89SJustin Iurman 137*3ed61b89SJustin Iurmanrun_ila() 138*3ed61b89SJustin Iurman{ 139*3ed61b89SJustin Iurman if [ $skip_ila != 0 ]; then 140*3ed61b89SJustin Iurman echo "SKIP: ila (output)" 141*3ed61b89SJustin Iurman return 142*3ed61b89SJustin Iurman fi 143*3ed61b89SJustin Iurman 144*3ed61b89SJustin Iurman ip -netns $beta route del 2001:db8:2::/64 145*3ed61b89SJustin Iurman ip -netns $beta route add 2001:db8:2:0:0:0:0:2/128 \ 146*3ed61b89SJustin Iurman encap ila 2001:db8:2:0 csum-mode no-action ident-type luid \ 147*3ed61b89SJustin Iurman hook-type output \ 148*3ed61b89SJustin Iurman dev veth1 &>/dev/null 149*3ed61b89SJustin Iurman sleep 1 150*3ed61b89SJustin Iurman 151*3ed61b89SJustin Iurman echo "TEST: ila (output)" 152*3ed61b89SJustin Iurman ip netns exec $beta ping6 -c 2 -W 1 2001:db8:2::2 &>/dev/null 153*3ed61b89SJustin Iurman sleep 1 154*3ed61b89SJustin Iurman 155*3ed61b89SJustin Iurman ip -netns $beta route del 2001:db8:2:0:0:0:0:2/128 156*3ed61b89SJustin Iurman ip -netns $beta route add 2001:db8:2::/64 dev veth1 157*3ed61b89SJustin Iurman sleep 1 158*3ed61b89SJustin Iurman} 159*3ed61b89SJustin Iurman 160*3ed61b89SJustin Iurmanrun_ioam6() 161*3ed61b89SJustin Iurman{ 162*3ed61b89SJustin Iurman if [ $skip_ioam6 != 0 ]; then 163*3ed61b89SJustin Iurman echo "SKIP: ioam6 (output)" 164*3ed61b89SJustin Iurman return 165*3ed61b89SJustin Iurman fi 166*3ed61b89SJustin Iurman 167*3ed61b89SJustin Iurman ip -netns $beta route change 2001:db8:2::/64 \ 168*3ed61b89SJustin Iurman encap ioam6 trace prealloc type 0x800000 ns 1 size 4 \ 169*3ed61b89SJustin Iurman dev veth1 &>/dev/null 170*3ed61b89SJustin Iurman sleep 1 171*3ed61b89SJustin Iurman 172*3ed61b89SJustin Iurman echo "TEST: ioam6 (output)" 173*3ed61b89SJustin Iurman ip netns exec $beta ping6 -c 2 -W 1 2001:db8:2::2 &>/dev/null 174*3ed61b89SJustin Iurman sleep 1 175*3ed61b89SJustin Iurman} 176*3ed61b89SJustin Iurman 177*3ed61b89SJustin Iurmanrun_rpl() 178*3ed61b89SJustin Iurman{ 179*3ed61b89SJustin Iurman if [ $skip_rpl != 0 ]; then 180*3ed61b89SJustin Iurman echo "SKIP: rpl (input)" 181*3ed61b89SJustin Iurman echo "SKIP: rpl (output)" 182*3ed61b89SJustin Iurman return 183*3ed61b89SJustin Iurman fi 184*3ed61b89SJustin Iurman 185*3ed61b89SJustin Iurman ip -netns $beta route change 2001:db8:2::/64 \ 186*3ed61b89SJustin Iurman encap rpl segs 2001:db8:2::2 \ 187*3ed61b89SJustin Iurman dev veth1 &>/dev/null 188*3ed61b89SJustin Iurman sleep 1 189*3ed61b89SJustin Iurman 190*3ed61b89SJustin Iurman echo "TEST: rpl (input)" 191*3ed61b89SJustin Iurman ip netns exec $alpha ping6 -c 2 -W 1 2001:db8:2::2 &>/dev/null 192*3ed61b89SJustin Iurman sleep 1 193*3ed61b89SJustin Iurman 194*3ed61b89SJustin Iurman echo "TEST: rpl (output)" 195*3ed61b89SJustin Iurman ip netns exec $beta ping6 -c 2 -W 1 2001:db8:2::2 &>/dev/null 196*3ed61b89SJustin Iurman sleep 1 197*3ed61b89SJustin Iurman} 198*3ed61b89SJustin Iurman 199*3ed61b89SJustin Iurmanrun_seg6() 200*3ed61b89SJustin Iurman{ 201*3ed61b89SJustin Iurman if [ $skip_seg6 != 0 ]; then 202*3ed61b89SJustin Iurman echo "SKIP: seg6 (input)" 203*3ed61b89SJustin Iurman echo "SKIP: seg6 (output)" 204*3ed61b89SJustin Iurman return 205*3ed61b89SJustin Iurman fi 206*3ed61b89SJustin Iurman 207*3ed61b89SJustin Iurman ip -netns $beta route change 2001:db8:2::/64 \ 208*3ed61b89SJustin Iurman encap seg6 mode inline segs 2001:db8:2::2 \ 209*3ed61b89SJustin Iurman dev veth1 &>/dev/null 210*3ed61b89SJustin Iurman sleep 1 211*3ed61b89SJustin Iurman 212*3ed61b89SJustin Iurman echo "TEST: seg6 (input)" 213*3ed61b89SJustin Iurman ip netns exec $alpha ping6 -c 2 -W 1 2001:db8:2::2 &>/dev/null 214*3ed61b89SJustin Iurman sleep 1 215*3ed61b89SJustin Iurman 216*3ed61b89SJustin Iurman echo "TEST: seg6 (output)" 217*3ed61b89SJustin Iurman ip netns exec $beta ping6 -c 2 -W 1 2001:db8:2::2 &>/dev/null 218*3ed61b89SJustin Iurman sleep 1 219*3ed61b89SJustin Iurman} 220*3ed61b89SJustin Iurman 221*3ed61b89SJustin Iurmanrun() 222*3ed61b89SJustin Iurman{ 223*3ed61b89SJustin Iurman run_ila 224*3ed61b89SJustin Iurman run_ioam6 225*3ed61b89SJustin Iurman run_rpl 226*3ed61b89SJustin Iurman run_seg6 227*3ed61b89SJustin Iurman} 228*3ed61b89SJustin Iurman 229*3ed61b89SJustin Iurmanif [ "$(id -u)" -ne 0 ]; then 230*3ed61b89SJustin Iurman echo "SKIP: Need root privileges." 231*3ed61b89SJustin Iurman exit $ksft_skip 232*3ed61b89SJustin Iurmanfi 233*3ed61b89SJustin Iurman 234*3ed61b89SJustin Iurmanif [ ! -x "$(command -v ip)" ]; then 235*3ed61b89SJustin Iurman echo "SKIP: Could not run test without ip tool." 236*3ed61b89SJustin Iurman exit $ksft_skip 237*3ed61b89SJustin Iurmanfi 238*3ed61b89SJustin Iurman 239*3ed61b89SJustin Iurmancheck_compatibility 240*3ed61b89SJustin Iurman 241*3ed61b89SJustin Iurmantrap cleanup EXIT 242*3ed61b89SJustin Iurman 243*3ed61b89SJustin Iurmansetup 244*3ed61b89SJustin Iurmanrun 245*3ed61b89SJustin Iurman 246*3ed61b89SJustin Iurmanexit $ksft_pass 247