implement incoming fragmented packets for v0 and v1
Some checks failed
Build and Test / friends (push) Failing after 12m31s
Build and Test / mario-tennis (push) Has been cancelled
Build and Test / wii-u-chat (push) Has been cancelled
Build and Test / puyopuyo (push) Has been cancelled
Build and Test / wii-sports-club (push) Has been cancelled
Build and Test / minecraft-wiiu (push) Has been cancelled
Build and Test / fast-racing-neo (push) Has been cancelled
Build and Test / splatoon-testfire (push) Has been cancelled
Build and Test / splatoon (push) Has been cancelled
Build and Test / sonic-transformed (push) Has been cancelled
Build and Test / super-mario-maker (push) Has been cancelled

This commit is contained in:
Maple Nebel 2026-07-18 01:12:27 +02:00
commit a8fdbeb025
2 changed files with 29 additions and 5 deletions

View file

@ -38,6 +38,7 @@ pub struct InternalConnection<C: CryptoInstance> {
server_packet_counter: u16,
client_packet_counter: u16,
unacknowledged_packets: HashMap<u16, Arc<Vec<u8>>>,
packet_buffer: Vec<u8>,
packet_queue: HashMap<u16, (Instant, PRUDPV0Packet<Vec<u8>>)>,
}
pub struct Connection<C: CryptoInstance> {
@ -282,6 +283,7 @@ impl<C: Crypto> Server<C> {
server_packet_counter: 1,
unacknowledged_packets: HashMap::new(),
packet_queue: HashMap::new(),
packet_buffer: vec![],
}),
});
@ -368,9 +370,16 @@ impl<C: Crypto> Server<C> {
};
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);

View file

@ -50,6 +50,7 @@ struct InternalConnection<E: CryptoHandlerConnectionInstance> {
socket: Arc<UdpSocket>,
packet_queue: HashMap<u16, PRUDPV1Packet>,
last_packet_time: Instant,
partial_packet: Vec<u8>,
unacknowleged_packets: Vec<(Instant, PRUDPV1Packet)>,
}
@ -431,6 +432,7 @@ impl<T: CryptoHandler> InternalSocket<T> {
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<T: CryptoHandler> InternalSocket<T> {
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();
}
}