From 0cc42568c7d6d5ca4962019770abd457d909ff1f Mon Sep 17 00:00:00 2001 From: Mark Qvist Date: Sun, 31 May 2026 23:54:46 +0200 Subject: [PATCH] Fixed UDP listener replacement deadlocking AutoInterface traffic when fast-roaming between physical interfaces or WiFi APs --- RNS/Interfaces/AutoInterface.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/RNS/Interfaces/AutoInterface.py b/RNS/Interfaces/AutoInterface.py index 41fbc849..57634851 100644 --- a/RNS/Interfaces/AutoInterface.py +++ b/RNS/Interfaces/AutoInterface.py @@ -428,14 +428,22 @@ class AutoInterface(Interface): if ifname in self.interface_servers: RNS.log("Shutting down previous UDP listener for "+str(self)+" "+str(ifname), RNS.LOG_DEBUG) previous_server = self.interface_servers[ifname] - def shutdown_server(): - previous_server.shutdown() + def shutdown_server(): previous_server.shutdown() threading.Thread(target=shutdown_server, daemon=True).start() RNS.log("Starting new UDP listener for "+str(self)+" "+str(ifname), RNS.LOG_DEBUG) - udp_server = socketserver.UDPServer(listen_address, self.handler_factory(self.process_incoming)) - self.interface_servers[ifname] = udp_server + retry_delay = 1.25 + listener_started = False + while not listener_started: + try: + time.sleep(retry_delay) + udp_server = socketserver.UDPServer(listen_address, self.handler_factory(self.process_incoming)) + self.interface_servers[ifname] = udp_server + listener_started = True + except Exception as e: + RNS.log(f"Could not start new UDP listener for {self} on {listen_address}: {e}", RNS.LOG_WARNING) + RNS.log(f"Retrying in {retry_delay} seconds", RNS.LOG_WARNING) thread = threading.Thread(target=udp_server.serve_forever) thread.daemon = True