selftests: drv-net: devmem: set reuseaddr on the sender's source port

devmem.py fails on the HW runners with:

  CMD[remote]: dd if=/dev/zero bs=512 count=1 2>/dev/null | socat -b 512 \
    -u - TCP6:[fd00:2::1]:50051,bind=[fd00:2::2]:50051,nodelay
    STDERR: socat[41018] W bind(5, {AF=10 [fd00:2::2]:50051}, 28): \
            Address already in use

ncdevmem installs a 5-tuple flow rule which matches the source port, so
socat has to bind it explicitly. The port comes from rand_port(), which
checks availability on the DUT - but we bind on the remote...
That said the failure rate seems to high to be random collisions
(~2% per sub-test). It's probably TIME_WAIT sockets on the remote,
run_rx_hds() alone creates 12 of them.

Set reuseaddr so a TIME_WAIT socket does not fail the bind. Collisions
with a live socket are still possible, we'll see if they are frequent
enough to care.

Reviewed-by: Breno Leitao <leitao@debian.org>
Reviewed-by: Bobby Eshleman <bobbyeshleman@meta.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Link: https://patch.msgid.link/20260912203101.153688-1-kuba@kernel.org
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
Jakub Kicinski 2026-09-12 13:31:01 -07:00 committed by Paolo Abeni
parent 1a523f29fe
commit b8e9e7d82e

View File

@ -201,7 +201,7 @@ def socat_send(cfg, port, buf_size=0):
else:
addr = cfg.baddr
suffix = f",bind={cfg.remote_baddr}:{port}"
suffix = f",bind={cfg.remote_baddr}:{port},reuseaddr"
buf = ""
if buf_size:
@ -213,7 +213,7 @@ def socat_send(cfg, port, buf_size=0):
def socat_listen(cfg, port):
"""Socat listen command for TX tests."""
return f"socat -U - TCP{cfg.addr_ipver}-LISTEN:{port}"
return f"socat -U - TCP{cfg.addr_ipver}-LISTEN:{port},reuseaddr"
def setup_test(cfg, bin_local):