xref: /openbmc/linux/samples/bpf/test_cgrp2_tc.sh (revision 9a87ffc99ec8eb8d35eed7c4f816d75f5cc9662e)
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