xref: /linux/tools/testing/selftests/rdma/rxe_rping_between_netns.sh (revision 4b0b946019e7376752456380b67e54eea2f10a7c)
1#!/bin/bash
2
3# Configuration
4NS="test1"
5VETH_A="veth-a"
6VETH_B="veth-b"
7IP_A="1.1.1.1"
8IP_B="1.1.1.2"
9PORT=4791
10
11exec > /dev/null
12
13# --- Cleanup Routine ---
14cleanup() {
15    echo "Cleaning up resources..."
16    rdma link del rxe1 2>/dev/null
17    ip netns exec "$NS" rdma link del rxe0 2>/dev/null
18    ip link delete "$VETH_B" 2>/dev/null
19    ip netns del "$NS" 2>/dev/null
20    modprobe -r rdma_rxe 2>/dev/null
21}
22trap cleanup EXIT
23
24# --- Prerequisite Checks ---
25if [[ $EUID -ne 0 ]]; then
26   echo "This script must be run as root"
27   exit 1
28fi
29
30modprobe rdma_rxe || { echo "Failed to load rdma_rxe"; exit 1; }
31
32# --- Setup Network Topology ---
33echo "Setting up network namespace and veth pair..."
34ip netns add "$NS"
35ip link add "$VETH_A" type veth peer name "$VETH_B"
36ip link set "$VETH_A" netns "$NS"
37
38# Configure Namespace side (test1)
39ip netns exec "$NS" ip addr add "$IP_A/24" dev "$VETH_A"
40ip netns exec "$NS" ip link set "$VETH_A" up
41ip netns exec "$NS" ip link set lo up
42
43# Configure Host side
44ip addr add "$IP_B/24" dev "$VETH_B"
45ip link set "$VETH_B" up
46
47# --- RXE Link Creation ---
48echo "Creating RDMA links..."
49ip netns exec "$NS" rdma link add rxe0 type rxe netdev "$VETH_A"
50rdma link add rxe1 type rxe netdev "$VETH_B"
51
52# Verify UDP 4791 is listening
53check_port() {
54    local target=$1 # "host" or "ns"
55    if [ "$target" == "ns" ]; then
56        ip netns exec "$NS" ss -Huln sport == :$PORT | grep -q ":$PORT"
57    else
58        ss -Huln sport == :$PORT | grep -q ":$PORT"
59    fi
60}
61
62check_port "ns" || { echo "Error: RXE port not listening in namespace"; exit 1; }
63check_port "host" || { echo "Error: RXE port not listening on host"; exit 1; }
64
65# --- Connectivity Test ---
66echo "Testing connectivity with rping..."
67ping -c 2 -W 1 "$IP_A" > /dev/null || { echo "Ping failed"; exit 1; }
68
69# Start rping server in background
70ip netns exec "$NS" rping -s -a "$IP_A" -v > /dev/null 2>&1 &
71RPING_PID=$!
72sleep 1 # Allow server to bind
73
74# Run rping client
75rping -c -a "$IP_A" -d -v -C 3
76RESULT=$?
77
78kill $RPING_PID 2>/dev/null
79
80if [ $RESULT -eq 0 ]; then
81    echo "SUCCESS: RDMA traffic verified."
82else
83    echo "FAILURE: rping failed."
84    exit 1
85fi
86