@@ -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