Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'netconsole-selftest-for-userdata-overflow'

Breno Leitao says:

====================
netconsole: selftest for userdata overflow

Implement comprehensive testing for netconsole userdata entry handling,
demonstrating correct behavior when creating maximum entries and
preventing unauthorized overflow.

Refactor existing test infrastructure to support modular, reusable
helper functions that validate strict entry limit enforcement.

Also, add a warning if update_userdata() sees more than
MAX_USERDATA_ITEMS entries. This shouldn't happen and it is a bug that
shouldn't be silently ignored.

v2: https://lore.kernel.org/20250103-netcons_overflow_test-v2-0-a49f9be64c21@debian.org
v1: https://lore.kernel.org/20241204-netcons_overflow_test-v1-0-a85a8d0ace21@debian.org
====================

Link: https://patch.msgid.link/20250108-netcons_overflow_test-v3-0-3d85eb091bec@debian.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+298 -219
+2 -1
MAINTAINERS
··· 16170 16170 S: Maintained 16171 16171 F: Documentation/networking/netconsole.rst 16172 16172 F: drivers/net/netconsole.c 16173 - F: tools/testing/selftests/drivers/net/netcons_basic.sh 16173 + F: tools/testing/selftests/drivers/net/lib/sh/lib_netcons.sh 16174 + F: tools/testing/selftests/drivers/net/netcons\* 16174 16175 16175 16176 NETDEVSIM 16176 16177 M: Jakub Kicinski <kuba@kernel.org>
+1 -1
drivers/net/netconsole.c
··· 730 730 struct userdatum *udm_item; 731 731 struct config_item *item; 732 732 733 - if (child_count >= MAX_USERDATA_ITEMS) 733 + if (WARN_ON_ONCE(child_count >= MAX_USERDATA_ITEMS)) 734 734 break; 735 735 child_count++; 736 736
+2
tools/testing/selftests/drivers/net/Makefile
··· 1 1 # SPDX-License-Identifier: GPL-2.0 2 2 3 3 TEST_INCLUDES := $(wildcard lib/py/*.py) \ 4 + $(wildcard lib/sh/*.sh) \ 4 5 ../../net/net_helper.sh \ 5 6 ../../net/lib.sh \ 6 7 7 8 TEST_PROGS := \ 8 9 netcons_basic.sh \ 10 + netcons_overflow.sh \ 9 11 ping.py \ 10 12 queues.py \ 11 13 stats.py \
+225
tools/testing/selftests/drivers/net/lib/sh/lib_netcons.sh
··· 1 + #!/usr/bin/env bash 2 + # SPDX-License-Identifier: GPL-2.0 3 + 4 + # This file contains functions and helpers to support the netconsole 5 + # selftests 6 + # 7 + # Author: Breno Leitao <leitao@debian.org> 8 + 9 + set -euo pipefail 10 + 11 + LIBDIR=$(dirname "$(readlink -e "${BASH_SOURCE[0]}")") 12 + 13 + SRCIF="" # to be populated later 14 + SRCIP=192.0.2.1 15 + DSTIF="" # to be populated later 16 + DSTIP=192.0.2.2 17 + 18 + PORT="6666" 19 + MSG="netconsole selftest" 20 + USERDATA_KEY="key" 21 + USERDATA_VALUE="value" 22 + TARGET=$(mktemp -u netcons_XXXXX) 23 + DEFAULT_PRINTK_VALUES=$(cat /proc/sys/kernel/printk) 24 + NETCONS_CONFIGFS="/sys/kernel/config/netconsole" 25 + NETCONS_PATH="${NETCONS_CONFIGFS}"/"${TARGET}" 26 + # NAMESPACE will be populated by setup_ns with a random value 27 + NAMESPACE="" 28 + 29 + # IDs for netdevsim 30 + NSIM_DEV_1_ID=$((256 + RANDOM % 256)) 31 + NSIM_DEV_2_ID=$((512 + RANDOM % 256)) 32 + NSIM_DEV_SYS_NEW="/sys/bus/netdevsim/new_device" 33 + 34 + # Used to create and delete namespaces 35 + source "${LIBDIR}"/../../../../net/lib.sh 36 + source "${LIBDIR}"/../../../../net/net_helper.sh 37 + 38 + # Create netdevsim interfaces 39 + create_ifaces() { 40 + 41 + echo "$NSIM_DEV_2_ID" > "$NSIM_DEV_SYS_NEW" 42 + echo "$NSIM_DEV_1_ID" > "$NSIM_DEV_SYS_NEW" 43 + udevadm settle 2> /dev/null || true 44 + 45 + local NSIM1=/sys/bus/netdevsim/devices/netdevsim"$NSIM_DEV_1_ID" 46 + local NSIM2=/sys/bus/netdevsim/devices/netdevsim"$NSIM_DEV_2_ID" 47 + 48 + # These are global variables 49 + SRCIF=$(find "$NSIM1"/net -maxdepth 1 -type d ! \ 50 + -path "$NSIM1"/net -exec basename {} \;) 51 + DSTIF=$(find "$NSIM2"/net -maxdepth 1 -type d ! \ 52 + -path "$NSIM2"/net -exec basename {} \;) 53 + } 54 + 55 + link_ifaces() { 56 + local NSIM_DEV_SYS_LINK="/sys/bus/netdevsim/link_device" 57 + local SRCIF_IFIDX=$(cat /sys/class/net/"$SRCIF"/ifindex) 58 + local DSTIF_IFIDX=$(cat /sys/class/net/"$DSTIF"/ifindex) 59 + 60 + exec {NAMESPACE_FD}</var/run/netns/"${NAMESPACE}" 61 + exec {INITNS_FD}</proc/self/ns/net 62 + 63 + # Bind the dst interface to namespace 64 + ip link set "${DSTIF}" netns "${NAMESPACE}" 65 + 66 + # Linking one device to the other one (on the other namespace} 67 + if ! echo "${INITNS_FD}:$SRCIF_IFIDX $NAMESPACE_FD:$DSTIF_IFIDX" > $NSIM_DEV_SYS_LINK 68 + then 69 + echo "linking netdevsim1 with netdevsim2 should succeed" 70 + cleanup 71 + exit "${ksft_skip}" 72 + fi 73 + } 74 + 75 + function configure_ip() { 76 + # Configure the IPs for both interfaces 77 + ip netns exec "${NAMESPACE}" ip addr add "${DSTIP}"/24 dev "${DSTIF}" 78 + ip netns exec "${NAMESPACE}" ip link set "${DSTIF}" up 79 + 80 + ip addr add "${SRCIP}"/24 dev "${SRCIF}" 81 + ip link set "${SRCIF}" up 82 + } 83 + 84 + function set_network() { 85 + # setup_ns function is coming from lib.sh 86 + setup_ns NAMESPACE 87 + 88 + # Create both interfaces, and assign the destination to a different 89 + # namespace 90 + create_ifaces 91 + 92 + # Link both interfaces back to back 93 + link_ifaces 94 + 95 + configure_ip 96 + } 97 + 98 + function create_dynamic_target() { 99 + DSTMAC=$(ip netns exec "${NAMESPACE}" \ 100 + ip link show "${DSTIF}" | awk '/ether/ {print $2}') 101 + 102 + # Create a dynamic target 103 + mkdir "${NETCONS_PATH}" 104 + 105 + echo "${DSTIP}" > "${NETCONS_PATH}"/remote_ip 106 + echo "${SRCIP}" > "${NETCONS_PATH}"/local_ip 107 + echo "${DSTMAC}" > "${NETCONS_PATH}"/remote_mac 108 + echo "${SRCIF}" > "${NETCONS_PATH}"/dev_name 109 + 110 + echo 1 > "${NETCONS_PATH}"/enabled 111 + } 112 + 113 + function cleanup() { 114 + local NSIM_DEV_SYS_DEL="/sys/bus/netdevsim/del_device" 115 + 116 + # delete netconsole dynamic reconfiguration 117 + echo 0 > "${NETCONS_PATH}"/enabled 118 + # Remove all the keys that got created during the selftest 119 + find "${NETCONS_PATH}/userdata/" -mindepth 1 -type d -delete 120 + # Remove the configfs entry 121 + rmdir "${NETCONS_PATH}" 122 + 123 + # Delete netdevsim devices 124 + echo "$NSIM_DEV_2_ID" > "$NSIM_DEV_SYS_DEL" 125 + echo "$NSIM_DEV_1_ID" > "$NSIM_DEV_SYS_DEL" 126 + 127 + # this is coming from lib.sh 128 + cleanup_all_ns 129 + 130 + # Restoring printk configurations 131 + echo "${DEFAULT_PRINTK_VALUES}" > /proc/sys/kernel/printk 132 + } 133 + 134 + function set_user_data() { 135 + if [[ ! -d "${NETCONS_PATH}""/userdata" ]] 136 + then 137 + echo "Userdata path not available in ${NETCONS_PATH}/userdata" 138 + exit "${ksft_skip}" 139 + fi 140 + 141 + KEY_PATH="${NETCONS_PATH}/userdata/${USERDATA_KEY}" 142 + mkdir -p "${KEY_PATH}" 143 + VALUE_PATH="${KEY_PATH}""/value" 144 + echo "${USERDATA_VALUE}" > "${VALUE_PATH}" 145 + } 146 + 147 + function listen_port_and_save_to() { 148 + local OUTPUT=${1} 149 + # Just wait for 2 seconds 150 + timeout 2 ip netns exec "${NAMESPACE}" \ 151 + socat UDP-LISTEN:"${PORT}",fork "${OUTPUT}" 152 + } 153 + 154 + function validate_result() { 155 + local TMPFILENAME="$1" 156 + 157 + # TMPFILENAME will contain something like: 158 + # 6.11.1-0_fbk0_rc13_509_g30d75cea12f7,13,1822,115075213798,-;netconsole selftest: netcons_gtJHM 159 + # key=value 160 + 161 + # Check if the file exists 162 + if [ ! -f "$TMPFILENAME" ]; then 163 + echo "FAIL: File was not generated." >&2 164 + exit "${ksft_fail}" 165 + fi 166 + 167 + if ! grep -q "${MSG}" "${TMPFILENAME}"; then 168 + echo "FAIL: ${MSG} not found in ${TMPFILENAME}" >&2 169 + cat "${TMPFILENAME}" >&2 170 + exit "${ksft_fail}" 171 + fi 172 + 173 + if ! grep -q "${USERDATA_KEY}=${USERDATA_VALUE}" "${TMPFILENAME}"; then 174 + echo "FAIL: ${USERDATA_KEY}=${USERDATA_VALUE} not found in ${TMPFILENAME}" >&2 175 + cat "${TMPFILENAME}" >&2 176 + exit "${ksft_fail}" 177 + fi 178 + 179 + # Delete the file once it is validated, otherwise keep it 180 + # for debugging purposes 181 + rm "${TMPFILENAME}" 182 + exit "${ksft_pass}" 183 + } 184 + 185 + function check_for_dependencies() { 186 + if [ "$(id -u)" -ne 0 ]; then 187 + echo "This test must be run as root" >&2 188 + exit "${ksft_skip}" 189 + fi 190 + 191 + if ! which socat > /dev/null ; then 192 + echo "SKIP: socat(1) is not available" >&2 193 + exit "${ksft_skip}" 194 + fi 195 + 196 + if ! which ip > /dev/null ; then 197 + echo "SKIP: ip(1) is not available" >&2 198 + exit "${ksft_skip}" 199 + fi 200 + 201 + if ! which udevadm > /dev/null ; then 202 + echo "SKIP: udevadm(1) is not available" >&2 203 + exit "${ksft_skip}" 204 + fi 205 + 206 + if [ ! -f "${NSIM_DEV_SYS_NEW}" ]; then 207 + echo "SKIP: file ${NSIM_DEV_SYS_NEW} does not exist. Check if CONFIG_NETDEVSIM is enabled" >&2 208 + exit "${ksft_skip}" 209 + fi 210 + 211 + if [ ! -d "${NETCONS_CONFIGFS}" ]; then 212 + echo "SKIP: directory ${NETCONS_CONFIGFS} does not exist. Check if NETCONSOLE_DYNAMIC is enabled" >&2 213 + exit "${ksft_skip}" 214 + fi 215 + 216 + if ip link show "${DSTIF}" 2> /dev/null; then 217 + echo "SKIP: interface ${DSTIF} exists in the system. Not overwriting it." >&2 218 + exit "${ksft_skip}" 219 + fi 220 + 221 + if ip addr list | grep -E "inet.*(${SRCIP}|${DSTIP})" 2> /dev/null; then 222 + echo "SKIP: IPs already in use. Skipping it" >&2 223 + exit "${ksft_skip}" 224 + fi 225 + }
+1 -217
tools/testing/selftests/drivers/net/netcons_basic.sh
··· 18 18 19 19 SCRIPTDIR=$(dirname "$(readlink -e "${BASH_SOURCE[0]}")") 20 20 21 - # Simple script to test dynamic targets in netconsole 22 - SRCIF="" # to be populated later 23 - SRCIP=192.0.2.1 24 - DSTIF="" # to be populated later 25 - DSTIP=192.0.2.2 21 + source "${SCRIPTDIR}"/lib/sh/lib_netcons.sh 26 22 27 - PORT="6666" 28 - MSG="netconsole selftest" 29 - USERDATA_KEY="key" 30 - USERDATA_VALUE="value" 31 - TARGET=$(mktemp -u netcons_XXXXX) 32 - DEFAULT_PRINTK_VALUES=$(cat /proc/sys/kernel/printk) 33 - NETCONS_CONFIGFS="/sys/kernel/config/netconsole" 34 - NETCONS_PATH="${NETCONS_CONFIGFS}"/"${TARGET}" 35 - KEY_PATH="${NETCONS_PATH}/userdata/${USERDATA_KEY}" 36 - # NAMESPACE will be populated by setup_ns with a random value 37 - NAMESPACE="" 38 - 39 - # IDs for netdevsim 40 - NSIM_DEV_1_ID=$((256 + RANDOM % 256)) 41 - NSIM_DEV_2_ID=$((512 + RANDOM % 256)) 42 - NSIM_DEV_SYS_NEW="/sys/bus/netdevsim/new_device" 43 - 44 - # Used to create and delete namespaces 45 - source "${SCRIPTDIR}"/../../net/lib.sh 46 - source "${SCRIPTDIR}"/../../net/net_helper.sh 47 - 48 - # Create netdevsim interfaces 49 - create_ifaces() { 50 - 51 - echo "$NSIM_DEV_2_ID" > "$NSIM_DEV_SYS_NEW" 52 - echo "$NSIM_DEV_1_ID" > "$NSIM_DEV_SYS_NEW" 53 - udevadm settle 2> /dev/null || true 54 - 55 - local NSIM1=/sys/bus/netdevsim/devices/netdevsim"$NSIM_DEV_1_ID" 56 - local NSIM2=/sys/bus/netdevsim/devices/netdevsim"$NSIM_DEV_2_ID" 57 - 58 - # These are global variables 59 - SRCIF=$(find "$NSIM1"/net -maxdepth 1 -type d ! \ 60 - -path "$NSIM1"/net -exec basename {} \;) 61 - DSTIF=$(find "$NSIM2"/net -maxdepth 1 -type d ! \ 62 - -path "$NSIM2"/net -exec basename {} \;) 63 - } 64 - 65 - link_ifaces() { 66 - local NSIM_DEV_SYS_LINK="/sys/bus/netdevsim/link_device" 67 - local SRCIF_IFIDX=$(cat /sys/class/net/"$SRCIF"/ifindex) 68 - local DSTIF_IFIDX=$(cat /sys/class/net/"$DSTIF"/ifindex) 69 - 70 - exec {NAMESPACE_FD}</var/run/netns/"${NAMESPACE}" 71 - exec {INITNS_FD}</proc/self/ns/net 72 - 73 - # Bind the dst interface to namespace 74 - ip link set "${DSTIF}" netns "${NAMESPACE}" 75 - 76 - # Linking one device to the other one (on the other namespace} 77 - if ! echo "${INITNS_FD}:$SRCIF_IFIDX $NAMESPACE_FD:$DSTIF_IFIDX" > $NSIM_DEV_SYS_LINK 78 - then 79 - echo "linking netdevsim1 with netdevsim2 should succeed" 80 - cleanup 81 - exit "${ksft_skip}" 82 - fi 83 - } 84 - 85 - function configure_ip() { 86 - # Configure the IPs for both interfaces 87 - ip netns exec "${NAMESPACE}" ip addr add "${DSTIP}"/24 dev "${DSTIF}" 88 - ip netns exec "${NAMESPACE}" ip link set "${DSTIF}" up 89 - 90 - ip addr add "${SRCIP}"/24 dev "${SRCIF}" 91 - ip link set "${SRCIF}" up 92 - } 93 - 94 - function set_network() { 95 - # setup_ns function is coming from lib.sh 96 - setup_ns NAMESPACE 97 - 98 - # Create both interfaces, and assign the destination to a different 99 - # namespace 100 - create_ifaces 101 - 102 - # Link both interfaces back to back 103 - link_ifaces 104 - 105 - configure_ip 106 - } 107 - 108 - function create_dynamic_target() { 109 - DSTMAC=$(ip netns exec "${NAMESPACE}" \ 110 - ip link show "${DSTIF}" | awk '/ether/ {print $2}') 111 - 112 - # Create a dynamic target 113 - mkdir "${NETCONS_PATH}" 114 - 115 - echo "${DSTIP}" > "${NETCONS_PATH}"/remote_ip 116 - echo "${SRCIP}" > "${NETCONS_PATH}"/local_ip 117 - echo "${DSTMAC}" > "${NETCONS_PATH}"/remote_mac 118 - echo "${SRCIF}" > "${NETCONS_PATH}"/dev_name 119 - 120 - echo 1 > "${NETCONS_PATH}"/enabled 121 - } 122 - 123 - function cleanup() { 124 - local NSIM_DEV_SYS_DEL="/sys/bus/netdevsim/del_device" 125 - 126 - # delete netconsole dynamic reconfiguration 127 - echo 0 > "${NETCONS_PATH}"/enabled 128 - # Remove key 129 - rmdir "${KEY_PATH}" 130 - # Remove the configfs entry 131 - rmdir "${NETCONS_PATH}" 132 - 133 - # Delete netdevsim devices 134 - echo "$NSIM_DEV_2_ID" > "$NSIM_DEV_SYS_DEL" 135 - echo "$NSIM_DEV_1_ID" > "$NSIM_DEV_SYS_DEL" 136 - 137 - # this is coming from lib.sh 138 - cleanup_all_ns 139 - 140 - # Restoring printk configurations 141 - echo "${DEFAULT_PRINTK_VALUES}" > /proc/sys/kernel/printk 142 - } 143 - 144 - function set_user_data() { 145 - if [[ ! -d "${NETCONS_PATH}""/userdata" ]] 146 - then 147 - echo "Userdata path not available in ${NETCONS_PATH}/userdata" 148 - exit "${ksft_skip}" 149 - fi 150 - 151 - mkdir -p "${KEY_PATH}" 152 - VALUE_PATH="${KEY_PATH}""/value" 153 - echo "${USERDATA_VALUE}" > "${VALUE_PATH}" 154 - } 155 - 156 - function listen_port_and_save_to() { 157 - local OUTPUT=${1} 158 - # Just wait for 2 seconds 159 - timeout 2 ip netns exec "${NAMESPACE}" \ 160 - socat UDP-LISTEN:"${PORT}",fork "${OUTPUT}" 161 - } 162 - 163 - function validate_result() { 164 - local TMPFILENAME="$1" 165 - 166 - # TMPFILENAME will contain something like: 167 - # 6.11.1-0_fbk0_rc13_509_g30d75cea12f7,13,1822,115075213798,-;netconsole selftest: netcons_gtJHM 168 - # key=value 169 - 170 - # Check if the file exists 171 - if [ ! -f "$TMPFILENAME" ]; then 172 - echo "FAIL: File was not generated." >&2 173 - exit "${ksft_fail}" 174 - fi 175 - 176 - if ! grep -q "${MSG}" "${TMPFILENAME}"; then 177 - echo "FAIL: ${MSG} not found in ${TMPFILENAME}" >&2 178 - cat "${TMPFILENAME}" >&2 179 - exit "${ksft_fail}" 180 - fi 181 - 182 - if ! grep -q "${USERDATA_KEY}=${USERDATA_VALUE}" "${TMPFILENAME}"; then 183 - echo "FAIL: ${USERDATA_KEY}=${USERDATA_VALUE} not found in ${TMPFILENAME}" >&2 184 - cat "${TMPFILENAME}" >&2 185 - exit "${ksft_fail}" 186 - fi 187 - 188 - # Delete the file once it is validated, otherwise keep it 189 - # for debugging purposes 190 - rm "${TMPFILENAME}" 191 - exit "${ksft_pass}" 192 - } 193 - 194 - function check_for_dependencies() { 195 - if [ "$(id -u)" -ne 0 ]; then 196 - echo "This test must be run as root" >&2 197 - exit "${ksft_skip}" 198 - fi 199 - 200 - if ! which socat > /dev/null ; then 201 - echo "SKIP: socat(1) is not available" >&2 202 - exit "${ksft_skip}" 203 - fi 204 - 205 - if ! which ip > /dev/null ; then 206 - echo "SKIP: ip(1) is not available" >&2 207 - exit "${ksft_skip}" 208 - fi 209 - 210 - if ! which udevadm > /dev/null ; then 211 - echo "SKIP: udevadm(1) is not available" >&2 212 - exit "${ksft_skip}" 213 - fi 214 - 215 - if [ ! -f "${NSIM_DEV_SYS_NEW}" ]; then 216 - echo "SKIP: file ${NSIM_DEV_SYS_NEW} does not exist. Check if CONFIG_NETDEVSIM is enabled" >&2 217 - exit "${ksft_skip}" 218 - fi 219 - 220 - if [ ! -d "${NETCONS_CONFIGFS}" ]; then 221 - echo "SKIP: directory ${NETCONS_CONFIGFS} does not exist. Check if NETCONSOLE_DYNAMIC is enabled" >&2 222 - exit "${ksft_skip}" 223 - fi 224 - 225 - if ip link show "${DSTIF}" 2> /dev/null; then 226 - echo "SKIP: interface ${DSTIF} exists in the system. Not overwriting it." >&2 227 - exit "${ksft_skip}" 228 - fi 229 - 230 - if ip addr list | grep -E "inet.*(${SRCIP}|${DSTIP})" 2> /dev/null; then 231 - echo "SKIP: IPs already in use. Skipping it" >&2 232 - exit "${ksft_skip}" 233 - fi 234 - } 235 - 236 - # ========== # 237 - # Start here # 238 - # ========== # 239 23 modprobe netdevsim 2> /dev/null || true 240 24 modprobe netconsole 2> /dev/null || true 241 25
+67
tools/testing/selftests/drivers/net/netcons_overflow.sh
··· 1 + #!/usr/bin/env bash 2 + # SPDX-License-Identifier: GPL-2.0 3 + 4 + # This test verifies that users can successfully create up to 5 + # MAX_USERDATA_ITEMS userdata entries without encountering any failures. 6 + # 7 + # Additionally, it tests for expected failure when attempting to exceed this 8 + # maximum limit. 9 + # 10 + # Author: Breno Leitao <leitao@debian.org> 11 + 12 + set -euo pipefail 13 + 14 + SCRIPTDIR=$(dirname "$(readlink -e "${BASH_SOURCE[0]}")") 15 + 16 + source "${SCRIPTDIR}"/lib/sh/lib_netcons.sh 17 + # This is coming from netconsole code. Check for it in drivers/net/netconsole.c 18 + MAX_USERDATA_ITEMS=16 19 + 20 + # Function to create userdata entries 21 + function create_userdata_max_entries() { 22 + # All these keys should be created without any error 23 + for i in $(seq $MAX_USERDATA_ITEMS) 24 + do 25 + # USERDATA_KEY is used by set_user_data 26 + USERDATA_KEY="key"${i} 27 + set_user_data 28 + done 29 + } 30 + 31 + # Function to verify the entry limit 32 + function verify_entry_limit() { 33 + # Allowing the test to fail without exiting, since the next command 34 + # will fail 35 + set +e 36 + mkdir "${NETCONS_PATH}/userdata/key_that_will_fail" 2> /dev/null 37 + ret="$?" 38 + set -e 39 + if [ "$ret" -eq 0 ]; 40 + then 41 + echo "Adding more than ${MAX_USERDATA_ITEMS} entries in userdata should fail, but it didn't" >&2 42 + ls "${NETCONS_PATH}/userdata/" >&2 43 + exit "${ksft_fail}" 44 + fi 45 + } 46 + 47 + # ========== # 48 + # Start here # 49 + # ========== # 50 + 51 + modprobe netdevsim 2> /dev/null || true 52 + modprobe netconsole 2> /dev/null || true 53 + 54 + # Check for basic system dependency and exit if not found 55 + check_for_dependencies 56 + 57 + # Remove the namespace, interfaces and netconsole target on exit 58 + trap cleanup EXIT 59 + # Create one namespace and two interfaces 60 + set_network 61 + # Create a dynamic target for netconsole 62 + create_dynamic_target 63 + # populate the maximum number of supported keys in userdata 64 + create_userdata_max_entries 65 + # Verify an additional entry is not allowed 66 + verify_entry_limit 67 + exit "${ksft_pass}"