Skip to content

Commit 2596903

Browse files
committed
Handle socket.IPV6_MULTICAST_IF failing to be set
1 parent ba4c943 commit 2596903

File tree

1 file changed

+37
-34
lines changed

1 file changed

+37
-34
lines changed

wsdiscovery/threaded.py

Lines changed: 37 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,15 @@ def _createMulticastOutSocket(self, addr, ttl):
121121
else:
122122
iface = int(addr.scope_id)
123123

124-
sock.setsockopt(ip_proto, self._get_multicast(), iface)
124+
try:
125+
sock.setsockopt(ip_proto, self._get_multicast(), iface)
126+
except OSError as e:
127+
logger.warning(
128+
"Interface for %s does not support "
129+
"multicast flags or is not UP: OSError %s",
130+
addr,
131+
e
132+
)
125133

126134
return sock
127135

@@ -142,7 +150,7 @@ def addSourceAddr(self, addr):
142150
try:
143151
self._multiInSocket.setsockopt(self._get_ip_proto(), self._get_ip_join(), self._makeMreq(addr))
144152
except socket.error as e:
145-
logger.debug(f"Interface has more than 1 address: {e}")
153+
logger.warning(f"Interface has more than 1 address: {e}")
146154

147155
sock = self._createMulticastOutSocket(addr, self._observer.ttl)
148156
self._multiOutUniInSockets[addr] = sock
@@ -152,7 +160,7 @@ def removeSourceAddr(self, addr):
152160
try:
153161
self._multiInSocket.setsockopt(self._get_ip_proto(), self._get_ip_leave(), self._makeMreq(addr))
154162
except socket.error as e:
155-
logger.debug(f"Interface has more than 1 address: {e}")
163+
logger.warning(f"Interface has more than 1 address: {e}")
156164

157165
sock = self._multiOutUniInSockets[addr]
158166
self._selector.unregister(sock)
@@ -388,36 +396,33 @@ def _startThreads(self):
388396
return
389397

390398
self._networkingThread_v4 = NetworkingThreadIPv4(self)
399+
self._networkingThread_v6 = NetworkingThreadIPv6(self)
391400
self._networkingThread_v4.start()
392-
self._addrsMonitorThread_v4 = AddressMonitorThread(self, socket.AF_INET)
393-
self._addrsMonitorThread_v4.start()
401+
self._networkingThread_v6.start()
394402
logger.debug("networking threads started")
395403

396-
try:
397-
self._networkingThread_v6 = NetworkingThreadIPv6(self)
398-
self._networkingThread_v6.start()
399-
self._addrsMonitorThread_v6 = AddressMonitorThread(self, socket.AF_INET6)
400-
self._addrsMonitorThread_v6.start()
401-
except OSError as e:
402-
logger.debug("IPv6 not supported: %s", e)
403-
self._networkingThread_v6 = None
404-
self._addrsMonitorThread_v6 = None
404+
self._addrsMonitorThread_v4 = AddressMonitorThread(self, socket.AF_INET)
405+
self._addrsMonitorThread_v6 = AddressMonitorThread(self, socket.AF_INET6)
406+
self._addrsMonitorThread_v4.start()
407+
self._addrsMonitorThread_v6.start()
405408
logger.debug("address monitoring threads started")
406409

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

422427
def start(self):
423428
"""start networking - should be called before using other methods"""
@@ -433,24 +438,23 @@ def addSourceAddr(self, addr):
433438
version = ipaddress.ip_address(addr).version
434439
if version == 4:
435440
self._networkingThread_v4.addSourceAddr(addr)
436-
elif version == 6 and self._networkingThread_v6 is not None:
441+
elif version == 6:
437442
self._networkingThread_v6.addSourceAddr(addr)
438443

439444
def removeSourceAddr(self, addr):
440445
version = ipaddress.ip_address(addr).version
441446
if version == 4:
442447
self._networkingThread_v4.removeSourceAddr(addr)
443-
elif version == 6 and self._networkingThread_v6 is not None:
448+
elif version == 6:
444449
self._networkingThread_v6.removeSourceAddr(addr)
445450

446451
def sendUnicastMessage(self, env, host, port, initialDelay=0,
447452
unicast_num=UNICAST_UDP_REPEAT):
448453
"handle unicast message sending"
449454
self._networkingThread_v4.addUnicastMessage(env, host, port,
450455
initialDelay, unicast_num)
451-
if self._networkingThread_v6 is not None:
452-
self._networkingThread_v6.addUnicastMessage(env, host, port,
453-
initialDelay, unicast_num)
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,8 +464,7 @@ def sendMulticastMessage(self, env, initialDelay=0,
460464
MULTICAST_PORT,
461465
initialDelay,
462466
multicast_num)
463-
if self._networkingThread_v6 is not None:
464-
self._networkingThread_v6.addMulticastMessage(env,
467+
self._networkingThread_v6.addMulticastMessage(env,
465468
MULTICAST_IPV6_ADDRESS,
466469
MULTICAST_PORT,
467470
initialDelay,

0 commit comments

Comments
 (0)