@@ -51,9 +51,9 @@ def __init__(self, kernel_socket):
5151 self .tree_logger = Main .logger .getChild ('KernelTree' )
5252
5353 # receive signals from kernel with a background thread
54- handler_thread = Thread (target = self .handler )
55- handler_thread .daemon = True
56- handler_thread .start ()
54+ self . handler_thread = Thread (target = self .handler )
55+ self . handler_thread .daemon = True
56+ self . handler_thread .start ()
5757
5858 '''
5959 Structure to create/remove virtual interfaces
@@ -177,9 +177,14 @@ def remove_multicast_route(self, kernel_entry: KernelEntry):
177177 raise NotImplementedError
178178
179179 @abstractmethod
180- def exit (self ):
180+ def close_socket (self ):
181181 raise NotImplementedError
182182
183+ def exit (self ):
184+ self .running = False
185+ self .close_socket ()
186+ self .handler_thread .join ()
187+
183188 @abstractmethod
184189 def handler (self ):
185190 raise NotImplementedError
@@ -412,12 +417,15 @@ def remove_multicast_route(self, kernel_entry: KernelEntry):
412417 if len (self .routing [kernel_entry .source_ip ]) == 0 :
413418 self .routing .pop (kernel_entry .source_ip )
414419
415- def exit (self ):
416- self .running = False
420+ def close_socket (self ):
421+ with socket .socket (socket .AF_INET , socket .SOCK_RAW , socket .IPPROTO_IGMP ) as s :
422+ s .sendto (b'' , ('' , 0 ))
423+ self .socket .close ()
417424
425+ def exit (self ):
418426 # MRT DONE
419427 self .socket .setsockopt (socket .IPPROTO_IP , self .MRT_DONE , 1 )
420- self . socket . close ()
428+ super (). exit ()
421429
422430
423431 '''
@@ -660,12 +668,15 @@ def remove_multicast_route(self, kernel_entry: KernelEntry):
660668 if len (self .routing [kernel_entry .source_ip ]) == 0 :
661669 self .routing .pop (kernel_entry .source_ip )
662670
663- def exit (self ):
664- self .running = False
671+ def close_socket (self ):
672+ with socket .socket (socket .AF_INET6 , socket .SOCK_RAW , socket .IPPROTO_ICMPV6 ) as s :
673+ s .sendto (b'0000' , ('' , 0 ))
674+ self .socket .close ()
665675
676+ def exit (self ):
666677 # MRT DONE
667678 self .socket .setsockopt (socket .IPPROTO_IPV6 , self .MRT6_DONE , 1 )
668- self . socket . close ()
679+ super (). exit ()
669680
670681 '''
671682 /*
0 commit comments