diff --git a/Cargo.lock b/Cargo.lock
index 0784362ddd..8b97ab3f0a 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -6776,6 +6776,7 @@ dependencies = [
"thiserror",
"tokio",
"tokio-tun",
+ "tokio-util",
"url",
]
diff --git a/common/ip-packet-requests/src/lib.rs b/common/ip-packet-requests/src/lib.rs
index 616357dedd..fc97d13042 100644
--- a/common/ip-packet-requests/src/lib.rs
+++ b/common/ip-packet-requests/src/lib.rs
@@ -2,7 +2,7 @@ pub mod codec;
pub mod request;
pub mod response;
-pub const CURRENT_VERSION: u8 = 2;
+pub const CURRENT_VERSION: u8 = 3;
fn make_bincode_serializer() -> impl bincode::Options {
use bincode::Options;
diff --git a/common/ip-packet-requests/src/request.rs b/common/ip-packet-requests/src/request.rs
index 68a95e0c4b..282617002e 100644
--- a/common/ip-packet-requests/src/request.rs
+++ b/common/ip-packet-requests/src/request.rs
@@ -74,10 +74,10 @@ impl IpPacketRequest {
)
}
- pub fn new_ip_packet(ip_packet: bytes::Bytes) -> Self {
+ pub fn new_data_request(ip_packets: bytes::Bytes) -> Self {
Self {
version: CURRENT_VERSION,
- data: IpPacketRequestData::Data(DataRequest { ip_packet }),
+ data: IpPacketRequestData::Data(DataRequest { ip_packets }),
}
}
@@ -164,7 +164,7 @@ pub struct DisconnectRequest {
// A data request is when the client wants to send an IP packet to a destination.
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
pub struct DataRequest {
- pub ip_packet: bytes::Bytes,
+ pub ip_packets: bytes::Bytes,
}
#[cfg(test)]
@@ -193,7 +193,7 @@ mod tests {
let data = IpPacketRequest {
version: 4,
data: IpPacketRequestData::Data(DataRequest {
- ip_packet: bytes::Bytes::from(vec![1u8; 32]),
+ ip_packets: bytes::Bytes::from(vec![1u8; 32]),
}),
};
assert_eq!(data.to_bytes().unwrap().len(), 35);
@@ -204,7 +204,7 @@ mod tests {
let data = IpPacketRequest {
version: 4,
data: IpPacketRequestData::Data(DataRequest {
- ip_packet: bytes::Bytes::from(vec![1, 2, 4, 2, 5]),
+ ip_packets: bytes::Bytes::from(vec![1, 2, 4, 2, 5]),
}),
};
@@ -221,7 +221,7 @@ mod tests {
assert_eq!(
deserialized.data,
IpPacketRequestData::Data(DataRequest {
- ip_packet: bytes::Bytes::from(vec![1, 2, 4, 2, 5]),
+ ip_packets: bytes::Bytes::from(vec![1, 2, 4, 2, 5]),
})
);
}
diff --git a/service-providers/ip-packet-router/Cargo.toml b/service-providers/ip-packet-router/Cargo.toml
index 1b3355af9a..39f3e33e48 100644
--- a/service-providers/ip-packet-router/Cargo.toml
+++ b/service-providers/ip-packet-router/Cargo.toml
@@ -40,6 +40,7 @@ serde_json = { workspace = true }
tap.workspace = true
thiserror = { workspace = true }
tokio = { workspace = true, features = ["rt-multi-thread", "net", "io-util"] }
+tokio-util = { workspace = true, features = ["codec"] }
url.workspace = true
[target.'cfg(target_os = "linux")'.dependencies]
diff --git a/service-providers/ip-packet-router/src/mixnet_listener.rs b/service-providers/ip-packet-router/src/mixnet_listener.rs
index 43a9191172..eb1510c1fc 100644
--- a/service-providers/ip-packet-router/src/mixnet_listener.rs
+++ b/service-providers/ip-packet-router/src/mixnet_listener.rs
@@ -3,8 +3,10 @@ use std::{
net::{IpAddr, SocketAddr},
};
+use bytes::{Bytes, BytesMut};
use futures::StreamExt;
use nym_ip_packet_requests::{
+ codec::MultiIpPacketCodec,
request::{IpPacketRequest, IpPacketRequestData},
response::{
DynamicConnectFailureReason, ErrorResponseReply, IpPacketResponse,
@@ -17,6 +19,7 @@ use nym_task::TaskHandle;
use tap::TapFallible;
#[cfg(target_os = "linux")]
use tokio::io::AsyncWriteExt;
+use tokio_util::codec::Decoder;
use crate::{
config::Config,
@@ -218,6 +221,8 @@ impl Drop for ConnectedClient {
}
}
+type PacketHandleResult = Result