All of lore.kernel.org
 help / color / mirror / Atom feed
From: Zhu Yanjun <yanjun.zhu@linux.dev>
To: jgg@ziepe.ca, leon@kernel.org, zyjzyj2000@gmail.com,
	shuah@kernel.org, linux-rdma@vger.kernel.org,
	linux-kselftest@vger.kernel.org, dsahern@kernel.org
Cc: Zhu Yanjun <yanjun.zhu@linux.dev>
Subject: [PATCH v5 4/4] RDMA/rxe: Add testcase for net namespace rxe
Date: Tue, 10 Mar 2026 03:05:18 +0100	[thread overview]
Message-ID: <20260310020519.101415-5-yanjun.zhu@linux.dev> (raw)
In-Reply-To: <20260310020519.101415-1-yanjun.zhu@linux.dev>

Add 4 testcases for rxe with net namespace.

Signed-off-by: Zhu Yanjun <yanjun.zhu@linux.dev>
---
 MAINTAINERS                                   |  1 +
 tools/testing/selftests/Makefile              |  1 +
 tools/testing/selftests/rdma/Makefile         |  7 ++
 tools/testing/selftests/rdma/config           |  3 +
 tools/testing/selftests/rdma/rxe_ipv6.sh      | 63 ++++++++++++++
 .../selftests/rdma/rxe_rping_between_netns.sh | 85 +++++++++++++++++++
 .../selftests/rdma/rxe_socket_with_netns.sh   | 76 +++++++++++++++++
 .../rdma/rxe_test_NETDEV_UNREGISTER.sh        | 63 ++++++++++++++
 8 files changed, 299 insertions(+)
 create mode 100644 tools/testing/selftests/rdma/Makefile
 create mode 100644 tools/testing/selftests/rdma/config
 create mode 100755 tools/testing/selftests/rdma/rxe_ipv6.sh
 create mode 100755 tools/testing/selftests/rdma/rxe_rping_between_netns.sh
 create mode 100755 tools/testing/selftests/rdma/rxe_socket_with_netns.sh
 create mode 100755 tools/testing/selftests/rdma/rxe_test_NETDEV_UNREGISTER.sh

diff --git a/MAINTAINERS b/MAINTAINERS
index 77fdfcb55f06..bd33edf79150 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -24492,6 +24492,7 @@ L:	linux-rdma@vger.kernel.org
 S:	Supported
 F:	drivers/infiniband/sw/rxe/
 F:	include/uapi/rdma/rdma_user_rxe.h
+F:	tools/testing/selftests/rdma/
 
 SOFTLOGIC 6x10 MPEG CODEC
 M:	Bluecherry Maintainers <maintainers@bluecherrydvr.com>
diff --git a/tools/testing/selftests/Makefile b/tools/testing/selftests/Makefile
index 450f13ba4cca..110e07c0d99d 100644
--- a/tools/testing/selftests/Makefile
+++ b/tools/testing/selftests/Makefile
@@ -94,6 +94,7 @@ TARGETS += proc
 TARGETS += pstore
 TARGETS += ptrace
 TARGETS += openat2
+TARGETS += rdma
 TARGETS += resctrl
 TARGETS += riscv
 TARGETS += rlimits
