selftests/vsock: use ss to wait for listeners instead of /proc/net

Replace /proc/net parsing with ss(8) for detecting listening sockets in
wait_for_listener() functions and add support for TCP, VSOCK, and Unix
socket protocols.

The previous implementation parsed /proc/net/tcp using awk to detect
listening sockets, but this approach could not support vsock because
vsock does not export socket information to /proc/net/.

Instead, use ss so that we can detect listeners on tcp, vsock, and unix.

The protocol parameter is now required for all wait_for_listener family
functions (wait_for_listener, vm_wait_for_listener,
host_wait_for_listener) to explicitly specify which socket type to wait
for.

ss is added to the dependency check in check_deps().

Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
Signed-off-by: Bobby Eshleman <bobbyeshleman@meta.com>
Link: https://patch.msgid.link/20260121-vsock-vmtest-v16-8-2859a7512097@meta.com
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
Bobby Eshleman 2026-01-21 14:11:48 -08:00 committed by Paolo Abeni
parent 4e870ac81d
commit 7418f3bb3a

View File

@ -182,7 +182,7 @@ check_args() {
}
check_deps() {
for dep in vng ${QEMU} busybox pkill ssh; do
for dep in vng ${QEMU} busybox pkill ssh ss; do
if [[ ! -x $(command -v "${dep}") ]]; then
echo -e "skip: dependency ${dep} not found!\n"
exit "${KSFT_SKIP}"
@ -337,21 +337,32 @@ wait_for_listener()
local port=$1
local interval=$2
local max_intervals=$3
local protocol=tcp
local pattern
local protocol=$4
local i
pattern=":$(printf "%04X" "${port}") "
# for tcp protocol additionally check the socket state
[ "${protocol}" = "tcp" ] && pattern="${pattern}0A"
for i in $(seq "${max_intervals}"); do
if awk -v pattern="${pattern}" \
'BEGIN {rc=1} $2" "$4 ~ pattern {rc=0} END {exit rc}' \
/proc/net/"${protocol}"*; then
case "${protocol}" in
tcp)
if ss --listening --tcp --numeric | grep -q ":${port} "; then
break
fi
;;
vsock)
if ss --listening --vsock --numeric | grep -q ":${port} "; then
break
fi
;;
unix)
# For unix sockets, port is actually the socket path
if ss --listening --unix | grep -q "${port}"; then
break
fi
;;
*)
echo "Unknown protocol: ${protocol}" >&2
break
fi
;;
esac
sleep "${interval}"
done
}
@ -359,23 +370,25 @@ wait_for_listener()
vm_wait_for_listener() {
local ns=$1
local port=$2
local protocol=$3
vm_ssh "${ns}" <<EOF
$(declare -f wait_for_listener)
wait_for_listener ${port} ${WAIT_PERIOD} ${WAIT_PERIOD_MAX}
wait_for_listener ${port} ${WAIT_PERIOD} ${WAIT_PERIOD_MAX} ${protocol}
EOF
}
host_wait_for_listener() {
local ns=$1
local port=$2
local protocol=$3
if [[ "${ns}" == "init_ns" ]]; then
wait_for_listener "${port}" "${WAIT_PERIOD}" "${WAIT_PERIOD_MAX}"
wait_for_listener "${port}" "${WAIT_PERIOD}" "${WAIT_PERIOD_MAX}" "${protocol}"
else
ip netns exec "${ns}" bash <<-EOF
$(declare -f wait_for_listener)
wait_for_listener ${port} ${WAIT_PERIOD} ${WAIT_PERIOD_MAX}
wait_for_listener ${port} ${WAIT_PERIOD} ${WAIT_PERIOD_MAX} ${protocol}
EOF
fi
}
@ -422,7 +435,7 @@ vm_vsock_test() {
return $rc
fi
vm_wait_for_listener "${ns}" "${port}"
vm_wait_for_listener "${ns}" "${port}" "tcp"
rc=$?
fi
set +o pipefail
@ -463,7 +476,7 @@ host_vsock_test() {
return $rc
fi
host_wait_for_listener "${ns}" "${port}"
host_wait_for_listener "${ns}" "${port}" "tcp"
rc=$?
fi
set +o pipefail