]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
selftests: net: Add IPv6 support to netconsole basic tests
authorBreno Leitao <leitao@debian.org>
Wed, 2 Jul 2025 10:06:39 +0000 (03:06 -0700)
committerJakub Kicinski <kuba@kernel.org>
Tue, 8 Jul 2025 01:52:57 +0000 (18:52 -0700)
Add IPv6 support to the netconsole basic functionality tests by:

- Introducing separate IPv4 and IPv6 address variables (SRCIP4/SRCIP6,
  DSTIP4/DSTIP6) to replace the single SRCIP/DSTIP variables
- Adding select_ipv4_or_ipv6() function to choose protocol version
- Updating socat configuration to use UDP6-LISTEN for IPv6 tests
- Adding wait_for_port() wrapper to handle protocol-specific port waiting
- Expanding test matrix to run both basic and extended formats against
  both IPv4 and IPv6 protocols
- Improving cleanup to kill any remaining socat processes
- Adding sleep delays for better IPv6 packet handling reliability

The test now validates netconsole functionality across both IP versions,
improving test coverage for dual-stack network environments.

This test would avoid the regression fixed by commit f59902070269 ("net:
netpoll: Initialize UDP checksum field before checksumming")

Signed-off-by: Breno Leitao <leitao@debian.org>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/20250702-netpoll_untagle_ip-v2-7-13cf3db24e2b@debian.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
tools/testing/selftests/drivers/net/lib/sh/lib_netcons.sh
tools/testing/selftests/drivers/net/netcons_basic.sh

index 3fcf85a3459698d397cfffe37eb0de8a79e2576a..258af805497b43d3540f4e03120ffe6736d929f7 100644 (file)
@@ -11,9 +11,11 @@ set -euo pipefail
 LIBDIR=$(dirname "$(readlink -e "${BASH_SOURCE[0]}")")
 
 SRCIF="" # to be populated later
-SRCIP=192.0.2.1
+SRCIP4="192.0.2.1"
+SRCIP6="fc00::1"
 DSTIF="" # to be populated later
-DSTIP=192.0.2.2
+DSTIP4="192.0.2.2"
+DSTIP6="fc00::2"
 
 PORT="6666"
 MSG="netconsole selftest"
@@ -80,7 +82,23 @@ function configure_ip() {
        ip link set "${SRCIF}" up
 }
 
+function select_ipv4_or_ipv6()
+{
+       local VERSION=${1}
+
+       if [[ "$VERSION" == "ipv6" ]]
+       then
+               DSTIP="${DSTIP6}"
+               SRCIP="${SRCIP6}"
+       else
+               DSTIP="${DSTIP4}"
+               SRCIP="${SRCIP4}"
+       fi
+}
+
 function set_network() {
+       local IP_VERSION=${1:-"ipv4"}
+
        # setup_ns function is coming from lib.sh
        setup_ns NAMESPACE
 
@@ -91,6 +109,7 @@ function set_network() {
        # Link both interfaces back to back
        link_ifaces
 
+       select_ipv4_or_ipv6 "${IP_VERSION}"
        configure_ip
 }
 
@@ -119,6 +138,11 @@ function create_dynamic_target() {
        fi
 
        echo 1 > "${NETCONS_PATH}"/enabled
+
+       # This will make sure that the kernel was able to
+       # load the netconsole driver configuration. The console message
+       # gets more organized/sequential as well.
+       sleep 1
 }
 
 # Generate the command line argument for netconsole following:
@@ -179,9 +203,18 @@ function set_user_data() {
 
 function listen_port_and_save_to() {
        local OUTPUT=${1}
+       local IPVERSION=${2:-"ipv4"}
+
+       if [ "${IPVERSION}" == "ipv4" ]
+       then
+               SOCAT_MODE="UDP-LISTEN"
+       else
+               SOCAT_MODE="UDP6-LISTEN"
+       fi
+
        # Just wait for 2 seconds
        timeout 2 ip netns exec "${NAMESPACE}" \
-               socat UDP-LISTEN:"${PORT}",fork "${OUTPUT}"
+               socat "${SOCAT_MODE}":"${PORT}",fork "${OUTPUT}"
 }
 
 # Only validate that the message arrived properly
@@ -263,8 +296,15 @@ function check_for_dependencies() {
                exit "${ksft_skip}"
        fi
 
-       if ip addr list | grep -E "inet.*(${SRCIP}|${DSTIP})" 2> /dev/null; then
-               echo "SKIP: IPs already in use. Skipping it" >&2
+       REGEXP4="inet.*(${SRCIP4}|${DSTIP4})"
+       REGEXP6="inet.*(${SRCIP6}|${DSTIP6})"
+       if ip addr list | grep -E "${REGEXP4}" 2> /dev/null; then
+               echo "SKIP: IPv4s already in use. Skipping it" >&2
+               exit "${ksft_skip}"
+       fi
+
+       if ip addr list | grep -E "${REGEXP6}" 2> /dev/null; then
+               echo "SKIP: IPv6s already in use. Skipping it" >&2
                exit "${ksft_skip}"
        fi
 }
@@ -278,11 +318,13 @@ function check_for_taskset() {
 
 # This is necessary if running multiple tests in a row
 function pkill_socat() {
-       PROCESS_NAME="socat UDP-LISTEN:6666,fork ${OUTPUT_FILE}"
+       PROCESS_NAME4="socat UDP-LISTEN:6666,fork ${OUTPUT_FILE}"
+       PROCESS_NAME6="socat UDP6-LISTEN:6666,fork ${OUTPUT_FILE}"
        # socat runs under timeout(1), kill it if it is still alive
        # do not fail if socat doesn't exist anymore
        set +e
-       pkill -f "${PROCESS_NAME}"
+       pkill -f "${PROCESS_NAME4}"
+       pkill -f "${PROCESS_NAME6}"
        set -e
 }
 
@@ -294,3 +336,23 @@ function check_netconsole_module() {
                exit "${ksft_skip}"
        fi
 }
+
+# A wrapper to translate protocol version to udp version
+function wait_for_port() {
+       local NAMESPACE=${1}
+       local PORT=${2}
+       IP_VERSION=${3}
+
+       if [ "${IP_VERSION}" == "ipv6" ]
+       then
+               PROTOCOL="udp6"
+       else
+               PROTOCOL="udp"
+       fi
+
+       wait_local_port_listen "${NAMESPACE}" "${PORT}" "${PROTOCOL}"
+       # even after the port is open, let's wait 1 second before writing
+       # otherwise the packet could be missed, and the test will fail. Happens
+       # more frequently on IPv6
+       sleep 1
+}
index 40a6ac6191b8b6d5c4279c7cfc31cc208ae998a5..a3446b5699764dfcc75f18649b9ab3194e37ea00 100755 (executable)
@@ -36,30 +36,37 @@ trap cleanup EXIT
 # Run the test twice, with different format modes
 for FORMAT in "basic" "extended"
 do
-       echo "Running with target mode: ${FORMAT}"
-       # Create one namespace and two interfaces
-       set_network
-       # Create a dynamic target for netconsole
-       create_dynamic_target "${FORMAT}"
-       # Only set userdata for extended format
-       if [ "$FORMAT" == "extended" ]
-       then
-               # Set userdata "key" with the "value" value
-               set_user_data
-       fi
-       # 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}"
+       for IP_VERSION in "ipv6" "ipv4"
+       do
+               echo "Running with target mode: ${FORMAT} (${IP_VERSION})"
+               # Create one namespace and two interfaces
+               set_network "${IP_VERSION}"
+               # Create a dynamic target for netconsole
+               create_dynamic_target "${FORMAT}"
+               # Only set userdata for extended format
+               if [ "$FORMAT" == "extended" ]
+               then
+                       # Set userdata "key" with the "value" value
+                       set_user_data
+               fi
+               # Listed for netconsole port inside the namespace and
+               # destination interface
+               listen_port_and_save_to "${OUTPUT_FILE}" "${IP_VERSION}" &
+               # Wait for socat to start and listen to the port.
+               wait_for_port "${NAMESPACE}" "${PORT}" "${IP_VERSION}"
+               # 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_result "${OUTPUT_FILE}" "${FORMAT}"
-       cleanup
+               # Make sure the message was received in the dst part
+               # and exit
+               validate_result "${OUTPUT_FILE}" "${FORMAT}"
+               # kill socat in case it is still running
+               pkill_socat
+               cleanup
+               echo "${FORMAT} : ${IP_VERSION} : Test passed" >&2
+       done
 done
 
 trap - EXIT