diff --git a/common/ip-packet-requests/src/request.rs b/common/ip-packet-requests/src/request.rs index 346d4c32d4..d962f10737 100644 --- a/common/ip-packet-requests/src/request.rs +++ b/common/ip-packet-requests/src/request.rs @@ -91,6 +91,7 @@ impl IpPacketRequest { IpPacketRequestData::DynamicConnect(request) => Some(request.request_id), IpPacketRequestData::Disconnect(request) => Some(request.request_id), IpPacketRequestData::Data(_) => None, + IpPacketRequestData::Ping(request) => Some(request.request_id), } } @@ -100,6 +101,7 @@ impl IpPacketRequest { IpPacketRequestData::DynamicConnect(request) => Some(&request.reply_to), IpPacketRequestData::Disconnect(request) => Some(&request.reply_to), IpPacketRequestData::Data(_) => None, + IpPacketRequestData::Ping(request) => Some(&request.reply_to), } } @@ -123,6 +125,7 @@ pub enum IpPacketRequestData { DynamicConnect(DynamicConnectRequest), Disconnect(DisconnectRequest), Data(DataRequest), + Ping(PingRequest), } // A static connect request is when the client provides the internal IP address it will use on the @@ -186,6 +189,14 @@ pub struct DataRequest { pub ip_packets: bytes::Bytes, } +// A ping request is when the client wants to check if the ip packet router is still alive. +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +pub struct PingRequest { + pub request_id: u64, + // The nym-address the response should be sent back to + pub reply_to: Recipient, +} + #[cfg(test)] mod tests { use super::*; diff --git a/common/ip-packet-requests/src/response.rs b/common/ip-packet-requests/src/response.rs index dff327350c..5c50bd715e 100644 --- a/common/ip-packet-requests/src/response.rs +++ b/common/ip-packet-requests/src/response.rs @@ -147,6 +147,7 @@ impl IpPacketResponse { IpPacketResponseData::Disconnect(response) => Some(response.request_id), IpPacketResponseData::UnrequestedDisconnect(_) => None, IpPacketResponseData::Data(_) => None, + IpPacketResponseData::Pong(response) => Some(response.request_id), IpPacketResponseData::Error(response) => Some(response.request_id), } } @@ -158,6 +159,7 @@ impl IpPacketResponse { IpPacketResponseData::Disconnect(response) => Some(&response.reply_to), IpPacketResponseData::UnrequestedDisconnect(response) => Some(&response.reply_to), IpPacketResponseData::Data(_) => None, + IpPacketResponseData::Pong(response) => Some(&response.reply_to), IpPacketResponseData::Error(response) => Some(&response.reply_to), } } @@ -193,6 +195,9 @@ pub enum IpPacketResponseData { // Response to a data request Data(DataResponse), + // Response to ping request + Pong(PongResponse), + // Error response Error(ErrorResponse), } @@ -308,6 +313,12 @@ pub struct DataResponse { pub ip_packet: bytes::Bytes, } +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct PongResponse { + pub request_id: u64, + pub reply_to: Recipient, +} + #[derive(Clone, Debug, Serialize, Deserialize)] pub struct ErrorResponse { pub request_id: u64, diff --git a/service-providers/ip-packet-router/src/mixnet_listener.rs b/service-providers/ip-packet-router/src/mixnet_listener.rs index 7cbe7dc23c..95d668b83e 100644 --- a/service-providers/ip-packet-router/src/mixnet_listener.rs +++ b/service-providers/ip-packet-router/src/mixnet_listener.rs @@ -529,6 +529,10 @@ impl MixnetListener { Ok(vec![self.on_disconnect_request(disconnect_request)]) } IpPacketRequestData::Data(data_request) => self.on_data_request(data_request).await, + IpPacketRequestData::Ping(_) => { + log::info!("Received ping request: not implemented, dropping"); + Ok(vec![]) + } } }