22
33# Source common functions and settings
44SCRIPT_DIR=" $( cd " $( dirname " ${BASH_SOURCE[0]} " ) " && pwd) "
5+ export SCRIPT_DIR
56source " ${SCRIPT_DIR} /common.sh"
67
78# Override timeout for netdev tests
@@ -21,44 +22,118 @@ esac
2122# Clean up any existing semu processes before starting tests
2223cleanup
2324
24- # Test network device functionality
25- TEST_NETDEV () {
26- local NETDEV=" $1 "
27- local CMD_PREFIX=" "
25+ # Platform detection
26+ UNAME_S=$( uname -s)
27+
28+ # Check if running on macOS
29+ if [[ ${UNAME_S} == " Darwin" ]]; then
30+ IS_MACOS=1
31+ else
32+ IS_MACOS=0
33+ fi
2834
29- if [ " $NETDEV " = " tap" ]; then
30- CMD_PREFIX=" sudo "
35+ # Network device to test (can be overridden by NETDEV environment variable)
36+ NETDEV=${NETDEV:- " " }
37+
38+ # Check for root privileges based on network device
39+ REQUIRES_SUDO=0
40+ if [[ ${IS_MACOS} -eq 1 && " ${NETDEV} " == " vmnet" ]]; then
41+ REQUIRES_SUDO=1
42+ SUDO_REASON=" vmnet.framework requires root privileges"
43+ elif [[ ${IS_MACOS} -eq 0 && " ${NETDEV} " == " tap" ]]; then
44+ REQUIRES_SUDO=1
45+ SUDO_REASON=" TAP device requires root privileges"
46+ fi
47+
48+ # Check for root privileges if required
49+ if [[ ${REQUIRES_SUDO} -eq 1 ]]; then
50+ if [[ $EUID -ne 0 ]]; then
51+ echo " Error: This script must be run with sudo for ${NETDEV} mode"
52+ echo " Reason: ${SUDO_REASON} "
53+ echo " "
54+ echo " Usage: sudo $0 "
55+ echo " Or use NETDEV=user for no-sudo mode (macOS/Linux)"
56+ exit 1
3157 fi
58+ fi
59+
60+ # Test network device functionality
61+ TEST_NETDEV () {
62+ local NETDEV=$1
3263
3364 ASSERT expect << DONE
3465 set timeout ${TIMEOUT}
35- spawn ${CMD_PREFIX} make check NETDEV=${NETDEV}
36- expect "buildroot login:" { send "root\n" } timeout { exit 1 }
37- expect "# " { send "uname -a\n" } timeout { exit 2 }
66+ spawn make check NETDEV=${NETDEV}
67+ expect "buildroot login:" { send "root\\ n" } timeout { exit 1 }
68+ expect "# " { send "uname -a\\ n" } timeout { exit 2 }
69+
3870 if { "$NETDEV " == "tap" } {
39- exec sudo ip addr add 192.168.10.1/24 dev tap0
40- exec sudo ip link set tap0 up
41- expect "riscv32 GNU/Linux" { send "ip l set eth0 up\n" } timeout { exit 3 }
42- expect "# " { send "ip a add 192.168.10.2/24 dev eth0\n" }
43- expect "# " { send "ping -c 3 192.168.10.1\n" }
71+ exec ip addr add 192.168.10.1/24 dev tap0
72+ exec ip link set tap0 up
73+ expect "riscv32 GNU/Linux" { send "ip l set eth0 up\\ n" } timeout { exit 3 }
74+ expect "# " { send "ip a add 192.168.10.2/24 dev eth0\\ n" }
75+ expect "# " { send "ping -c 3 192.168.10.1\\ n" }
4476 expect "3 packets transmitted, 3 packets received, 0% packet loss" { } timeout { exit 4 }
4577 } elseif { "$NETDEV " == "user" } {
46- expect "riscv32 GNU/Linux" { send "ip addr add 10.0.2.15/24 dev eth0\n" } timeout { exit 3 }
47- expect "# " { send "ip link set eth0 up\n"}
48- expect "# " { send "ip route add default via 10.0.2.2\n"}
49- expect "# " { send "ping -c 3 10.0.2.2\n" }
78+ expect "riscv32 GNU/Linux" { send "ip addr add 10.0.2.15/24 dev eth0\\ n" } timeout { exit 3 }
79+ expect "# " { send "ip link set eth0 up\\ n"}
80+ expect "# " { send "ip route add default via 10.0.2.2\\ n"}
81+ expect "# " { send "ping -c 3 10.0.2.2\\ n" }
82+ expect "3 packets transmitted, 3 packets received, 0% packet loss" { } timeout { exit 4 }
83+ } elseif { "$NETDEV " == "vmnet" } {
84+ # vmnet (macOS): detect host-provided gateway and configure statically
85+ set vmnet_info [exec \$ env(SCRIPT_DIR)/detect-vmnet-network.sh]
86+ set vmnet_guest_ip [lindex \$ vmnet_info 0]
87+ set vmnet_gateway [lindex \$ vmnet_info 1]
88+ set vmnet_prefix [lindex \$ vmnet_info 2]
89+
90+ expect "riscv32 GNU/Linux" { send "ip link set eth0 up\\ n" } timeout { exit 3 }
91+ expect "# " { send "ip addr flush dev eth0\\ n" }
92+ expect "# " { send "ip addr add \$ vmnet_guest_ip/\$ vmnet_prefix dev eth0\\ n" }
93+ expect "# " { send "ip route replace default via \$ vmnet_gateway\\ n" }
94+ expect "# " { send "for i in 1 2 3 4 5; do ping -c 1 -W 3 \$ vmnet_gateway && break; sleep 1; done\\ n" }
95+ expect "# " { send "ping -c 3 \$ vmnet_gateway\\ n" }
5096 expect "3 packets transmitted, 3 packets received, 0% packet loss" { } timeout { exit 4 }
5197 }
5298DONE
5399}
54100
55- # Network devices to test
56- NETWORK_DEVICES=(tap user)
101+ # Determine network devices to test based on platform
102+ if [[ -n " ${NETDEV} " ]]; then
103+ # NETDEV environment variable specified - test only that device
104+ NETWORK_DEVICES=(${NETDEV} )
105+ elif [[ ${IS_MACOS} -eq 1 ]]; then
106+ # macOS: test both user (no sudo) and vmnet (requires sudo)
107+ # Default to user if not running as root
108+ if [[ $EUID -eq 0 ]]; then
109+ NETWORK_DEVICES=(user vmnet)
110+ else
111+ NETWORK_DEVICES=(user)
112+ echo " Note: Running without sudo, testing user mode only"
113+ echo " Run with 'sudo' to test vmnet mode"
114+ fi
115+ else
116+ # Linux: test tap (requires sudo) and user (no sudo)
117+ if [[ $EUID -eq 0 ]]; then
118+ NETWORK_DEVICES=(tap user)
119+ else
120+ NETWORK_DEVICES=(user)
121+ echo " Note: Running without sudo, testing user mode only"
122+ echo " Run with 'sudo' to test tap mode"
123+ fi
124+ fi
125+
126+ echo " Platform: ${UNAME_S} "
127+ echo " Network devices to test: ${NETWORK_DEVICES[@]} "
57128
58129for NETDEV in " ${NETWORK_DEVICES[@]} " ; do
59130 cleanup
60- echo " Test network device: $NETDEV "
61- TEST_NETDEV " $NETDEV "
131+ echo " "
132+ echo " ========================================="
133+ echo " Testing network device: $NETDEV "
134+ echo " ========================================="
135+ TEST_NETDEV $NETDEV
136+ echo " ✓ $NETDEV test passed"
62137done
63138
64139ret=" $? "
0 commit comments