Skip to content

Commit c203721

Browse files
authored
Merge pull request #362 from fortanix/raoul/PLAT-397-refactor_tcp_listeners
[PLAT-397] Refactoring keeping track of `TcpListeners`
2 parents 8484295 + ffecdff commit c203721

File tree

3 files changed

+32
-30
lines changed

3 files changed

+32
-30
lines changed

Cargo.lock

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

fortanix-vme/fortanix-vme-abi/src/lib.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,13 @@ pub enum Request {
1919
Bind {
2020
/// The address the listen to in the parent VM
2121
addr: String,
22-
/// The port the enclave is listening on to receive connections from the parent VM
22+
/// The port the enclave is listening on to receive connections from the parent VM. This
23+
/// port will also be used to reference the connection
2324
enclave_port: u32,
2425
},
2526
Accept {
26-
fd: i32,
27+
/// The Vsock port the enclave is listening on
28+
enclave_port: u32,
2729
}
2830
}
2931

@@ -76,9 +78,6 @@ pub enum Response {
7678
Bound {
7779
/// The local TCP address the parent VM is listening on
7880
local: Addr,
79-
/// The id used to identify the listener. It can be used for subsequent calls (e.g., to
80-
/// accept new incoming connections)
81-
fd: i32,
8281
},
8382
IncomingConnection {
8483
/// The local address (as used by the runner)

fortanix-vme/fortanix-vme-runner/src/lib.rs

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,9 @@ use std::thread::{self, JoinHandle};
88
use std::io::{self, Error as IoError, ErrorKind as IoErrorKind, Read, Write};
99
use std::net::{Shutdown, TcpListener, TcpStream};
1010
use std::os::unix::io::AsRawFd;
11-
use std::os::unix::prelude::RawFd;
1211
use 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

1615
const 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

8992
pub 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

99102
impl 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

Comments
 (0)