mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-16 18:22:00 -04:00
selftests: net: py: Add rand_ports helper method
Certain tests need a unique set of ports. Successive calls to the existing rand_port method may return a duplicate port, resulting in test flakiness. The new helper keeps sockets open while building a list of ephemeral ports, thus the kernel enforces their uniqueness. Signed-off-by: Dimitri Daskalakis <dimitri.daskalakis1@gmail.com> Link: https://patch.msgid.link/20260224224659.1507082-2-dimitri.daskalakis1@gmail.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
committed by
Jakub Kicinski
parent
2cd63825c7
commit
b0249c0d41
@@ -22,7 +22,8 @@ try:
|
||||
NlError, RtnlFamily, DevlinkFamily, PSPFamily
|
||||
from net.lib.py import CmdExitFailure
|
||||
from net.lib.py import bkg, cmd, bpftool, bpftrace, defer, ethtool, \
|
||||
fd_read_timeout, ip, rand_port, wait_port_listen, wait_file, tool
|
||||
fd_read_timeout, ip, rand_port, rand_ports, wait_port_listen, \
|
||||
wait_file, tool
|
||||
from net.lib.py import KsftSkipEx, KsftFailEx, KsftXfailEx
|
||||
from net.lib.py import ksft_disruptive, ksft_exit, ksft_pr, ksft_run, \
|
||||
ksft_setup, ksft_variants, KsftNamedVariant
|
||||
@@ -36,7 +37,7 @@ try:
|
||||
"NlError", "RtnlFamily", "DevlinkFamily", "PSPFamily",
|
||||
"CmdExitFailure",
|
||||
"bkg", "cmd", "bpftool", "bpftrace", "defer", "ethtool",
|
||||
"fd_read_timeout", "ip", "rand_port",
|
||||
"fd_read_timeout", "ip", "rand_port", "rand_ports",
|
||||
"wait_port_listen", "wait_file", "tool",
|
||||
"KsftSkipEx", "KsftFailEx", "KsftXfailEx",
|
||||
"ksft_disruptive", "ksft_exit", "ksft_pr", "ksft_run",
|
||||
|
||||
@@ -22,7 +22,7 @@ try:
|
||||
NlError, RtnlFamily, DevlinkFamily, PSPFamily
|
||||
from net.lib.py import CmdExitFailure
|
||||
from net.lib.py import bkg, cmd, bpftool, bpftrace, defer, ethtool, \
|
||||
fd_read_timeout, ip, rand_port, wait_port_listen, wait_file
|
||||
fd_read_timeout, ip, rand_port, rand_ports, wait_port_listen, wait_file
|
||||
from net.lib.py import KsftSkipEx, KsftFailEx, KsftXfailEx
|
||||
from net.lib.py import ksft_disruptive, ksft_exit, ksft_pr, ksft_run, \
|
||||
ksft_setup, ksft_variants, KsftNamedVariant
|
||||
@@ -34,7 +34,7 @@ try:
|
||||
"NlError", "RtnlFamily", "DevlinkFamily", "PSPFamily",
|
||||
"CmdExitFailure",
|
||||
"bkg", "cmd", "bpftool", "bpftrace", "defer", "ethtool",
|
||||
"fd_read_timeout", "ip", "rand_port",
|
||||
"fd_read_timeout", "ip", "rand_port", "rand_ports",
|
||||
"wait_port_listen", "wait_file",
|
||||
"KsftSkipEx", "KsftFailEx", "KsftXfailEx",
|
||||
"ksft_disruptive", "ksft_exit", "ksft_pr", "ksft_run",
|
||||
|
||||
@@ -13,7 +13,8 @@ from .ksft import KsftFailEx, KsftSkipEx, KsftXfailEx, ksft_pr, ksft_eq, \
|
||||
from .netns import NetNS, NetNSEnter
|
||||
from .nsim import NetdevSim, NetdevSimDev
|
||||
from .utils import CmdExitFailure, fd_read_timeout, cmd, bkg, defer, \
|
||||
bpftool, ip, ethtool, bpftrace, rand_port, wait_port_listen, wait_file, tool
|
||||
bpftool, ip, ethtool, bpftrace, rand_port, rand_ports, wait_port_listen, \
|
||||
wait_file, tool
|
||||
from .ynl import NlError, YnlFamily, EthtoolFamily, NetdevFamily, RtnlFamily, RtnlAddrFamily
|
||||
from .ynl import NetshaperFamily, DevlinkFamily, PSPFamily
|
||||
|
||||
@@ -25,7 +26,7 @@ __all__ = ["KSRC",
|
||||
"ksft_run", "ksft_exit", "ksft_variants", "KsftNamedVariant",
|
||||
"NetNS", "NetNSEnter",
|
||||
"CmdExitFailure", "fd_read_timeout", "cmd", "bkg", "defer",
|
||||
"bpftool", "ip", "ethtool", "bpftrace", "rand_port",
|
||||
"bpftool", "ip", "ethtool", "bpftrace", "rand_port", "rand_ports",
|
||||
"wait_port_listen", "wait_file", "tool",
|
||||
"NetdevSim", "NetdevSimDev",
|
||||
"NetshaperFamily", "DevlinkFamily", "PSPFamily", "NlError",
|
||||
|
||||
@@ -281,9 +281,27 @@ def rand_port(stype=socket.SOCK_STREAM):
|
||||
"""
|
||||
Get a random unprivileged port.
|
||||
"""
|
||||
with socket.socket(socket.AF_INET6, stype) as s:
|
||||
s.bind(("", 0))
|
||||
return s.getsockname()[1]
|
||||
return rand_ports(1, stype)[0]
|
||||
|
||||
|
||||
def rand_ports(count, stype=socket.SOCK_STREAM):
|
||||
"""
|
||||
Get a unique set of random unprivileged ports.
|
||||
"""
|
||||
sockets = []
|
||||
ports = []
|
||||
|
||||
try:
|
||||
for _ in range(count):
|
||||
s = socket.socket(socket.AF_INET6, stype)
|
||||
sockets.append(s)
|
||||
s.bind(("", 0))
|
||||
ports.append(s.getsockname()[1])
|
||||
finally:
|
||||
for s in sockets:
|
||||
s.close()
|
||||
|
||||
return ports
|
||||
|
||||
|
||||
def wait_port_listen(port, proto="tcp", ns=None, host=None, sleep=0.005, deadline=5):
|
||||
|
||||
Reference in New Issue
Block a user