1a3f74617SMartin KaFai Lau#!/bin/bash 2b2441318SGreg Kroah-Hartman# SPDX-License-Identifier: GPL-2.0 3a3f74617SMartin KaFai Lau 4a3f74617SMartin KaFai LauMY_DIR=$(dirname $0) 5a3f74617SMartin KaFai Lau# Details on the bpf prog 6a3f74617SMartin KaFai LauBPF_CGRP2_ARRAY_NAME='test_cgrp2_array_pin' 7*e04946f5SDaniel T. LeeBPF_PROG="$MY_DIR/test_cgrp2_tc.bpf.o" 8a3f74617SMartin KaFai LauBPF_SECTION='filter' 9a3f74617SMartin KaFai Lau 10a3f74617SMartin KaFai Lau[ -z "$TC" ] && TC='tc' 11a3f74617SMartin KaFai Lau[ -z "$IP" ] && IP='ip' 12a3f74617SMartin KaFai Lau 13a3f74617SMartin KaFai Lau# Names of the veth interface, net namespace...etc. 14a3f74617SMartin KaFai LauHOST_IFC='ve' 15a3f74617SMartin KaFai LauNS_IFC='vens' 16a3f74617SMartin KaFai LauNS='ns' 17a3f74617SMartin KaFai Lau 18a3f74617SMartin KaFai Laufind_mnt() { 19a3f74617SMartin KaFai Lau cat /proc/mounts | \ 20a3f74617SMartin KaFai Lau awk '{ if ($3 == "'$1'" && mnt == "") { mnt = $2 }} END { print mnt }' 21a3f74617SMartin KaFai Lau} 22a3f74617SMartin KaFai Lau 23a3f74617SMartin KaFai Lau# Init cgroup2 vars 24a3f74617SMartin KaFai Lauinit_cgrp2_vars() { 25a3f74617SMartin KaFai Lau CGRP2_ROOT=$(find_mnt cgroup2) 26a3f74617SMartin KaFai Lau if [ -z "$CGRP2_ROOT" ] 27a3f74617SMartin KaFai Lau then 28a3f74617SMartin KaFai Lau CGRP2_ROOT='/mnt/cgroup2' 29a3f74617SMartin KaFai Lau MOUNT_CGRP2="yes" 30a3f74617SMartin KaFai Lau fi 31a3f74617SMartin KaFai Lau CGRP2_TC="$CGRP2_ROOT/tc" 32a3f74617SMartin KaFai Lau CGRP2_TC_LEAF="$CGRP2_TC/leaf" 33a3f74617SMartin KaFai Lau} 34a3f74617SMartin KaFai Lau 35a3f74617SMartin KaFai Lau# Init bpf fs vars 36a3f74617SMartin KaFai Lauinit_bpf_fs_vars() { 37a3f74617SMartin KaFai Lau local bpf_fs_root=$(find_mnt bpf) 38a3f74617SMartin KaFai Lau [ -n "$bpf_fs_root" ] || return -1 39a3f74617SMartin KaFai Lau BPF_FS_TC_SHARE="$bpf_fs_root/tc/globals" 40a3f74617SMartin KaFai Lau} 41a3f74617SMartin KaFai Lau 42a3f74617SMartin KaFai Lausetup_cgrp2() { 43a3f74617SMartin KaFai Lau case $1 in 44a3f74617SMartin KaFai Lau start) 45a3f74617SMartin KaFai Lau if [ "$MOUNT_CGRP2" == 'yes' ] 46a3f74617SMartin KaFai Lau then 47a3f74617SMartin KaFai Lau [ -d $CGRP2_ROOT ] || mkdir -p $CGRP2_ROOT 48a3f74617SMartin KaFai Lau mount -t cgroup2 none $CGRP2_ROOT || return $? 49a3f74617SMartin KaFai Lau fi 50a3f74617SMartin KaFai Lau mkdir -p $CGRP2_TC_LEAF 51a3f74617SMartin KaFai Lau ;; 52a3f74617SMartin KaFai Lau *) 53a3f74617SMartin KaFai Lau rmdir $CGRP2_TC_LEAF && rmdir $CGRP2_TC 54a3f74617SMartin KaFai Lau [ "$MOUNT_CGRP2" == 'yes' ] && umount $CGRP2_ROOT 55a3f74617SMartin KaFai Lau ;; 56a3f74617SMartin KaFai Lau esac 57a3f74617SMartin KaFai Lau} 58a3f74617SMartin KaFai Lau 59a3f74617SMartin KaFai Lausetup_bpf_cgrp2_array() { 60a3f74617SMartin KaFai Lau local bpf_cgrp2_array="$BPF_FS_TC_SHARE/$BPF_CGRP2_ARRAY_NAME" 61a3f74617SMartin KaFai Lau case $1 in 62a3f74617SMartin KaFai Lau start) 63a3f74617SMartin KaFai Lau $MY_DIR/test_cgrp2_array_pin -U $bpf_cgrp2_array -v $CGRP2_TC 64a3f74617SMartin KaFai Lau ;; 65a3f74617SMartin KaFai Lau *) 66a3f74617SMartin KaFai Lau [ -d "$BPF_FS_TC_SHARE" ] && rm -f $bpf_cgrp2_array 67a3f74617SMartin KaFai Lau ;; 68a3f74617SMartin KaFai Lau esac 69a3f74617SMartin KaFai Lau} 70a3f74617SMartin KaFai Lau 71a3f74617SMartin KaFai Lausetup_net() { 72a3f74617SMartin KaFai Lau case $1 in 73a3f74617SMartin KaFai Lau start) 74a3f74617SMartin KaFai Lau $IP link add $HOST_IFC type veth peer name $NS_IFC || return $? 75a3f74617SMartin KaFai Lau $IP link set dev $HOST_IFC up || return $? 76d982a2e3SDaniel T. Lee sysctl -q net.ipv6.conf.$HOST_IFC.disable_ipv6=0 77a3f74617SMartin KaFai Lau sysctl -q net.ipv6.conf.$HOST_IFC.accept_dad=0 78a3f74617SMartin KaFai Lau 79f20f064eSDaniel T. Lee $IP netns add $NS || return $? 80f20f064eSDaniel T. Lee $IP link set dev $NS_IFC netns $NS || return $? 81a3f74617SMartin KaFai Lau $IP -n $NS link set dev $NS_IFC up || return $? 82d982a2e3SDaniel T. Lee $IP netns exec $NS sysctl -q net.ipv6.conf.$NS_IFC.disable_ipv6=0 83a3f74617SMartin KaFai Lau $IP netns exec $NS sysctl -q net.ipv6.conf.$NS_IFC.accept_dad=0 84a3f74617SMartin KaFai Lau $TC qdisc add dev $HOST_IFC clsact || return $? 85a3f74617SMartin KaFai Lau $TC filter add dev $HOST_IFC egress bpf da obj $BPF_PROG sec $BPF_SECTION || return $? 86a3f74617SMartin KaFai Lau ;; 87a3f74617SMartin KaFai Lau *) 88a3f74617SMartin KaFai Lau $IP netns del $NS 89a3f74617SMartin KaFai Lau $IP link del $HOST_IFC 90a3f74617SMartin KaFai Lau ;; 91a3f74617SMartin KaFai Lau esac 92a3f74617SMartin KaFai Lau} 93a3f74617SMartin KaFai Lau 94a3f74617SMartin KaFai Laurun_in_cgrp() { 95a3f74617SMartin KaFai Lau # Fork another bash and move it under the specified cgroup. 96a3f74617SMartin KaFai Lau # It makes the cgroup cleanup easier at the end of the test. 97a3f74617SMartin KaFai Lau cmd='echo $$ > ' 98a3f74617SMartin KaFai Lau cmd="$cmd $1/cgroup.procs; exec $2" 99a3f74617SMartin KaFai Lau bash -c "$cmd" 100a3f74617SMartin KaFai Lau} 101a3f74617SMartin KaFai Lau 102a3f74617SMartin KaFai Laudo_test() { 103a3f74617SMartin KaFai Lau run_in_cgrp $CGRP2_TC_LEAF "ping -6 -c3 ff02::1%$HOST_IFC >& /dev/null" 104a3f74617SMartin KaFai Lau local dropped=$($TC -s qdisc show dev $HOST_IFC | tail -3 | \ 105a3f74617SMartin KaFai Lau awk '/drop/{print substr($7, 0, index($7, ",")-1)}') 106a3f74617SMartin KaFai Lau if [[ $dropped -eq 0 ]] 107a3f74617SMartin KaFai Lau then 108a3f74617SMartin KaFai Lau echo "FAIL" 109a3f74617SMartin KaFai Lau return 1 110a3f74617SMartin KaFai Lau else 111a3f74617SMartin KaFai Lau echo "Successfully filtered $dropped packets" 112a3f74617SMartin KaFai Lau return 0 113a3f74617SMartin KaFai Lau fi 114a3f74617SMartin KaFai Lau} 115a3f74617SMartin KaFai Lau 116a3f74617SMartin KaFai Laudo_exit() { 117a3f74617SMartin KaFai Lau if [ "$DEBUG" == "yes" ] && [ "$MODE" != 'cleanuponly' ] 118a3f74617SMartin KaFai Lau then 119a3f74617SMartin KaFai Lau echo "------ DEBUG ------" 120ee748cd9STiezhu Yang echo "mount: "; mount | grep -E '(cgroup2|bpf)'; echo 121a3f74617SMartin KaFai Lau echo "$CGRP2_TC_LEAF: "; ls -l $CGRP2_TC_LEAF; echo 122a3f74617SMartin KaFai Lau if [ -d "$BPF_FS_TC_SHARE" ] 123a3f74617SMartin KaFai Lau then 124a3f74617SMartin KaFai Lau echo "$BPF_FS_TC_SHARE: "; ls -l $BPF_FS_TC_SHARE; echo 125a3f74617SMartin KaFai Lau fi 126a3f74617SMartin KaFai Lau echo "Host net:" 127a3f74617SMartin KaFai Lau $IP netns 128a3f74617SMartin KaFai Lau $IP link show dev $HOST_IFC 129a3f74617SMartin KaFai Lau $IP -6 a show dev $HOST_IFC 130a3f74617SMartin KaFai Lau $TC -s qdisc show dev $HOST_IFC 131a3f74617SMartin KaFai Lau echo 132a3f74617SMartin KaFai Lau echo "$NS net:" 133a3f74617SMartin KaFai Lau $IP -n $NS link show dev $NS_IFC 134a3f74617SMartin KaFai Lau $IP -n $NS -6 link show dev $NS_IFC 135a3f74617SMartin KaFai Lau echo "------ DEBUG ------" 136a3f74617SMartin KaFai Lau echo 137a3f74617SMartin KaFai Lau fi 138a3f74617SMartin KaFai Lau 139a3f74617SMartin KaFai Lau if [ "$MODE" != 'nocleanup' ] 140a3f74617SMartin KaFai Lau then 141a3f74617SMartin KaFai Lau setup_net stop 142a3f74617SMartin KaFai Lau setup_bpf_cgrp2_array stop 143a3f74617SMartin KaFai Lau setup_cgrp2 stop 144a3f74617SMartin KaFai Lau fi 145a3f74617SMartin KaFai Lau} 146a3f74617SMartin KaFai Lau 147a3f74617SMartin KaFai Lauinit_cgrp2_vars 148a3f74617SMartin KaFai Lauinit_bpf_fs_vars 149a3f74617SMartin KaFai Lau 150a3f74617SMartin KaFai Lauwhile [[ $# -ge 1 ]] 151a3f74617SMartin KaFai Laudo 152a3f74617SMartin KaFai Lau a="$1" 153a3f74617SMartin KaFai Lau case $a in 154a3f74617SMartin KaFai Lau debug) 155a3f74617SMartin KaFai Lau DEBUG='yes' 156a3f74617SMartin KaFai Lau shift 1 157a3f74617SMartin KaFai Lau ;; 158a3f74617SMartin KaFai Lau cleanup-only) 159a3f74617SMartin KaFai Lau MODE='cleanuponly' 160a3f74617SMartin KaFai Lau shift 1 161a3f74617SMartin KaFai Lau ;; 162a3f74617SMartin KaFai Lau no-cleanup) 163a3f74617SMartin KaFai Lau MODE='nocleanup' 164a3f74617SMartin KaFai Lau shift 1 165a3f74617SMartin KaFai Lau ;; 166a3f74617SMartin KaFai Lau *) 167a3f74617SMartin KaFai Lau echo "test_cgrp2_tc [debug] [cleanup-only | no-cleanup]" 168a3f74617SMartin KaFai Lau echo " debug: Print cgrp and network setup details at the end of the test" 169a3f74617SMartin KaFai Lau echo " cleanup-only: Try to cleanup things from last test. No test will be run" 170a3f74617SMartin KaFai Lau echo " no-cleanup: Run the test but don't do cleanup at the end" 171a3f74617SMartin KaFai Lau echo "[Note: If no arg is given, it will run the test and do cleanup at the end]" 172a3f74617SMartin KaFai Lau echo 173a3f74617SMartin KaFai Lau exit -1 174a3f74617SMartin KaFai Lau ;; 175a3f74617SMartin KaFai Lau esac 176a3f74617SMartin KaFai Laudone 177a3f74617SMartin KaFai Lau 178a3f74617SMartin KaFai Lautrap do_exit 0 179a3f74617SMartin KaFai Lau 180a3f74617SMartin KaFai Lau[ "$MODE" == 'cleanuponly' ] && exit 181a3f74617SMartin KaFai Lau 182a3f74617SMartin KaFai Lausetup_cgrp2 start || exit $? 183a3f74617SMartin KaFai Lausetup_net start || exit $? 184a3f74617SMartin KaFai Lauinit_bpf_fs_vars || exit $? 185a3f74617SMartin KaFai Lausetup_bpf_cgrp2_array start || exit $? 186a3f74617SMartin KaFai Laudo_test 187a3f74617SMartin KaFai Lauecho 188