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