1use crate::sequence::{self, ReliableWindow};
2
3use std::{
4 collections::{HashMap, VecDeque},
5 net::SocketAddr,
6 sync::{
7 Arc,
8 atomic::{AtomicUsize, Ordering},
9 },
10};
11
12use crate::{datatype::*, error::*, fragment::FragmentQ, raknet_log_debug, utils::*};
13
14pub(crate) type OutgoingFrames = Vec<FrameSetPacket>;
15
16#[derive(Clone, Copy, Debug, PartialEq, Eq)]
18#[repr(u8)]
19pub enum Reliability {
20 Unreliable = 0x00,
22 UnreliableSequenced = 0x01,
24 Reliable = 0x02,
26 ReliableOrdered = 0x03,
28 ReliableSequenced = 0x04,
30}
31
32impl Reliability {
33 pub fn to_u8(&self) -> u8 {
34 *self as u8
35 }
36
37 pub fn from(flags: u8) -> Result<Self> {
38 Self::try_from(flags)
39 }
40}
41
42impl TryFrom<u8> for Reliability {
43 type Error = RaknetError;
44
45 fn try_from(flags: u8) -> Result<Self> {
46 match flags {
47 0x00 => Ok(Self::Unreliable),
48 0x01 => Ok(Self::UnreliableSequenced),
49 0x02 => Ok(Self::Reliable),
50 0x03 => Ok(Self::ReliableOrdered),
51 0x04 => Ok(Self::ReliableSequenced),
52 _ => Err(RaknetError::IncorrectReliability),
53 }
54 }
55}
56
57const NEEDS_B_AND_AS_FLAG: u8 = 0x4;
58const CONTINUOUS_SEND_FLAG: u8 = 0x8;
59
60#[derive(Clone, Debug)]
63pub(crate) enum FramePayload {
64 Owned(Vec<u8>),
65 Shared {
66 owner: Arc<[u8]>,
67 start: u32,
68 length: u16,
69 },
70}
71
72impl Default for FramePayload {
73 fn default() -> Self {
74 Self::Owned(Vec::new())
75 }
76}
77
78impl FramePayload {
79 fn copy_shared(data: &[u8]) -> Self {
80 Self::Shared {
81 owner: Arc::from(data),
82 start: 0,
83 length: data.len() as u16,
84 }
85 }
86}
87
88impl std::ops::Deref for FramePayload {
89 type Target = [u8];
90 fn deref(&self) -> &[u8] {
91 match self {
92 Self::Owned(data) => data,
93 Self::Shared {
94 owner,
95 start,
96 length,
97 } => &owner[*start as usize..*start as usize + usize::from(*length)],
98 }
99 }
100}
101
102impl AsRef<[u8]> for FramePayload {
103 fn as_ref(&self) -> &[u8] {
104 self
105 }
106}
107
108impl From<Vec<u8>> for FramePayload {
109 fn from(data: Vec<u8>) -> Self {
110 Self::Owned(data)
111 }
112}
113
114impl From<FramePayload> for Vec<u8> {
115 fn from(data: FramePayload) -> Self {
116 match data {
117 FramePayload::Owned(data) => data,
118 shared => shared.to_vec(),
119 }
120 }
121}
122
123impl PartialEq for FramePayload {
124 fn eq(&self, other: &Self) -> bool {
125 self.as_ref() == other.as_ref()
126 }
127}
128
129struct SharedPayload {
132 remaining: AtomicUsize,
133 bytes: usize,
134}
135
136#[derive(Clone)]
137pub struct FrameSetPacket {
138 pub sequence_number: u32,
139 pub flags: u8,
140 pub length_in_bytes: u16,
141 pub reliable_frame_index: u32,
142 pub sequenced_frame_index: u32,
143 pub ordered_frame_index: u32,
144 pub order_channel: u8,
145 pub compound_size: u32,
146 pub compound_id: u16,
147 pub fragment_index: u32,
148 pub data: FramePayload,
149 shared_payload: Option<Arc<SharedPayload>>,
150}
151
152impl FrameSetPacket {
153 pub fn new(r: Reliability, data: Vec<u8>) -> Self {
154 Self::from_payload(r, data.into())
155 }
156
157 fn from_payload(r: Reliability, data: FramePayload) -> Self {
158 let flag = r.to_u8() << 5;
159
160 Self {
161 sequence_number: 0,
162 flags: flag,
163 length_in_bytes: data.len() as u16,
164 reliable_frame_index: 0,
165 sequenced_frame_index: 0,
166 ordered_frame_index: 0,
167 order_channel: 0,
168 compound_size: 0,
169 compound_id: 0,
170 fragment_index: 0,
171 data,
172 shared_payload: None,
173 }
174 }
175
176 #[cfg(test)]
177 pub fn deserialize(buf: &[u8]) -> Result<(Self, bool)> {
178 let mut reader = RaknetReader::new(buf);
179 let input_len = buf.len() as u64;
180
181 let mut ret = Self {
182 sequence_number: 0,
183 flags: 0,
184 length_in_bytes: 0,
185 reliable_frame_index: 0,
186 sequenced_frame_index: 0,
187 ordered_frame_index: 0,
188 order_channel: 0,
189 compound_size: 0,
190 compound_id: 0,
191 fragment_index: 0,
192 data: FramePayload::default(),
193 shared_payload: None,
194 };
195
196 let packet_id = reader.read_u8()?;
197 if !(0x80..=0x8d).contains(&packet_id) {
198 return Err(RaknetError::PacketHeaderError);
199 }
200 ret.sequence_number = reader.read_u24(Endian::Little)?;
201 ret.flags = reader.read_u8()?;
202
203 let length_in_bits = reader.read_u16(Endian::Big)?;
204 if length_in_bits % 8 != 0 {
205 return Err(RaknetError::PacketParseError);
206 }
207 ret.length_in_bytes = length_in_bits / 8;
208
209 if ret.is_reliable()? {
210 ret.reliable_frame_index = reader.read_u24(Endian::Little)?;
211 }
212
213 if ret.is_sequenced()? {
214 ret.sequenced_frame_index = reader.read_u24(Endian::Little)?;
215 }
216 if ret.is_ordered()? {
217 ret.ordered_frame_index = reader.read_u24(Endian::Little)?;
218 ret.order_channel = reader.read_u8()?;
219 }
220
221 if ret.is_fragment() {
222 ret.compound_size = reader.read_u32(Endian::Big)?;
223 ret.compound_id = reader.read_u16(Endian::Big)?;
224 ret.fragment_index = reader.read_u32(Endian::Big)?;
225 }
226
227 let mut data = vec![0; usize::from(ret.length_in_bytes)];
228 reader.read(&mut data)?;
229 ret.data = data.into();
230
231 if ret.is_fragment() && (ret.compound_size == 0 || ret.fragment_index >= ret.compound_size)
232 {
233 return Err(RaknetError::PacketParseError);
234 }
235
236 Ok((ret, reader.pos() == input_len))
237 }
238
239 pub fn serialize(&self) -> Result<Vec<u8>> {
240 let mut buffer = Vec::new();
241 self.serialize_into(&mut buffer)?;
242 Ok(buffer)
243 }
244
245 pub(crate) fn serialize_into(&self, buffer: &mut Vec<u8>) -> Result<()> {
246 self.validate()?;
247 let size = self._size()?;
248 buffer.clear();
249 buffer.reserve(size);
250 let mut writer = RaknetWriter::from_buffer(std::mem::take(buffer));
251 let result = self
252 .write_header(&mut writer)
253 .and_then(|()| writer.write(self.data.as_ref()));
254 *buffer = writer.get_raw_payload();
255 result
256 }
257
258 pub(crate) fn validate(&self) -> Result<()> {
259 if self.data.len() != usize::from(self.length_in_bytes)
260 || self.data.len() > usize::from(u16::MAX / 8)
261 || (self.is_fragment()
262 && (self.compound_size == 0 || self.fragment_index >= self.compound_size))
263 {
264 return Err(RaknetError::PacketParseError);
265 }
266
267 self._size()?;
268 Ok(())
269 }
270
271 pub(crate) fn encode_header(&self, header: &mut [u8; 32]) -> Result<usize> {
272 self.validate()?;
273 let mut writer = RaknetWriter::from_buffer(header.as_mut_slice());
274 self.write_header(&mut writer)?;
275 Ok(32 - writer.remaining_mut())
276 }
277
278 fn write_header<B: bytes::BufMut>(&self, writer: &mut RaknetWriter<B>) -> Result<()> {
279 let mut id = 0x80 | NEEDS_B_AND_AS_FLAG;
280
281 if (self.flags & 16) != 0 && self.fragment_index != 0 {
283 id |= CONTINUOUS_SEND_FLAG;
284 }
285
286 writer.write_u8(id)?;
287 writer.write_u24(self.sequence_number, Endian::Little)?;
288
289 writer.write_u8(self.flags)?;
291 writer.write_u16(self.length_in_bytes * 8, Endian::Big)?;
292
293 if self.is_reliable()? {
294 writer.write_u24(self.reliable_frame_index, Endian::Little)?;
295 }
296
297 if self.is_sequenced()? {
298 writer.write_u24(self.sequenced_frame_index, Endian::Little)?;
299 }
300 if self.is_ordered()? {
301 writer.write_u24(self.ordered_frame_index, Endian::Little)?;
302 writer.write_u8(self.order_channel)?;
303 }
304
305 if (self.flags & 16) != 0 {
307 writer.write_u32(self.compound_size, Endian::Big)?;
308 writer.write_u16(self.compound_id, Endian::Big)?;
309 writer.write_u32(self.fragment_index, Endian::Big)?;
310 }
311 Ok(())
312 }
313
314 pub fn is_fragment(&self) -> bool {
315 (self.flags & 16) != 0
316 }
317
318 pub fn is_reliable(&self) -> Result<bool> {
319 let r = Reliability::from((self.flags & 224) >> 5)?;
320 Ok(matches!(
321 r,
322 Reliability::Reliable | Reliability::ReliableOrdered | Reliability::ReliableSequenced
323 ))
324 }
325
326 pub fn is_ordered(&self) -> Result<bool> {
327 let r = Reliability::from((self.flags & 224) >> 5)?;
328 Ok(matches!(
329 r,
330 Reliability::UnreliableSequenced
331 | Reliability::ReliableOrdered
332 | Reliability::ReliableSequenced
333 ))
334 }
335
336 pub fn is_sequenced(&self) -> Result<bool> {
337 let r = Reliability::from((self.flags & 224) >> 5)?;
338 Ok(matches!(
339 r,
340 Reliability::UnreliableSequenced | Reliability::ReliableSequenced
341 ))
342 }
343 pub fn reliability(&self) -> Result<Reliability> {
344 Reliability::from((self.flags & 224) >> 5)
345 }
346
347 pub fn _size(&self) -> Result<usize> {
348 let mut ret = 0;
349 ret += 1;
351 ret += 3;
353 ret += 1;
355 ret += 2;
357
358 if self.is_reliable()? {
359 ret += 3;
361 }
362 if self.is_sequenced()? {
363 ret += 3;
365 }
366 if self.is_ordered()? {
367 ret += 4;
369 }
370 if (self.flags & 16) != 0 {
371 ret += 10;
373 }
374 ret += self.data.len();
376 Ok(ret)
377 }
378}
379
380pub struct FrameVec {
381 #[cfg(test)]
382 pub frames: Vec<FrameSetPacket>,
383}
384
385impl FrameVec {
386 #[cfg(test)]
387 pub fn new(buf: &[u8]) -> Result<Self> {
388 let mut frames = Vec::new();
389 Self::decode_into(buf, &mut frames)?;
390 Ok(Self { frames })
391 }
392
393 pub(crate) fn decode_into(buf: &[u8], frames: &mut Vec<FrameSetPacket>) -> Result<()> {
395 Self::decode(buf, frames, false)
396 }
397
398 pub(crate) fn decode_owned_into(
399 mut buf: Vec<u8>,
400 frames: &mut Vec<FrameSetPacket>,
401 ) -> Result<()> {
402 Self::decode(&buf, frames, true)?;
403 if let [frame] = frames.as_mut_slice() {
404 let length = usize::from(frame.length_in_bytes);
407 let offset = buf.len() - length;
408 buf.copy_within(offset.., 0);
409 buf.truncate(length);
410 frame.data = buf.into();
411 }
412 Ok(())
413 }
414
415 fn decode(buf: &[u8], frames: &mut Vec<FrameSetPacket>, owned: bool) -> Result<()> {
416 frames.clear();
417 let mut reader = RaknetReader::new(buf);
418 let id = reader.read_u8()?;
419 if !(0x80..=0x8d).contains(&id) {
420 return Err(RaknetError::PacketHeaderError);
421 }
422 let sequence_number = reader.read_u24(Endian::Little)?;
423 if reader.pos() == buf.len() as u64 {
424 return Err(RaknetError::PacketParseError);
425 }
426 while reader.pos() < buf.len() as u64 {
427 let mut frame = FrameSetPacket {
428 sequence_number,
429 flags: 0,
430 length_in_bytes: 0,
431 reliable_frame_index: 0,
432 sequenced_frame_index: 0,
433 ordered_frame_index: 0,
434 order_channel: 0,
435 compound_size: 0,
436 compound_id: 0,
437 fragment_index: 0,
438 data: FramePayload::default(),
439 shared_payload: None,
440 };
441
442 frame.flags = reader.read_u8()?;
443 let length_in_bits = reader.read_u16(Endian::Big)?;
444 if length_in_bits % 8 != 0 {
445 return Err(RaknetError::PacketParseError);
446 }
447 frame.length_in_bytes = length_in_bits / 8;
448
449 if frame.is_reliable()? {
450 frame.reliable_frame_index = reader.read_u24(Endian::Little)?;
451 }
452 if frame.is_sequenced()? {
453 frame.sequenced_frame_index = reader.read_u24(Endian::Little)?;
454 }
455 if frame.is_ordered()? {
456 frame.ordered_frame_index = reader.read_u24(Endian::Little)?;
457 frame.order_channel = reader.read_u8()?;
458 }
459 if frame.is_fragment() {
460 frame.compound_size = reader.read_u32(Endian::Big)?;
461 frame.compound_id = reader.read_u16(Endian::Big)?;
462 frame.fragment_index = reader.read_u32(Endian::Big)?;
463 if frame.compound_size == 0 || frame.fragment_index >= frame.compound_size {
464 return Err(RaknetError::PacketParseError);
465 }
466 }
467
468 let data = reader.read_slice(usize::from(frame.length_in_bytes))?;
469 if !owned || !frames.is_empty() || reader.pos() != buf.len() as u64 {
472 frame.data = data.to_vec().into();
473 }
474 frames.push(frame);
475 }
476
477 Ok(())
478 }
479}
480
481#[derive(Default)]
482pub struct ACKSet {
483 ack: Vec<(u32, u32)>,
484 nack: Vec<(u32, u32)>,
485 next_expected: u32,
486}
487
488impl ACKSet {
489 pub fn insert(&mut self, s: u32) {
490 let mut split = None;
492 self.nack.retain_mut(|(start, end)| {
493 if s < *start || s > *end {
494 return true;
495 }
496 if *start == *end {
497 return false;
498 }
499 if s == *start {
500 *start += 1;
501 } else if s == *end {
502 *end -= 1;
503 } else {
504 split = Some((s + 1, *end));
505 *end = s - 1;
506 }
507 true
508 });
509 if let Some(range) = split {
510 self.nack.push(range);
511 }
512 if s == self.next_expected || sequence::newer(s, self.next_expected) {
513 if s != self.next_expected {
514 if s > self.next_expected {
515 self.nack.push((self.next_expected, s - 1));
516 } else {
517 self.nack.push((self.next_expected, sequence::MASK));
518 if s != 0 {
519 self.nack.push((0, s - 1));
520 }
521 }
522 }
523 self.next_expected = sequence::next(s);
524 }
525
526 for i in 0..self.ack.len() {
527 let a = self.ack[i];
528 if (a.0..=a.1).contains(&s) {
529 return;
530 }
531 if a.0 != 0 && s == a.0 - 1 {
532 self.ack[i].0 = s;
533 return;
534 }
535 if s == a.1.saturating_add(1) {
536 self.ack[i].1 = s;
537 return;
538 }
539 }
540 self.ack.push((s, s));
541 }
542
543 pub fn get_ack(&mut self) -> Vec<(u32, u32)> {
544 std::mem::take(&mut self.ack)
545 }
546
547 pub fn get_nack(&mut self) -> Vec<(u32, u32)> {
548 std::mem::take(&mut self.nack)
549 }
550}
551
552#[derive(Default)]
554struct ChannelIndexes {
555 primary: u32,
556 others: HashMap<u8, u32>,
557}
558
559impl ChannelIndexes {
560 fn get(&self, channel: u8) -> u32 {
561 if channel == 0 {
562 self.primary
563 } else {
564 self.others.get(&channel).copied().unwrap_or(0)
565 }
566 }
567
568 fn get_mut(&mut self, channel: u8) -> &mut u32 {
569 if channel == 0 {
570 &mut self.primary
571 } else {
572 self.others.entry(channel).or_default()
573 }
574 }
575
576 #[cfg(test)]
577 fn insert(&mut self, channel: u8, index: u32) {
578 *self.get_mut(channel) = index;
579 }
580}
581
582#[derive(Default)]
583pub struct RecvQ {
584 sequenced_frame_indexes: ChannelIndexes,
585 last_ordered_indexes: ChannelIndexes,
586 sequence_number_ackset: ACKSet,
587 packets: HashMap<u32, FrameSetPacket>,
588 ordered_packets: HashMap<(u8, u32), FrameSetPacket>,
589 fragment_queue: FragmentQ,
590 reliable_window: ReliableWindow,
591 ordered_bytes: usize,
592 ready_ordered: Vec<FrameSetPacket>,
593 ready_bytes: usize,
594}
595
596impl RecvQ {
597 pub fn new() -> Self {
598 Self::default()
599 }
600
601 pub fn insert(&mut self, frame: FrameSetPacket) -> Result<()> {
602 let reliability = frame.reliability()?;
603 self.sequence_number_ackset.insert(frame.sequence_number);
604 if frame.is_reliable()? && !self.reliable_window.accept(frame.reliable_frame_index)? {
605 return Ok(());
606 }
607
608 match reliability {
609 Reliability::Unreliable => {
610 self.packets.entry(frame.sequence_number).or_insert(frame);
611 }
612 Reliability::UnreliableSequenced => {
613 let channel = frame.order_channel;
614 let sequence_index = frame.sequenced_frame_index;
615 let sequence_number = frame.sequence_number;
616 let last_index = self.sequenced_frame_indexes.get_mut(channel);
617 if sequence_index == *last_index || sequence::newer(sequence_index, *last_index) {
618 self.packets.entry(sequence_number).or_insert(frame);
619 *last_index = sequence::next(sequence_index);
620 }
621 }
622 Reliability::Reliable => {
623 self.packets.insert(frame.sequence_number, frame);
624 }
625 Reliability::ReliableOrdered => {
626 let expected_index = self.last_ordered_indexes.get(frame.order_channel);
627 if sequence::newer(expected_index, frame.ordered_frame_index) {
628 return Ok(());
629 }
630 if sequence::distance(frame.ordered_frame_index, expected_index)
631 >= sequence::RECEIVE_WINDOW
632 {
633 return Err(RaknetError::PacketParseError);
634 }
635 let complete = if frame.is_fragment() {
636 self.fragment_queue.insert_and_take_completed(frame)?
637 } else {
638 Some(frame)
639 };
640 if let Some(frame) = complete {
641 let key = (frame.order_channel, frame.ordered_frame_index);
642 if self.ordered_packets.contains_key(&key) {
643 return Ok(());
644 }
645 if self.ordered_packets.len() + self.ready_ordered.len()
646 >= sequence::RECEIVE_WINDOW as usize
647 || self.ordered_bytes + self.ready_bytes + frame.data.len()
648 > 64 * 1024 * 1024
649 {
650 return Err(RaknetError::PacketParseError);
651 }
652 if frame.ordered_frame_index == expected_index {
653 let channel = frame.order_channel;
654 self.ready_bytes += frame.data.len();
655 self.ready_ordered.push(frame);
656 let expected = self.last_ordered_indexes.get_mut(channel);
657 *expected = sequence::next(*expected);
658 while !self.ordered_packets.is_empty() {
660 let Some(frame) = self.ordered_packets.remove(&(channel, *expected))
661 else {
662 break;
663 };
664 self.ordered_bytes -= frame.data.len();
665 self.ready_bytes += frame.data.len();
666 self.ready_ordered.push(frame);
667 *expected = sequence::next(*expected);
668 }
669 } else {
670 self.ordered_bytes += frame.data.len();
671 self.ordered_packets.insert(key, frame);
672 }
673 }
674 }
675
676 Reliability::ReliableSequenced => {
677 let channel = frame.order_channel;
678 let sequence_index = frame.sequenced_frame_index;
679 let sequence_number = frame.sequence_number;
680 let last_index = self.sequenced_frame_indexes.get_mut(channel);
681 if sequence_index == *last_index || sequence::newer(sequence_index, *last_index) {
682 self.packets.entry(sequence_number).or_insert(frame);
683 *last_index = sequence::next(sequence_index);
684 }
685 }
686 }
687 Ok(())
688 }
689
690 pub fn get_ack(&mut self) -> Vec<(u32, u32)> {
691 self.sequence_number_ackset.get_ack()
692 }
693
694 pub fn get_nack(&mut self) -> Vec<(u32, u32)> {
695 self.sequence_number_ackset.get_nack()
696 }
697
698 #[cfg(test)]
699 pub fn flush(&mut self, _peer_addr: &SocketAddr) -> Vec<FrameSetPacket> {
700 let mut frames = Vec::new();
701 self.flush_into(&mut frames);
702 frames
703 }
704
705 pub(crate) fn flush_into(&mut self, frames: &mut Vec<FrameSetPacket>) {
706 frames.append(&mut self.ready_ordered);
707 self.ready_bytes = 0;
708 if self.packets.is_empty() {
709 return;
710 }
711 let mut packets: Vec<_> = self.packets.drain().map(|(_, frame)| frame).collect();
712 packets.sort_unstable_by_key(|frame| frame.sequence_number);
713 frames.extend(packets);
714 }
715 pub fn fragments_expired(&self) -> bool {
716 self.fragment_queue.expired()
717 }
718
719 pub fn get_ordered_packet(&self) -> usize {
720 self.ordered_packets.len() + self.ready_ordered.len()
721 }
722
723 pub fn get_fragment_queue_size(&self) -> usize {
724 self.fragment_queue.size()
725 }
726
727 pub fn get_ordered_keys(&self) -> Vec<(u8, u32)> {
728 self.ordered_packets.keys().copied().collect()
729 }
730
731 pub fn get_size(&self) -> usize {
732 self.packets.len()
733 }
734}
735
736pub struct SendQ {
737 mtu: u16,
738 ack_sequence_number: u32,
739 sequence_number: u32,
740 reliable_frame_index: u32,
741 sequenced_frame_indexes: ChannelIndexes,
742 ordered_frame_indexes: ChannelIndexes,
743 compound_id: u16,
744 packets: VecDeque<FrameSetPacket>,
746 queued_unreliable: usize,
747 buffered_bytes: usize,
748 rto: i64,
749 srtt: i64,
750 sent_packet: Vec<(FrameSetPacket, bool, i64, u32, Vec<u32>)>,
751 flight_order_dirty: bool,
752}
753
754impl SendQ {
755 pub const DEFAULT_TIMEOUT_MILLS: i64 = 50;
756 const MAX_IN_FLIGHT_PACKETS: usize = 64;
757 const MAX_BUFFERED_BYTES: usize = 64 * 1024 * 1024;
758 const SEND_HIGH_WATER: usize = 256 * 1024;
759 const FRAME_BUDGET: usize = 128;
760
761 const RTO_UBOUND: i64 = 12000;
762 const RTO_LBOUND: i64 = 50;
763
764 pub fn new(mtu: u16) -> Self {
765 Self {
766 mtu,
767 ack_sequence_number: sequence::MASK,
768 sequence_number: 0,
769 packets: VecDeque::new(),
770 queued_unreliable: 0,
771 buffered_bytes: 0,
772 sent_packet: vec![],
773 flight_order_dirty: false,
774 reliable_frame_index: 0,
775 sequenced_frame_indexes: ChannelIndexes::default(),
776 ordered_frame_indexes: ChannelIndexes::default(),
777 compound_id: 0,
778
779 rto: SendQ::DEFAULT_TIMEOUT_MILLS,
780 srtt: SendQ::DEFAULT_TIMEOUT_MILLS,
781 }
782 }
783
784 fn required_bytes(&self, reliability: Reliability, len: usize) -> Result<usize> {
785 let payload = usize::from(self.mtu)
786 .checked_sub(60)
787 .filter(|n| *n > 0)
788 .ok_or(RaknetError::PacketSizeExceedMTU)?;
789 let frames = if reliability == Reliability::ReliableOrdered && len > payload {
790 let frames = len.div_ceil(payload);
791 if frames > crate::fragment::MAX_FRAGMENTS {
792 return Err(RaknetError::PacketSizeExceedMTU);
793 }
794 frames
795 } else {
796 1
797 };
798 let bytes = frames
799 .checked_mul(Self::FRAME_BUDGET)
800 .and_then(|n| n.checked_add(len))
801 .filter(|n| *n <= Self::MAX_BUFFERED_BYTES)
802 .ok_or(RaknetError::PacketSizeExceedMTU)?;
803 Ok(bytes)
804 }
805
806 pub fn has_capacity(&self, reliability: Reliability, len: usize) -> Result<bool> {
807 let required = self.required_bytes(reliability, len)?;
808 Ok(self.buffered_bytes.saturating_add(required) <= Self::SEND_HIGH_WATER.max(required))
810 }
811
812 pub fn insert(&mut self, reliability: Reliability, buf: &[u8]) -> Result<()> {
813 self.insert_with_order_channel(reliability, buf, 0)
814 }
815
816 pub fn insert_with_order_channel(
817 &mut self,
818 reliability: Reliability,
819 buf: &[u8],
820 order_channel: u8,
821 ) -> Result<()> {
822 let reserved = self.required_bytes(reliability, buf.len())?;
823 if reserved > Self::MAX_BUFFERED_BYTES - self.buffered_bytes {
824 return Err(RaknetError::PacketSizeExceedMTU);
825 }
826 let max_payload = self
827 .mtu
828 .checked_sub(60)
829 .map(usize::from)
830 .filter(|size| *size > 0)
831 .ok_or(RaknetError::PacketSizeExceedMTU)?;
832
833 match reliability {
834 Reliability::Unreliable => {
835 if buf.len() > max_payload {
836 return Err(RaknetError::PacketSizeExceedMTU);
837 }
838
839 let frame = FrameSetPacket::new(reliability, buf.to_vec());
840 self.packets.push_back(frame);
841 }
842 Reliability::UnreliableSequenced => {
843 if buf.len() > max_payload {
844 return Err(RaknetError::PacketSizeExceedMTU);
845 }
846
847 let sequenced_frame_index = {
848 let index = self.sequenced_frame_indexes.get_mut(order_channel);
849 let current = *index;
850 *index = sequence::next(*index);
851 current
852 };
853 let ordered_frame_index = self.ordered_frame_indexes.get(order_channel);
854 let mut frame = FrameSetPacket::new(reliability, buf.to_vec());
855 frame.order_channel = order_channel;
856 frame.ordered_frame_index = ordered_frame_index;
857 frame.sequenced_frame_index = sequenced_frame_index;
858 self.packets.push_back(frame);
859 }
860 Reliability::Reliable => {
861 if buf.len() > max_payload {
862 return Err(RaknetError::PacketSizeExceedMTU);
863 }
864
865 let mut frame =
866 FrameSetPacket::from_payload(reliability, FramePayload::copy_shared(buf));
867 frame.reliable_frame_index = self.reliable_frame_index;
868 self.packets.push_back(frame);
869 self.reliable_frame_index = sequence::next(self.reliable_frame_index);
870 }
871 Reliability::ReliableOrdered => {
872 if buf.len() <= max_payload {
873 let mut frame =
874 FrameSetPacket::from_payload(reliability, FramePayload::copy_shared(buf));
875 frame.order_channel = order_channel;
876 frame.reliable_frame_index = self.reliable_frame_index;
877 frame.ordered_frame_index = *self.ordered_frame_indexes.get_mut(order_channel);
878 self.packets.push_back(frame);
879 self.reliable_frame_index = sequence::next(self.reliable_frame_index);
880 } else {
881 let compound_size = buf.len().div_ceil(max_payload);
882 let compound_size = u32::try_from(compound_size)
883 .map_err(|_| RaknetError::PacketSizeExceedMTU)?;
884 let ordered_frame_index = *self.ordered_frame_indexes.get_mut(order_channel);
885
886 let data: Arc<[u8]> = Arc::from(buf);
887 let shared_payload = Arc::new(SharedPayload {
888 remaining: AtomicUsize::new(compound_size as usize),
889 bytes: data.len(),
890 });
891 for (fragment_index, chunk) in buf.chunks(max_payload).enumerate() {
892 let start = fragment_index * max_payload;
893 let mut frame = FrameSetPacket::from_payload(
894 reliability,
895 FramePayload::Shared {
896 owner: data.clone(),
897 start: start as u32,
898 length: chunk.len() as u16,
899 },
900 );
901 frame.shared_payload = Some(shared_payload.clone());
902 frame.flags |= 16;
903 frame.compound_size = compound_size;
904 frame.compound_id = self.compound_id;
905 frame.fragment_index = fragment_index as u32;
906 frame.order_channel = order_channel;
907 frame.reliable_frame_index = self.reliable_frame_index;
908 frame.ordered_frame_index = ordered_frame_index;
909 self.packets.push_back(frame);
910 self.reliable_frame_index = sequence::next(self.reliable_frame_index);
911 }
912 self.compound_id = self.compound_id.wrapping_add(1);
913 }
914 let index = self.ordered_frame_indexes.get_mut(order_channel);
915 *index = sequence::next(*index);
916 }
917 Reliability::ReliableSequenced => {
918 if buf.len() > max_payload {
919 return Err(RaknetError::PacketSizeExceedMTU);
920 }
921
922 let sequenced_frame_index = {
923 let index = self.sequenced_frame_indexes.get_mut(order_channel);
924 let current = *index;
925 *index = sequence::next(*index);
926 current
927 };
928 let ordered_frame_index = self.ordered_frame_indexes.get(order_channel);
929 let mut frame =
930 FrameSetPacket::from_payload(reliability, FramePayload::copy_shared(buf));
931 frame.order_channel = order_channel;
932 frame.reliable_frame_index = self.reliable_frame_index;
933 frame.sequenced_frame_index = sequenced_frame_index;
934 frame.ordered_frame_index = ordered_frame_index;
935 self.packets.push_back(frame);
936 self.reliable_frame_index = sequence::next(self.reliable_frame_index);
937 }
938 };
939 self.buffered_bytes += reserved;
940 if matches!(
941 reliability,
942 Reliability::Unreliable | Reliability::UnreliableSequenced
943 ) {
944 self.queued_unreliable += 1;
945 }
946 Ok(())
947 }
948
949 fn update_rto(&mut self, rtt: i64) {
950 (self.srtt, self.rto) = Self::latency_sample(self.srtt, rtt);
951 }
952
953 fn latency_sample(srtt: i64, rtt: i64) -> (i64, i64) {
954 let srtt = (srtt * 4 + rtt) / 5;
955 (
956 srtt,
957 (srtt * 3 / 2).clamp(Self::RTO_LBOUND, Self::RTO_UBOUND),
958 )
959 }
960
961 pub fn get_rto(&self) -> i64 {
962 self.rto
963 }
964
965 pub fn nack(&mut self, sequence: u32, tick: i64) {
966 for i in 0..self.sent_packet.len() {
967 let item = &mut self.sent_packet[i];
968 if item.1 && item.0.sequence_number == sequence {
969 raknet_log_debug!(
970 "packet {}-{}-{} nack {} times",
971 item.0.sequence_number,
972 item.0.reliable_frame_index,
973 item.0.ordered_frame_index,
974 item.3 + 1
975 );
976 let previous = item.0.sequence_number;
977 self.flight_order_dirty = true;
978 item.0.sequence_number = self.sequence_number;
979 self.sequence_number = sequence::next(self.sequence_number);
980 item.1 = false;
981 item.2 = tick;
982
983 if item.4.len() == 64 {
984 item.4.remove(0);
985 }
986 item.4.push(previous);
987 }
988 }
989 }
990
991 pub fn ack(&mut self, sequence: u32, tick: i64) {
992 let Some(index) = self
994 .sent_packet
995 .iter()
996 .position(|item| item.0.sequence_number == sequence || item.4.contains(&sequence))
997 else {
998 return;
999 };
1000 let item = self.sent_packet.remove(index);
1001 let released_payload = match &item.0.shared_payload {
1002 Some(payload) if payload.remaining.fetch_sub(1, Ordering::Relaxed) == 1 => {
1003 payload.bytes
1004 }
1005 Some(_) => 0,
1006 None => item.0.data.len(),
1007 };
1008 self.buffered_bytes -= released_payload + Self::FRAME_BUDGET;
1009 if sequence::newer(sequence, self.ack_sequence_number) {
1010 let span = sequence::distance(sequence, self.ack_sequence_number);
1011 let missing: Vec<_> = self
1012 .sent_packet
1013 .iter()
1014 .filter_map(|item| {
1015 let distance =
1016 sequence::distance(item.0.sequence_number, self.ack_sequence_number);
1017 (distance > 0 && distance < span).then_some(item.0.sequence_number)
1018 })
1019 .collect();
1020 for id in missing {
1021 self.nack(id, tick);
1022 }
1023 self.ack_sequence_number = sequence;
1024 }
1025 if item.3 == 0 {
1027 self.update_rto(tick.saturating_sub(item.2).max(0));
1028 }
1029 }
1030
1031 pub fn ack_ranges(&mut self, ranges: &[(u32, u32)], tick: i64) {
1032 if let [(start, end)] = ranges {
1033 if start == end {
1034 self.ack(*start, tick);
1035 return;
1036 }
1037 }
1038 let previous = self.ack_sequence_number;
1041 let mut newest = previous;
1042 let mut latency = (self.srtt, self.rto);
1043 let mut released_bytes = 0;
1044 self.sent_packet.retain_mut(|item| {
1045 let acknowledged_id = std::iter::once(item.0.sequence_number)
1046 .chain(item.4.iter().copied())
1047 .find(|id| {
1048 ranges
1049 .iter()
1050 .any(|&(start, end)| start <= *id && *id <= end)
1051 });
1052 let Some(id) = acknowledged_id else {
1053 return true;
1054 };
1055 let payload_bytes = match &item.0.shared_payload {
1056 Some(payload) if payload.remaining.fetch_sub(1, Ordering::Relaxed) == 1 => {
1057 payload.bytes
1058 }
1059 Some(_) => 0,
1060 None => item.0.data.len(),
1061 };
1062 released_bytes += payload_bytes + Self::FRAME_BUDGET;
1063 if sequence::newer(id, newest) {
1064 newest = id;
1065 }
1066 if item.3 == 0 {
1067 latency = Self::latency_sample(latency.0, tick.saturating_sub(item.2).max(0));
1068 }
1069 false
1070 });
1071 self.buffered_bytes -= released_bytes;
1072
1073 (self.srtt, self.rto) = latency;
1074 if newest != previous {
1075 let span = sequence::distance(newest, previous);
1076 let missing: Vec<_> = self
1077 .sent_packet
1078 .iter()
1079 .filter_map(|item| {
1080 let distance = sequence::distance(item.0.sequence_number, previous);
1081 (distance > 0 && distance < span).then_some(item.0.sequence_number)
1082 })
1083 .collect();
1084 for id in missing {
1085 self.nack(id, tick);
1086 }
1087 self.ack_sequence_number = newest;
1088 }
1089 }
1090
1091 pub fn nack_ranges(&mut self, ranges: &[(u32, u32)], tick: i64) {
1092 if let [(start, end)] = ranges {
1093 if start == end {
1094 self.nack(*start, tick);
1095 return;
1096 }
1097 }
1098 let missing: Vec<_> = self
1099 .sent_packet
1100 .iter()
1101 .filter_map(|item| {
1102 let id = item.0.sequence_number;
1103 ranges
1104 .iter()
1105 .any(|&(start, end)| start <= id && id <= end)
1106 .then_some(id)
1107 })
1108 .collect();
1109 for id in missing {
1110 self.nack(id, tick);
1111 }
1112 }
1113
1114 fn tick(&mut self, tick: i64) {
1115 for i in 0..self.sent_packet.len() {
1116 let p = &mut self.sent_packet[i];
1117
1118 let mut cur_rto = self.rto;
1119
1120 for _ in 0..p.3.min(32) {
1122 cur_rto = ((cur_rto as f64 * 1.5) as i64).min(Self::RTO_UBOUND);
1123 }
1124
1125 if p.1 && tick - p.2 >= cur_rto {
1126 let previous = p.0.sequence_number;
1127 self.flight_order_dirty = true;
1128 p.0.sequence_number = self.sequence_number;
1129 self.sequence_number = sequence::next(self.sequence_number);
1130 p.1 = false;
1131 if p.4.len() == 64 {
1132 p.4.remove(0);
1133 }
1134 p.4.push(previous);
1135 }
1136 }
1137 }
1138
1139 pub fn flush(&mut self, tick: i64, peer_addr: &SocketAddr) -> OutgoingFrames {
1140 self.tick(tick);
1141
1142 let capacity = self.packets.len().min(
1145 Self::MAX_IN_FLIGHT_PACKETS.saturating_sub(self.sent_packet.len())
1146 + self.queued_unreliable,
1147 );
1148 let mut ret = OutgoingFrames::with_capacity(capacity);
1149 if self.flight_order_dirty {
1152 self.sent_packet
1153 .sort_unstable_by_key(|packet| packet.0.sequence_number);
1154 self.flight_order_dirty = false;
1155 }
1156
1157 for packet in &mut self.sent_packet {
1158 if !packet.1 {
1159 raknet_log_debug!(
1160 "{} , packet {}-{}-{} resend {} times",
1161 peer_addr,
1162 packet.0.sequence_number,
1163 packet.0.reliable_frame_index,
1164 packet.0.ordered_frame_index,
1165 packet.3 + 1
1166 );
1167 ret.push(packet.0.clone());
1168 packet.1 = true;
1169 packet.2 = tick;
1170 packet.3 = packet.3.saturating_add(1);
1171 }
1172 }
1173
1174 let queued_count = self.packets.len();
1175 for _ in 0..queued_count {
1176 if self.sent_packet.len() >= Self::MAX_IN_FLIGHT_PACKETS && self.queued_unreliable == 0
1177 {
1178 break;
1179 }
1180 let Some(mut packet) = self.packets.pop_front() else {
1181 break;
1182 };
1183 let reliable = packet.is_reliable().unwrap_or(false);
1184 if reliable && self.sent_packet.len() >= Self::MAX_IN_FLIGHT_PACKETS {
1185 self.packets.push_back(packet);
1186 continue;
1187 }
1188
1189 packet.sequence_number = self.sequence_number;
1190 self.sequence_number = sequence::next(self.sequence_number);
1191
1192 if reliable {
1193 ret.push(packet.clone());
1194 if self
1195 .sent_packet
1196 .last()
1197 .is_some_and(|previous| previous.0.sequence_number > packet.sequence_number)
1198 {
1199 self.flight_order_dirty = true;
1200 }
1201 self.sent_packet.push((packet, true, tick, 0, Vec::new()));
1202 } else {
1203 self.queued_unreliable -= 1;
1204 self.buffered_bytes -= packet.data.len() + Self::FRAME_BUDGET;
1205 ret.push(packet);
1206 }
1207 }
1208
1209 ret
1210 }
1211
1212 pub fn is_empty(&self) -> bool {
1213 self.packets.is_empty() && self.sent_packet.is_empty()
1214 }
1215
1216 pub fn get_reliable_queue_size(&self) -> usize {
1217 self.packets.len()
1218 }
1219
1220 pub fn get_sent_queue_size(&self) -> usize {
1221 self.sent_packet.len()
1222 }
1223}
1224
1225#[test]
1226fn malformed_datagrams_are_rejected() {
1227 assert!(FrameVec::new(&[0x80, 0, 0]).is_err());
1228 assert!(FrameVec::new(&[0x10, 0, 0, 0]).is_err());
1229}
1230
1231#[test]
1232fn send_queue_rejects_an_invalid_mtu() {
1233 let mut send_queue = SendQ::new(59);
1234 assert!(send_queue.insert(Reliability::Reliable, &[0xfe]).is_err());
1235}
1236
1237#[tokio::test]
1238async fn test_recvq_orders_channels_independently() {
1239 let mut recvq = RecvQ::new();
1240
1241 let mut later_on_channel_one = FrameSetPacket::new(Reliability::ReliableOrdered, vec![1]);
1242 later_on_channel_one.sequence_number = 0;
1243 later_on_channel_one.order_channel = 1;
1244 later_on_channel_one.ordered_frame_index = 1;
1245 recvq.insert(later_on_channel_one).unwrap();
1246
1247 let mut first_on_channel_two = FrameSetPacket::new(Reliability::ReliableOrdered, vec![2]);
1248 first_on_channel_two.sequence_number = 1;
1249 first_on_channel_two.reliable_frame_index = 1;
1250 first_on_channel_two.order_channel = 2;
1251 first_on_channel_two.ordered_frame_index = 0;
1252 recvq.insert(first_on_channel_two).unwrap();
1253
1254 let ready = recvq.flush(&"127.0.0.1:0".parse().unwrap());
1255 assert_eq!(ready.len(), 1);
1256 assert_eq!(ready[0].order_channel, 2);
1257
1258 let mut first_on_channel_one = FrameSetPacket::new(Reliability::ReliableOrdered, vec![0]);
1259 first_on_channel_one.sequence_number = 2;
1260 first_on_channel_one.reliable_frame_index = 2;
1261 first_on_channel_one.order_channel = 1;
1262 first_on_channel_one.ordered_frame_index = 0;
1263 recvq.insert(first_on_channel_one).unwrap();
1264
1265 let ready = recvq.flush(&"127.0.0.1:0".parse().unwrap());
1266 assert_eq!(ready.len(), 2);
1267 assert_eq!(ready[0].ordered_frame_index, 0);
1268 assert_eq!(ready[1].ordered_frame_index, 1);
1269 assert!(ready.iter().all(|frame| frame.order_channel == 1));
1270}
1271
1272#[tokio::test]
1273async fn test_sendq_maintains_ordered_indexes_per_channel() {
1274 let mut sendq = SendQ::new(1500);
1275 sendq
1276 .insert_with_order_channel(Reliability::ReliableOrdered, &[0xfe, 1], 3)
1277 .unwrap();
1278 sendq
1279 .insert_with_order_channel(Reliability::ReliableOrdered, &[0xfe, 2], 9)
1280 .unwrap();
1281
1282 let sent = sendq.flush(0, &"127.0.0.1:0".parse().unwrap());
1283 assert_eq!(sent.len(), 2);
1284 assert_eq!(sent[0].order_channel, 3);
1285 assert_eq!(sent[0].ordered_frame_index, 0);
1286 assert_eq!(sent[1].order_channel, 9);
1287 assert_eq!(sent[1].ordered_frame_index, 0);
1288}
1289
1290#[tokio::test]
1291async fn test_ackset() {
1292 let mut ackset = ACKSet::default();
1293
1294 ackset.insert(0);
1295 ackset.insert(1);
1296 ackset.insert(2);
1297 ackset.insert(4);
1298
1299 let acks = ackset.get_ack();
1300
1301 assert!(acks == vec![(0, 2), (4, 4)]);
1302
1303 let mut ackset = ACKSet::default();
1304
1305 ackset.insert(0);
1306 ackset.insert(1);
1307 ackset.insert(2);
1308 ackset.insert(6);
1309
1310 let acks = ackset.get_ack();
1311
1312 assert!(acks == vec![(0, 2), (6, 6)]);
1313
1314 let acks = ackset.get_ack();
1315
1316 assert!(acks == vec![]);
1317
1318 ackset.insert(0);
1319 ackset.insert(2);
1320
1321 let acks = ackset.get_ack();
1322
1323 assert!(acks == vec![(0, 0), (2, 2)]);
1324}
1325
1326#[tokio::test]
1327async fn test_frame_serialize_deserialize() {
1328 let p: Vec<u8> = [
1330 132, 0, 0, 0, 64, 0, 144, 0, 0, 0, 9, 146, 33, 7, 47, 57, 18, 128, 111, 0, 0, 0, 0, 20,
1331 200, 47, 41, 0,
1332 ]
1333 .to_vec();
1334
1335 let a = FrameSetPacket::deserialize(&p).unwrap();
1336 assert!(a.0.serialize().unwrap() == p);
1337}
1338
1339#[tokio::test]
1340async fn test_recvq() {
1341 let mut r = RecvQ::new();
1342 let mut p = FrameSetPacket::new(Reliability::Reliable, vec![]);
1343 p.sequence_number = 0;
1344 p.ordered_frame_index = 0;
1345 r.insert(p).unwrap();
1346
1347 let mut p = FrameSetPacket::new(Reliability::Reliable, vec![]);
1348 p.sequence_number = 1;
1349 p.reliable_frame_index = 1;
1350 p.ordered_frame_index = 1;
1351 r.insert(p).unwrap();
1352
1353 let ret = r.flush(&"0.0.0.0:0".parse().unwrap());
1354 assert!(ret.len() == 2);
1355}
1356
1357#[tokio::test]
1358async fn test_recvq_fragment() {
1359 let mut r = RecvQ::new();
1360 let mut p = FrameSetPacket::new(Reliability::ReliableOrdered, vec![1]);
1361 p.flags |= 16;
1362 p.sequence_number = 0;
1363 p.ordered_frame_index = 0;
1364 p.compound_id = 1;
1365 p.compound_size = 3;
1366 p.fragment_index = 0;
1367 p.order_channel = 7;
1368 r.insert(p).unwrap();
1369
1370 let mut p = FrameSetPacket::new(Reliability::ReliableOrdered, vec![2]);
1371 p.flags |= 16;
1372 p.sequence_number = 1;
1373 p.reliable_frame_index = 1;
1374 p.ordered_frame_index = 0;
1375 p.compound_id = 1;
1376 p.compound_size = 3;
1377 p.fragment_index = 1;
1378 p.order_channel = 7;
1379 r.insert(p).unwrap();
1380
1381 let mut p = FrameSetPacket::new(Reliability::ReliableOrdered, vec![3]);
1382 p.flags |= 16;
1383 p.sequence_number = 2;
1384 p.reliable_frame_index = 2;
1385 p.ordered_frame_index = 0;
1386 p.compound_id = 1;
1387 p.compound_size = 3;
1388 p.fragment_index = 2;
1389 p.order_channel = 7;
1390 r.insert(p).unwrap();
1391
1392 let ret = r.flush(&"0.0.0.0:0".parse().unwrap());
1393 assert!(ret.len() == 1);
1394 assert_eq!(ret[0].data.as_ref(), &[1, 2, 3]);
1395 assert_eq!(ret[0].order_channel, 7);
1396}
1397
1398#[tokio::test]
1399async fn test_sendq() {
1400 let mut s = SendQ::new(1500);
1401 let p = FrameSetPacket::new(Reliability::Reliable, vec![]);
1402 s.insert(Reliability::Reliable, &p.serialize().unwrap())
1403 .unwrap();
1404
1405 let p = FrameSetPacket::new(Reliability::Reliable, vec![]);
1406 s.insert(Reliability::Reliable, &p.serialize().unwrap())
1407 .unwrap();
1408
1409 let sockaddr: SocketAddr = "127.0.0.1:8000".parse().unwrap();
1410 let ret = s.flush(0, &sockaddr);
1411 assert!(ret.len() == 2);
1412
1413 s.ack(0, 0);
1414 s.ack(1, 0);
1415
1416 let ret = s.flush(300, &sockaddr);
1417 assert!(ret.is_empty());
1418}
1419
1420#[test]
1421fn send_queue_pipelines_reliable_packets_with_a_bounded_window() {
1422 let mut sendq = SendQ::new(1500);
1423 let peer = "127.0.0.1:8000".parse().unwrap();
1424
1425 for index in 0..SendQ::MAX_IN_FLIGHT_PACKETS + 1 {
1426 sendq
1427 .insert(Reliability::ReliableOrdered, &[0xfe, index as u8])
1428 .unwrap();
1429 let sent = sendq.flush(0, &peer);
1430 if index < SendQ::MAX_IN_FLIGHT_PACKETS {
1431 assert_eq!(sent.len(), 1);
1432 assert_eq!(sent[0].ordered_frame_index, index as u32);
1433 } else {
1434 assert!(sent.is_empty());
1435 }
1436 }
1437
1438 assert_eq!(sendq.get_sent_queue_size(), SendQ::MAX_IN_FLIGHT_PACKETS);
1439 assert_eq!(sendq.get_reliable_queue_size(), 1);
1440
1441 sendq.ack(0, 1);
1442 let sent = sendq.flush(1, &peer);
1443 assert_eq!(sent.len(), 1);
1444 assert_eq!(
1445 sent[0].ordered_frame_index,
1446 SendQ::MAX_IN_FLIGHT_PACKETS as u32
1447 );
1448 assert_eq!(sendq.get_sent_queue_size(), SendQ::MAX_IN_FLIGHT_PACKETS);
1449 assert_eq!(sendq.get_reliable_queue_size(), 0);
1450}
1451
1452#[test]
1453fn send_queue_retransmits_immediately_after_nack() {
1454 let mut sendq = SendQ::new(1500);
1455 let peer = "127.0.0.1:8000".parse().unwrap();
1456 sendq.insert(Reliability::Reliable, &[0xfe]).unwrap();
1457
1458 let first = sendq.flush(0, &peer);
1459 assert_eq!(first.len(), 1);
1460 assert_eq!(first[0].sequence_number, 0);
1461
1462 sendq.nack(0, 1);
1463 let retransmitted = sendq.flush(1, &peer);
1464 assert_eq!(retransmitted.len(), 1);
1465 assert_eq!(retransmitted[0].sequence_number, 1);
1466}
1467
1468#[tokio::test]
1469async fn test_client_packet1() {
1470 let a = [
1471 140, 3, 0, 0, 112, 44, 192, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 254, 236,
1472 189, 203, 114, 234, 74, 183, 239, 185, 79, 175, 170, 30, 99, 159, 110, 125, 59, 36, 1, 222,
1473 166, 122, 19, 35, 97, 48, 18, 19, 161, 11, 82, 69, 197, 23, 128, 248, 38, 32, 9, 107, 218,
1474 152, 91, 69, 61, 79, 53, 234, 141, 78, 243, 52, 234, 5, 170, 119, 90, 149, 41, 165, 48, 41,
1475 11, 12, 2, 95, 214, 154, 255, 198, 47, 86, 120, 77, 15, 75, 202, 203, 24, 57, 46, 153, 249,
1476 223, 255, 199, 127, 253, 47, 255, 246, 111, 255, 229, 255, 253, 111, 255, 227, 191, 254,
1477 63, 255, 243, 191, 253, 219, 255, 249, 239, 163, 201, 96, 58, 255, 247, 255, 237, 127, 255,
1478 247, 241, 166, 53, 25, 54, 70, 211, 206, 180, 165, 152, 91, 181, 172, 221, 53, 159, 155,
1479 243, 95, 162, 215, 107, 222, 52, 125, 177, 105, 247, 61, 165, 107, 5, 205, 158, 84, 29,
1480 244, 250, 209, 111, 85, 214, 106, 166, 21, 52, 122, 91, 93, 209, 77, 165, 222, 51, 117,
1481 215, 21, 20, 197, 109, 148, 55, 166, 220, 122, 234, 216, 101, 105, 108, 43, 157, 241, 180,
1482 218, 49, 26, 250, 189, 165, 184, 243, 129, 242, 171, 50, 170, 7, 247, 109, 241, 113, 173,
1483 221, 235, 205, 225, 60, 18, 218, 226, 196, 234, 134, 186, 57, 240, 43, 83, 43, 112, 167,
1484 150, 57, 89, 13, 75, 90, 205, 146, 244, 123, 183, 46, 111, 199, 182, 176, 214, 182, 147,
1485 141, 214, 16, 187, 227, 134, 38, 247, 234, 150, 219, 107, 84, 231, 78, 201, 17, 186, 115,
1486 189, 174, 139, 154, 51, 82, 212, 210, 192, 178, 30, 13, 49, 216, 186, 179, 218, 203, 192,
1487 143, 238, 61, 177, 37, 186, 211, 234, 147, 41, 105, 91, 87, 169, 61, 142, 239, 22, 207,
1488 170, 28, 205, 199, 117, 253, 121, 32, 107, 117, 213, 119, 166, 255, 234, 62, 254, 7, 249,
1489 238, 153, 219, 111, 9, 3, 219, 141, 28, 73, 17, 92, 83, 17, 189, 198, 100, 57, 10, 3, 97,
1490 76, 190, 221, 187, 39, 127, 167, 183, 154, 186, 253, 201, 170, 57, 35, 239, 61, 235, 150,
1491 58, 117, 103, 173, 25, 242, 186, 125, 215, 138, 220, 134, 245, 226, 53, 200, 239, 90, 53,
1492 209, 9, 215, 145, 35, 44, 130, 241, 153, 109, 214, 145, 45, 117, 32, 5, 229, 177, 185, 158,
1493 121, 210, 122, 48, 154, 7, 150, 105, 107, 162, 106, 233, 146, 41, 87, 23, 61, 163, 117,
1494 167, 149, 92, 167, 83, 215, 94, 220, 70, 165, 111, 6, 214, 196, 110, 8, 37, 237, 222, 107,
1495 184, 161, 76, 191, 243, 217, 19, 149, 142, 213, 112, 55, 134, 226, 54, 29, 163, 213, 29,
1496 218, 214, 203, 72, 246, 90, 154, 31, 61, 246, 76, 209, 234, 133, 74, 223, 158, 183, 126,
1497 15, 77, 241, 119, 199, 168, 117, 134, 194, 162, 163, 7, 90, 167, 59, 183, 218, 110, 67, 40,
1498 143, 130, 32, 178, 239, 181, 208, 233, 63, 110, 123, 91, 85, 26, 223, 221, 174, 45, 163,
1499 41, 245, 238, 107, 247, 170, 18, 149, 123, 155, 170, 173, 90, 206, 148, 124, 243, 139, 19,
1500 58, 211, 206, 76, 150, 180, 250, 72, 234, 212, 127, 73, 154, 161, 84, 239, 126, 253, 199,
1501 63, 158, 123, 119, 119, 203, 126, 120, 247, 220, 113, 55, 245, 97, 189, 212, 172, 255, 136,
1502 30, 159, 164, 122, 255, 95, 245, 141, 220, 159, 41, 149, 169, 218, 173, 174, 5, 249, 247,
1503 83, 205, 188, 185, 81, 220, 113, 251, 229, 101, 213, 249, 245, 123, 212, 248, 71, 239, 105,
1504 48, 151, 68, 103, 32, 175, 215, 63, 220, 113, 216, 169, 252, 243, 247, 211, 118, 230, 255,
1505 179, 210, 173, 173, 123, 230, 203, 63, 170, 163, 127, 12, 52, 39, 26, 247, 158, 182, 147,
1506 113, 52, 154, 4, 75, 219, 122, 168, 223, 120, 255, 152, 223, 138, 173, 135, 122, 79, 43,
1507 245, 27, 255, 254, 191, 210, 81, 92, 214, 250, 38, 29, 197, 90, 79, 9, 74, 164, 149, 221,
1508 158, 188, 88, 218, 126, 112, 51, 152, 213, 234, 93, 50, 12, 117, 255, 89, 208, 77, 171,
1509 214, 21, 2, 217, 182, 189, 154, 110, 76, 20, 163, 177, 136, 198, 247, 129, 234, 148, 188,
1510 103, 210, 74, 21, 203, 82, 102, 158, 161, 152, 94, 80, 251, 57, 52, 253, 77, 151, 244, 139,
1511 93, 255, 181, 29, 134, 250, 139, 37, 182, 44, 199, 154, 44, 180, 173, 94, 210, 67, 119,
1512 162, 217, 238, 168, 45, 173, 75, 166, 89, 49, 221, 121, 75, 181, 252, 201, 68, 13, 106, 11,
1513 215, 174, 172, 116, 193, 151, 122, 225, 164, 101, 88, 214, 131, 99, 121, 131, 81, 24, 45,
1514 12, 251, 177, 162, 202, 149, 101, 79, 168, 52, 76, 161, 114, 231, 153, 11, 127, 104, 76,
1515 54, 182, 29, 56, 35, 201, 157, 140, 103, 90, 91, 221, 186, 229, 126, 182, 7, 196, 213, 210,
1516 154, 41, 118, 115, 186, 154, 58, 246, 122, 78, 70, 227, 84, 183, 212, 109, 167, 222, 37,
1517 35, 153, 14, 228, 156, 142, 145, 201, 36, 38, 19, 59, 212, 151, 67, 179, 178, 28, 134, 90,
1518 64, 196, 74, 234, 204, 41, 107, 51, 191, 172, 209, 137, 62, 107, 10, 228, 191, 2, 249, 125,
1519 129, 14, 232, 81, 73, 141, 155, 111, 40, 69, 68, 110, 68, 59, 60, 24, 223, 255, 72, 255,
1520 46, 249, 125, 89, 84, 233, 223, 37, 127, 107, 52, 215, 35, 55, 12, 102, 78, 95, 15, 186,
1521 125, 75, 24, 52, 170, 155, 65, 95, 175, 52, 103, 145, 48, 154, 91, 1, 253, 123, 78, 191,
1522 187, 255, 78, 165, 68, 54, 240, 73, 243, 8, 244, 119, 205, 123, 107, 58, 108, 4, 179, 158,
1523 100, 85, 232, 39, 25, 230, 196, 245, 4, 171, 102, 155, 147, 246, 80, 140, 90, 227, 240,
1524 113, 213, 21, 20, 221, 54, 221, 182, 38, 91, 74, 215, 212, 90, 186, 18, 204, 187, 166, 181,
1525 26, 26, 90, 93, 187, 91, 180, 212, 128, 40, 129, 198, 194, 232, 88, 171, 229, 80, 28, 109,
1526 92, 203, 43, 121, 115, 125, 221, 19, 162, 178, 102, 138, 174, 109, 77, 12, 215, 168, 217,
1527 186, 36, 151, 71, 164, 139, 61, 223, 26, 12, 132, 245, 114, 68, 148, 196, 64, 138, 106,
1528 166, 160, 77, 6, 210, 66, 232, 137, 122, 107, 228, 59, 226, 184, 111, 169, 35, 203, 85, 61,
1529 165, 86, 25, 247, 221, 126, 215, 94, 76, 186, 118, 180, 30, 207, 38, 91, 77, 209, 219, 61,
1530 203, 213, 186, 225, 164, 231, 206, 213, 167, 14, 153, 252, 142, 45, 170, 227, 198, 164, 57,
1531 188, 143, 30, 109, 197, 93, 147, 103, 205, 173, 251, 214, 202, 178, 221, 27, 39, 80, 250,
1532 134, 160, 210, 46, 50, 255, 53, 31, 119, 199, 195, 137, 182, 49, 141, 199, 40, 108, 191,
1533 244, 212, 222, 63, 198, 213, 255, 188, 239, 206, 102, 155, 223, 102, 235, 159, 255, 252,
1534 241, 16, 244, 194, 233, 68, 170, 7, 27, 189, 211, 250, 189, 104, 143, 255, 241, 159, 66,
1535 221, 121, 169, 73, 98, 189, 90, 107, 78, 23, 29, 229, 215, 96, 54, 27, 153, 183, 182, 223,
1536 155, 223, 55, 127, 24, 227, 219, 167, 217, 237, 188, 31, 74, 154, 226, 255, 115, 220, 169,
1537 143, 165, 231, 135, 95, 245, 217, 118, 174, 201, 134, 255, 88, 121, 92, 132, 129, 123, 251,
1538 175, 250, 204, 189, 169, 46, 138, 78, 144, 126, 109, 161, 10, 170, 240, 32, 248, 27, 83,
1539 156, 172, 6, 162, 90, 233, 223, 85, 151, 214, 182, 21, 88, 37, 79, 242, 238, 149, 118, 143,
1540 152, 10, 131, 232, 111, 91, 209, 2, 85, 113, 239, 29, 99, 178, 37, 170, 76, 210, 173, 232,
1541 201, 104, 84, 183, 230, 220, 122, 26, 248, 138, 209, 149, 148, 167, 65, 73, 111, 91, 50,
1542 249, 194, 153, 85, 241, 204, 245, 218, 242, 215, 130, 121, 31, 84, 188, 192, 171, 13, 36,
1543 165, 54, 152, 43, 55, 157, 123, 85, 176, 228, 69, 203, 242, 197, 187, 129, 210, 10, 71,
1544 155, 231, 50, 25, 45, 147, 161, 185, 46, 15, 228, 201, 243, 56, 156, 56, 214, 92, 9, 212,
1545 134, 103, 142, 230, 53, 203, 157, 71, 83, 211, 242, 126, 118, 55, 196,
1546 ];
1547
1548 let b = FrameVec::new(&a).unwrap();
1549 assert!(b.frames.len() == 1);
1550 assert!(b.frames[0].is_fragment());
1551}
1552
1553#[tokio::test]
1554async fn test_client_packet2() {
1555 let p0 = [
1557 132, 0, 0, 0, 64, 0, 144, 0, 0, 0, 9, 162, 70, 235, 28, 218, 182, 26, 192, 0, 0, 0, 0, 16,
1558 151, 43, 113, 0,
1559 ];
1560 let p1 = [
1562 132, 1, 0, 0, 64, 0, 144, 0, 0, 0, 9, 162, 70, 235, 28, 218, 182, 26, 192, 0, 0, 0, 0, 16,
1563 151, 43, 113, 0,
1564 ];
1565 let p2 = [
1567 132, 2, 0, 0, 96, 9, 64, 1, 0, 0, 0, 0, 0, 0, 19, 4, 83, 237, 234, 82, 74, 188, 6, 23, 0,
1568 225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 196, 178, 112, 86, 5, 59, 97, 219, 15, 0,
1569 0, 0, 6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 188, 210, 59, 150, 246,
1570 167, 182, 213, 33, 0, 0, 0, 6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0,
1571 132, 194, 47, 23, 175, 46, 78, 138, 23, 0, 0, 0, 6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128,
1572 0, 0, 0, 0, 0, 0, 136, 219, 85, 240, 191, 125, 172, 233, 10, 0, 0, 0, 6, 23, 0, 225, 138,
1573 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 80, 211, 212, 44, 191, 227, 124, 40, 13, 0, 0, 0,
1574 6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 77, 13, 19, 149, 102, 140, 134,
1575 77, 16, 0, 0, 0, 4, 83, 237, 239, 254, 225, 138, 4, 63, 87, 214, 254, 225, 138, 4, 83, 236,
1576 159, 254, 225, 138, 4, 63, 87, 46, 254, 225, 138, 4, 63, 87, 56, 128, 225, 138, 4, 63, 87,
1577 56, 123, 225, 138, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255,
1578 255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255,
1579 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1580 0, 0, 0, 0, 0, 16, 151, 56, 146, 0, 0, 72, 0, 0, 0, 0, 0, 16, 151, 56, 146,
1581 ];
1582 let p3 = [132, 3, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 16, 151, 56, 161];
1584 let p4 = [
1586 140, 4, 0, 0, 112, 44, 192, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 254, 236,
1587 189, 203, 114, 234, 202, 214, 239, 249, 157, 94, 85, 61, 198, 119, 186, 181, 79, 72, 2,
1588 188, 77, 245, 140, 145, 48, 24, 137, 137, 208, 5, 169, 162, 98, 7, 32, 246, 4, 36, 97, 77,
1589 155, 201, 173, 162, 158, 231, 188, 81, 53, 171, 89, 47, 80, 189, 211, 170, 148, 148, 194,
1590 164, 156, 96, 16, 248, 178, 214, 252, 55, 126, 177, 194, 107, 122, 88, 82, 94, 198, 200,
1591 113, 201, 204, 255, 231, 127, 252, 215, 255, 242, 31, 255, 241, 95, 254, 223, 255, 251,
1592 127, 252, 215, 255, 254, 63, 255, 199, 127, 252, 159, 255, 57, 154, 12, 166, 243, 255, 252,
1593 223, 254, 247, 255, 28, 111, 90, 147, 97, 99, 52, 237, 76, 91, 138, 185, 85, 203, 218, 125,
1594 243, 165, 57, 255, 41, 122, 189, 230, 77, 211, 23, 155, 118, 223, 83, 186, 86, 208, 236,
1595 73, 213, 65, 175, 31, 253, 82, 101, 173, 102, 90, 65, 163, 183, 213, 21, 221, 84, 234, 61,
1596 83, 119, 93, 65, 81, 172, 70, 107, 233, 25, 138, 210, 179, 149, 23, 79, 18, 205, 142, 41,
1597 8, 163, 134, 179, 177, 77, 87, 182, 131, 86, 121, 80, 106, 213, 135, 125, 179, 162, 139,
1598 122, 203, 241, 131, 138, 109, 4, 93, 51, 168, 173, 135, 74, 75, 29, 214, 29, 97, 104, 4,
1599 55, 222, 182, 86, 26, 205, 189, 242, 192, 127, 217, 90, 219, 174, 48, 40, 233, 115, 171,
1600 49, 105, 141, 109, 189, 63, 182, 91, 63, 70, 141, 167, 237, 120, 166, 148, 213, 173, 92,
1601 30, 110, 149, 78, 91, 12, 66, 93, 241, 5, 93, 208, 45, 45, 156, 56, 143, 130, 18, 90, 194,
1602 147, 104, 55, 116, 209, 8, 163, 103, 211, 94, 151, 134, 91, 189, 50, 174, 235, 191, 135,
1603 138, 213, 237, 218, 21, 211, 182, 252, 233, 191, 187, 79, 255, 141, 124, 247, 204, 237,
1604 183, 132, 129, 237, 70, 142, 164, 8, 174, 169, 136, 94, 99, 178, 28, 133, 129, 48, 38, 223,
1605 238, 61, 180, 68, 183, 183, 154, 186, 253, 201, 170, 57, 123, 90, 107, 179, 110, 169, 83,
1606 119, 214, 154, 33, 175, 219, 247, 173, 200, 109, 88, 191, 189, 6, 249, 93, 171, 38, 58,
1607 225, 58, 114, 132, 69, 48, 62, 179, 205, 58, 178, 165, 14, 164, 160, 60, 54, 215, 51, 79,
1608 90, 15, 70, 243, 192, 50, 109, 77, 84, 45, 93, 50, 229, 234, 162, 103, 180, 238, 181, 146,
1609 235, 116, 234, 218, 111, 183, 81, 233, 155, 129, 53, 177, 27, 66, 73, 123, 240, 26, 110,
1610 40, 139, 238, 180, 250, 226, 137, 74, 199, 106, 184, 27, 67, 113, 155, 142, 209, 234, 14,
1611 109, 235, 247, 72, 246, 90, 154, 31, 61, 245, 76, 209, 234, 133, 74, 223, 158, 183, 126,
1612 13, 77, 241, 87, 199, 168, 117, 134, 194, 162, 163, 7, 90, 167, 59, 183, 218, 110, 67, 40,
1613 143, 130, 32, 178, 31, 180, 208, 233, 63, 109, 123, 91, 85, 26, 223, 223, 174, 45, 163, 41,
1614 245, 30, 106, 15, 170, 18, 149, 123, 155, 170, 173, 90, 206, 148, 124, 243, 111, 39, 116,
1615 166, 157, 153, 44, 105, 245, 145, 212, 169, 255, 148, 52, 67, 169, 222, 255, 252, 111, 237,
1616 167, 127, 74, 191, 234, 254, 100, 169, 140, 42, 171, 201, 92, 173, 142, 252, 127, 77, 86,
1617 247, 77, 251, 95, 254, 175, 127, 215, 127, 223, 246, 42, 255, 26, 253, 235, 165, 108, 133,
1618 255, 246, 151, 203, 202, 211, 250, 151, 175, 12, 203, 193, 124, 221, 155, 255, 67, 126,
1619 190, 109, 253, 99, 242, 243, 95, 211, 167, 219, 187, 237, 157, 107, 254, 43, 24, 107, 81,
1620 79, 22, 171, 225, 38, 252, 183, 240, 24, 4, 255, 114, 31, 21, 213, 235, 11, 195, 81, 239,
1621 159, 253, 161, 97, 169, 222, 77, 215, 41, 173, 164, 231, 254, 68, 157, 151, 199, 131, 31,
1622 15, 51, 229, 63, 255, 215, 120, 20, 151, 181, 190, 25, 143, 98, 173, 167, 4, 37, 210, 202,
1623 110, 79, 94, 44, 109, 63, 184, 25, 204, 106, 245, 174, 165, 184, 186, 255, 34, 232, 166,
1624 85, 235, 10, 129, 108, 219, 94, 77, 55, 38, 138, 209, 88, 68, 227, 135, 64, 117, 74, 222,
1625 11, 105, 165, 138, 101, 41, 51, 50, 138, 77, 47, 168, 253, 24, 154, 254, 166, 75, 250, 197,
1626 174, 255, 220, 14, 67, 253, 183, 37, 182, 44, 199, 154, 44, 180, 173, 94, 210, 67, 119,
1627 162, 217, 238, 168, 45, 173, 75, 166, 89, 49, 221, 121, 75, 181, 252, 201, 68, 13, 106, 11,
1628 215, 174, 172, 116, 193, 151, 122, 225, 164, 101, 88, 214, 163, 99, 121, 131, 81, 24, 45,
1629 12, 251, 169, 162, 202, 149, 101, 79, 168, 52, 76, 161, 114, 239, 153, 11, 127, 104, 76,
1630 54, 182, 29, 56, 35, 201, 157, 140, 103, 90, 91, 221, 186, 229, 126, 190, 7, 196, 213, 210,
1631 154, 41, 118, 115, 186, 154, 58, 246, 122, 78, 70, 227, 84, 183, 212, 109, 167, 222, 37,
1632 35, 57, 30, 200, 156, 142, 145, 201, 36, 38, 19, 59, 212, 151, 67, 179, 178, 28, 134, 90,
1633 64, 196, 74, 234, 204, 41, 107, 51, 191, 172, 197, 19, 125, 214, 20, 200, 127, 5, 242, 251,
1634 66, 60, 160, 71, 37, 53, 105, 190, 161, 20, 17, 185, 81, 220, 225, 193, 248, 225, 46, 251,
1635 187, 228, 247, 101, 81, 141, 255, 46, 249, 91, 163, 185, 30, 185, 97, 48, 115, 250, 122,
1636 208, 237, 91, 194, 160, 81, 221, 12, 250, 122, 165, 57, 139, 132, 209, 220, 10, 226, 191,
1637 231, 244, 187, 251, 239, 84, 74, 101, 3, 159, 52, 143, 16, 255, 174, 249, 96, 77, 135, 141,
1638 96, 214, 147, 172, 74, 252, 73, 134, 57, 113, 61, 193, 170, 217, 230, 164, 61, 20, 163,
1639 214, 56, 124, 90, 117, 5, 69, 39, 10, 164, 173, 201, 150, 210, 53, 181, 150, 174, 4, 243,
1640 174, 105, 173, 134, 134, 86, 215, 238, 23, 45, 53, 208, 156, 81, 99, 97, 116, 172, 213,
1641 114, 40, 142, 54, 174, 229, 149, 188, 185, 190, 238, 9, 81, 89, 51, 69, 215, 182, 38, 134,
1642 107, 212, 108, 93, 146, 203, 35, 210, 197, 158, 111, 13, 6, 194, 122, 57, 18, 91, 226, 64,
1643 138, 106, 166, 160, 77, 6, 210, 66, 232, 17, 165, 52, 242, 29, 113, 220, 183, 212, 145,
1644 229, 170, 158, 82, 171, 140, 251, 110, 191, 107, 47, 38, 93, 59, 90, 143, 103, 147, 173,
1645 166, 232, 237, 158, 229, 106, 221, 112, 210, 115, 231, 234, 115, 135, 76, 126, 199, 22,
1646 213, 113, 99, 210, 28, 62, 68, 79, 182, 226, 174, 201, 179, 230, 214, 67, 107, 101, 217,
1647 238, 141, 19, 40, 125, 67, 80, 227, 46, 50, 255, 61, 31, 119, 199, 195, 137, 182, 49, 141,
1648 167, 40, 108, 255, 238, 169, 189, 127, 140, 171, 255, 124, 232, 206, 102, 155, 95, 102,
1649 235, 95, 255, 186, 123, 12, 122, 225, 116, 34, 213, 131, 141, 222, 105, 253, 90, 180, 199,
1650 255, 248, 167, 80, 119, 126, 215, 36, 177, 94, 173, 53, 167, 139, 142, 242, 115, 48, 155,
1651 141, 204, 91, 219, 239, 205, 31, 154, 119, 198, 248, 246, 121, 118, 59, 239, 135, 146, 166,
1652 248, 255, 26, 119, 234, 99, 233, 229, 241, 103, 125, 182, 157, 107, 178, 225, 63, 85, 158,
1653 22, 97, 224, 222, 254, 187, 62, 115, 111, 170, 139, 162, 19, 164, 95, 91, 168, 130, 42, 60,
1654 10, 254, 198, 20, 39, 171, 129, 168, 86, 250, 247, 213, 165, 181, 109, 5, 86, 201, 147,
1655 188, 7, 165, 221, 35, 166, 194, 176, 2, 215, 86, 180, 64, 85, 220, 7, 199, 152, 108, 137,
1656 42, 147, 116, 43, 122, 54, 26, 213, 173, 57, 183, 158, 7, 190, 98, 116, 37, 229, 153, 168,
1657 243, 182, 37, 147, 47, 156, 89, 21, 207, 92, 175, 45, 127, 45, 152, 15, 65, 197, 11, 188,
1658 218, 64, 82, 106, 131, 185, 114, 211, 121, 80, 5, 75, 94, 180, 44, 95, 188, 31, 40, 173,
1659 112, 180, 121, 41, 147, 209, 50, 25, 154, 235, 242, 64, 158, 188, 140, 137, 154, 183, 230,
1660 74, 160, 54, 60, 115, 52, 175, 89, 238, 60, 154, 154, 150, 247, 163, 187,
1661 ];
1662 let p5 = [
1664 140, 5, 0, 0, 96, 9, 64, 1, 0, 0, 0, 0, 0, 0, 19, 4, 83, 237, 234, 82, 74, 188, 6, 23, 0,
1665 225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 196, 178, 112, 86, 5, 59, 97, 219, 15, 0,
1666 0, 0, 6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 188, 210, 59, 150, 246,
1667 167, 182, 213, 33, 0, 0, 0, 6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0,
1668 132, 194, 47, 23, 175, 46, 78, 138, 23, 0, 0, 0, 6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128,
1669 0, 0, 0, 0, 0, 0, 136, 219, 85, 240, 191, 125, 172, 233, 10, 0, 0, 0, 6, 23, 0, 225, 138,
1670 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 80, 211, 212, 44, 191, 227, 124, 40, 13, 0, 0, 0,
1671 6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 77, 13, 19, 149, 102, 140, 134,
1672 77, 16, 0, 0, 0, 4, 83, 237, 239, 254, 225, 138, 4, 63, 87, 214, 254, 225, 138, 4, 83, 236,
1673 159, 254, 225, 138, 4, 63, 87, 46, 254, 225, 138, 4, 63, 87, 56, 128, 225, 138, 4, 63, 87,
1674 56, 123, 225, 138, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255,
1675 255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255,
1676 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1677 0, 0, 0, 0, 0, 16, 151, 56, 146,
1678 ];
1679 let p6 = [
1681 140, 6, 0, 0, 112, 44, 192, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 254, 236,
1682 189, 203, 114, 234, 202, 214, 239, 249, 157, 94, 85, 61, 198, 119, 186, 181, 79, 72, 2,
1683 188, 77, 245, 140, 145, 48, 24, 137, 137, 208, 5, 169, 162, 98, 7, 32, 246, 4, 36, 97, 77,
1684 155, 201, 173, 162, 158, 231, 188, 81, 53, 171, 89, 47, 80, 189, 211, 170, 148, 148, 194,
1685 164, 156, 96, 16, 248, 178, 214, 252, 55, 126, 177, 194, 107, 122, 88, 82, 94, 198, 200,
1686 113, 201, 204, 255, 231, 127, 252, 215, 255, 242, 31, 255, 241, 95, 254, 223, 255, 251,
1687 127, 252, 215, 255, 254, 63, 255, 199, 127, 252, 159, 255, 57, 154, 12, 166, 243, 255, 252,
1688 223, 254, 247, 255, 28, 111, 90, 147, 97, 99, 52, 237, 76, 91, 138, 185, 85, 203, 218, 125,
1689 243, 165, 57, 255, 41, 122, 189, 230, 77, 211, 23, 155, 118, 223, 83, 186, 86, 208, 236,
1690 73, 213, 65, 175, 31, 253, 82, 101, 173, 102, 90, 65, 163, 183, 213, 21, 221, 84, 234, 61,
1691 83, 119, 93, 65, 81, 172, 70, 107, 233, 25, 138, 210, 179, 149, 23, 79, 18, 205, 142, 41,
1692 8, 163, 134, 179, 177, 77, 87, 182, 131, 86, 121, 80, 106, 213, 135, 125, 179, 162, 139,
1693 122, 203, 241, 131, 138, 109, 4, 93, 51, 168, 173, 135, 74, 75, 29, 214, 29, 97, 104, 4,
1694 55, 222, 182, 86, 26, 205, 189, 242, 192, 127, 217, 90, 219, 174, 48, 40, 233, 115, 171,
1695 49, 105, 141, 109, 189, 63, 182, 91, 63, 70, 141, 167, 237, 120, 166, 148, 213, 173, 92,
1696 30, 110, 149, 78, 91, 12, 66, 93, 241, 5, 93, 208, 45, 45, 156, 56, 143, 130, 18, 90, 194,
1697 147, 104, 55, 116, 209, 8, 163, 103, 211, 94, 151, 134, 91, 189, 50, 174, 235, 191, 135,
1698 138, 213, 237, 218, 21, 211, 182, 252, 233, 191, 187, 79, 255, 141, 124, 247, 204, 237,
1699 183, 132, 129, 237, 70, 142, 164, 8, 174, 169, 136, 94, 99, 178, 28, 133, 129, 48, 38, 223,
1700 238, 61, 180, 68, 183, 183, 154, 186, 253, 201, 170, 57, 123, 90, 107, 179, 110, 169, 83,
1701 119, 214, 154, 33, 175, 219, 247, 173, 200, 109, 88, 191, 189, 6, 249, 93, 171, 38, 58,
1702 225, 58, 114, 132, 69, 48, 62, 179, 205, 58, 178, 165, 14, 164, 160, 60, 54, 215, 51, 79,
1703 90, 15, 70, 243, 192, 50, 109, 77, 84, 45, 93, 50, 229, 234, 162, 103, 180, 238, 181, 146,
1704 235, 116, 234, 218, 111, 183, 81, 233, 155, 129, 53, 177, 27, 66, 73, 123, 240, 26, 110,
1705 40, 139, 238, 180, 250, 226, 137, 74, 199, 106, 184, 27, 67, 113, 155, 142, 209, 234, 14,
1706 109, 235, 247, 72, 246, 90, 154, 31, 61, 245, 76, 209, 234, 133, 74, 223, 158, 183, 126,
1707 13, 77, 241, 87, 199, 168, 117, 134, 194, 162, 163, 7, 90, 167, 59, 183, 218, 110, 67, 40,
1708 143, 130, 32, 178, 31, 180, 208, 233, 63, 109, 123, 91, 85, 26, 223, 223, 174, 45, 163, 41,
1709 245, 30, 106, 15, 170, 18, 149, 123, 155, 170, 173, 90, 206, 148, 124, 243, 111, 39, 116,
1710 166, 157, 153, 44, 105, 245, 145, 212, 169, 255, 148, 52, 67, 169, 222, 255, 252, 111, 237,
1711 167, 127, 74, 191, 234, 254, 100, 169, 140, 42, 171, 201, 92, 173, 142, 252, 127, 77, 86,
1712 247, 77, 251, 95, 254, 175, 127, 215, 127, 223, 246, 42, 255, 26, 253, 235, 165, 108, 133,
1713 255, 246, 151, 203, 202, 211, 250, 151, 175, 12, 203, 193, 124, 221, 155, 255, 67, 126,
1714 190, 109, 253, 99, 242, 243, 95, 211, 167, 219, 187, 237, 157, 107, 254, 43, 24, 107, 81,
1715 79, 22, 171, 225, 38, 252, 183, 240, 24, 4, 255, 114, 31, 21, 213, 235, 11, 195, 81, 239,
1716 159, 253, 161, 97, 169, 222, 77, 215, 41, 173, 164, 231, 254, 68, 157, 151, 199, 131, 31,
1717 15, 51, 229, 63, 255, 215, 120, 20, 151, 181, 190, 25, 143, 98, 173, 167, 4, 37, 210, 202,
1718 110, 79, 94, 44, 109, 63, 184, 25, 204, 106, 245, 174, 165, 184, 186, 255, 34, 232, 166,
1719 85, 235, 10, 129, 108, 219, 94, 77, 55, 38, 138, 209, 88, 68, 227, 135, 64, 117, 74, 222,
1720 11, 105, 165, 138, 101, 41, 51, 50, 138, 77, 47, 168, 253, 24, 154, 254, 166, 75, 250, 197,
1721 174, 255, 220, 14, 67, 253, 183, 37, 182, 44, 199, 154, 44, 180, 173, 94, 210, 67, 119,
1722 162, 217, 238, 168, 45, 173, 75, 166, 89, 49, 221, 121, 75, 181, 252, 201, 68, 13, 106, 11,
1723 215, 174, 172, 116, 193, 151, 122, 225, 164, 101, 88, 214, 163, 99, 121, 131, 81, 24, 45,
1724 12, 251, 169, 162, 202, 149, 101, 79, 168, 52, 76, 161, 114, 239, 153, 11, 127, 104, 76,
1725 54, 182, 29, 56, 35, 201, 157, 140, 103, 90, 91, 221, 186, 229, 126, 190, 7, 196, 213, 210,
1726 154, 41, 118, 115, 186, 154, 58, 246, 122, 78, 70, 227, 84, 183, 212, 109, 167, 222, 37,
1727 35, 57, 30, 200, 156, 142, 145, 201, 36, 38, 19, 59, 212, 151, 67, 179, 178, 28, 134, 90,
1728 64, 196, 74, 234, 204, 41, 107, 51, 191, 172, 197, 19, 125, 214, 20, 200, 127, 5, 242, 251,
1729 66, 60, 160, 71, 37, 53, 105, 190, 161, 20, 17, 185, 81, 220, 225, 193, 248, 225, 46, 251,
1730 187, 228, 247, 101, 81, 141, 255, 46, 249, 91, 163, 185, 30, 185, 97, 48, 115, 250, 122,
1731 208, 237, 91, 194, 160, 81, 221, 12, 250, 122, 165, 57, 139, 132, 209, 220, 10, 226, 191,
1732 231, 244, 187, 251, 239, 84, 74, 101, 3, 159, 52, 143, 16, 255, 174, 249, 96, 77, 135, 141,
1733 96, 214, 147, 172, 74, 252, 73, 134, 57, 113, 61, 193, 170, 217, 230, 164, 61, 20, 163,
1734 214, 56, 124, 90, 117, 5, 69, 39, 10, 164, 173, 201, 150, 210, 53, 181, 150, 174, 4, 243,
1735 174, 105, 173, 134, 134, 86, 215, 238, 23, 45, 53, 208, 156, 81, 99, 97, 116, 172, 213,
1736 114, 40, 142, 54, 174, 229, 149, 188, 185, 190, 238, 9, 81, 89, 51, 69, 215, 182, 38, 134,
1737 107, 212, 108, 93, 146, 203, 35, 210, 197, 158, 111, 13, 6, 194, 122, 57, 18, 91, 226, 64,
1738 138, 106, 166, 160, 77, 6, 210, 66, 232, 17, 165, 52, 242, 29, 113, 220, 183, 212, 145,
1739 229, 170, 158, 82, 171, 140, 251, 110, 191, 107, 47, 38, 93, 59, 90, 143, 103, 147, 173,
1740 166, 232, 237, 158, 229, 106, 221, 112, 210, 115, 231, 234, 115, 135, 76, 126, 199, 22,
1741 213, 113, 99, 210, 28, 62, 68, 79, 182, 226, 174, 201, 179, 230, 214, 67, 107, 101, 217,
1742 238, 141, 19, 40, 125, 67, 80, 227, 46, 50, 255, 61, 31, 119, 199, 195, 137, 182, 49, 141,
1743 167, 40, 108, 255, 238, 169, 189, 127, 140, 171, 255, 124, 232, 206, 102, 155, 95, 102,
1744 235, 95, 255, 186, 123, 12, 122, 225, 116, 34, 213, 131, 141, 222, 105, 253, 90, 180, 199,
1745 255, 248, 167, 80, 119, 126, 215, 36, 177, 94, 173, 53, 167, 139, 142, 242, 115, 48, 155,
1746 141, 204, 91, 219, 239, 205, 31, 154, 119, 198, 248, 246, 121, 118, 59, 239, 135, 146, 166,
1747 248, 255, 26, 119, 234, 99, 233, 229, 241, 103, 125, 182, 157, 107, 178, 225, 63, 85, 158,
1748 22, 97, 224, 222, 254, 187, 62, 115, 111, 170, 139, 162, 19, 164, 95, 91, 168, 130, 42, 60,
1749 10, 254, 198, 20, 39, 171, 129, 168, 86, 250, 247, 213, 165, 181, 109, 5, 86, 201, 147,
1750 188, 7, 165, 221, 35, 166, 194, 176, 2, 215, 86, 180, 64, 85, 220, 7, 199, 152, 108, 137,
1751 42, 147, 116, 43, 122, 54, 26, 213, 173, 57, 183, 158, 7, 190, 98, 116, 37, 229, 153, 168,
1752 243, 182, 37, 147, 47, 156, 89, 21, 207, 92, 175, 45, 127, 45, 152, 15, 65, 197, 11, 188,
1753 218, 64, 82, 106, 131, 185, 114, 211, 121, 80, 5, 75, 94, 180, 44, 95, 188, 31, 40, 173,
1754 112, 180, 121, 41, 147, 209, 50, 25, 154, 235, 242, 64, 158, 188, 140, 137, 154, 183, 230,
1755 74, 160, 54, 60, 115, 52, 175, 89, 238, 60, 154, 154, 150, 247, 163, 187,
1756 ];
1757 let ps: Vec<Vec<u8>> = vec![
1758 p0.to_vec(),
1759 p1.to_vec(),
1760 p2.to_vec(),
1761 p3.to_vec(),
1762 p4.to_vec(),
1763 p5.to_vec(),
1764 p6.to_vec(),
1765 ];
1766
1767 let mut n = 0;
1768
1769 let mut rq = RecvQ::new();
1770 for i in ps {
1771 let v = FrameVec::new(&i).unwrap();
1772 for i in v.frames {
1773 rq.insert(i).unwrap();
1774 if !rq.flush(&"0.0.0.0:0".parse().unwrap()).is_empty() {
1775 n += 1;
1776 }
1777 }
1778 }
1779
1780 assert_eq!(n, 4);
1782}
1783
1784#[cfg(test)]
1785#[path = "arq_tests.rs"]
1786mod regressions;
1787
1788#[test]
1789fn rejects_messages_exceeding_the_receivers_fragment_limit() {
1790 let sendq = SendQ::new(576);
1791 let limit = crate::fragment::MAX_FRAGMENTS * (576 - 60);
1792 assert!(
1793 sendq
1794 .required_bytes(Reliability::ReliableOrdered, limit)
1795 .is_ok()
1796 );
1797 assert!(matches!(
1798 sendq.required_bytes(Reliability::ReliableOrdered, limit + 1),
1799 Err(RaknetError::PacketSizeExceedMTU)
1800 ));
1801}
1802
1803#[test]
1804fn exact_mtu_payload_is_not_marked_as_split() {
1805 let mut sendq = SendQ::new(576);
1806 let payload = vec![0xfe; 516];
1807 sendq
1808 .insert(Reliability::ReliableOrdered, &payload)
1809 .unwrap();
1810 let frames = sendq.flush(0, &"127.0.0.1:19132".parse().unwrap());
1811 assert_eq!(frames.len(), 1);
1812 assert_eq!(frames[0].flags & 16, 0);
1813 assert_eq!(frames[0].data.as_ref(), payload);
1814 sendq.ack(frames[0].sequence_number, 1);
1815 assert!(sendq.is_empty());
1816 assert_eq!(sendq.buffered_bytes, 0);
1817}
1818
1819#[cfg(test)]
1820mod allocation_regressions {
1821 use super::*;
1822
1823 #[test]
1824 fn frame_decoder_reuses_storage_and_discards_previous_frames() {
1825 let packet = FrameSetPacket::new(Reliability::ReliableOrdered, vec![0xfe; 800]);
1826 let encoded = packet.serialize().unwrap();
1827 let mut frames = Vec::new();
1828 FrameVec::decode_into(&encoded, &mut frames).unwrap();
1829 let capacity = frames.capacity();
1830 assert_eq!(frames[0].data.as_ref(), &[0xfe; 800]);
1831 frames.clear();
1832 FrameVec::decode_into(&encoded, &mut frames).unwrap();
1833 assert_eq!(frames.len(), 1);
1834 assert_eq!(frames.capacity(), capacity);
1835 assert!(FrameVec::decode_into(&[0x84], &mut frames).is_err());
1836 assert!(frames.is_empty());
1837 }
1838
1839 #[test]
1840 fn ordered_delivery_retains_the_receive_queue_allocation() {
1841 let mut queue = RecvQ::new();
1842 let mut delivered = Vec::new();
1843 for index in 0..16 {
1844 let mut frame = FrameSetPacket::new(Reliability::ReliableOrdered, vec![0xfe]);
1845 frame.sequence_number = index;
1846 frame.reliable_frame_index = index;
1847 frame.ordered_frame_index = index;
1848 queue.insert(frame).unwrap();
1849 queue.flush_into(&mut delivered);
1850 assert_eq!(delivered.len(), 1);
1851 delivered.clear();
1852 assert!(queue.ready_ordered.capacity() > 0);
1853 }
1854 }
1855}
1856
1857#[cfg(test)]
1858mod serialization_reuse_tests {
1859 use super::*;
1860
1861 #[test]
1862 fn reused_fragment_buffer_preserves_the_wire_format() {
1863 let mut frame = FrameSetPacket::new(Reliability::ReliableOrdered, vec![0xfe; 16]);
1864 frame.flags |= 16;
1865 frame.sequence_number = 0xabcdef;
1866 frame.reliable_frame_index = 0x123456;
1867 frame.ordered_frame_index = 0x654321;
1868 frame.order_channel = 7;
1869 frame.compound_size = 3;
1870 frame.compound_id = 0x1234;
1871 frame.fragment_index = 1;
1872 let mut expected = vec![
1873 0x8c, 0xef, 0xcd, 0xab, 0x70, 0, 0x80, 0x56, 0x34, 0x12, 0x21, 0x43, 0x65, 7, 0, 0, 0,
1874 3, 0x12, 0x34, 0, 0, 0, 1,
1875 ];
1876 expected.extend_from_slice(&[0xfe; 16]);
1877 let mut buffer = Vec::with_capacity(128);
1878 buffer.extend_from_slice(&[0xff; 64]);
1879 for _ in 0..100 {
1880 frame.serialize_into(&mut buffer).unwrap();
1881 assert_eq!(buffer, expected);
1882 assert_eq!(buffer.capacity(), 128);
1883 }
1884 frame.compound_size = 0;
1885 assert!(frame.serialize_into(&mut buffer).is_err());
1886 assert_eq!(buffer, expected);
1887 }
1888}
1889
1890#[cfg(test)]
1891mod shared_fragment_tests {
1892 use super::*;
1893
1894 #[test]
1895 fn retransmitted_fragment_accepts_old_ack_without_releasing_the_budget_twice() {
1896 let peer = "127.0.0.1:19132".parse().unwrap();
1897 let mut queue = SendQ::new(1400);
1898 queue
1899 .insert(Reliability::ReliableOrdered, &[0xfe; 4096])
1900 .unwrap();
1901 let frames = queue.flush(0, &peer);
1902 let old_id = frames[3].sequence_number;
1903 queue.nack(old_id, 1);
1904 let retry = queue.flush(1, &peer);
1905 assert_eq!(retry.len(), 1);
1906 let new_id = retry[0].sequence_number;
1907 queue.ack(old_id, 2);
1908 let budget = queue.buffered_bytes;
1909 queue.ack(old_id, 2);
1910 queue.ack(new_id, 2);
1911 assert_eq!(queue.buffered_bytes, budget);
1912 for frame in &frames[..3] {
1913 queue.ack(frame.sequence_number, 2);
1914 }
1915 assert_eq!(queue.buffered_bytes, 0);
1916 }
1917
1918 #[test]
1919 fn fragment_slices_share_one_allocation_and_keep_its_budget_until_final_ack() {
1920 let peer = "127.0.0.1:19132".parse().unwrap();
1921 let mut queue = SendQ::new(1400);
1922 let payload = vec![0xfe; 4096];
1923 queue
1924 .insert(Reliability::ReliableOrdered, &payload)
1925 .unwrap();
1926 let frames = queue.flush(0, &peer);
1927 assert_eq!(frames.len(), 4);
1928 let owner = frames[0].shared_payload.as_ref().unwrap();
1929 for frame in &frames {
1930 assert!(Arc::ptr_eq(owner, frame.shared_payload.as_ref().unwrap()));
1931 }
1932 let restored: Vec<_> = frames
1933 .iter()
1934 .flat_map(|frame| frame.data.iter().copied())
1935 .collect();
1936 assert_eq!(restored, payload);
1937 let initial = queue.buffered_bytes;
1938 for (index, frame) in frames.iter().enumerate() {
1939 queue.ack(frame.sequence_number, 1);
1940 queue.ack(frame.sequence_number, 1);
1941 if index + 1 < frames.len() {
1942 assert_eq!(
1943 queue.buffered_bytes,
1944 initial - (index + 1) * SendQ::FRAME_BUDGET
1945 );
1946 }
1947 }
1948 assert_eq!(queue.buffered_bytes, 0);
1949 assert_eq!(owner.remaining.load(Ordering::Relaxed), 0);
1950 }
1951}
1952
1953#[cfg(test)]
1954mod flight_order_tests {
1955 use super::*;
1956
1957 #[test]
1958 fn retries_and_sequence_wrap_keep_the_existing_numeric_order() {
1959 let peer = "127.0.0.1:19132".parse().unwrap();
1960 let mut queue = SendQ::new(1400);
1961 queue.sequence_number = sequence::MASK;
1962 queue.insert(Reliability::ReliableOrdered, &[0xfe]).unwrap();
1963 queue.insert(Reliability::ReliableOrdered, &[0xfe]).unwrap();
1964 let initial = queue.flush(0, &peer);
1965 assert_eq!(
1966 initial
1967 .iter()
1968 .map(|frame| frame.sequence_number)
1969 .collect::<Vec<_>>(),
1970 [sequence::MASK, 0]
1971 );
1972 assert!(queue.flight_order_dirty);
1973 assert!(queue.flush(1, &peer).is_empty());
1974 assert_eq!(
1975 queue
1976 .sent_packet
1977 .iter()
1978 .map(|packet| packet.0.sequence_number)
1979 .collect::<Vec<_>>(),
1980 [0, sequence::MASK]
1981 );
1982 assert!(!queue.flight_order_dirty);
1983 queue.nack(sequence::MASK, 2);
1984 assert!(queue.flight_order_dirty);
1985 let retry = queue.flush(2, &peer);
1986 assert_eq!(retry.len(), 1);
1987 assert_eq!(retry[0].sequence_number, 1);
1988 assert!(!queue.flight_order_dirty);
1989 assert_eq!(
1990 queue
1991 .sent_packet
1992 .iter()
1993 .map(|packet| packet.0.sequence_number)
1994 .collect::<Vec<_>>(),
1995 [0, 1]
1996 );
1997 queue.ack(sequence::MASK, 3);
1998 queue.ack(0, 3);
1999 assert!(queue.is_empty());
2000 assert_eq!(queue.buffered_bytes, 0);
2001 }
2002}
2003
2004#[cfg(test)]
2005mod owned_decode_tests {
2006 use super::*;
2007
2008 #[test]
2009 fn a_single_frame_moves_the_udp_allocation_into_its_payload() {
2010 let frame = FrameSetPacket::new(Reliability::ReliableOrdered, vec![0xfe; 800]);
2011 let packet = frame.serialize().unwrap();
2012 let pointer = packet.as_ptr();
2013 let mut decoded = Vec::new();
2014 FrameVec::decode_owned_into(packet, &mut decoded).unwrap();
2015 assert_eq!(decoded.len(), 1);
2016 assert_eq!(decoded[0].data.as_ptr(), pointer);
2017 assert_eq!(decoded[0].data.as_ref(), frame.data.as_ref());
2018 let data: Vec<u8> = decoded.pop().unwrap().data.into();
2019 assert_eq!(data.as_ptr(), pointer);
2020 }
2021
2022 #[test]
2023 fn multiple_frames_and_invalid_lengths_keep_the_borrowed_decoder_contract() {
2024 let first = FrameSetPacket::new(Reliability::ReliableOrdered, vec![0xfe; 800]);
2025 let second = FrameSetPacket::new(Reliability::Unreliable, vec![0xfe; 64]);
2026 let mut packet = first.serialize().unwrap();
2027 packet.extend_from_slice(&second.serialize().unwrap()[4..]);
2028 let mut expected = Vec::new();
2029 FrameVec::decode_into(&packet, &mut expected).unwrap();
2030 let mut actual = Vec::new();
2031 FrameVec::decode_owned_into(packet.clone(), &mut actual).unwrap();
2032 assert_eq!(actual.len(), 2);
2033 for (actual, expected) in actual.iter().zip(&expected) {
2034 assert_eq!(actual.serialize().unwrap(), expected.serialize().unwrap());
2035 }
2036 for length in 0..packet.len() {
2037 let mut borrowed = Vec::new();
2038 let mut owned = Vec::new();
2039 assert_eq!(
2040 FrameVec::decode_into(&packet[..length], &mut borrowed).is_ok(),
2041 FrameVec::decode_owned_into(packet[..length].to_vec(), &mut owned).is_ok()
2042 );
2043 }
2044 }
2045}