From b21346064eff53a2e090bea5b00ac93441c0ce67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Wed, 7 Feb 2024 10:18:23 +0100 Subject: [PATCH] Add disconnect request/response for the future --- common/ip-packet-requests/src/request.rs | 24 +++++++++++++++++++ common/ip-packet-requests/src/response.rs | 24 +++++++++++++++++++ .../ip-packet-router/src/mixnet_listener.rs | 11 +++++++++ 3 files changed, 59 insertions(+) diff --git a/common/ip-packet-requests/src/request.rs b/common/ip-packet-requests/src/request.rs index f6bc485d0d..9900ce3784 100644 --- a/common/ip-packet-requests/src/request.rs +++ b/common/ip-packet-requests/src/request.rs @@ -60,6 +60,20 @@ impl IpPacketRequest { ) } + pub fn new_disconnect_request(reply_to: Recipient) -> (Self, u64) { + let request_id = generate_random(); + ( + Self { + version: CURRENT_VERSION, + data: IpPacketRequestData::Disconnect(DisconnectRequest { + request_id, + reply_to, + }), + }, + request_id, + ) + } + pub fn new_ip_packet(ip_packet: bytes::Bytes) -> Self { Self { version: CURRENT_VERSION, @@ -71,6 +85,7 @@ impl IpPacketRequest { match &self.data { IpPacketRequestData::StaticConnect(request) => Some(request.request_id), IpPacketRequestData::DynamicConnect(request) => Some(request.request_id), + IpPacketRequestData::Disconnect(request) => Some(request.request_id), IpPacketRequestData::Data(_) => None, } } @@ -79,6 +94,7 @@ impl IpPacketRequest { match &self.data { IpPacketRequestData::StaticConnect(request) => Some(&request.reply_to), IpPacketRequestData::DynamicConnect(request) => Some(&request.reply_to), + IpPacketRequestData::Disconnect(request) => Some(&request.reply_to), IpPacketRequestData::Data(_) => None, } } @@ -101,6 +117,7 @@ impl IpPacketRequest { pub enum IpPacketRequestData { StaticConnect(StaticConnectRequest), DynamicConnect(DynamicConnectRequest), + Disconnect(DisconnectRequest), Data(DataRequest), } @@ -131,6 +148,13 @@ pub struct DynamicConnectRequest { pub reply_to_avg_mix_delays: Option, } +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +pub struct DisconnectRequest { + pub request_id: u64, + // The nym-address the response should be sent back to + pub reply_to: Recipient, +} + #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] pub struct DataRequest { pub ip_packet: bytes::Bytes, diff --git a/common/ip-packet-requests/src/response.rs b/common/ip-packet-requests/src/response.rs index 2703f6aec2..053d8552b6 100644 --- a/common/ip-packet-requests/src/response.rs +++ b/common/ip-packet-requests/src/response.rs @@ -105,6 +105,7 @@ impl IpPacketResponse { match &self.data { IpPacketResponseData::StaticConnect(response) => Some(response.request_id), IpPacketResponseData::DynamicConnect(response) => Some(response.request_id), + IpPacketResponseData::Disconnect(response) => Some(response.request_id), IpPacketResponseData::Data(_) => None, IpPacketResponseData::Error(response) => Some(response.request_id), } @@ -114,6 +115,7 @@ impl IpPacketResponse { match &self.data { IpPacketResponseData::StaticConnect(response) => Some(&response.reply_to), IpPacketResponseData::DynamicConnect(response) => Some(&response.reply_to), + IpPacketResponseData::Disconnect(response) => Some(&response.reply_to), IpPacketResponseData::Data(_) => None, IpPacketResponseData::Error(response) => Some(&response.reply_to), } @@ -137,6 +139,7 @@ impl IpPacketResponse { pub enum IpPacketResponseData { StaticConnect(StaticConnectResponse), DynamicConnect(DynamicConnectResponse), + Disconnect(DisconnectResponse), Data(DataResponse), Error(ErrorResponse), } @@ -210,6 +213,27 @@ pub enum DynamicConnectFailureReason { Other(String), } +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct DisconnectResponse { + pub request_id: u64, + pub reply_to: Recipient, + pub reply: DisconnectResponseReply, +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub enum DisconnectResponseReply { + Success, + Failure(DisconnectFailureReason), +} + +#[derive(Clone, Debug, Serialize, Deserialize, thiserror::Error)] +pub enum DisconnectFailureReason { + #[error("requested nym-address is not currently connected")] + RequestedNymAddressNotConnected, + #[error("{0}")] + Other(String), +} + #[derive(Clone, Debug, Serialize, Deserialize)] pub struct DataResponse { pub ip_packet: bytes::Bytes, diff --git a/service-providers/ip-packet-router/src/mixnet_listener.rs b/service-providers/ip-packet-router/src/mixnet_listener.rs index 3edc2d2123..0031683e53 100644 --- a/service-providers/ip-packet-router/src/mixnet_listener.rs +++ b/service-providers/ip-packet-router/src/mixnet_listener.rs @@ -305,6 +305,14 @@ impl MixnetListener { ))) } + fn on_disconnect_request( + &self, + _disconnect_request: nym_ip_packet_requests::request::DisconnectRequest, + ) -> Result> { + log::info!("Received disconnect request: not implemented, dropping"); + Ok(None) + } + async fn on_data_request( &mut self, data_request: nym_ip_packet_requests::request::DataRequest, @@ -411,6 +419,9 @@ impl MixnetListener { IpPacketRequestData::DynamicConnect(connect_request) => { self.on_dynamic_connect_request(connect_request).await } + IpPacketRequestData::Disconnect(disconnect_request) => { + self.on_disconnect_request(disconnect_request) + } IpPacketRequestData::Data(data_request) => self.on_data_request(data_request).await, } }