| #! /bin/bash |
| # SPDX-License-Identifier: GPL-2.0 |
| |
| readonly KSFT_FAIL=1 |
| readonly KSFT_SKIP=4 |
| |
| # SELFTESTS_MPTCP_LIB_EXPECT_ALL_FEATURES env var can be set when validating all |
| # features using the last version of the kernel and the selftests to make sure |
| # a test is not being skipped by mistake. |
| mptcp_lib_expect_all_features() { |
| [ "${SELFTESTS_MPTCP_LIB_EXPECT_ALL_FEATURES:-}" = "1" ] |
| } |
| |
| # $1: msg |
| mptcp_lib_fail_if_expected_feature() { |
| if mptcp_lib_expect_all_features; then |
| echo "ERROR: missing feature: ${*}" |
| exit ${KSFT_FAIL} |
| fi |
| |
| return 1 |
| } |
| |
| # $1: file |
| mptcp_lib_has_file() { |
| local f="${1}" |
| |
| if [ -f "${f}" ]; then |
| return 0 |
| fi |
| |
| mptcp_lib_fail_if_expected_feature "${f} file not found" |
| } |
| |
| mptcp_lib_check_mptcp() { |
| if ! mptcp_lib_has_file "/proc/sys/net/mptcp/enabled"; then |
| echo "SKIP: MPTCP support is not available" |
| exit ${KSFT_SKIP} |
| fi |
| } |
| |
| mptcp_lib_check_kallsyms() { |
| if ! mptcp_lib_has_file "/proc/kallsyms"; then |
| echo "SKIP: CONFIG_KALLSYMS is missing" |
| exit ${KSFT_SKIP} |
| fi |
| } |
| |
| # Internal: use mptcp_lib_kallsyms_has() instead |
| __mptcp_lib_kallsyms_has() { |
| local sym="${1}" |
| |
| mptcp_lib_check_kallsyms |
| |
| grep -q " ${sym}" /proc/kallsyms |
| } |
| |
| # $1: part of a symbol to look at, add '$' at the end for full name |
| mptcp_lib_kallsyms_has() { |
| local sym="${1}" |
| |
| if __mptcp_lib_kallsyms_has "${sym}"; then |
| return 0 |
| fi |
| |
| mptcp_lib_fail_if_expected_feature "${sym} symbol not found" |
| } |
| |
| # $1: part of a symbol to look at, add '$' at the end for full name |
| mptcp_lib_kallsyms_doesnt_have() { |
| local sym="${1}" |
| |
| if ! __mptcp_lib_kallsyms_has "${sym}"; then |
| return 0 |
| fi |
| |
| mptcp_lib_fail_if_expected_feature "${sym} symbol has been found" |
| } |
| |
| # !!!AVOID USING THIS!!! |
| # Features might not land in the expected version and features can be backported |
| # |
| # $1: kernel version, e.g. 6.3 |
| mptcp_lib_kversion_ge() { |
| local exp_maj="${1%.*}" |
| local exp_min="${1#*.}" |
| local v maj min |
| |
| # If the kernel has backported features, set this env var to 1: |
| if [ "${SELFTESTS_MPTCP_LIB_NO_KVERSION_CHECK:-}" = "1" ]; then |
| return 0 |
| fi |
| |
| v=$(uname -r | cut -d'.' -f1,2) |
| maj=${v%.*} |
| min=${v#*.} |
| |
| if [ "${maj}" -gt "${exp_maj}" ] || |
| { [ "${maj}" -eq "${exp_maj}" ] && [ "${min}" -ge "${exp_min}" ]; }; then |
| return 0 |
| fi |
| |
| mptcp_lib_fail_if_expected_feature "kernel version ${1} lower than ${v}" |
| } |