@@ -313,6 +313,10 @@ impl Server {
313313 self . listeners . read ( ) . unwrap ( ) . get ( & addr) . cloned ( )
314314 }
315315
316+ fn remove_listener ( & self , addr : & VsockAddr ) -> Option < Arc < Mutex < Listener > > > {
317+ self . listeners . write ( ) . unwrap ( ) . remove ( & addr)
318+ }
319+
316320 // Preliminary work for PLAT-367
317321 #[ allow( dead_code) ]
318322 fn connection ( & self , enclave : VsockAddr , runner : VsockAddr ) -> Option < ConnectionInfo > {
@@ -413,11 +417,34 @@ impl Server {
413417 }
414418 }
415419
420+ fn handle_request_close ( self : Arc < Self > , enclave_port : u32 , enclave : & mut VsockStream ) -> Result < ( ) , IoError > {
421+ let cid: u32 = enclave. peer ( ) . unwrap ( ) . parse ( ) . unwrap_or ( vsock:: VMADDR_CID_HYPERVISOR ) ;
422+ let addr = VsockAddr :: new ( cid, enclave_port) ;
423+ if let Some ( listener) = self . remove_listener ( & addr) {
424+ // Close `TcpListener`
425+ drop ( listener) ;
426+ } else {
427+ // Info not found, possibly not a listener socket
428+ }
429+ let response = Response :: Closed ;
430+ Self :: log_communication (
431+ "runner" ,
432+ enclave. local_port ( ) . unwrap_or_default ( ) ,
433+ "enclave" ,
434+ enclave. peer_port ( ) . unwrap_or_default ( ) ,
435+ & format ! ( "{:?}" , & response) ,
436+ Direction :: Right ,
437+ "vsock" ) ;
438+ enclave. write ( & serde_cbor:: ser:: to_vec ( & response) . unwrap ( ) ) ?;
439+ Ok ( ( ) )
440+ }
441+
416442 fn handle_client ( self : Arc < Self > , stream : & mut VsockStream ) -> Result < ( ) , IoError > {
417443 match Self :: read_request ( stream) {
418444 Ok ( Request :: Connect { addr } ) => self . handle_request_connect ( & addr, stream) ?,
419445 Ok ( Request :: Bind { addr, enclave_port } ) => self . handle_request_bind ( & addr, enclave_port, stream) ?,
420446 Ok ( Request :: Accept { enclave_port } ) => self . handle_request_accept ( enclave_port, stream) ?,
447+ Ok ( Request :: Close { enclave_port } ) => self . handle_request_close ( enclave_port, stream) ?,
421448 Err ( _e) => return Err ( IoError :: new ( IoErrorKind :: InvalidData , "Failed to read request" ) ) ,
422449 } ;
423450 Ok ( ( ) )
0 commit comments