@@ -388,33 +388,36 @@ def _startThreads(self):
388388 return
389389
390390 self ._networkingThread_v4 = NetworkingThreadIPv4 (self )
391- self ._networkingThread_v6 = NetworkingThreadIPv6 (self )
392391 self ._networkingThread_v4 .start ()
393- self ._networkingThread_v6 .start ()
394- logger .debug ("networking threads started" )
395-
396392 self ._addrsMonitorThread_v4 = AddressMonitorThread (self , socket .AF_INET )
397- self ._addrsMonitorThread_v6 = AddressMonitorThread (self , socket .AF_INET6 )
398393 self ._addrsMonitorThread_v4 .start ()
399- self ._addrsMonitorThread_v6 .start ()
394+ logger .debug ("networking threads started" )
395+
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
400405 logger .debug ("address monitoring threads started" )
401406
402407 def _stopThreads (self ):
403- if self ._networkingThread_v4 is None :
404- return
405-
406- self ._networkingThread_v4 .schedule_stop ()
407- self ._addrsMonitorThread_v4 .schedule_stop ()
408- self ._networkingThread_v6 .schedule_stop ()
409- self ._addrsMonitorThread_v6 .schedule_stop ()
410-
411- self ._networkingThread_v4 .join ()
412- self ._addrsMonitorThread_v4 .join ()
413- self ._networkingThread_v6 .join ()
414- self ._addrsMonitorThread_v6 .join ()
415-
416- self ._networkingThread_v4 = None
417- self ._networkingThread_v6 = None
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
418421
419422 def start (self ):
420423 """start networking - should be called before using other methods"""
@@ -430,23 +433,24 @@ def addSourceAddr(self, addr):
430433 version = ipaddress .ip_address (addr ).version
431434 if version == 4 :
432435 self ._networkingThread_v4 .addSourceAddr (addr )
433- elif version == 6 :
436+ elif version == 6 and self . _networkingThread_v6 is not None :
434437 self ._networkingThread_v6 .addSourceAddr (addr )
435438
436439 def removeSourceAddr (self , addr ):
437440 version = ipaddress .ip_address (addr ).version
438441 if version == 4 :
439442 self ._networkingThread_v4 .removeSourceAddr (addr )
440- elif version == 6 :
443+ elif version == 6 and self . _networkingThread_v6 is not None :
441444 self ._networkingThread_v6 .removeSourceAddr (addr )
442445
443446 def sendUnicastMessage (self , env , host , port , initialDelay = 0 ,
444447 unicast_num = UNICAST_UDP_REPEAT ):
445448 "handle unicast message sending"
446449 self ._networkingThread_v4 .addUnicastMessage (env , host , port ,
447450 initialDelay , unicast_num )
448- self ._networkingThread_v6 .addUnicastMessage (env , host , port ,
449- initialDelay , unicast_num )
451+ if self ._networkingThread_v6 is not None :
452+ self ._networkingThread_v6 .addUnicastMessage (env , host , port ,
453+ initialDelay , unicast_num )
450454
451455 def sendMulticastMessage (self , env , initialDelay = 0 ,
452456 multicast_num = MULTICAST_UDP_REPEAT ):
@@ -456,7 +460,8 @@ def sendMulticastMessage(self, env, initialDelay=0,
456460 MULTICAST_PORT ,
457461 initialDelay ,
458462 multicast_num )
459- self ._networkingThread_v6 .addMulticastMessage (env ,
463+ if self ._networkingThread_v6 is not None :
464+ self ._networkingThread_v6 .addMulticastMessage (env ,
460465 MULTICAST_IPV6_ADDRESS ,
461466 MULTICAST_PORT ,
462467 initialDelay ,
0 commit comments