Skip to content

Commit

Permalink
Renet: correctly calculate small packet size for unreliable channels
Browse files Browse the repository at this point in the history
  • Loading branch information
lucaspoffo committed May 29, 2023
1 parent 0c6311c commit 6d65002
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 3 deletions.
28 changes: 28 additions & 0 deletions renet/src/channel/reliable.rs
Original file line number Diff line number Diff line change
Expand Up @@ -363,6 +363,8 @@ impl ReceiveChannelReliable {

#[cfg(test)]
mod tests {
use octets::OctetsMut;

use super::*;

#[test]
Expand Down Expand Up @@ -523,4 +525,30 @@ mod tests {
let packets = send.get_packets_to_send(&mut sequence, &mut available_bytes, current_time);
assert_eq!(packets.len(), 0);
}

#[test]
fn small_packet_max_size() {
let mut sequence: u64 = 0;
let current_time: Duration = Duration::ZERO;
let mut available_bytes = u64::MAX;
let resend_time = Duration::from_millis(100);
let mut send = SendChannelReliable::new(0, resend_time, usize::MAX);

// 4 bytes
let message: Bytes = vec![0, 1, 2, 3].into();

// (4 + 1 + 2) * 300 = 2100 = 2 packets
for _ in 0..300 {
send.send_message(message.clone()).unwrap();
}

let packets = send.get_packets_to_send(&mut sequence, &mut available_bytes, current_time);
assert_eq!(packets.len(), 2);
let mut buffer = [0u8; 1400];
for packet in packets {
let mut oct = OctetsMut::with_slice(&mut buffer);
let len = packet.to_bytes(&mut oct).unwrap();
assert!(len < 1300);
}
}
}
31 changes: 29 additions & 2 deletions renet/src/channel/unreliable.rs
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,8 @@ impl SendChannelUnreliable {

self.sliced_message_id += 1;
} else {
if small_messages_bytes + message.len() > SLICE_SIZE {
let serialized_size = message.len() + octets::varint_len(message.len() as u64);
if small_messages_bytes + serialized_size > SLICE_SIZE {
packets.push(Packet::SmallUnreliable {
sequence: *packet_sequence,
channel_id: self.channel_id,
Expand All @@ -89,7 +90,7 @@ impl SendChannelUnreliable {
small_messages_bytes = 0;
}

small_messages_bytes += message.len();
small_messages_bytes += serialized_size;
small_messages.push(message);
}
}
Expand Down Expand Up @@ -210,6 +211,8 @@ impl ReceiveChannelUnreliable {

#[cfg(test)]
mod tests {
use octets::OctetsMut;

use super::*;

#[test]
Expand Down Expand Up @@ -337,4 +340,28 @@ mod tests {
let packets = send.get_packets_to_send(&mut sequence, &mut available_bytes);
assert_eq!(packets.len(), 0);
}

#[test]
fn small_packet_max_size() {
let mut sequence: u64 = 0;
let mut available_bytes = u64::MAX;
let mut send = SendChannelUnreliable::new(0, usize::MAX);

// 4 bytes
let message: Bytes = vec![0, 1, 2, 3].into();

// (4 + 1) * 400 = 2000 = 2 packets
for _ in 0..400 {
send.send_message(message.clone());
}

let packets = send.get_packets_to_send(&mut sequence, &mut available_bytes);
assert_eq!(packets.len(), 2);
let mut buffer = [0u8; 1400];
for packet in packets {
let mut oct = OctetsMut::with_slice(&mut buffer);
let len = packet.to_bytes(&mut oct).unwrap();
assert!(len < 1300);
}
}
}
2 changes: 1 addition & 1 deletion renet/src/packet.rs
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,7 @@ impl Packet {

let payload = b.get_bytes_with_varint_length()?;

if payload.len() == 0 {
if payload.is_empty() {
return Err(SerializationError::EmptySlice);
}

Expand Down

0 comments on commit 6d65002

Please sign in to comment.