1#! /bin/bash
2# SPDX-License-Identifier: GPL-2.0
3
4readonly KSFT_FAIL=1
5readonly KSFT_SKIP=4
6
7# SELFTESTS_MPTCP_LIB_EXPECT_ALL_FEATURES env var can be set when validating all
8# features using the last version of the kernel and the selftests to make sure
9# a test is not being skipped by mistake.
10mptcp_lib_expect_all_features() {
11	[ "${SELFTESTS_MPTCP_LIB_EXPECT_ALL_FEATURES:-}" = "1" ]
12}
13
14# $1: msg
15mptcp_lib_fail_if_expected_feature() {
16	if mptcp_lib_expect_all_features; then
17		echo "ERROR: missing feature: ${*}"
18		exit ${KSFT_FAIL}
19	fi
20
21	return 1
22}
23
24# $1: file
25mptcp_lib_has_file() {
26	local f="${1}"
27
28	if [ -f "${f}" ]; then
29		return 0
30	fi
31
32	mptcp_lib_fail_if_expected_feature "${f} file not found"
33}
34
35mptcp_lib_check_mptcp() {
36	if ! mptcp_lib_has_file "/proc/sys/net/mptcp/enabled"; then
37		echo "SKIP: MPTCP support is not available"
38		exit ${KSFT_SKIP}
39	fi
40}
41
42mptcp_lib_check_kallsyms() {
43	if ! mptcp_lib_has_file "/proc/kallsyms"; then
44		echo "SKIP: CONFIG_KALLSYMS is missing"
45		exit ${KSFT_SKIP}
46	fi
47}
48
49# Internal: use mptcp_lib_kallsyms_has() instead
50__mptcp_lib_kallsyms_has() {
51	local sym="${1}"
52
53	mptcp_lib_check_kallsyms
54
55	grep -q " ${sym}" /proc/kallsyms
56}
57
58# $1: part of a symbol to look at, add '$' at the end for full name
59mptcp_lib_kallsyms_has() {
60	local sym="${1}"
61
62	if __mptcp_lib_kallsyms_has "${sym}"; then
63		return 0
64	fi
65
66	mptcp_lib_fail_if_expected_feature "${sym} symbol not found"
67}
68
69# $1: part of a symbol to look at, add '$' at the end for full name
70mptcp_lib_kallsyms_doesnt_have() {
71	local sym="${1}"
72
73	if ! __mptcp_lib_kallsyms_has "${sym}"; then
74		return 0
75	fi
76
77	mptcp_lib_fail_if_expected_feature "${sym} symbol has been found"
78}
79
80# !!!AVOID USING THIS!!!
81# Features might not land in the expected version and features can be backported
82#
83# $1: kernel version, e.g. 6.3
84mptcp_lib_kversion_ge() {
85	local exp_maj="${1%.*}"
86	local exp_min="${1#*.}"
87	local v maj min
88
89	# If the kernel has backported features, set this env var to 1:
90	if [ "${SELFTESTS_MPTCP_LIB_NO_KVERSION_CHECK:-}" = "1" ]; then
91		return 0
92	fi
93
94	v=$(uname -r | cut -d'.' -f1,2)
95	maj=${v%.*}
96	min=${v#*.}
97
98	if   [ "${maj}" -gt "${exp_maj}" ] ||
99	   { [ "${maj}" -eq "${exp_maj}" ] && [ "${min}" -ge "${exp_min}" ]; }; then
100		return 0
101	fi
102
103	mptcp_lib_fail_if_expected_feature "kernel version ${1} lower than ${v}"
104}
105