1*e01027caSZhu Yanjun#!/bin/bash 2*e01027caSZhu Yanjun 3*e01027caSZhu Yanjun# Configuration 4*e01027caSZhu YanjunPORT=4791 5*e01027caSZhu YanjunMODS=("tun" "rdma_rxe") 6*e01027caSZhu Yanjun 7*e01027caSZhu Yanjunexec > /dev/null 8*e01027caSZhu Yanjun 9*e01027caSZhu Yanjun# --- Helper: Cleanup Routine --- 10*e01027caSZhu Yanjuncleanup() { 11*e01027caSZhu Yanjun echo "Cleaning up resources..." 12*e01027caSZhu Yanjun rdma link del rxe1 2>/dev/null 13*e01027caSZhu Yanjun rdma link del rxe0 2>/dev/null 14*e01027caSZhu Yanjun ip link del tun0 2>/dev/null 15*e01027caSZhu Yanjun ip link del tun1 2>/dev/null 16*e01027caSZhu Yanjun for m in "${MODS[@]}"; do modprobe -r "$m" 2>/dev/null; done 17*e01027caSZhu Yanjun} 18*e01027caSZhu Yanjun 19*e01027caSZhu Yanjun# Ensure cleanup runs on script exit or interrupt 20*e01027caSZhu Yanjuntrap cleanup EXIT 21*e01027caSZhu Yanjun 22*e01027caSZhu Yanjun# --- Phase 1: Environment Check --- 23*e01027caSZhu Yanjunif [[ $EUID -ne 0 ]]; then 24*e01027caSZhu Yanjun echo "Error: This script must be run as root." 25*e01027caSZhu Yanjun exit 1 26*e01027caSZhu Yanjunfi 27*e01027caSZhu Yanjun 28*e01027caSZhu Yanjunfor m in "${MODS[@]}"; do 29*e01027caSZhu Yanjun modprobe "$m" || { echo "Error: Failed to load $m"; exit 1; } 30*e01027caSZhu Yanjundone 31*e01027caSZhu Yanjun 32*e01027caSZhu Yanjun# --- Phase 2: Create Interfaces & RXE Links --- 33*e01027caSZhu Yanjunecho "Creating tun0 (1.1.1.1) and rxe0..." 34*e01027caSZhu Yanjunip tuntap add mode tun tun0 35*e01027caSZhu Yanjunip addr add 1.1.1.1/24 dev tun0 36*e01027caSZhu Yanjunip link set tun0 up 37*e01027caSZhu Yanjunrdma link add rxe0 type rxe netdev tun0 38*e01027caSZhu Yanjun 39*e01027caSZhu Yanjun# Verify port 4791 is listening 40*e01027caSZhu Yanjunif ! ss -Huln sport = :$PORT | grep -q ":$PORT"; then 41*e01027caSZhu Yanjun echo "Error: UDP port $PORT not found after rxe0 creation" 42*e01027caSZhu Yanjun exit 1 43*e01027caSZhu Yanjunfi 44*e01027caSZhu Yanjun 45*e01027caSZhu Yanjunecho "Creating tun1 (2.2.2.2) and rxe1..." 46*e01027caSZhu Yanjunip tuntap add mode tun tun1 47*e01027caSZhu Yanjunip addr add 2.2.2.2/24 dev tun1 48*e01027caSZhu Yanjunip link set tun1 up 49*e01027caSZhu Yanjunrdma link add rxe1 type rxe netdev tun1 50*e01027caSZhu Yanjun 51*e01027caSZhu Yanjun# Verify port 4791 is still listening 52*e01027caSZhu Yanjunif ! ss -Huln sport = :$PORT | grep -q ":$PORT"; then 53*e01027caSZhu Yanjun echo "Error: UDP port $PORT missing after rxe1 creation" 54*e01027caSZhu Yanjun exit 1 55*e01027caSZhu Yanjunfi 56*e01027caSZhu Yanjun 57*e01027caSZhu Yanjun# --- Phase 3: Targeted Deletion --- 58*e01027caSZhu Yanjunecho "Deleting rxe1..." 59*e01027caSZhu Yanjunrdma link del rxe1 60*e01027caSZhu Yanjun 61*e01027caSZhu Yanjun# Port should still be active because rxe0 is still alive 62*e01027caSZhu Yanjunif ! ss -Huln sport = :$PORT | grep -q ":$PORT"; then 63*e01027caSZhu Yanjun echo "Error: UDP port $PORT closed prematurely" 64*e01027caSZhu Yanjun exit 1 65*e01027caSZhu Yanjunfi 66*e01027caSZhu Yanjun 67*e01027caSZhu Yanjunecho "Deleting rxe0..." 68*e01027caSZhu Yanjunrdma link del rxe0 69*e01027caSZhu Yanjun 70*e01027caSZhu Yanjun# Port should now be gone 71*e01027caSZhu Yanjunif ss -Huln sport = :$PORT | grep -q ":$PORT"; then 72*e01027caSZhu Yanjun echo "Error: UDP port $PORT still exists after all links deleted" 73*e01027caSZhu Yanjun exit 1 74*e01027caSZhu Yanjunfi 75*e01027caSZhu Yanjun 76*e01027caSZhu Yanjunecho "Test passed successfully." 77