Skip to content

Commit 6191069

Browse files
committed
Add connection info
1 parent 2a7b85d commit 6191069

File tree

2 files changed

+69
-2
lines changed
  • fortanix-vme

2 files changed

+69
-2
lines changed

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ pub enum Request {
3030
Close {
3131
enclave_port: u32,
3232
},
33+
Info {
34+
enclave_port: u32,
35+
runner_port: Option<u32>,
36+
},
3337
}
3438

3539
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
@@ -92,6 +96,18 @@ pub enum Response {
9296
proxy_port: u32,
9397
},
9498
Closed,
99+
Info {
100+
/// The local address (as used by the runner)
101+
local: Addr,
102+
/// The address of the remote party for open connection, None for server sockets
103+
peer: Option<Addr>,
104+
},
105+
Failed(Error),
106+
}
107+
108+
#[derive(Debug, PartialEq, Eq, Serialize, Deserialize)]
109+
pub enum Error {
110+
ConnectionNotFound,
95111
}
96112

97113
#[cfg(test)]

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

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ 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;
1111
use 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};
1313
use vsock::{self, SockAddr as VsockAddr, Std, Vsock, VsockListener, VsockStream};
1414

1515
const PROXY_BUFF_SIZE: usize = 4192;
@@ -98,6 +98,10 @@ struct Connection {
9898

9999
#[derive(Clone, Debug)]
100100
struct 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

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

Comments
 (0)