Skip to content

Commit 978f81f

Browse files
authored
Merge branch 'master' into prevent_thread_exception_collapse_bad_message
2 parents fe8143a + ba4c943 commit 978f81f

File tree

1 file changed

+33
-28
lines changed

1 file changed

+33
-28
lines changed

wsdiscovery/threaded.py

Lines changed: 33 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ def addSourceAddr(self, addr):
142142
try:
143143
self._multiInSocket.setsockopt(self._get_ip_proto(), self._get_ip_join(), self._makeMreq(addr))
144144
except socket.error as e:
145-
logger.warning(f"Interface has more than 1 address: {e}")
145+
logger.debug(f"Interface has more than 1 address: {e}")
146146

147147
sock = self._createMulticastOutSocket(addr, self._observer.ttl)
148148
self._multiOutUniInSockets[addr] = sock
@@ -152,7 +152,7 @@ def removeSourceAddr(self, addr):
152152
try:
153153
self._multiInSocket.setsockopt(self._get_ip_proto(), self._get_ip_leave(), self._makeMreq(addr))
154154
except socket.error as e:
155-
logger.warning(f"Interface has more than 1 address: {e}")
155+
logger.debug(f"Interface has more than 1 address: {e}")
156156

157157
sock = self._multiOutUniInSockets[addr]
158158
self._selector.unregister(sock)
@@ -392,33 +392,36 @@ def _startThreads(self):
392392
return
393393

394394
self._networkingThread_v4 = NetworkingThreadIPv4(self)
395-
self._networkingThread_v6 = NetworkingThreadIPv6(self)
396395
self._networkingThread_v4.start()
397-
self._networkingThread_v6.start()
398-
logger.debug("networking threads started")
399-
400396
self._addrsMonitorThread_v4 = AddressMonitorThread(self, socket.AF_INET)
401-
self._addrsMonitorThread_v6 = AddressMonitorThread(self, socket.AF_INET6)
402397
self._addrsMonitorThread_v4.start()
403-
self._addrsMonitorThread_v6.start()
398+
logger.debug("networking threads started")
399+
400+
try:
401+
self._networkingThread_v6 = NetworkingThreadIPv6(self)
402+
self._networkingThread_v6.start()
403+
self._addrsMonitorThread_v6 = AddressMonitorThread(self, socket.AF_INET6)
404+
self._addrsMonitorThread_v6.start()
405+
except OSError as e:
406+
logger.debug("IPv6 not supported: %s", e)
407+
self._networkingThread_v6 = None
408+
self._addrsMonitorThread_v6 = None
404409
logger.debug("address monitoring threads started")
405410

406411
def _stopThreads(self):
407-
if self._networkingThread_v4 is None:
408-
return
409-
410-
self._networkingThread_v4.schedule_stop()
411-
self._addrsMonitorThread_v4.schedule_stop()
412-
self._networkingThread_v6.schedule_stop()
413-
self._addrsMonitorThread_v6.schedule_stop()
414-
415-
self._networkingThread_v4.join()
416-
self._addrsMonitorThread_v4.join()
417-
self._networkingThread_v6.join()
418-
self._addrsMonitorThread_v6.join()
419-
420-
self._networkingThread_v4 = None
421-
self._networkingThread_v6 = None
412+
if self._networkingThread_v4 is not None:
413+
self._networkingThread_v4.schedule_stop()
414+
self._addrsMonitorThread_v4.schedule_stop()
415+
self._networkingThread_v4.join()
416+
self._addrsMonitorThread_v4.join()
417+
self._networkingThread_v4 = None
418+
419+
if self._networkingThread_v6 is not None:
420+
self._networkingThread_v6.schedule_stop()
421+
self._addrsMonitorThread_v6.schedule_stop()
422+
self._networkingThread_v6.join()
423+
self._addrsMonitorThread_v6.join()
424+
self._networkingThread_v6 = None
422425

423426
def start(self):
424427
"""start networking - should be called before using other methods"""
@@ -434,23 +437,24 @@ def addSourceAddr(self, addr):
434437
version = ipaddress.ip_address(addr).version
435438
if version == 4:
436439
self._networkingThread_v4.addSourceAddr(addr)
437-
elif version == 6:
440+
elif version == 6 and self._networkingThread_v6 is not None:
438441
self._networkingThread_v6.addSourceAddr(addr)
439442

440443
def removeSourceAddr(self, addr):
441444
version = ipaddress.ip_address(addr).version
442445
if version == 4:
443446
self._networkingThread_v4.removeSourceAddr(addr)
444-
elif version == 6:
447+
elif version == 6 and self._networkingThread_v6 is not None:
445448
self._networkingThread_v6.removeSourceAddr(addr)
446449

447450
def sendUnicastMessage(self, env, host, port, initialDelay=0,
448451
unicast_num=UNICAST_UDP_REPEAT):
449452
"handle unicast message sending"
450453
self._networkingThread_v4.addUnicastMessage(env, host, port,
451454
initialDelay, unicast_num)
452-
self._networkingThread_v6.addUnicastMessage(env, host, port,
453-
initialDelay, unicast_num)
455+
if self._networkingThread_v6 is not None:
456+
self._networkingThread_v6.addUnicastMessage(env, host, port,
457+
initialDelay, unicast_num)
454458

455459
def sendMulticastMessage(self, env, initialDelay=0,
456460
multicast_num=MULTICAST_UDP_REPEAT):
@@ -460,7 +464,8 @@ def sendMulticastMessage(self, env, initialDelay=0,
460464
MULTICAST_PORT,
461465
initialDelay,
462466
multicast_num)
463-
self._networkingThread_v6.addMulticastMessage(env,
467+
if self._networkingThread_v6 is not None:
468+
self._networkingThread_v6.addMulticastMessage(env,
464469
MULTICAST_IPV6_ADDRESS,
465470
MULTICAST_PORT,
466471
initialDelay,

0 commit comments

Comments
 (0)