@@ -8,10 +8,9 @@ use std::thread::{self, JoinHandle};
88use std:: io:: { self , Error as IoError , ErrorKind as IoErrorKind , Read , Write } ;
99use std:: net:: { Shutdown , TcpListener , TcpStream } ;
1010use std:: os:: unix:: io:: AsRawFd ;
11- use std:: os:: unix:: prelude:: RawFd ;
1211use std:: sync:: { Arc , Mutex } ;
13- use fortanix_vme_abi:: { self , Response , Request } ;
14- use vsock:: { self , Std , Vsock , VsockListener , VsockStream } ;
12+ use fortanix_vme_abi:: { self , Addr , Response , Request } ;
13+ use vsock:: { self , SockAddr as VsockAddr , Std , Vsock , VsockListener , VsockStream } ;
1514
1615const PROXY_BUFF_SIZE : usize = 4192 ;
1716
@@ -80,10 +79,14 @@ impl StreamConnection for VsockStream {
8079 }
8180}
8281
83- struct ListenerInfo {
82+ struct Listener {
8483 listener : TcpListener ,
85- enclave_cid : u32 ,
86- enclave_port : u32 ,
84+ }
85+
86+ impl Listener {
87+ fn new ( listener : TcpListener ) -> Self {
88+ Listener { listener }
89+ }
8790}
8891
8992pub struct Server {
@@ -93,7 +96,7 @@ pub struct Server {
9396 /// When the enclave instructs to accept a new connection, the runner accepts a new TCP
9497 /// connection. It then locates the ListenerInfo and finds the information it needs to set up a
9598 /// new vsock connection to the enclave
96- listeners : Mutex < FnvHashMap < RawFd , Arc < Mutex < ListenerInfo > > > > ,
99+ listeners : Mutex < FnvHashMap < VsockAddr , Arc < Mutex < Listener > > > > ,
97100}
98101
99102impl Server {
@@ -210,14 +213,12 @@ impl Server {
210213 Ok ( ( ) )
211214 }
212215
213- fn add_listener_info ( & self , info : ListenerInfo ) -> RawFd {
214- let fd = info. listener . as_raw_fd ( ) ;
215- self . listeners . lock ( ) . unwrap ( ) . insert ( fd, Arc :: new ( Mutex :: new ( info) ) ) ;
216- fd
216+ fn add_listener ( & self , addr : VsockAddr , info : Listener ) {
217+ self . listeners . lock ( ) . unwrap ( ) . insert ( addr, Arc :: new ( Mutex :: new ( info) ) ) ;
217218 }
218219
219- fn listener_info ( & self , fd : & RawFd ) -> Option < Arc < Mutex < ListenerInfo > > > {
220- self . listeners . lock ( ) . unwrap ( ) . get ( & fd ) . cloned ( )
220+ fn listener ( & self , addr : & VsockAddr ) -> Option < Arc < Mutex < Listener > > > {
221+ self . listeners . lock ( ) . unwrap ( ) . get ( & addr ) . cloned ( )
221222 }
222223
223224 /*
@@ -246,9 +247,9 @@ impl Server {
246247 fn handle_request_bind ( & self , addr : & String , enclave_port : u32 , enclave : & mut VsockStream ) -> Result < ( ) , IoError > {
247248 let cid: u32 = enclave. peer ( ) . unwrap ( ) . parse ( ) . unwrap_or ( vsock:: VMADDR_CID_HYPERVISOR ) ;
248249 let listener = TcpListener :: bind ( addr) ?;
249- let local = listener. local_addr ( ) ?. into ( ) ;
250- let fd = self . add_listener_info ( ListenerInfo { listener , enclave_cid : cid, enclave_port } ) ;
251- let response = Response :: Bound { local, fd } ;
250+ let local: Addr = listener. local_addr ( ) ?. into ( ) ;
251+ self . add_listener ( VsockAddr :: new ( cid, enclave_port) , Listener :: new ( listener ) ) ;
252+ let response = Response :: Bound { local } ;
252253 Self :: log_communication (
253254 "runner" ,
254255 enclave. local_port ( ) . unwrap_or_default ( ) ,
@@ -261,12 +262,14 @@ impl Server {
261262 Ok ( ( ) )
262263 }
263264
264- fn handle_request_accept ( & self , fd : RawFd , enclave : & mut VsockStream ) -> Result < ( ) , IoError > {
265- let listener_info = self . listener_info ( & fd)
265+ fn handle_request_accept ( & self , vsock_listener_port : u32 , enclave : & mut VsockStream ) -> Result < ( ) , IoError > {
266+ let enclave_cid: u32 = enclave. peer ( ) . unwrap ( ) . parse ( ) . unwrap_or ( vsock:: VMADDR_CID_HYPERVISOR ) ;
267+ let enclave_addr = VsockAddr :: new ( enclave_cid, vsock_listener_port) ;
268+ let listener = self . listener ( & enclave_addr)
266269 . ok_or ( IoError :: new ( IoErrorKind :: InvalidInput , "Information about provided file descriptor was not found" ) ) ?;
267- let listener_info = listener_info . lock ( ) . unwrap ( ) ;
268- let ( cid , port ) = ( listener_info . enclave_cid , listener_info . enclave_port ) ;
269- match listener_info . listener . accept ( ) {
270+ let listener = listener . lock ( ) . unwrap ( ) ;
271+
272+ match listener . listener . accept ( ) {
270273 Ok ( ( mut conn, peer) ) => {
271274 let vsock = Vsock :: new :: < Std > ( ) ?;
272275 let response = Response :: IncomingConnection {
@@ -284,7 +287,7 @@ impl Server {
284287 "vsock" ) ;
285288 enclave. write ( & serde_cbor:: ser:: to_vec ( & response) . unwrap ( ) ) ?;
286289 let _ = thread:: Builder :: new ( ) . spawn ( move || {
287- let mut proxy = vsock. connect_with_cid_port ( cid, port) . unwrap ( ) ;
290+ let mut proxy = vsock. connect_with_cid_port ( enclave_addr . cid ( ) , enclave_addr . port ( ) ) . unwrap ( ) ;
288291 Self :: proxy_connection ( ( & mut conn, "remote" ) , ( & mut proxy, "proxy" ) ) ;
289292 } ) ;
290293 Ok ( ( ) )
@@ -336,7 +339,7 @@ impl Server {
336339 match Self :: read_request ( stream) {
337340 Ok ( Request :: Connect { addr } ) => self . handle_request_connect ( & addr, stream) ?,
338341 Ok ( Request :: Bind { addr, enclave_port } ) => self . handle_request_bind ( & addr, enclave_port, stream) ?,
339- Ok ( Request :: Accept { fd } ) => self . handle_request_accept ( fd , stream) ?,
342+ Ok ( Request :: Accept { enclave_port } ) => self . handle_request_accept ( enclave_port , stream) ?,
340343 Err ( _e) => return Err ( IoError :: new ( IoErrorKind :: InvalidData , "Failed to read request" ) ) ,
341344 } ;
342345 Ok ( ( ) )
0 commit comments