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