From 751c8abc0649ce777f081505b6eebcb09bf2224a Mon Sep 17 00:00:00 2001 From: Spacebot Date: Fri, 17 Jul 2026 08:17:35 +0000 Subject: [PATCH 1/6] Update Rust crate tokio to v1.53.0 --- Cargo.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bd7dfe2..90aa616 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1366,7 +1366,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -1985,7 +1985,7 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2 0.6.3", + "socket2 0.5.10", "tokio", "tower-service", "tracing", @@ -3293,7 +3293,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -4046,7 +4046,7 @@ dependencies = [ "getrandom 0.4.2", "once_cell", "rustix", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -4147,9 +4147,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.52.3" +version = "1.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" +checksum = "d988bcd52dbe076d3d46903332f58c912b87a2c49b1428419a5845154762ffee" dependencies = [ "bytes", "libc", @@ -4796,7 +4796,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] From a8fdbeb02578b3ece7d75063b74becdb2155ad6e Mon Sep 17 00:00:00 2001 From: Maple Nebel Date: Sat, 18 Jul 2026 01:12:27 +0200 Subject: [PATCH 2/6] implement incoming fragmented packets for v0 and v1 --- prudpv0/src/server.rs | 13 +++++++++++-- prudpv1/src/prudp/socket.rs | 21 ++++++++++++++++++--- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/prudpv0/src/server.rs b/prudpv0/src/server.rs index 96b6416..006988c 100644 --- a/prudpv0/src/server.rs +++ b/prudpv0/src/server.rs @@ -38,6 +38,7 @@ pub struct InternalConnection { server_packet_counter: u16, client_packet_counter: u16, unacknowledged_packets: HashMap>>, + packet_buffer: Vec, packet_queue: HashMap>)>, } pub struct Connection { @@ -282,6 +283,7 @@ impl Server { server_packet_counter: 1, unacknowledged_packets: HashMap::new(), packet_queue: HashMap::new(), + packet_buffer: vec![], }), }); @@ -368,9 +370,16 @@ impl Server { }; conn.crypto_instance.decrypt_incoming(payload); - - res.target.send(payload.to_owned()).await; + conn.packet_buffer.extend_from_slice(payload); conn.client_packet_counter += 1; + if packet.fragment_id().unwrap() != 0 { + info!("handeling fragmented packet"); + continue; + } + + res.target + .send(std::mem::take(&mut conn.packet_buffer)) + .await; } info!("finished handeling packets, dropping inner connection"); drop(conn); diff --git a/prudpv1/src/prudp/socket.rs b/prudpv1/src/prudp/socket.rs index 57f4ce4..a051033 100644 --- a/prudpv1/src/prudp/socket.rs +++ b/prudpv1/src/prudp/socket.rs @@ -50,6 +50,7 @@ struct InternalConnection { socket: Arc, packet_queue: HashMap, last_packet_time: Instant, + partial_packet: Vec, unacknowleged_packets: Vec<(Instant, PRUDPV1Packet)>, } @@ -431,6 +432,7 @@ impl InternalSocket { packet_queue: Default::default(), last_packet_time: Instant::now(), unacknowleged_packets: Vec::new(), + partial_packet: Vec::new(), supported_function_version, }; @@ -573,11 +575,24 @@ impl InternalSocket { while let Some(mut packet) = conn.packet_queue.remove(&counter) { conn.crypto_handler_instance .decrypt_incoming(packet.header.substream_id, &mut packet.payload[..]); - - conn.data_sender.send(packet.payload).await.ok(); - + conn.partial_packet + .extend_from_slice(&mut packet.payload[..]); conn.reliable_client_counter = conn.reliable_client_counter.overflowing_add(1).0; counter = conn.reliable_client_counter; + if packet.options.iter().any(|v| { + if let FragmentId(f) = v { + *f != 0 + } else { + false + } + }) { + println!("handeling fragmented packet"); + continue; + } + + let packet = std::mem::take(&mut conn.partial_packet); + + conn.data_sender.send(packet).await.ok(); } } From 40cdec017c70f8a8ea43cb2ee1b6296eb504af08 Mon Sep 17 00:00:00 2001 From: Maple Nebel Date: Sat, 18 Jul 2026 01:24:58 +0200 Subject: [PATCH 3/6] fix compilation error --- prudpv0/src/server.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prudpv0/src/server.rs b/prudpv0/src/server.rs index 006988c..757129c 100644 --- a/prudpv0/src/server.rs +++ b/prudpv0/src/server.rs @@ -372,7 +372,7 @@ impl Server { conn.crypto_instance.decrypt_incoming(payload); conn.packet_buffer.extend_from_slice(payload); conn.client_packet_counter += 1; - if packet.fragment_id().unwrap() != 0 { + if *packet.fragment_id().unwrap() != 0 { info!("handeling fragmented packet"); continue; } From e6520d99ec23f43c802888d097c9e761fe7de71b Mon Sep 17 00:00:00 2001 From: Maple Nebel Date: Sat, 18 Jul 2026 22:55:26 +0200 Subject: [PATCH 4/6] add packet resending on unacknowledged packet --- prudpv0/src/server.rs | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/prudpv0/src/server.rs b/prudpv0/src/server.rs index 757129c..3c790cb 100644 --- a/prudpv0/src/server.rs +++ b/prudpv0/src/server.rs @@ -97,7 +97,7 @@ impl Server { .expect("packet malformed in creation"), );*/ let mut inner = conn.inner.lock().await; - let pieces = data.chunks(700); + let pieces = data.chunks(962); let max_piece = pieces.len() - 1; let mut frag_num = 1; for (i, piece) in pieces.enumerate() { @@ -141,9 +141,18 @@ impl Server { .send_to(&data, conn.addr.regular_socket_addr) .await .ok(); - - break; + sleep(Duration::from_millis(500)).await; } + println!("connection exceeded max fail count, disconnecting"); + let Some(conn) = conn.upgrade() else { + return; + }; + let Some(this) = this.upgrade() else { + return; + }; + let mut conns = this.connections.write().await; + conns.remove(&(conn.addr, conn.session_id)); + drop(conns); }); frag_num += 1; } @@ -336,6 +345,13 @@ impl Server { warn!("data packet on inactive connection from: {:?}", addr); return; }; + + if header.type_flags.get_flags() & ACK != 0 { + let mut inner = res.inner.lock().await; + inner.unacknowledged_packets.remove(&header.sequence_id); + return; + } + info!("frag: {}", frag_id); let mut conn = res.inner.lock().await; let ack = new_data_packet( @@ -481,8 +497,8 @@ impl Server { inner.last_action = Instant::now(); drop(inner); }; - if header.type_flags.get_flags() & ACK != 0 { - info!("got ack(acks are ignored for now)"); + if header.type_flags.get_flags() & ACK != 0 && header.type_flags.get_types() != DATA { + info!("got ack(acks are ignored for now(unless they are data acks))"); return; } println!("{:?}", header); From 9b2287a3f03bec1548c79ac4f569e1c3fd2ea435 Mon Sep 17 00:00:00 2001 From: Maple Nebel Date: Sun, 19 Jul 2026 00:28:07 +0200 Subject: [PATCH 5/6] adjustments to aggregate acknowledgement --- prudpv1/src/prudp/socket.rs | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/prudpv1/src/prudp/socket.rs b/prudpv1/src/prudp/socket.rs index a051033..0059882 100644 --- a/prudpv1/src/prudp/socket.rs +++ b/prudpv1/src/prudp/socket.rs @@ -705,19 +705,7 @@ impl AnyInternalSocket for InternalSocket { let conn = &**conn; let mut conn = conn.lock().await; - if conn.supported_function_version == 1 { - let mut collected_ids: Vec = Vec::new(); - let mut cursor = Cursor::new(&packet.payload); - - while let Ok(v) = read_u16(&mut cursor) { - collected_ids.push(v); - } - - conn.unacknowleged_packets.retain_mut(|(_, up)| { - !(collected_ids.iter().any(|id| up.header.sequence_id == *id) - || up.header.sequence_id <= packet.header.sequence_id) - }); - } else { + if packet.header.substream_id == 1 { let mut collected_ids: Vec = Vec::new(); let mut cursor = Cursor::new(&packet.payload); @@ -744,10 +732,22 @@ impl AnyInternalSocket for InternalSocket { collected_ids.push(additional_sequence_id); } - conn.unacknowleged_packets.retain_mut(|(_, up)| { + conn.unacknowleged_packets.retain(|(_, up)| { !(collected_ids.iter().any(|id| up.header.sequence_id == *id) || up.header.sequence_id <= sequence_id) }); + } else { + let mut collected_ids: Vec = Vec::new(); + let mut cursor = Cursor::new(&packet.payload); + + while let Ok(v) = read_u16(&mut cursor) { + collected_ids.push(v); + } + + conn.unacknowleged_packets.retain(|(_, up)| { + !(collected_ids.iter().any(|id| up.header.sequence_id == *id) + || up.header.sequence_id <= packet.header.sequence_id) + }); } } else { error!("non connection acknowledgement packet on nonexistent connection...") From 7eb71a6d6ed5ff5e5536fc130f43ee1c17085fe0 Mon Sep 17 00:00:00 2001 From: Spacebot Date: Mon, 20 Jul 2026 17:48:48 +0000 Subject: [PATCH 6/6] Update Rust crate tokio to v1.53.1 --- Cargo.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bd7dfe2..3e74005 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1366,7 +1366,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -1985,7 +1985,7 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2 0.6.3", + "socket2 0.5.10", "tokio", "tower-service", "tracing", @@ -3293,7 +3293,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -4046,7 +4046,7 @@ dependencies = [ "getrandom 0.4.2", "once_cell", "rustix", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -4147,9 +4147,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.52.3" +version = "1.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" +checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed" dependencies = [ "bytes", "libc", @@ -4796,7 +4796,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]]