Commit 69d094ef authored by Breno Leitao's avatar Breno Leitao Committed by Jakub Kicinski
Browse files

selftests: net: add netconsole test for cmdline configuration

Add a new selftest to verify netconsole module loading with command
line arguments. This test exercises the init_netconsole() path and
validates proper parsing of the netconsole= parameter format.

The test:
- Loads netconsole module with cmdline configuration instead of
  dynamic reconfiguration
- Validates message transmission through the configured target
- Adds helper functions for cmdline string generation and module
  validation

This complements existing netconsole selftests by covering the
module initialization code path that processes boot-time parameters.
This test is useful to test issues like the one described in [1].

Link: https://lore.kernel.org/netdev/Z36TlACdNMwFD7wv@dev-ushankar.dev.purestorage.com/

 [1]
Signed-off-by: default avatarBreno Leitao <leitao@debian.org>
Link: https://patch.msgid.link/20250613-rework-v3-8-0752bf2e6912@debian.org


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent bed365ca
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -12,6 +12,7 @@ TEST_GEN_FILES := \
TEST_PROGS := \
	napi_id.py \
	netcons_basic.sh \
	netcons_cmdline.sh \
	netcons_fragmented_msg.sh \
	netcons_overflow.sh \
	netcons_sysdata.sh \
+33 −6
Original line number Diff line number Diff line
@@ -121,6 +121,17 @@ function create_dynamic_target() {
	echo 1 > "${NETCONS_PATH}"/enabled
}

# Generate the command line argument for netconsole following:
#  netconsole=[+][src-port]@[src-ip]/[<dev>],[tgt-port]@<tgt-ip>/[tgt-macaddr]
function create_cmdline_str() {
	DSTMAC=$(ip netns exec "${NAMESPACE}" \
		 ip link show "${DSTIF}" | awk '/ether/ {print $2}')
	SRCPORT="1514"
	TGTPORT="6666"

	echo "netconsole=\"+${SRCPORT}@${SRCIP}/${SRCIF},${TGTPORT}@${DSTIP}/${DSTMAC}\""
}

# Do not append the release to the header of the message
function disable_release_append() {
	echo 0 > "${NETCONS_PATH}"/enabled
@@ -173,13 +184,9 @@ function listen_port_and_save_to() {
		socat UDP-LISTEN:"${PORT}",fork "${OUTPUT}"
}

function validate_result() {
# Only validate that the message arrived properly
function validate_msg() {
	local TMPFILENAME="$1"
	local FORMAT=${2:-"extended"}

	# TMPFILENAME will contain something like:
	# 6.11.1-0_fbk0_rc13_509_g30d75cea12f7,13,1822,115075213798,-;netconsole selftest: netcons_gtJHM
	#  key=value

	# Check if the file exists
	if [ ! -f "$TMPFILENAME" ]; then
@@ -192,6 +199,17 @@ function validate_result() {
		cat "${TMPFILENAME}" >&2
		exit "${ksft_fail}"
	fi
}

# Validate the message and userdata
function validate_result() {
	local TMPFILENAME="$1"

	# TMPFILENAME will contain something like:
	# 6.11.1-0_fbk0_rc13_509_g30d75cea12f7,13,1822,115075213798,-;netconsole selftest: netcons_gtJHM
	#  key=value

	validate_msg "${TMPFILENAME}"

	# userdata is not supported on basic format target,
	# thus, do not validate it.
@@ -267,3 +285,12 @@ function pkill_socat() {
	pkill -f "${PROCESS_NAME}"
	set -e
}

# Check if netconsole was compiled as a module, otherwise exit
function check_netconsole_module() {
	if modinfo netconsole | grep filename: | grep -q builtin
	then
		echo "SKIP: netconsole should be compiled as a module" >&2
		exit "${ksft_skip}"
	fi
}
+52 −0
Original line number Diff line number Diff line
#!/usr/bin/env bash
# SPDX-License-Identifier: GPL-2.0

# This is a selftest to test cmdline arguments on netconsole.
# It exercises loading of netconsole from cmdline instead of the dynamic
# reconfiguration. This includes parsing the long netconsole= line and all the
# flow through init_netconsole().
#
# Author: Breno Leitao <leitao@debian.org>

set -euo pipefail

SCRIPTDIR=$(dirname "$(readlink -e "${BASH_SOURCE[0]}")")

source "${SCRIPTDIR}"/lib/sh/lib_netcons.sh

check_netconsole_module

modprobe netdevsim 2> /dev/null || true
rmmod netconsole 2> /dev/null || true

# The content of kmsg will be save to the following file
OUTPUT_FILE="/tmp/${TARGET}"

# Check for basic system dependency and exit if not found
# check_for_dependencies
# Set current loglevel to KERN_INFO(6), and default to KERN_NOTICE(5)
echo "6 5" > /proc/sys/kernel/printk
# Remove the namespace and network interfaces
trap do_cleanup EXIT
# Create one namespace and two interfaces
set_network
# Create the command line for netconsole, with the configuration from the
# function above
CMDLINE="$(create_cmdline_str)"

# Load the module, with the cmdline set
modprobe netconsole "${CMDLINE}"

# Listed for netconsole port inside the namespace and destination interface
listen_port_and_save_to "${OUTPUT_FILE}" &
# Wait for socat to start and listen to the port.
wait_local_port_listen "${NAMESPACE}" "${PORT}" udp
# Send the message
echo "${MSG}: ${TARGET}" > /dev/kmsg
# Wait until socat saves the file to disk
busywait "${BUSYWAIT_TIMEOUT}" test -s "${OUTPUT_FILE}"
# Make sure the message was received in the dst part
# and exit
validate_msg "${OUTPUT_FILE}"

exit "${ksft_pass}"