| #!/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 |