Message ID | 20240620232902.1343834-2-kuba@kernel.org (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | selftests: drv-net: rss_ctx: add tests for RSS contexts | expand |
On 2024-06-20 16:28, Jakub Kicinski wrote: > We use random ports for communication. As Willem predicted > this leads to occasional failures. Try to check if port is > already in use by opening a socket and binding to that port. > > Signed-off-by: Jakub Kicinski <kuba@kernel.org> > --- > tools/testing/selftests/net/lib/py/utils.py | 13 ++++++++++++- > 1 file changed, 12 insertions(+), 1 deletion(-) > > diff --git a/tools/testing/selftests/net/lib/py/utils.py b/tools/testing/selftests/net/lib/py/utils.py > index 0540ea24921d..9fa9ec720c89 100644 > --- a/tools/testing/selftests/net/lib/py/utils.py > +++ b/tools/testing/selftests/net/lib/py/utils.py > @@ -3,6 +3,7 @@ > import json as _json > import random > import re > +import socket > import subprocess > import time > > @@ -81,7 +82,17 @@ import time > """ > Get unprivileged port, for now just random, one day we may decide to check if used. That day is today ;) > """ > - return random.randint(10000, 65535) > + while True: > + port = random.randint(10000, 65535) > + try: > + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: > + s.bind(("", port)) > + with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s: > + s.bind(("", port)) > + return port > + except OSError as e: > + if e.errno != 98: # already in use > + raise > > > def wait_port_listen(port, proto="tcp", ns=None, host=None, sleep=0.005, deadline=5):
Jakub Kicinski wrote: > We use random ports for communication. As Willem predicted > this leads to occasional failures. Try to check if port is > already in use by opening a socket and binding to that port. > > Signed-off-by: Jakub Kicinski <kuba@kernel.org> > --- > tools/testing/selftests/net/lib/py/utils.py | 13 ++++++++++++- > 1 file changed, 12 insertions(+), 1 deletion(-) > > diff --git a/tools/testing/selftests/net/lib/py/utils.py b/tools/testing/selftests/net/lib/py/utils.py > index 0540ea24921d..9fa9ec720c89 100644 > --- a/tools/testing/selftests/net/lib/py/utils.py > +++ b/tools/testing/selftests/net/lib/py/utils.py > @@ -3,6 +3,7 @@ > import json as _json > import random > import re > +import socket > import subprocess > import time > > @@ -81,7 +82,17 @@ import time > """ > Get unprivileged port, for now just random, one day we may decide to check if used. > """ > - return random.randint(10000, 65535) > + while True: > + port = random.randint(10000, 65535) > + try: > + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: > + s.bind(("", port)) > + with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s: > + s.bind(("", port)) Is the separate AF_INET needed? As AF_INET6 is not IPV6_V6ONLY. The following correctly fails in the second bind with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s6: s6.bind(("", 8000)) with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s4: s4.bind(("", 8000)) > + return port > + except OSError as e: > + if e.errno != 98: # already in use > + raise > > > def wait_port_listen(port, proto="tcp", ns=None, host=None, sleep=0.005, deadline=5): > -- > 2.45.2 >
On 6/21/24 01:28, Jakub Kicinski wrote: > We use random ports for communication. As Willem predicted > this leads to occasional failures. Try to check if port is > already in use by opening a socket and binding to that port. > > Signed-off-by: Jakub Kicinski <kuba@kernel.org> > --- > tools/testing/selftests/net/lib/py/utils.py | 13 ++++++++++++- > 1 file changed, 12 insertions(+), 1 deletion(-) > > diff --git a/tools/testing/selftests/net/lib/py/utils.py b/tools/testing/selftests/net/lib/py/utils.py > index 0540ea24921d..9fa9ec720c89 100644 > --- a/tools/testing/selftests/net/lib/py/utils.py > +++ b/tools/testing/selftests/net/lib/py/utils.py > @@ -3,6 +3,7 @@ > import json as _json > import random > import re > +import socket > import subprocess > import time > > @@ -81,7 +82,17 @@ import time > """ > Get unprivileged port, for now just random, one day we may decide to check if used. > """ nit: this comment could be now updated > - return random.randint(10000, 65535) > + while True: nit: perhaps you could limit the loop to some finite number of steps for the case that all ports are in use :P > + port = random.randint(10000, 65535) > + try: > + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: > + s.bind(("", port)) > + with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s: > + s.bind(("", port)) > + return port > + except OSError as e: > + if e.errno != 98: # already in use > + raise > > > def wait_port_listen(port, proto="tcp", ns=None, host=None, sleep=0.005, deadline=5):
diff --git a/tools/testing/selftests/net/lib/py/utils.py b/tools/testing/selftests/net/lib/py/utils.py index 0540ea24921d..9fa9ec720c89 100644 --- a/tools/testing/selftests/net/lib/py/utils.py +++ b/tools/testing/selftests/net/lib/py/utils.py @@ -3,6 +3,7 @@ import json as _json import random import re +import socket import subprocess import time @@ -81,7 +82,17 @@ import time """ Get unprivileged port, for now just random, one day we may decide to check if used. """ - return random.randint(10000, 65535) + while True: + port = random.randint(10000, 65535) + try: + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.bind(("", port)) + with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s: + s.bind(("", port)) + return port + except OSError as e: + if e.errno != 98: # already in use + raise def wait_port_listen(port, proto="tcp", ns=None, host=None, sleep=0.005, deadline=5):
We use random ports for communication. As Willem predicted this leads to occasional failures. Try to check if port is already in use by opening a socket and binding to that port. Signed-off-by: Jakub Kicinski <kuba@kernel.org> --- tools/testing/selftests/net/lib/py/utils.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)