4 # Details on the bpf prog
5 BPF_CGRP2_ARRAY_NAME
='test_cgrp2_array_pin'
6 BPF_PROG
="$MY_DIR/test_cgrp2_tc_kern.o"
9 [ -z "$TC" ] && TC
='tc'
10 [ -z "$IP" ] && IP
='ip'
12 # Names of the veth interface, net namespace...etc.
19 awk '{ if ($3 == "'$1'" && mnt == "") { mnt = $2 }} END { print mnt }'
24 CGRP2_ROOT
=$
(find_mnt cgroup2
)
25 if [ -z "$CGRP2_ROOT" ]
27 CGRP2_ROOT
='/mnt/cgroup2'
30 CGRP2_TC
="$CGRP2_ROOT/tc"
31 CGRP2_TC_LEAF
="$CGRP2_TC/leaf"
36 local bpf_fs_root
=$
(find_mnt bpf
)
37 [ -n "$bpf_fs_root" ] ||
return -1
38 BPF_FS_TC_SHARE
="$bpf_fs_root/tc/globals"
44 if [ "$MOUNT_CGRP2" == 'yes' ]
46 [ -d $CGRP2_ROOT ] || mkdir
-p $CGRP2_ROOT
47 mount
-t cgroup2 none
$CGRP2_ROOT ||
return $?
49 mkdir
-p $CGRP2_TC_LEAF
52 rmdir $CGRP2_TC_LEAF && rmdir $CGRP2_TC
53 [ "$MOUNT_CGRP2" == 'yes' ] && umount
$CGRP2_ROOT
58 setup_bpf_cgrp2_array
() {
59 local bpf_cgrp2_array
="$BPF_FS_TC_SHARE/$BPF_CGRP2_ARRAY_NAME"
62 $MY_DIR/test_cgrp2_array_pin
-U $bpf_cgrp2_array -v $CGRP2_TC
65 [ -d "$BPF_FS_TC_SHARE" ] && rm -f $bpf_cgrp2_array
73 $IP link add
$HOST_IFC type veth peer name
$NS_IFC ||
return $?
74 $IP link
set dev
$HOST_IFC up ||
return $?
75 sysctl
-q net.ipv6.conf.
$HOST_IFC.accept_dad
=0
77 $IP netns add ns ||
return $?
78 $IP link
set dev
$NS_IFC netns ns ||
return $?
79 $IP -n $NS link
set dev
$NS_IFC up ||
return $?
80 $IP netns
exec $NS sysctl
-q net.ipv6.conf.
$NS_IFC.accept_dad
=0
81 $TC qdisc add dev
$HOST_IFC clsact ||
return $?
82 $TC filter add dev
$HOST_IFC egress bpf da obj
$BPF_PROG sec
$BPF_SECTION ||
return $?
86 $IP link del
$HOST_IFC
92 # Fork another bash and move it under the specified cgroup.
93 # It makes the cgroup cleanup easier at the end of the test.
95 cmd
="$cmd $1/cgroup.procs; exec $2"
100 run_in_cgrp
$CGRP2_TC_LEAF "ping -6 -c3 ff02::1%$HOST_IFC >& /dev/null"
101 local dropped
=$
($TC -s qdisc show dev
$HOST_IFC |
tail -3 | \
102 awk '/drop/{print substr($7, 0, index($7, ",")-1)}')
103 if [[ $dropped -eq 0 ]]
108 echo "Successfully filtered $dropped packets"
114 if [ "$DEBUG" == "yes" ] && [ "$MODE" != 'cleanuponly' ]
116 echo "------ DEBUG ------"
117 echo "mount: "; mount |
egrep '(cgroup2|bpf)'; echo
118 echo "$CGRP2_TC_LEAF: "; ls -l $CGRP2_TC_LEAF; echo
119 if [ -d "$BPF_FS_TC_SHARE" ]
121 echo "$BPF_FS_TC_SHARE: "; ls -l $BPF_FS_TC_SHARE; echo
125 $IP link show dev
$HOST_IFC
126 $IP -6 a show dev
$HOST_IFC
127 $TC -s qdisc show dev
$HOST_IFC
130 $IP -n $NS link show dev
$NS_IFC
131 $IP -n $NS -6 link show dev
$NS_IFC
132 echo "------ DEBUG ------"
136 if [ "$MODE" != 'nocleanup' ]
139 setup_bpf_cgrp2_array stop
164 echo "test_cgrp2_tc [debug] [cleanup-only | no-cleanup]"
165 echo " debug: Print cgrp and network setup details at the end of the test"
166 echo " cleanup-only: Try to cleanup things from last test. No test will be run"
167 echo " no-cleanup: Run the test but don't do cleanup at the end"
168 echo "[Note: If no arg is given, it will run the test and do cleanup at the end]"
177 [ "$MODE" == 'cleanuponly' ] && exit
179 setup_cgrp2 start ||
exit $?
180 setup_net start ||
exit $?
181 init_bpf_fs_vars ||
exit $?
182 setup_bpf_cgrp2_array start ||
exit $?