1*4882a593Smuzhiyun#!/bin/sh 2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0 3*4882a593Smuzhiyun 4*4882a593Smuzhiyun# Test various socket options that can be set by attaching programs to cgroups. 5*4882a593Smuzhiyun 6*4882a593SmuzhiyunCGRP_MNT="/tmp/cgroupv2-test_cgrp2_sock" 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun################################################################################ 9*4882a593Smuzhiyun# 10*4882a593Smuzhiyunprint_result() 11*4882a593Smuzhiyun{ 12*4882a593Smuzhiyun local rc=$1 13*4882a593Smuzhiyun local status=" OK " 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun [ $rc -ne 0 ] && status="FAIL" 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun printf "%-50s [%4s]\n" "$2" "$status" 18*4882a593Smuzhiyun} 19*4882a593Smuzhiyun 20*4882a593Smuzhiyuncheck_sock() 21*4882a593Smuzhiyun{ 22*4882a593Smuzhiyun out=$(test_cgrp2_sock) 23*4882a593Smuzhiyun echo $out | grep -q "$1" 24*4882a593Smuzhiyun if [ $? -ne 0 ]; then 25*4882a593Smuzhiyun print_result 1 "IPv4: $2" 26*4882a593Smuzhiyun echo " expected: $1" 27*4882a593Smuzhiyun echo " have: $out" 28*4882a593Smuzhiyun rc=1 29*4882a593Smuzhiyun else 30*4882a593Smuzhiyun print_result 0 "IPv4: $2" 31*4882a593Smuzhiyun fi 32*4882a593Smuzhiyun} 33*4882a593Smuzhiyun 34*4882a593Smuzhiyuncheck_sock6() 35*4882a593Smuzhiyun{ 36*4882a593Smuzhiyun out=$(test_cgrp2_sock -6) 37*4882a593Smuzhiyun echo $out | grep -q "$1" 38*4882a593Smuzhiyun if [ $? -ne 0 ]; then 39*4882a593Smuzhiyun print_result 1 "IPv6: $2" 40*4882a593Smuzhiyun echo " expected: $1" 41*4882a593Smuzhiyun echo " have: $out" 42*4882a593Smuzhiyun rc=1 43*4882a593Smuzhiyun else 44*4882a593Smuzhiyun print_result 0 "IPv6: $2" 45*4882a593Smuzhiyun fi 46*4882a593Smuzhiyun} 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun################################################################################ 49*4882a593Smuzhiyun# 50*4882a593Smuzhiyun 51*4882a593Smuzhiyuncleanup() 52*4882a593Smuzhiyun{ 53*4882a593Smuzhiyun echo $$ >> ${CGRP_MNT}/cgroup.procs 54*4882a593Smuzhiyun rmdir ${CGRP_MNT}/sockopts 55*4882a593Smuzhiyun} 56*4882a593Smuzhiyun 57*4882a593Smuzhiyuncleanup_and_exit() 58*4882a593Smuzhiyun{ 59*4882a593Smuzhiyun local rc=$1 60*4882a593Smuzhiyun local msg="$2" 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun [ -n "$msg" ] && echo "ERROR: $msg" 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun test_cgrp2_sock -d ${CGRP_MNT}/sockopts 65*4882a593Smuzhiyun ip li del cgrp2_sock 66*4882a593Smuzhiyun umount ${CGRP_MNT} 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun exit $rc 69*4882a593Smuzhiyun} 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun################################################################################ 73*4882a593Smuzhiyun# main 74*4882a593Smuzhiyun 75*4882a593Smuzhiyunrc=0 76*4882a593Smuzhiyun 77*4882a593Smuzhiyunip li add cgrp2_sock type dummy 2>/dev/null 78*4882a593Smuzhiyun 79*4882a593Smuzhiyunset -e 80*4882a593Smuzhiyunmkdir -p ${CGRP_MNT} 81*4882a593Smuzhiyunmount -t cgroup2 none ${CGRP_MNT} 82*4882a593Smuzhiyunset +e 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun# make sure we have a known start point 86*4882a593Smuzhiyuncleanup 2>/dev/null 87*4882a593Smuzhiyun 88*4882a593Smuzhiyunmkdir -p ${CGRP_MNT}/sockopts 89*4882a593Smuzhiyun[ $? -ne 0 ] && cleanup_and_exit 1 "Failed to create cgroup hierarchy" 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun# set pid into cgroup 93*4882a593Smuzhiyunecho $$ > ${CGRP_MNT}/sockopts/cgroup.procs 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun# no bpf program attached, so socket should show no settings 96*4882a593Smuzhiyuncheck_sock "dev , mark 0, priority 0" "No programs attached" 97*4882a593Smuzhiyuncheck_sock6 "dev , mark 0, priority 0" "No programs attached" 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun# verify device is set 100*4882a593Smuzhiyun# 101*4882a593Smuzhiyuntest_cgrp2_sock -b cgrp2_sock ${CGRP_MNT}/sockopts 102*4882a593Smuzhiyunif [ $? -ne 0 ]; then 103*4882a593Smuzhiyun cleanup_and_exit 1 "Failed to install program to set device" 104*4882a593Smuzhiyunfi 105*4882a593Smuzhiyuncheck_sock "dev cgrp2_sock, mark 0, priority 0" "Device set" 106*4882a593Smuzhiyuncheck_sock6 "dev cgrp2_sock, mark 0, priority 0" "Device set" 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun# verify mark is set 109*4882a593Smuzhiyun# 110*4882a593Smuzhiyuntest_cgrp2_sock -m 666 ${CGRP_MNT}/sockopts 111*4882a593Smuzhiyunif [ $? -ne 0 ]; then 112*4882a593Smuzhiyun cleanup_and_exit 1 "Failed to install program to set mark" 113*4882a593Smuzhiyunfi 114*4882a593Smuzhiyuncheck_sock "dev , mark 666, priority 0" "Mark set" 115*4882a593Smuzhiyuncheck_sock6 "dev , mark 666, priority 0" "Mark set" 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun# verify priority is set 118*4882a593Smuzhiyun# 119*4882a593Smuzhiyuntest_cgrp2_sock -p 123 ${CGRP_MNT}/sockopts 120*4882a593Smuzhiyunif [ $? -ne 0 ]; then 121*4882a593Smuzhiyun cleanup_and_exit 1 "Failed to install program to set priority" 122*4882a593Smuzhiyunfi 123*4882a593Smuzhiyuncheck_sock "dev , mark 0, priority 123" "Priority set" 124*4882a593Smuzhiyuncheck_sock6 "dev , mark 0, priority 123" "Priority set" 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun# all 3 at once 127*4882a593Smuzhiyun# 128*4882a593Smuzhiyuntest_cgrp2_sock -b cgrp2_sock -m 666 -p 123 ${CGRP_MNT}/sockopts 129*4882a593Smuzhiyunif [ $? -ne 0 ]; then 130*4882a593Smuzhiyun cleanup_and_exit 1 "Failed to install program to set device, mark and priority" 131*4882a593Smuzhiyunfi 132*4882a593Smuzhiyuncheck_sock "dev cgrp2_sock, mark 666, priority 123" "Priority set" 133*4882a593Smuzhiyuncheck_sock6 "dev cgrp2_sock, mark 666, priority 123" "Priority set" 134*4882a593Smuzhiyun 135*4882a593Smuzhiyuncleanup_and_exit $rc 136