diff --git a/tools/testing/selftests/rdma/Makefile b/tools/testing/selftests/rdma/Makefile
new file mode 100644
index 000000000000..7dd7cba7a73c
--- /dev/null
+++ b/tools/testing/selftests/rdma/Makefile
@@ -0,0 +1,7 @@
+# SPDX-License-Identifier: GPL-2.0
+TEST_PROGS := rxe_rping_between_netns.sh \
+		rxe_ipv6.sh \
+		rxe_socket_with_netns.sh \
+		rxe_test_NETDEV_UNREGISTER.sh
+
+include ../lib.mk
diff --git a/tools/testing/selftests/rdma/config b/tools/testing/selftests/rdma/config
new file mode 100644
index 000000000000..4ffb814e253b
--- /dev/null
+++ b/tools/testing/selftests/rdma/config
@@ -0,0 +1,3 @@
+CONFIG_TUN
+CONFIG_VETH
+CONFIG_RDMA_RXE
diff --git a/tools/testing/selftests/rdma/rxe_ipv6.sh b/tools/testing/selftests/rdma/rxe_ipv6.sh
new file mode 100755
index 000000000000..b7059bfd6d7c
--- /dev/null
+++ b/tools/testing/selftests/rdma/rxe_ipv6.sh
@@ -0,0 +1,63 @@
+#!/bin/bash
+
+# Configuration
+NS_NAME="net6"
+VETH_HOST="veth0"
+VETH_NS="veth1"
+RXE_NAME="rxe6"
+PORT=4791
+IP6_ADDR="2001:db8::1/64"
+
+exec > /dev/null
+
+# Cleanup function to run on exit (even on failure)
+cleanup() {
+    ip netns del "$NS_NAME" 2>/dev/null
+    modprobe -r rdma_rxe 2>/dev/null
+    echo "Done."
+}
+trap cleanup EXIT
+
+# 1. Prerequisites check
+for mod in tun veth rdma_rxe; do
+    if ! modinfo "$mod" >/dev/null 2>&1; then
+        echo "Error: Kernel module '$mod' not found."
+        exit 1
+    fi
+done
+
+modprobe rdma_rxe
+
+# 2. Setup Namespace and Networking
+echo "Setting up IPv6 network namespace..."
+ip netns add "$NS_NAME"
+ip link add "$VETH_HOST" type veth peer name "$VETH_NS"
+ip link set "$VETH_NS" netns "$NS_NAME"
+ip netns exec "$NS_NAME" ip addr add "$IP6_ADDR" dev "$VETH_NS"
+ip netns exec "$NS_NAME" ip link set "$VETH_NS" up
+ip link set "$VETH_HOST" up
+
+# 3. Add RDMA Link
+echo "Adding RDMA RXE link..."
+if ! ip netns exec "$NS_NAME" rdma link add "$RXE_NAME" type rxe netdev "$VETH_NS"; then
+    echo "Error: Failed to create RXE link."
+    exit 1
+fi
+
+# 4. Verification: Port should be listening
+# Using -H to skip headers and -q for quiet exit codes
+if ! ip netns exec "$NS_NAME" ss -Hul6n sport = :$PORT | grep -q ":$PORT"; then
+    echo "Error: UDP port $PORT is NOT listening after link creation."
+    exit 1
+fi
+echo "Verified: Port $PORT is active."
+
+# 5. Removal and Verification
+echo "Deleting RDMA link..."
+ip netns exec "$NS_NAME" rdma link del "$RXE_NAME"
+
+if ip netns exec "$NS_NAME" ss -Hul6n sport = :$PORT | grep -q ":$PORT"; then
+    echo "Error: UDP port $PORT still active after link deletion."
+    exit 1
+fi
+echo "Verified: Port $PORT closed successfully."
diff --git a/tools/testing/selftests/rdma/rxe_rping_between_netns.sh b/tools/testing/selftests/rdma/rxe_rping_between_netns.sh
new file mode 100755
index 000000000000..e5b876f58c6e
--- /dev/null
+++ b/tools/testing/selftests/rdma/rxe_rping_between_netns.sh
@@ -0,0 +1,85 @@
+#!/bin/bash
+
+# Configuration
+NS="test1"
+VETH_A="veth-a"
+VETH_B="veth-b"
+IP_A="1.1.1.1"
+IP_B="1.1.1.2"
+PORT=4791
+
+exec > /dev/null
+
+# --- Cleanup Routine ---
+cleanup() {
+    echo "Cleaning up resources..."
+    rdma link del rxe1 2>/dev/null
+    ip netns exec "$NS" rdma link del rxe0 2>/dev/null
+    ip link delete "$VETH_B" 2>/dev/null
+    ip netns del "$NS" 2>/dev/null
+    modprobe -r rdma_rxe 2>/dev/null
+}
+trap cleanup EXIT
+
+# --- Prerequisite Checks ---
+if [[ $EUID -ne 0 ]]; then
+   echo "This script must be run as root"
+   exit 1
+fi
+
+modprobe rdma_rxe || { echo "Failed to load rdma_rxe"; exit 1; }
+
+# --- Setup Network Topology ---
+echo "Setting up network namespace and veth pair..."
+ip netns add "$NS"
+ip link add "$VETH_A" type veth peer name "$VETH_B"
+ip link set "$VETH_A" netns "$NS"
+
+# Configure Namespace side (test1)
+ip netns exec "$NS" ip addr add "$IP_A/24" dev "$VETH_A"
+ip netns exec "$NS" ip link set "$VETH_A" up
+ip netns exec "$NS" ip link set lo up
+
+# Configure Host side
+ip addr add "$IP_B/24" dev "$VETH_B"
+ip link set "$VETH_B" up
+
+# --- RXE Link Creation ---
+echo "Creating RDMA links..."
+ip netns exec "$NS" rdma link add rxe0 type rxe netdev "$VETH_A"
+rdma link add rxe1 type rxe netdev "$VETH_B"
+
+# Verify UDP 4791 is listening
+check_port() {
+    local target=$1 # "host" or "ns"
+    if [ "$target" == "ns" ]; then
+        ip netns exec "$NS" ss -Huln sport == :$PORT | grep -q ":$PORT"
+    else
+        ss -Huln sport == :$PORT | grep -q ":$PORT"
+    fi
+}
+
+check_port "ns" || { echo "Error: RXE port not listening in namespace"; exit 1; }
+check_port "host" || { echo "Error: RXE port not listening on host"; exit 1; }
+
+# --- Connectivity Test ---
+echo "Testing connectivity with rping..."
+ping -c 2 -W 1 "$IP_A" > /dev/null || { echo "Ping failed"; exit 1; }
+
+# Start rping server in background
+ip netns exec "$NS" rping -s -a "$IP_A" -v > /dev/null 2>&1 &
+RPING_PID=$!
+sleep 1 # Allow server to bind
+
+# Run rping client
+rping -c -a "$IP_A" -d -v -C 3
+RESULT=$?
+
+kill $RPING_PID 2>/dev/null
+
+if [ $RESULT -eq 0 ]; then
+    echo "SUCCESS: RDMA traffic verified."
+else
+    echo "FAILURE: rping failed."
+    exit 1
+fi
diff --git a/tools/testing/selftests/rdma/rxe_socket_with_netns.sh b/tools/testing/selftests/rdma/rxe_socket_with_netns.sh
new file mode 100755
index 000000000000..002e5098f751
--- /dev/null
+++ b/tools/testing/selftests/rdma/rxe_socket_with_netns.sh
@@ -0,0 +1,76 @@
+#!/bin/bash
+
+# Configuration
+PORT=4791
+MODS=("tun" "rdma_rxe")
+
+exec > /dev/null
+
+# --- Helper: Cleanup Routine ---
+cleanup() {
+    echo "Cleaning up resources..."
+    rdma link del rxe1 2>/dev/null
+    rdma link del rxe0 2>/dev/null
+    ip link del tun0 2>/dev/null
+    ip link del tun1 2>/dev/null
+    for m in "${MODS[@]}"; do modprobe -r "$m" 2>/dev/null; done
+}
+
+# Ensure cleanup runs on script exit or interrupt
+trap cleanup EXIT
+
+# --- Phase 1: Environment Check ---
+if [[ $EUID -ne 0 ]]; then
+   echo "Error: This script must be run as root."
+   exit 1
+fi
+
+for m in "${MODS[@]}"; do
+    modprobe "$m" || { echo "Error: Failed to load $m"; exit 1; }
+done
+
+# --- Phase 2: Create Interfaces & RXE Links ---
+echo "Creating tun0 (1.1.1.1) and rxe0..."
+ip tuntap add mode tun tun0
+ip addr add 1.1.1.1/24 dev tun0
+ip link set tun0 up
+rdma link add rxe0 type rxe netdev tun0
+
+# Verify port 4791 is listening
+if ! ss -Huln sport = :$PORT | grep -q ":$PORT"; then
+    echo "Error: UDP port $PORT not found after rxe0 creation"
+    exit 1
+fi
+
+echo "Creating tun1 (2.2.2.2) and rxe1..."
+ip tuntap add mode tun tun1
+ip addr add 2.2.2.2/24 dev tun1
+ip link set tun1 up
+rdma link add rxe1 type rxe netdev tun1
+
+# Verify port 4791 is still listening
+if ! ss -Huln sport = :$PORT | grep -q ":$PORT"; then
+    echo "Error: UDP port $PORT missing after rxe1 creation"
+    exit 1
+fi
+
+# --- Phase 3: Targeted Deletion ---
+echo "Deleting rxe1..."
+rdma link del rxe1
+
+# Port should still be active because rxe0 is still alive
+if ! ss -Huln sport = :$PORT | grep -q ":$PORT"; then
+    echo "Error: UDP port $PORT closed prematurely"
+    exit 1
+fi
+
+echo "Deleting rxe0..."
+rdma link del rxe0
+
+# Port should now be gone
+if ss -Huln sport = :$PORT | grep -q ":$PORT"; then
+    echo "Error: UDP port $PORT still exists after all links deleted"
+    exit 1
+fi
+
+echo "Test passed successfully."
diff --git a/tools/testing/selftests/rdma/rxe_test_NETDEV_UNREGISTER.sh b/tools/testing/selftests/rdma/rxe_test_NETDEV_UNREGISTER.sh
new file mode 100755
index 000000000000..021ca451499d
--- /dev/null
+++ b/tools/testing/selftests/rdma/rxe_test_NETDEV_UNREGISTER.sh
@@ -0,0 +1,63 @@
+#!/bin/bash
+
+# Configuration
+DEV_NAME="tun0"
+RXE_NAME="rxe0"
+RDMA_PORT=4791
+
+exec > /dev/null
+
+# --- Cleanup Routine ---
+# Ensures environment is clean even if the script hits an error
+cleanup() {
+    echo "Performing cleanup..."
+    rdma link del $RXE_NAME 2>/dev/null
+    ip link del $DEV_NAME 2>/dev/null
+    modprobe -r rdma_rxe 2>/dev/null
+}
+trap cleanup EXIT
+
+# 1. Dependency Check
+if ! modinfo rdma_rxe >/dev/null 2>&1; then
+    echo "Error: rdma_rxe module not found."
+    exit 1
+fi
+
+modprobe rdma_rxe
+
+# 2. Setup TUN Device
+echo "Creating $DEV_NAME..."
+ip tuntap add mode tun "$DEV_NAME"
+ip addr add 1.1.1.1/24 dev "$DEV_NAME"
+ip link set "$DEV_NAME" up
+
+# 3. Attach RXE Link
+echo "Attaching RXE link $RXE_NAME to $DEV_NAME..."
+rdma link add "$RXE_NAME" type rxe netdev "$DEV_NAME"
+
+# 4. Verification: Port Check
+# Use -H (no header) and -q (quiet) for cleaner scripting logic
+if ! ss -Huln sport == :$RDMA_PORT | grep -q ":$RDMA_PORT"; then
+    echo "Error: UDP port $RDMA_PORT is not listening."
+    exit 1
+fi
+echo "Verified: RXE is listening on UDP $RDMA_PORT."
+
+# 5. Trigger NETDEV_UNREGISTER
+# We delete the underlying device without deleting the RDMA link first.
+echo "Triggering NETDEV_UNREGISTER by deleting $DEV_NAME..."
+ip link del "$DEV_NAME"
+
+# 6. Final Verification
+# The RXE link and the UDP port should be automatically cleaned up by the kernel.
+if rdma link show "$RXE_NAME" 2>/dev/null; then
+    echo "Error: $RXE_NAME still exists after netdev removal."
+    exit 1
+fi
+
+if ss -Huln sport == :$RDMA_PORT | grep -q ":$RDMA_PORT"; then
+    echo "Error: UDP port $RDMA_PORT still listening after netdev removal."
+    exit 1
+fi
+
+echo "Success: NETDEV_UNREGISTER handled correctly."
-- 
2.53.0


  parent reply	other threads:[~2026-03-10  2:05 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-03-10  2:05 [PATCH v5 0/4] RDMA/rxe: Add the support that rxe can work in net namespace Zhu Yanjun
2026-03-10  2:05 ` [PATCH v5 1/4] RDMA/nldev: Add dellink function pointer Zhu Yanjun
2026-03-10 15:47   ` David Ahern
2026-03-10 19:01   ` Leon Romanovsky
2026-03-11  1:58     ` Yanjun.Zhu
2026-03-11  8:54       ` Leon Romanovsky
2026-03-11 22:01         ` Yanjun.Zhu
2026-03-11 22:09           ` Yanjun.Zhu
2026-03-12  2:04           ` David Ahern
2026-03-12  3:59             ` Zhu Yanjun
2026-03-12  5:09               ` Zhu Yanjun
2026-03-12 18:04                 ` Yanjun.Zhu
2026-03-10  2:05 ` [PATCH v5 2/4] RDMA/rxe: Add net namespace support for IPv4/IPv6 sockets Zhu Yanjun
2026-03-10 15:48   ` David Ahern
2026-03-10  2:05 ` [PATCH v5 3/4] RDMA/rxe: Support RDMA link creation and destruction per net namespace Zhu Yanjun
2026-03-10 15:48   ` David Ahern
2026-03-10 18:57   ` Leon Romanovsky
2026-03-10 20:32     ` Yanjun.Zhu
2026-03-11  8:45       ` Leon Romanovsky
2026-03-11 19:08         ` Yanjun.Zhu
2026-03-10  2:05 ` Zhu Yanjun [this message]
2026-03-10 15:49   ` [PATCH v5 4/4] RDMA/rxe: Add testcase for net namespace rxe David Ahern
2026-03-10 18:53   ` Leon Romanovsky
2026-03-10 21:01     ` Yanjun.Zhu
2026-03-11  8:51       ` Leon Romanovsky
2026-03-11 22:51         ` Yanjun.Zhu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260310020519.101415-5-yanjun.zhu@linux.dev \
    --to=yanjun.zhu@linux.dev \
    --cc=dsahern@kernel.org \
    --cc=jgg@ziepe.ca \
    --cc=leon@kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=linux-rdma@vger.kernel.org \
    --cc=shuah@kernel.org \
    --cc=zyjzyj2000@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.