| #!/bin/sh | |
| # SPDX-License-Identifier: GPL-2.0 | |
| # Test various socket options that can be set by attaching programs to cgroups. | |
| CGRP_MNT="/tmp/cgroupv2-test_cgrp2_sock" | |
| ################################################################################ | |
| # | |
| print_result() | |
| { | |
| local rc=$1 | |
| local status=" OK " | |
| [ $rc -ne 0 ] && status="FAIL" | |
| printf "%-50s [%4s]\n" "$2" "$status" | |
| } | |
| check_sock() | |
| { | |
| out=$(test_cgrp2_sock) | |
| echo $out | grep -q "$1" | |
| if [ $? -ne 0 ]; then | |
| print_result 1 "IPv4: $2" | |
| echo " expected: $1" | |
| echo " have: $out" | |
| rc=1 | |
| else | |
| print_result 0 "IPv4: $2" | |
| fi | |
| } | |
| check_sock6() | |
| { | |
| out=$(test_cgrp2_sock -6) | |
| echo $out | grep -q "$1" | |
| if [ $? -ne 0 ]; then | |
| print_result 1 "IPv6: $2" | |
| echo " expected: $1" | |
| echo " have: $out" | |
| rc=1 | |
| else | |
| print_result 0 "IPv6: $2" | |
| fi | |
| } | |
| ################################################################################ | |
| # | |
| cleanup() | |
| { | |
| echo $$ >> ${CGRP_MNT}/cgroup.procs | |
| rmdir ${CGRP_MNT}/sockopts | |
| } | |
| cleanup_and_exit() | |
| { | |
| local rc=$1 | |
| local msg="$2" | |
| [ -n "$msg" ] && echo "ERROR: $msg" | |
| test_cgrp2_sock -d ${CGRP_MNT}/sockopts | |
| ip li del cgrp2_sock | |
| umount ${CGRP_MNT} | |
| exit $rc | |
| } | |
| ################################################################################ | |
| # main | |
| rc=0 | |
| ip li add cgrp2_sock type dummy 2>/dev/null | |
| set -e | |
| mkdir -p ${CGRP_MNT} | |
| mount -t cgroup2 none ${CGRP_MNT} | |
| set +e | |
| # make sure we have a known start point | |
| cleanup 2>/dev/null | |
| mkdir -p ${CGRP_MNT}/sockopts | |
| [ $? -ne 0 ] && cleanup_and_exit 1 "Failed to create cgroup hierarchy" | |
| # set pid into cgroup | |
| echo $$ > ${CGRP_MNT}/sockopts/cgroup.procs | |
| # no bpf program attached, so socket should show no settings | |
| check_sock "dev , mark 0, priority 0" "No programs attached" | |
| check_sock6 "dev , mark 0, priority 0" "No programs attached" | |
| # verify device is set | |
| # | |
| test_cgrp2_sock -b cgrp2_sock ${CGRP_MNT}/sockopts | |
| if [ $? -ne 0 ]; then | |
| cleanup_and_exit 1 "Failed to install program to set device" | |
| fi | |
| check_sock "dev cgrp2_sock, mark 0, priority 0" "Device set" | |
| check_sock6 "dev cgrp2_sock, mark 0, priority 0" "Device set" | |
| # verify mark is set | |
| # | |
| test_cgrp2_sock -m 666 ${CGRP_MNT}/sockopts | |
| if [ $? -ne 0 ]; then | |
| cleanup_and_exit 1 "Failed to install program to set mark" | |
| fi | |
| check_sock "dev , mark 666, priority 0" "Mark set" | |
| check_sock6 "dev , mark 666, priority 0" "Mark set" | |
| # verify priority is set | |
| # | |
| test_cgrp2_sock -p 123 ${CGRP_MNT}/sockopts | |
| if [ $? -ne 0 ]; then | |
| cleanup_and_exit 1 "Failed to install program to set priority" | |
| fi | |
| check_sock "dev , mark 0, priority 123" "Priority set" | |
| check_sock6 "dev , mark 0, priority 123" "Priority set" | |
| # all 3 at once | |
| # | |
| test_cgrp2_sock -b cgrp2_sock -m 666 -p 123 ${CGRP_MNT}/sockopts | |
| if [ $? -ne 0 ]; then | |
| cleanup_and_exit 1 "Failed to install program to set device, mark and priority" | |
| fi | |
| check_sock "dev cgrp2_sock, mark 666, priority 123" "Priority set" | |
| check_sock6 "dev cgrp2_sock, mark 666, priority 123" "Priority set" | |
| cleanup_and_exit $rc |