mirror of
https://github.com/espressif/openthread.git
synced 2026-08-05 02:17:47 +00:00
[srp-server] retry other ports when failing to prepareSocket (#9981)
Unicast SRP dataset uses a ephemeral UDP port which could be taken by another process. Currently SRP server creates the socket at the port after the server is added into netdata. However, at that moment the port may not be available on the platform so it may fail to create the socket and start the server. This commit adds the logic to restart the enabling process with another port candidate if SRP server fails to create the socket.
This commit is contained in:
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
import ipaddress
|
||||
import logging
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -81,6 +80,12 @@ class SingleHostAndService(thread_cert.TestCase):
|
||||
host.start(start_radvd=False)
|
||||
self.simulator.go(5)
|
||||
|
||||
# Reserve UDP ports to verify that SRP server can skip the unavailable
|
||||
# ports correctly
|
||||
server.reserve_udp_port(53535)
|
||||
server.reserve_udp_port(53536)
|
||||
server.reserve_udp_port(53537)
|
||||
|
||||
self.assertEqual(server.srp_server_get_state(), 'disabled')
|
||||
server.srp_server_set_enabled(True)
|
||||
server.srp_server_set_lease_range(LEASE, LEASE, KEY_LEASE, KEY_LEASE)
|
||||
@@ -88,6 +93,7 @@ class SingleHostAndService(thread_cert.TestCase):
|
||||
self.simulator.go(config.BORDER_ROUTER_STARTUP_DELAY)
|
||||
self.assertEqual('leader', server.get_state())
|
||||
self.assertEqual(server.srp_server_get_state(), 'running')
|
||||
self.assertNotIn(server.get_srp_server_port(), [53535, 53536, 53537])
|
||||
|
||||
client.start()
|
||||
self.simulator.go(config.ROUTER_STARTUP_DELAY)
|
||||
|
||||
@@ -197,6 +197,9 @@ class OtbrDocker:
|
||||
self.pexpect.wait()
|
||||
self.pexpect.proc.kill()
|
||||
|
||||
def reserve_udp_port(self, port):
|
||||
self.bash(f'socat -u UDP6-LISTEN:{port},bindtodevice=wpan0 - &')
|
||||
|
||||
def destroy(self):
|
||||
logging.info("Destroying %s", self)
|
||||
self._shutdown_docker()
|
||||
|
||||
@@ -94,14 +94,14 @@ class SrpServerRebootPort(thread_cert.TestCase):
|
||||
|
||||
#
|
||||
# 2. Reboot the server without any service registered. The server should
|
||||
# listen to the same port after the reboot.
|
||||
# switch to a new port after re-enabling.
|
||||
#
|
||||
old_port = server.get_srp_server_port()
|
||||
server.srp_server_set_enabled(False)
|
||||
self.simulator.go(5)
|
||||
server.srp_server_set_enabled(True)
|
||||
self.simulator.go(5)
|
||||
self.assertEqual(old_port, server.get_srp_server_port())
|
||||
self.assertNotEqual(old_port, server.get_srp_server_port())
|
||||
|
||||
#
|
||||
# 3. Register a service
|
||||
|
||||
Reference in New Issue
Block a user