Skip to main content

rust_raknet/
arq.rs

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/// Delivery and ordering guarantees for a RakNet frame.
17#[derive(Clone, Copy, Debug, PartialEq, Eq)]
18#[repr(u8)]
19pub enum Reliability {
20    /// The frame may be lost or arrive out of order.
21    Unreliable = 0x00,
22    /// Only the newest frame in the ordering stream is delivered.
23    UnreliableSequenced = 0x01,
24    /// The frame is retransmitted until acknowledged, without ordering guarantees.
25    Reliable = 0x02,
26    /// The frame is retransmitted and delivered in order within its channel.
27    ReliableOrdered = 0x03,
28    /// The frame is reliable, but older frames in its ordering stream may be skipped.
29    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// Received payloads move into the application without another allocation.
61// Reliable sends share their backing allocation with retransmission frames.
62#[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
129// A fragmented send retains its complete allocation until the final fragment
130// is acknowledged. Charge that allocation once, independently of frame clones.
131struct 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        // Set the continuation bit for all fragments after the first.
282        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        // The top three bits encode the reliability mode.
290        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        // Bit 4 marks a fragmented frame.
306        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        // id
350        ret += 1;
351        // sequence number
352        ret += 3;
353        // flags
354        ret += 1;
355        // length_in_bits
356        ret += 2;
357
358        if self.is_reliable()? {
359            // reliable frame index
360            ret += 3;
361        }
362        if self.is_sequenced()? {
363            // sequenced frame index
364            ret += 3;
365        }
366        if self.is_ordered()? {
367            // Ordered frame index and channel.
368            ret += 4;
369        }
370        if (self.flags & 16) != 0 {
371            // Compound size, compound ID, and fragment index.
372            ret += 10;
373        }
374        //body
375        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    // Reuse the frame metadata allocation across incoming datagrams.
394    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            // A single-frame datagram can reuse its allocation for the payload.
405            // Compact the body in place without a shared slice owner.
406            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            // Multi-frame datagrams retain independent payload allocations.
470            // The owned single-frame path moves the original allocation below.
471            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        // Remove a hole that arrived before the next NACK was emitted.
491        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/// Channel zero is the common path; other channels allocate only when used.
553#[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                        // Contiguous traffic bypasses the reordering hash table.
659                        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    // Each entry stores a frame, send state, last send time, retry count, and prior sequence IDs.
745    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        // Admit a single large message while applying backpressure to bursts.
809        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        // Ignore ACKs outside the actual send history before advancing any state.
993        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        // A retransmitted frame has an ambiguous RTT sample (Karn's algorithm).
1026        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        // Compact the bounded flight window once. Removing each acknowledged
1039        // frame separately repeatedly shifts the remaining frame metadata.
1040        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            // Bound the existing 1.5x retry backoff, including long-lived losses.
1121            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        // Reserve queued batches once; a full reliable flight window reserves
1143        // nothing. The compact vector keeps async frame transfers cheap.
1144        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        // New sends preserve numeric order until the 24-bit sequence wraps.
1150        // ACK removal preserves it too; only resequencing requires sorting.
1151        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    // Captured first frame datagram from a Bedrock 1.18.12 client.
1329    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    // Connection Request - reliable [ reliable_frame_index = 0 ]
1556    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    // Connection Request - reliable [ reliable_frame_index = 0 ]
1561    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    // 2 frames Incompatible Protocol(extract data?) Connected ping - reliable ordered [ reliable_frame_index = 1 ]
1566    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    // 1 frames Connected ping - unreliable
1583    let p3 = [132, 3, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 16, 151, 56, 161];
1584    // 1 frames game packet - reliable ordered [is_fragment reliable_frame_index = 2 ordered_frame_index = 1 ]
1585    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    // 1 frames Incompatible Protocol(extract data?) - reliable ordered [reliable_frame_index = 1 ordered_frame_index = 0] == p2
1663    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    // 1 frames game packet - reliable ordered [is_fragment reliable_frame_index = 2 ordered_frame_index = 1 ] == p4
1680    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    // p1 retransmits p0 with a new datagram ID but the same reliable frame ID.
1781    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}