@@ -9,7 +9,7 @@ use std::io::{self, Error as IoError, ErrorKind as IoErrorKind, Read, Write};
99use std:: net:: { Shutdown , TcpListener , TcpStream } ;
1010use std:: os:: unix:: io:: AsRawFd ;
1111use std:: sync:: { Arc , Mutex , RwLock } ;
12- use fortanix_vme_abi:: { self , Addr , Response , Request } ;
12+ use fortanix_vme_abi:: { self , Addr , Error as VmeError , Response , Request } ;
1313use vsock:: { self , SockAddr as VsockAddr , Std , Vsock , VsockListener , VsockStream } ;
1414
1515const PROXY_BUFF_SIZE : usize = 4192 ;
@@ -98,6 +98,10 @@ struct Connection {
9898
9999#[ derive( Clone , Debug ) ]
100100struct ConnectionInfo {
101+ /// The local address (as used by the runner)
102+ local : Addr ,
103+ /// The address of the remote party for open connection, None for server sockets
104+ peer : Addr ,
101105}
102106
103107impl Connection {
@@ -110,7 +114,10 @@ impl Connection {
110114 }
111115
112116 pub fn info ( & self ) -> ConnectionInfo {
113- ConnectionInfo { }
117+ ConnectionInfo {
118+ local : self . tcp_stream . local_addr ( ) . unwrap ( ) . into ( ) ,
119+ peer : self . tcp_stream . peer_addr ( ) . unwrap ( ) . into ( ) ,
120+ }
114121 }
115122
116123 /// Exchanges messages between the remote server and enclave. Returns on error, or when one of
@@ -439,11 +446,55 @@ impl Server {
439446 Ok ( ( ) )
440447 }
441448
449+ fn handle_request_info ( self : Arc < Self > , enclave_port : u32 , runner_port : Option < u32 > , enclave : & mut VsockStream ) -> Result < ( ) , IoError > {
450+ let enclave_cid: u32 = enclave. peer ( ) . unwrap ( ) . parse ( ) . unwrap_or ( vsock:: VMADDR_CID_HYPERVISOR ) ;
451+ let enclave_addr = VsockAddr :: new ( enclave_cid, enclave_port) ;
452+ let response = if let Some ( runner_port) = runner_port {
453+ // We're looking for a Connection
454+ let runner_cid: u32 = enclave. local ( ) . unwrap ( ) . parse ( ) . unwrap_or ( vsock:: VMADDR_CID_HYPERVISOR ) ;
455+ let runner_addr = VsockAddr :: new ( runner_cid, runner_port) ;
456+ if let Some ( connection) = self . connection ( enclave_addr, runner_addr) {
457+ Response :: Info {
458+ local : connection. local . clone ( ) ,
459+ peer : Some ( connection. peer . clone ( ) ) ,
460+ }
461+ } else {
462+ // Connection not found
463+ Response :: Failed ( VmeError :: ConnectionNotFound )
464+ }
465+ } else {
466+ // We're looking for a Listener
467+ if let Some ( listener) = self . listener ( & enclave_addr) {
468+ let listener = listener. lock ( ) . unwrap ( ) ;
469+ Response :: Info {
470+ local : listener. listener . local_addr ( ) ?. into ( ) ,
471+ peer : None ,
472+ }
473+ } else {
474+ // Listener not found
475+ Response :: Failed ( VmeError :: ConnectionNotFound )
476+ }
477+ } ;
478+ Self :: log_communication (
479+ "runner" ,
480+ enclave. local_port ( ) . unwrap_or_default ( ) ,
481+ "enclave" ,
482+ enclave. peer_port ( ) . unwrap_or_default ( ) ,
483+ & format ! ( "{:?}" , & response) ,
484+ Direction :: Right ,
485+ "vsock" ) ;
486+ enclave. write ( & serde_cbor:: ser:: to_vec ( & response) . unwrap ( ) ) ?;
487+ Ok ( ( ) )
488+ }
489+
442490 fn handle_client ( self : Arc < Self > , stream : & mut VsockStream ) -> Result < ( ) , IoError > {
443491 match Self :: read_request ( stream) {
444492 Ok ( Request :: Connect { addr } ) => self . handle_request_connect ( & addr, stream) ?,
445493 Ok ( Request :: Bind { addr, enclave_port } ) => self . handle_request_bind ( & addr, enclave_port, stream) ?,
446494 Ok ( Request :: Accept { enclave_port } ) => self . handle_request_accept ( enclave_port, stream) ?,
495+ Ok ( Request :: Info {
496+ enclave_port,
497+ runner_port } ) => self . handle_request_info ( enclave_port, runner_port, stream) ?,
447498 Ok ( Request :: Close { enclave_port } ) => self . handle_request_close ( enclave_port, stream) ?,
448499 Err ( _e) => return Err ( IoError :: new ( IoErrorKind :: InvalidData , "Failed to read request" ) ) ,
449500 } ;
0 commit comments