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) struct OutgoingFrames {
15    frames: Vec<FrameSetPacket>,
16    pub(crate) coalesced: bool,
17}
18
19impl OutgoingFrames {
20    #[cfg(test)]
21    pub(crate) fn new() -> Self {
22        Self::with_capacity(0)
23    }
24
25    fn with_capacity(capacity: usize) -> Self {
26        Self {
27            frames: Vec::with_capacity(capacity),
28            coalesced: false,
29        }
30    }
31}
32
33impl std::ops::Deref for OutgoingFrames {
34    type Target = Vec<FrameSetPacket>;
35    fn deref(&self) -> &Self::Target {
36        &self.frames
37    }
38}
39
40impl std::ops::DerefMut for OutgoingFrames {
41    fn deref_mut(&mut self) -> &mut Self::Target {
42        &mut self.frames
43    }
44}
45
46impl IntoIterator for OutgoingFrames {
47    type Item = FrameSetPacket;
48    type IntoIter = std::vec::IntoIter<FrameSetPacket>;
49    fn into_iter(self) -> Self::IntoIter {
50        self.frames.into_iter()
51    }
52}
53
54impl<'a> IntoIterator for &'a OutgoingFrames {
55    type Item = &'a FrameSetPacket;
56    type IntoIter = std::slice::Iter<'a, FrameSetPacket>;
57    fn into_iter(self) -> Self::IntoIter {
58        self.frames.iter()
59    }
60}
61
62/// Delivery and ordering guarantees for a RakNet frame.
63#[derive(Clone, Copy, Debug, PartialEq, Eq)]
64#[repr(u8)]
65pub enum Reliability {
66    /// The frame may be lost or arrive out of order.
67    Unreliable = 0x00,
68    /// Only the newest frame in the ordering stream is delivered.
69    UnreliableSequenced = 0x01,
70    /// The frame is retransmitted until acknowledged, without ordering guarantees.
71    Reliable = 0x02,
72    /// The frame is retransmitted and delivered in order within its channel.
73    ReliableOrdered = 0x03,
74    /// The frame is reliable, but older frames in its ordering stream may be skipped.
75    ReliableSequenced = 0x04,
76}
77
78impl Reliability {
79    pub fn to_u8(&self) -> u8 {
80        *self as u8
81    }
82
83    pub fn from(flags: u8) -> Result<Self> {
84        Self::try_from(flags)
85    }
86}
87
88impl TryFrom<u8> for Reliability {
89    type Error = RaknetError;
90
91    fn try_from(flags: u8) -> Result<Self> {
92        match flags {
93            0x00 => Ok(Self::Unreliable),
94            0x01 => Ok(Self::UnreliableSequenced),
95            0x02 => Ok(Self::Reliable),
96            0x03 => Ok(Self::ReliableOrdered),
97            0x04 => Ok(Self::ReliableSequenced),
98            _ => Err(RaknetError::IncorrectReliability),
99        }
100    }
101}
102
103const NEEDS_B_AND_AS_FLAG: u8 = 0x4;
104const CONTINUOUS_SEND_FLAG: u8 = 0x8;
105
106// Received payloads move into the application without another allocation.
107// Reliable sends share their backing allocation with retransmission frames.
108#[derive(Clone, Debug)]
109pub(crate) enum FramePayload {
110    Owned(Vec<u8>),
111    Bytes(bytes::Bytes),
112    Shared {
113        owner: Arc<[u8]>,
114        start: u32,
115        length: u16,
116    },
117}
118
119impl Default for FramePayload {
120    fn default() -> Self {
121        Self::Owned(Vec::new())
122    }
123}
124
125impl FramePayload {
126    fn copy_shared(data: &[u8]) -> Self {
127        Self::Shared {
128            owner: Arc::from(data),
129            start: 0,
130            length: data.len() as u16,
131        }
132    }
133}
134
135impl std::ops::Deref for FramePayload {
136    type Target = [u8];
137    fn deref(&self) -> &[u8] {
138        match self {
139            Self::Owned(data) => data,
140            Self::Bytes(data) => data,
141            Self::Shared {
142                owner,
143                start,
144                length,
145            } => &owner[*start as usize..*start as usize + usize::from(*length)],
146        }
147    }
148}
149
150impl AsRef<[u8]> for FramePayload {
151    fn as_ref(&self) -> &[u8] {
152        self
153    }
154}
155
156impl From<Vec<u8>> for FramePayload {
157    fn from(data: Vec<u8>) -> Self {
158        Self::Owned(data)
159    }
160}
161
162impl From<FramePayload> for Vec<u8> {
163    fn from(data: FramePayload) -> Self {
164        match data {
165            FramePayload::Owned(data) => data,
166            shared => shared.to_vec(),
167        }
168    }
169}
170
171impl PartialEq for FramePayload {
172    fn eq(&self, other: &Self) -> bool {
173        self.as_ref() == other.as_ref()
174    }
175}
176
177// A fragmented send retains its complete allocation until the final fragment
178// is acknowledged. Charge that allocation once, independently of frame clones.
179struct SharedPayload {
180    remaining: AtomicUsize,
181    bytes: usize,
182}
183
184#[derive(Clone)]
185pub struct FrameSetPacket {
186    pub sequence_number: u32,
187    pub flags: u8,
188    pub length_in_bytes: u16,
189    pub reliable_frame_index: u32,
190    pub sequenced_frame_index: u32,
191    pub ordered_frame_index: u32,
192    pub order_channel: u8,
193    pub compound_size: u32,
194    pub compound_id: u16,
195    pub fragment_index: u32,
196    pub(crate) data: FramePayload,
197    shared_payload: Option<Arc<SharedPayload>>,
198}
199
200impl FrameSetPacket {
201    pub fn new(r: Reliability, data: Vec<u8>) -> Self {
202        Self::from_payload(r, data.into())
203    }
204
205    fn from_payload(r: Reliability, data: FramePayload) -> Self {
206        let flag = r.to_u8() << 5;
207
208        Self {
209            sequence_number: 0,
210            flags: flag,
211            length_in_bytes: data.len() as u16,
212            reliable_frame_index: 0,
213            sequenced_frame_index: 0,
214            ordered_frame_index: 0,
215            order_channel: 0,
216            compound_size: 0,
217            compound_id: 0,
218            fragment_index: 0,
219            data,
220            shared_payload: None,
221        }
222    }
223
224    #[cfg(test)]
225    pub fn deserialize(buf: &[u8]) -> Result<(Self, bool)> {
226        let mut reader = RaknetReader::new(buf);
227        let input_len = buf.len() as u64;
228
229        let mut ret = Self {
230            sequence_number: 0,
231            flags: 0,
232            length_in_bytes: 0,
233            reliable_frame_index: 0,
234            sequenced_frame_index: 0,
235            ordered_frame_index: 0,
236            order_channel: 0,
237            compound_size: 0,
238            compound_id: 0,
239            fragment_index: 0,
240            data: FramePayload::default(),
241            shared_payload: None,
242        };
243
244        let packet_id = reader.read_u8()?;
245        if !(0x80..=0x8d).contains(&packet_id) {
246            return Err(RaknetError::PacketHeaderError);
247        }
248        ret.sequence_number = reader.read_u24(Endian::Little)?;
249        ret.flags = reader.read_u8()?;
250
251        let length_in_bits = reader.read_u16(Endian::Big)?;
252        if length_in_bits % 8 != 0 {
253            return Err(RaknetError::PacketParseError);
254        }
255        ret.length_in_bytes = length_in_bits / 8;
256
257        if ret.is_reliable()? {
258            ret.reliable_frame_index = reader.read_u24(Endian::Little)?;
259        }
260
261        if ret.is_sequenced()? {
262            ret.sequenced_frame_index = reader.read_u24(Endian::Little)?;
263        }
264        if ret.is_ordered()? {
265            ret.ordered_frame_index = reader.read_u24(Endian::Little)?;
266            ret.order_channel = reader.read_u8()?;
267        }
268
269        if ret.is_fragment() {
270            ret.compound_size = reader.read_u32(Endian::Big)?;
271            ret.compound_id = reader.read_u16(Endian::Big)?;
272            ret.fragment_index = reader.read_u32(Endian::Big)?;
273        }
274
275        let mut data = vec![0; usize::from(ret.length_in_bytes)];
276        reader.read(&mut data)?;
277        ret.data = data.into();
278
279        if ret.is_fragment() && (ret.compound_size == 0 || ret.fragment_index >= ret.compound_size)
280        {
281            return Err(RaknetError::PacketParseError);
282        }
283
284        Ok((ret, reader.pos() == input_len))
285    }
286
287    pub fn serialize(&self) -> Result<Vec<u8>> {
288        let mut buffer = Vec::new();
289        self.serialize_into(&mut buffer)?;
290        Ok(buffer)
291    }
292
293    pub(crate) fn serialize_into(&self, buffer: &mut Vec<u8>) -> Result<()> {
294        self.validate()?;
295        let size = self._size()?;
296        buffer.clear();
297        buffer.reserve(size);
298        let mut writer = RaknetWriter::from_buffer(std::mem::take(buffer));
299        let result = self
300            .write_header(&mut writer)
301            .and_then(|()| writer.write(self.data.as_ref()));
302        *buffer = writer.get_raw_payload();
303        result
304    }
305
306    pub(crate) fn serialize_group_into(frames: &[Self], output: &mut Vec<u8>) -> Result<()> {
307        let first = frames.first().ok_or(RaknetError::PacketParseError)?;
308        output.clear();
309        for (index, frame) in frames.iter().enumerate() {
310            if frame.sequence_number != first.sequence_number {
311                return Err(RaknetError::PacketParseError);
312            }
313            let mut header = [0; 32];
314            let length = frame.encode_header(&mut header)?;
315            output.extend_from_slice(&header[if index == 0 { 0 } else { 4 }..length]);
316            output.extend_from_slice(frame.data.as_ref());
317        }
318        Ok(())
319    }
320
321    pub(crate) fn validate(&self) -> Result<()> {
322        if self.data.len() != usize::from(self.length_in_bytes)
323            || self.data.len() > usize::from(u16::MAX / 8)
324            || (self.is_fragment()
325                && (self.compound_size == 0 || self.fragment_index >= self.compound_size))
326        {
327            return Err(RaknetError::PacketParseError);
328        }
329
330        self._size()?;
331        Ok(())
332    }
333
334    pub(crate) fn encode_header(&self, header: &mut [u8; 32]) -> Result<usize> {
335        self.validate()?;
336        let mut writer = RaknetWriter::from_buffer(header.as_mut_slice());
337        self.write_header(&mut writer)?;
338        Ok(32 - writer.remaining_mut())
339    }
340
341    fn write_header<B: bytes::BufMut>(&self, writer: &mut RaknetWriter<B>) -> Result<()> {
342        let mut id = 0x80 | NEEDS_B_AND_AS_FLAG;
343
344        // Set the continuation bit for all fragments after the first.
345        if (self.flags & 16) != 0 && self.fragment_index != 0 {
346            id |= CONTINUOUS_SEND_FLAG;
347        }
348
349        writer.write_u8(id)?;
350        writer.write_u24(self.sequence_number, Endian::Little)?;
351
352        // The top three bits encode the reliability mode.
353        writer.write_u8(self.flags)?;
354        writer.write_u16(self.length_in_bytes * 8, Endian::Big)?;
355
356        if self.is_reliable()? {
357            writer.write_u24(self.reliable_frame_index, Endian::Little)?;
358        }
359
360        if self.is_sequenced()? {
361            writer.write_u24(self.sequenced_frame_index, Endian::Little)?;
362        }
363        if self.is_ordered()? {
364            writer.write_u24(self.ordered_frame_index, Endian::Little)?;
365            writer.write_u8(self.order_channel)?;
366        }
367
368        // Bit 4 marks a fragmented frame.
369        if (self.flags & 16) != 0 {
370            writer.write_u32(self.compound_size, Endian::Big)?;
371            writer.write_u16(self.compound_id, Endian::Big)?;
372            writer.write_u32(self.fragment_index, Endian::Big)?;
373        }
374        Ok(())
375    }
376
377    pub fn is_fragment(&self) -> bool {
378        (self.flags & 16) != 0
379    }
380
381    pub fn is_reliable(&self) -> Result<bool> {
382        let r = Reliability::from((self.flags & 224) >> 5)?;
383        Ok(matches!(
384            r,
385            Reliability::Reliable | Reliability::ReliableOrdered | Reliability::ReliableSequenced
386        ))
387    }
388
389    pub fn is_ordered(&self) -> Result<bool> {
390        let r = Reliability::from((self.flags & 224) >> 5)?;
391        Ok(matches!(
392            r,
393            Reliability::UnreliableSequenced
394                | Reliability::ReliableOrdered
395                | Reliability::ReliableSequenced
396        ))
397    }
398
399    pub fn is_sequenced(&self) -> Result<bool> {
400        let r = Reliability::from((self.flags & 224) >> 5)?;
401        Ok(matches!(
402            r,
403            Reliability::UnreliableSequenced | Reliability::ReliableSequenced
404        ))
405    }
406    pub fn reliability(&self) -> Result<Reliability> {
407        Reliability::from((self.flags & 224) >> 5)
408    }
409
410    pub fn _size(&self) -> Result<usize> {
411        let mut ret = 0;
412        // id
413        ret += 1;
414        // sequence number
415        ret += 3;
416        // flags
417        ret += 1;
418        // length_in_bits
419        ret += 2;
420
421        if self.is_reliable()? {
422            // reliable frame index
423            ret += 3;
424        }
425        if self.is_sequenced()? {
426            // sequenced frame index
427            ret += 3;
428        }
429        if self.is_ordered()? {
430            // Ordered frame index and channel.
431            ret += 4;
432        }
433        if (self.flags & 16) != 0 {
434            // Compound size, compound ID, and fragment index.
435            ret += 10;
436        }
437        //body
438        ret += self.data.len();
439        Ok(ret)
440    }
441}
442
443pub struct FrameVec {
444    #[cfg(test)]
445    pub frames: Vec<FrameSetPacket>,
446}
447
448impl FrameVec {
449    #[cfg(test)]
450    pub fn new(buf: &[u8]) -> Result<Self> {
451        let mut frames = Vec::new();
452        Self::decode_into(buf, &mut frames)?;
453        Ok(Self { frames })
454    }
455
456    // Reuse the frame metadata allocation across incoming datagrams.
457    pub(crate) fn decode_into(buf: &[u8], frames: &mut Vec<FrameSetPacket>) -> Result<()> {
458        Self::decode(buf, frames, false)
459    }
460
461    pub(crate) fn decode_owned_into(
462        mut buf: Vec<u8>,
463        frames: &mut Vec<FrameSetPacket>,
464    ) -> Result<()> {
465        Self::decode(&buf, frames, true)?;
466        if let [frame] = frames.as_mut_slice() {
467            // A single-frame datagram can reuse its allocation for the payload.
468            // Compact the body in place without a shared slice owner.
469            let length = usize::from(frame.length_in_bytes);
470            let offset = buf.len() - length;
471            buf.copy_within(offset.., 0);
472            buf.truncate(length);
473            frame.data = buf.into();
474        }
475        Ok(())
476    }
477
478    fn decode(buf: &[u8], frames: &mut Vec<FrameSetPacket>, owned: bool) -> Result<()> {
479        frames.clear();
480        let mut reader = RaknetReader::new(buf);
481        let id = reader.read_u8()?;
482        if !(0x80..=0x8d).contains(&id) {
483            return Err(RaknetError::PacketHeaderError);
484        }
485        let sequence_number = reader.read_u24(Endian::Little)?;
486        if reader.pos() == buf.len() as u64 {
487            return Err(RaknetError::PacketParseError);
488        }
489        while reader.pos() < buf.len() as u64 {
490            let mut frame = FrameSetPacket {
491                sequence_number,
492                flags: 0,
493                length_in_bytes: 0,
494                reliable_frame_index: 0,
495                sequenced_frame_index: 0,
496                ordered_frame_index: 0,
497                order_channel: 0,
498                compound_size: 0,
499                compound_id: 0,
500                fragment_index: 0,
501                data: FramePayload::default(),
502                shared_payload: None,
503            };
504
505            frame.flags = reader.read_u8()?;
506            let length_in_bits = reader.read_u16(Endian::Big)?;
507            if length_in_bits % 8 != 0 {
508                return Err(RaknetError::PacketParseError);
509            }
510            frame.length_in_bytes = length_in_bits / 8;
511
512            if frame.is_reliable()? {
513                frame.reliable_frame_index = reader.read_u24(Endian::Little)?;
514            }
515            if frame.is_sequenced()? {
516                frame.sequenced_frame_index = reader.read_u24(Endian::Little)?;
517            }
518            if frame.is_ordered()? {
519                frame.ordered_frame_index = reader.read_u24(Endian::Little)?;
520                frame.order_channel = reader.read_u8()?;
521            }
522            if frame.is_fragment() {
523                frame.compound_size = reader.read_u32(Endian::Big)?;
524                frame.compound_id = reader.read_u16(Endian::Big)?;
525                frame.fragment_index = reader.read_u32(Endian::Big)?;
526                if frame.compound_size == 0 || frame.fragment_index >= frame.compound_size {
527                    return Err(RaknetError::PacketParseError);
528                }
529            }
530
531            let data = reader.read_slice(usize::from(frame.length_in_bytes))?;
532            // Multi-frame datagrams retain independent payload allocations.
533            // The owned single-frame path moves the original allocation below.
534            if !owned || !frames.is_empty() || reader.pos() != buf.len() as u64 {
535                frame.data = data.to_vec().into();
536            }
537            frames.push(frame);
538        }
539
540        Ok(())
541    }
542}
543
544#[derive(Default)]
545pub struct ACKSet {
546    ack: Vec<(u32, u32)>,
547    nack: Vec<(u32, u32)>,
548    next_expected: u32,
549}
550
551impl ACKSet {
552    pub fn insert(&mut self, s: u32) {
553        // Remove a hole that arrived before the next NACK was emitted.
554        let mut split = None;
555        self.nack.retain_mut(|(start, end)| {
556            if s < *start || s > *end {
557                return true;
558            }
559            if *start == *end {
560                return false;
561            }
562            if s == *start {
563                *start += 1;
564            } else if s == *end {
565                *end -= 1;
566            } else {
567                split = Some((s + 1, *end));
568                *end = s - 1;
569            }
570            true
571        });
572        if let Some(range) = split {
573            self.nack.push(range);
574        }
575        if s == self.next_expected || sequence::newer(s, self.next_expected) {
576            if s != self.next_expected {
577                if s > self.next_expected {
578                    self.nack.push((self.next_expected, s - 1));
579                } else {
580                    self.nack.push((self.next_expected, sequence::MASK));
581                    if s != 0 {
582                        self.nack.push((0, s - 1));
583                    }
584                }
585            }
586            self.next_expected = sequence::next(s);
587        }
588
589        for i in 0..self.ack.len() {
590            let a = self.ack[i];
591            if (a.0..=a.1).contains(&s) {
592                return;
593            }
594            if a.0 != 0 && s == a.0 - 1 {
595                self.ack[i].0 = s;
596                return;
597            }
598            if s == a.1.saturating_add(1) {
599                self.ack[i].1 = s;
600                return;
601            }
602        }
603        self.ack.push((s, s));
604    }
605
606    #[cfg(test)]
607    pub fn get_ack(&mut self) -> Vec<(u32, u32)> {
608        std::mem::take(&mut self.ack)
609    }
610
611    fn take_ack_into(&mut self, output: &mut Vec<(u32, u32)>) {
612        output.clear();
613        std::mem::swap(output, &mut self.ack);
614    }
615
616    fn take_nack_into(&mut self, output: &mut Vec<(u32, u32)>) {
617        output.clear();
618        std::mem::swap(output, &mut self.nack);
619    }
620
621    #[cfg(test)]
622    pub fn get_nack(&mut self) -> Vec<(u32, u32)> {
623        std::mem::take(&mut self.nack)
624    }
625}
626
627/// Channel zero is the common path; other channels allocate only when used.
628#[derive(Default)]
629struct ChannelIndexes {
630    primary: u32,
631    others: HashMap<u8, u32>,
632}
633
634impl ChannelIndexes {
635    fn get(&self, channel: u8) -> u32 {
636        if channel == 0 {
637            self.primary
638        } else {
639            self.others.get(&channel).copied().unwrap_or(0)
640        }
641    }
642
643    fn get_mut(&mut self, channel: u8) -> &mut u32 {
644        if channel == 0 {
645            &mut self.primary
646        } else {
647            self.others.entry(channel).or_default()
648        }
649    }
650
651    #[cfg(test)]
652    fn insert(&mut self, channel: u8, index: u32) {
653        *self.get_mut(channel) = index;
654    }
655}
656
657#[derive(Default)]
658pub struct RecvQ {
659    sequenced_frame_indexes: ChannelIndexes,
660    last_ordered_indexes: ChannelIndexes,
661    sequence_number_ackset: ACKSet,
662    packets: HashMap<u32, FrameSetPacket>,
663    ordered_packets: HashMap<(u8, u32), FrameSetPacket>,
664    fragment_queue: FragmentQ,
665    reliable_window: ReliableWindow,
666    ordered_bytes: usize,
667    ready_ordered: Vec<FrameSetPacket>,
668    ready_bytes: usize,
669}
670
671impl RecvQ {
672    pub fn new() -> Self {
673        Self::default()
674    }
675
676    pub fn insert(&mut self, frame: FrameSetPacket) -> Result<()> {
677        let reliability = frame.reliability()?;
678        self.sequence_number_ackset.insert(frame.sequence_number);
679        if frame.is_reliable()? && !self.reliable_window.accept(frame.reliable_frame_index)? {
680            return Ok(());
681        }
682
683        match reliability {
684            Reliability::Unreliable => {
685                self.packets.entry(frame.sequence_number).or_insert(frame);
686            }
687            Reliability::UnreliableSequenced => {
688                let channel = frame.order_channel;
689                let sequence_index = frame.sequenced_frame_index;
690                let sequence_number = frame.sequence_number;
691                let last_index = self.sequenced_frame_indexes.get_mut(channel);
692                if sequence_index == *last_index || sequence::newer(sequence_index, *last_index) {
693                    self.packets.entry(sequence_number).or_insert(frame);
694                    *last_index = sequence::next(sequence_index);
695                }
696            }
697            Reliability::Reliable => {
698                self.packets.insert(frame.sequence_number, frame);
699            }
700            Reliability::ReliableOrdered => {
701                let expected_index = self.last_ordered_indexes.get(frame.order_channel);
702                if sequence::newer(expected_index, frame.ordered_frame_index) {
703                    return Ok(());
704                }
705                if sequence::distance(frame.ordered_frame_index, expected_index)
706                    >= sequence::RECEIVE_WINDOW
707                {
708                    return Err(RaknetError::PacketParseError);
709                }
710                let complete = if frame.is_fragment() {
711                    self.fragment_queue.insert_and_take_completed(frame)?
712                } else {
713                    Some(frame)
714                };
715                if let Some(frame) = complete {
716                    let key = (frame.order_channel, frame.ordered_frame_index);
717                    if self.ordered_packets.contains_key(&key) {
718                        return Ok(());
719                    }
720                    if self.ordered_packets.len() + self.ready_ordered.len()
721                        >= sequence::RECEIVE_WINDOW as usize
722                        || self.ordered_bytes + self.ready_bytes + frame.data.len()
723                            > 64 * 1024 * 1024
724                    {
725                        return Err(RaknetError::PacketParseError);
726                    }
727                    if frame.ordered_frame_index == expected_index {
728                        let channel = frame.order_channel;
729                        self.ready_bytes += frame.data.len();
730                        self.ready_ordered.push(frame);
731                        let expected = self.last_ordered_indexes.get_mut(channel);
732                        *expected = sequence::next(*expected);
733                        // Contiguous traffic bypasses the reordering hash table.
734                        while !self.ordered_packets.is_empty() {
735                            let Some(frame) = self.ordered_packets.remove(&(channel, *expected))
736                            else {
737                                break;
738                            };
739                            self.ordered_bytes -= frame.data.len();
740                            self.ready_bytes += frame.data.len();
741                            self.ready_ordered.push(frame);
742                            *expected = sequence::next(*expected);
743                        }
744                    } else {
745                        self.ordered_bytes += frame.data.len();
746                        self.ordered_packets.insert(key, frame);
747                    }
748                }
749            }
750
751            Reliability::ReliableSequenced => {
752                let channel = frame.order_channel;
753                let sequence_index = frame.sequenced_frame_index;
754                let sequence_number = frame.sequence_number;
755                let last_index = self.sequenced_frame_indexes.get_mut(channel);
756                if sequence_index == *last_index || sequence::newer(sequence_index, *last_index) {
757                    self.packets.entry(sequence_number).or_insert(frame);
758                    *last_index = sequence::next(sequence_index);
759                }
760            }
761        }
762        Ok(())
763    }
764
765    #[cfg(test)]
766    pub fn get_ack(&mut self) -> Vec<(u32, u32)> {
767        self.sequence_number_ackset.get_ack()
768    }
769
770    #[cfg(test)]
771    pub fn get_nack(&mut self) -> Vec<(u32, u32)> {
772        self.sequence_number_ackset.get_nack()
773    }
774
775    pub(crate) fn take_ack_into(&mut self, output: &mut Vec<(u32, u32)>) {
776        self.sequence_number_ackset.take_ack_into(output);
777    }
778
779    pub(crate) fn take_nack_into(&mut self, output: &mut Vec<(u32, u32)>) {
780        self.sequence_number_ackset.take_nack_into(output);
781    }
782
783    #[cfg(test)]
784    pub fn flush(&mut self, _peer_addr: &SocketAddr) -> Vec<FrameSetPacket> {
785        let mut frames = Vec::new();
786        self.flush_into(&mut frames);
787        frames
788    }
789
790    pub(crate) fn flush_into(&mut self, frames: &mut Vec<FrameSetPacket>) {
791        frames.append(&mut self.ready_ordered);
792        self.ready_bytes = 0;
793        if self.packets.is_empty() {
794            return;
795        }
796        let mut packets: Vec<_> = self.packets.drain().map(|(_, frame)| frame).collect();
797        packets.sort_unstable_by_key(|frame| frame.sequence_number);
798        frames.extend(packets);
799    }
800    pub(crate) fn needs_maintenance(&self) -> bool {
801        !self.sequence_number_ackset.nack.is_empty() || self.fragment_queue.size() != 0
802    }
803
804    pub fn fragments_expired(&self) -> bool {
805        self.fragment_queue.expired()
806    }
807
808    pub fn get_ordered_packet(&self) -> usize {
809        self.ordered_packets.len() + self.ready_ordered.len()
810    }
811
812    pub fn get_fragment_queue_size(&self) -> usize {
813        self.fragment_queue.size()
814    }
815
816    pub fn get_ordered_keys(&self) -> Vec<(u8, u32)> {
817        self.ordered_packets.keys().copied().collect()
818    }
819
820    pub fn get_size(&self) -> usize {
821        self.packets.len()
822    }
823}
824
825pub struct SendQ {
826    mtu: u16,
827    ack_sequence_number: u32,
828    sequence_number: u32,
829    reliable_frame_index: u32,
830    sequenced_frame_indexes: ChannelIndexes,
831    ordered_frame_indexes: ChannelIndexes,
832    compound_id: u16,
833    // Each entry stores a frame, send state, last send time, retry count, and prior sequence IDs.
834    packets: VecDeque<FrameSetPacket>,
835    queued_unreliable: usize,
836    buffered_bytes: usize,
837    rto: i64,
838    srtt: i64,
839    sent_packet: Vec<(FrameSetPacket, bool, i64, u32, Vec<u32>)>,
840    flight_order_dirty: bool,
841    next_retry: i64,
842    retries_pending: bool,
843    coalesce: bool,
844    coalescing_allowed: bool,
845    grouped_acks: bool,
846}
847
848impl SendQ {
849    pub const DEFAULT_TIMEOUT_MILLS: i64 = 50;
850    const MAX_IN_FLIGHT_PACKETS: usize = 64;
851    const MAX_COALESCED_FRAMES: usize = 8;
852    const MAX_BUFFERED_BYTES: usize = 64 * 1024 * 1024;
853    const SEND_HIGH_WATER: usize = 256 * 1024;
854    const FRAME_BUDGET: usize = 128;
855
856    const RTO_UBOUND: i64 = 12000;
857    const RTO_LBOUND: i64 = 50;
858
859    pub fn new(mtu: u16) -> Self {
860        Self {
861            mtu,
862            ack_sequence_number: sequence::MASK,
863            sequence_number: 0,
864            packets: VecDeque::new(),
865            queued_unreliable: 0,
866            buffered_bytes: 0,
867            sent_packet: vec![],
868            flight_order_dirty: false,
869            next_retry: i64::MAX,
870            retries_pending: false,
871            coalesce: false,
872            coalescing_allowed: true,
873            grouped_acks: false,
874            reliable_frame_index: 0,
875            sequenced_frame_indexes: ChannelIndexes::default(),
876            ordered_frame_indexes: ChannelIndexes::default(),
877            compound_id: 0,
878
879            rto: SendQ::DEFAULT_TIMEOUT_MILLS,
880            srtt: SendQ::DEFAULT_TIMEOUT_MILLS,
881        }
882    }
883
884    fn required_bytes(&self, reliability: Reliability, len: usize) -> Result<usize> {
885        let payload = usize::from(self.mtu)
886            .checked_sub(60)
887            .filter(|n| *n > 0)
888            .ok_or(RaknetError::PacketSizeExceedMTU)?;
889        let frames = if reliability == Reliability::ReliableOrdered && len > payload {
890            let frames = len.div_ceil(payload);
891            if frames > crate::fragment::MAX_FRAGMENTS {
892                return Err(RaknetError::PacketSizeExceedMTU);
893            }
894            frames
895        } else {
896            1
897        };
898        let bytes = frames
899            .checked_mul(Self::FRAME_BUDGET)
900            .and_then(|n| n.checked_add(len))
901            .filter(|n| *n <= Self::MAX_BUFFERED_BYTES)
902            .ok_or(RaknetError::PacketSizeExceedMTU)?;
903        Ok(bytes)
904    }
905
906    pub fn has_capacity(&self, reliability: Reliability, len: usize) -> Result<bool> {
907        let required = self.required_bytes(reliability, len)?;
908        // Admit a single large message while applying backpressure to bursts.
909        Ok(self.buffered_bytes.saturating_add(required) <= Self::SEND_HIGH_WATER.max(required))
910    }
911
912    pub(crate) fn enable_coalescing(&mut self) {
913        self.coalesce = self.coalescing_allowed;
914    }
915
916    pub(crate) fn allows_coalescing(&self) -> bool {
917        self.coalescing_allowed
918    }
919
920    pub(crate) fn has_batch_capacity(
921        &self,
922        reliability: Reliability,
923        mut lengths: impl Iterator<Item = usize>,
924    ) -> Result<bool> {
925        let required = lengths.try_fold(0usize, |total, length| {
926            total
927                .checked_add(self.required_bytes(reliability, length)?)
928                .filter(|&bytes| bytes <= Self::MAX_BUFFERED_BYTES)
929                .ok_or(RaknetError::PacketSizeExceedMTU)
930        })?;
931        Ok(self.buffered_bytes.saturating_add(required) <= Self::SEND_HIGH_WATER.max(required))
932    }
933
934    pub fn insert(&mut self, reliability: Reliability, buf: &[u8]) -> Result<()> {
935        self.insert_with_order_channel(reliability, buf, 0)
936    }
937
938    pub fn insert_with_order_channel(
939        &mut self,
940        reliability: Reliability,
941        buf: &[u8],
942        order_channel: u8,
943    ) -> Result<()> {
944        self.insert_payload(reliability, buf, order_channel, None)
945    }
946
947    pub(crate) fn insert_bytes(
948        &mut self,
949        reliability: Reliability,
950        data: &bytes::Bytes,
951        order_channel: u8,
952    ) -> Result<()> {
953        self.insert_payload(reliability, data, order_channel, Some(data))
954    }
955
956    fn insert_payload(
957        &mut self,
958        reliability: Reliability,
959        buf: &[u8],
960        order_channel: u8,
961        owned: Option<&bytes::Bytes>,
962    ) -> Result<()> {
963        let reserved = self.required_bytes(reliability, buf.len())?;
964        if reserved > Self::MAX_BUFFERED_BYTES - self.buffered_bytes {
965            return Err(RaknetError::PacketSizeExceedMTU);
966        }
967        let max_payload = self
968            .mtu
969            .checked_sub(60)
970            .map(usize::from)
971            .filter(|size| *size > 0)
972            .ok_or(RaknetError::PacketSizeExceedMTU)?;
973
974        match reliability {
975            Reliability::Unreliable => {
976                if buf.len() > max_payload {
977                    return Err(RaknetError::PacketSizeExceedMTU);
978                }
979
980                let frame = FrameSetPacket::from_payload(
981                    reliability,
982                    owned.map_or_else(
983                        || FramePayload::Owned(buf.to_vec()),
984                        |data| FramePayload::Bytes(data.clone()),
985                    ),
986                );
987                self.packets.push_back(frame);
988            }
989            Reliability::UnreliableSequenced => {
990                if buf.len() > max_payload {
991                    return Err(RaknetError::PacketSizeExceedMTU);
992                }
993
994                let sequenced_frame_index = {
995                    let index = self.sequenced_frame_indexes.get_mut(order_channel);
996                    let current = *index;
997                    *index = sequence::next(*index);
998                    current
999                };
1000                let ordered_frame_index = self.ordered_frame_indexes.get(order_channel);
1001                let mut frame = FrameSetPacket::from_payload(
1002                    reliability,
1003                    owned.map_or_else(
1004                        || FramePayload::Owned(buf.to_vec()),
1005                        |data| FramePayload::Bytes(data.clone()),
1006                    ),
1007                );
1008                frame.order_channel = order_channel;
1009                frame.ordered_frame_index = ordered_frame_index;
1010                frame.sequenced_frame_index = sequenced_frame_index;
1011                self.packets.push_back(frame);
1012            }
1013            Reliability::Reliable => {
1014                if buf.len() > max_payload {
1015                    return Err(RaknetError::PacketSizeExceedMTU);
1016                }
1017
1018                let mut frame = FrameSetPacket::from_payload(
1019                    reliability,
1020                    owned.map_or_else(
1021                        || FramePayload::copy_shared(buf),
1022                        |data| FramePayload::Bytes(data.clone()),
1023                    ),
1024                );
1025                frame.reliable_frame_index = self.reliable_frame_index;
1026                self.packets.push_back(frame);
1027                self.reliable_frame_index = sequence::next(self.reliable_frame_index);
1028            }
1029            Reliability::ReliableOrdered => {
1030                if buf.len() <= max_payload {
1031                    let mut frame = FrameSetPacket::from_payload(
1032                        reliability,
1033                        owned.map_or_else(
1034                            || FramePayload::copy_shared(buf),
1035                            |data| FramePayload::Bytes(data.clone()),
1036                        ),
1037                    );
1038                    frame.order_channel = order_channel;
1039                    frame.reliable_frame_index = self.reliable_frame_index;
1040                    frame.ordered_frame_index = *self.ordered_frame_indexes.get_mut(order_channel);
1041                    self.packets.push_back(frame);
1042                    self.reliable_frame_index = sequence::next(self.reliable_frame_index);
1043                } else {
1044                    let compound_size = buf.len().div_ceil(max_payload);
1045                    let compound_size = u32::try_from(compound_size)
1046                        .map_err(|_| RaknetError::PacketSizeExceedMTU)?;
1047                    let ordered_frame_index = *self.ordered_frame_indexes.get_mut(order_channel);
1048
1049                    let data: Option<Arc<[u8]>> = owned.is_none().then(|| Arc::from(buf));
1050                    let shared_payload = Arc::new(SharedPayload {
1051                        remaining: AtomicUsize::new(compound_size as usize),
1052                        bytes: buf.len(),
1053                    });
1054                    for (fragment_index, chunk) in buf.chunks(max_payload).enumerate() {
1055                        let start = fragment_index * max_payload;
1056                        let mut frame = FrameSetPacket::from_payload(
1057                            reliability,
1058                            match owned {
1059                                Some(data) => {
1060                                    FramePayload::Bytes(data.slice(start..start + chunk.len()))
1061                                }
1062                                None => FramePayload::Shared {
1063                                    owner: data.as_ref().unwrap().clone(),
1064                                    start: start as u32,
1065                                    length: chunk.len() as u16,
1066                                },
1067                            },
1068                        );
1069                        frame.shared_payload = Some(shared_payload.clone());
1070                        frame.flags |= 16;
1071                        frame.compound_size = compound_size;
1072                        frame.compound_id = self.compound_id;
1073                        frame.fragment_index = fragment_index as u32;
1074                        frame.order_channel = order_channel;
1075                        frame.reliable_frame_index = self.reliable_frame_index;
1076                        frame.ordered_frame_index = ordered_frame_index;
1077                        self.packets.push_back(frame);
1078                        self.reliable_frame_index = sequence::next(self.reliable_frame_index);
1079                    }
1080                    self.compound_id = self.compound_id.wrapping_add(1);
1081                }
1082                let index = self.ordered_frame_indexes.get_mut(order_channel);
1083                *index = sequence::next(*index);
1084            }
1085            Reliability::ReliableSequenced => {
1086                if buf.len() > max_payload {
1087                    return Err(RaknetError::PacketSizeExceedMTU);
1088                }
1089
1090                let sequenced_frame_index = {
1091                    let index = self.sequenced_frame_indexes.get_mut(order_channel);
1092                    let current = *index;
1093                    *index = sequence::next(*index);
1094                    current
1095                };
1096                let ordered_frame_index = self.ordered_frame_indexes.get(order_channel);
1097                let mut frame = FrameSetPacket::from_payload(
1098                    reliability,
1099                    owned.map_or_else(
1100                        || FramePayload::copy_shared(buf),
1101                        |data| FramePayload::Bytes(data.clone()),
1102                    ),
1103                );
1104                frame.order_channel = order_channel;
1105                frame.reliable_frame_index = self.reliable_frame_index;
1106                frame.sequenced_frame_index = sequenced_frame_index;
1107                frame.ordered_frame_index = ordered_frame_index;
1108                self.packets.push_back(frame);
1109                self.reliable_frame_index = sequence::next(self.reliable_frame_index);
1110            }
1111        };
1112        self.buffered_bytes += reserved;
1113        if matches!(
1114            reliability,
1115            Reliability::Unreliable | Reliability::UnreliableSequenced
1116        ) {
1117            self.queued_unreliable += 1;
1118        }
1119        Ok(())
1120    }
1121
1122    fn update_rto(&mut self, rtt: i64) {
1123        let previous = self.rto;
1124        (self.srtt, self.rto) = Self::latency_sample(self.srtt, rtt);
1125        if self.rto != previous {
1126            self.next_retry = 0;
1127        }
1128    }
1129
1130    fn latency_sample(srtt: i64, rtt: i64) -> (i64, i64) {
1131        let srtt = (srtt * 4 + rtt) / 5;
1132        (
1133            srtt,
1134            (srtt * 3 / 2).clamp(Self::RTO_LBOUND, Self::RTO_UBOUND),
1135        )
1136    }
1137
1138    pub(crate) fn mtu(&self) -> u16 {
1139        self.mtu
1140    }
1141
1142    pub fn get_rto(&self) -> i64 {
1143        self.rto
1144    }
1145
1146    pub fn nack(&mut self, sequence: u32, tick: i64) {
1147        for i in 0..self.sent_packet.len() {
1148            let item = &mut self.sent_packet[i];
1149            if item.1 && item.0.sequence_number == sequence {
1150                // Preserve ordinary pacing once this connection has observed
1151                // loss, including feedback received before batching is enabled.
1152                self.coalescing_allowed = false;
1153                self.coalesce = false;
1154                raknet_log_debug!(
1155                    "packet {}-{}-{} nack {} times",
1156                    item.0.sequence_number,
1157                    item.0.reliable_frame_index,
1158                    item.0.ordered_frame_index,
1159                    item.3 + 1
1160                );
1161                let previous = item.0.sequence_number;
1162                self.flight_order_dirty = true;
1163                item.0.sequence_number = self.sequence_number;
1164                self.sequence_number = sequence::next(self.sequence_number);
1165                item.1 = false;
1166                self.retries_pending = true;
1167                item.2 = tick;
1168
1169                if item.4.len() == 64 {
1170                    item.4.remove(0);
1171                }
1172                item.4.push(previous);
1173            }
1174        }
1175    }
1176
1177    pub fn ack(&mut self, sequence: u32, tick: i64) {
1178        if self.grouped_acks && self.sent_packet.len() > 1 {
1179            self.ack_ranges(&[(sequence, sequence)], tick);
1180            return;
1181        }
1182        // Ignore ACKs outside the actual send history before advancing any state.
1183        let Some(index) = self
1184            .sent_packet
1185            .iter()
1186            .position(|item| item.0.sequence_number == sequence || item.4.contains(&sequence))
1187        else {
1188            return;
1189        };
1190        let item = self.sent_packet.remove(index);
1191        if self.grouped_acks && self.sent_packet.is_empty() {
1192            self.grouped_acks = false;
1193        }
1194        let released_payload = match &item.0.shared_payload {
1195            Some(payload) if payload.remaining.fetch_sub(1, Ordering::Relaxed) == 1 => {
1196                payload.bytes
1197            }
1198            Some(_) => 0,
1199            None => item.0.data.len(),
1200        };
1201        self.buffered_bytes -= released_payload + Self::FRAME_BUDGET;
1202        if sequence::newer(sequence, self.ack_sequence_number) {
1203            let span = sequence::distance(sequence, self.ack_sequence_number);
1204            let missing: Vec<_> = self
1205                .sent_packet
1206                .iter()
1207                .filter_map(|item| {
1208                    let distance =
1209                        sequence::distance(item.0.sequence_number, self.ack_sequence_number);
1210                    (distance > 0 && distance < span).then_some(item.0.sequence_number)
1211                })
1212                .collect();
1213            for id in missing {
1214                self.nack(id, tick);
1215            }
1216            self.ack_sequence_number = sequence;
1217        }
1218        // A retransmitted frame has an ambiguous RTT sample (Karn's algorithm).
1219        if item.3 == 0 {
1220            self.update_rto(tick.saturating_sub(item.2).max(0));
1221        }
1222    }
1223
1224    #[inline]
1225    pub fn ack_ranges(&mut self, ranges: &[(u32, u32)], tick: i64) {
1226        if self.grouped_acks {
1227            self.ack_ranges_inner::<true>(ranges, tick);
1228        } else {
1229            self.ack_ranges_inner::<false>(ranges, tick);
1230        }
1231    }
1232
1233    fn ack_ranges_inner<const GROUPED: bool>(&mut self, ranges: &[(u32, u32)], tick: i64) {
1234        if let [(start, end)] = ranges {
1235            if start == end && (!GROUPED || self.sent_packet.len() <= 1) {
1236                self.ack(*start, tick);
1237                return;
1238            }
1239        }
1240        // Compact the bounded flight window once. Removing each acknowledged
1241        // frame separately repeatedly shifts the remaining frame metadata.
1242        let previous = self.ack_sequence_number;
1243        let mut newest = previous;
1244        let mut latency = (self.srtt, self.rto);
1245        let mut released_bytes = 0;
1246        let mut previous_sample = None;
1247        self.sent_packet.retain_mut(|item| {
1248            let acknowledged_id = std::iter::once(item.0.sequence_number)
1249                .chain(item.4.iter().copied())
1250                .find(|id| {
1251                    ranges
1252                        .iter()
1253                        .any(|&(start, end)| start <= *id && *id <= end)
1254                });
1255            let Some(id) = acknowledged_id else {
1256                return true;
1257            };
1258            let payload_bytes = match &item.0.shared_payload {
1259                Some(payload) if payload.remaining.fetch_sub(1, Ordering::Relaxed) == 1 => {
1260                    payload.bytes
1261                }
1262                Some(_) => 0,
1263                None => item.0.data.len(),
1264            };
1265            released_bytes += payload_bytes + Self::FRAME_BUDGET;
1266            if sequence::newer(id, newest) {
1267                newest = id;
1268            }
1269            // Initial members of a frame set are contiguous. Retransmitted
1270            // frames never contribute RTT samples (Karn's algorithm).
1271            if item.3 == 0 && (!GROUPED || previous_sample != Some(id)) {
1272                if GROUPED {
1273                    previous_sample = Some(id);
1274                }
1275                latency = Self::latency_sample(latency.0, tick.saturating_sub(item.2).max(0));
1276            }
1277            false
1278        });
1279        self.buffered_bytes -= released_bytes;
1280        if GROUPED && self.sent_packet.is_empty() {
1281            self.grouped_acks = false;
1282        }
1283
1284        if self.rto != latency.1 {
1285            self.next_retry = 0;
1286        }
1287        (self.srtt, self.rto) = latency;
1288        if newest != previous {
1289            let span = sequence::distance(newest, previous);
1290            let missing: Vec<_> = self
1291                .sent_packet
1292                .iter()
1293                .filter_map(|item| {
1294                    let distance = sequence::distance(item.0.sequence_number, previous);
1295                    (distance > 0 && distance < span).then_some(item.0.sequence_number)
1296                })
1297                .collect();
1298            for id in missing {
1299                self.nack(id, tick);
1300            }
1301            self.ack_sequence_number = newest;
1302        }
1303    }
1304
1305    pub fn nack_ranges(&mut self, ranges: &[(u32, u32)], tick: i64) {
1306        if let [(start, end)] = ranges {
1307            if start == end {
1308                self.nack(*start, tick);
1309                return;
1310            }
1311        }
1312        let missing: Vec<_> = self
1313            .sent_packet
1314            .iter()
1315            .filter_map(|item| {
1316                let id = item.0.sequence_number;
1317                ranges
1318                    .iter()
1319                    .any(|&(start, end)| start <= id && id <= end)
1320                    .then_some(id)
1321            })
1322            .collect();
1323        for id in missing {
1324            self.nack(id, tick);
1325        }
1326    }
1327
1328    fn retry_timeout(rto: i64, retries: u32) -> i64 {
1329        let mut timeout = rto;
1330        for _ in 0..retries.min(32) {
1331            timeout = ((timeout as f64 * 1.5) as i64).min(Self::RTO_UBOUND);
1332        }
1333        timeout
1334    }
1335
1336    fn tick(&mut self, tick: i64) {
1337        if tick < self.next_retry {
1338            return;
1339        }
1340        self.next_retry = i64::MAX;
1341        for i in 0..self.sent_packet.len() {
1342            let p = &mut self.sent_packet[i];
1343
1344            let cur_rto = Self::retry_timeout(self.rto, p.3);
1345
1346            if p.1 && tick - p.2 >= cur_rto {
1347                self.coalescing_allowed = false;
1348                self.coalesce = false;
1349                let previous = p.0.sequence_number;
1350                self.flight_order_dirty = true;
1351                p.0.sequence_number = self.sequence_number;
1352                self.sequence_number = sequence::next(self.sequence_number);
1353                p.1 = false;
1354                self.retries_pending = true;
1355                if p.4.len() == 64 {
1356                    p.4.remove(0);
1357                }
1358                p.4.push(previous);
1359            } else if p.1 {
1360                self.next_retry = self.next_retry.min(p.2.saturating_add(cur_rto));
1361            }
1362        }
1363    }
1364
1365    pub fn flush(&mut self, tick: i64, peer_addr: &SocketAddr) -> OutgoingFrames {
1366        self.tick(tick);
1367
1368        // Reserve queued batches once; a full reliable flight window reserves
1369        // nothing. The compact vector keeps async frame transfers cheap.
1370        let capacity = self.packets.len().min(
1371            Self::MAX_IN_FLIGHT_PACKETS.saturating_sub(self.sent_packet.len())
1372                + self.queued_unreliable,
1373        );
1374        let mut ret = OutgoingFrames::with_capacity(capacity);
1375        // New sends preserve numeric order until the 24-bit sequence wraps.
1376        // ACK removal preserves it too; only resequencing requires sorting.
1377        if self.flight_order_dirty {
1378            self.sent_packet
1379                .sort_unstable_by_key(|packet| packet.0.sequence_number);
1380            self.flight_order_dirty = false;
1381        }
1382
1383        if self.retries_pending {
1384            for packet in &mut self.sent_packet {
1385                if !packet.1 {
1386                    raknet_log_debug!(
1387                        "{} , packet {}-{}-{} resend {} times",
1388                        peer_addr,
1389                        packet.0.sequence_number,
1390                        packet.0.reliable_frame_index,
1391                        packet.0.ordered_frame_index,
1392                        packet.3 + 1
1393                    );
1394                    ret.push(packet.0.clone());
1395                    packet.1 = true;
1396                    packet.2 = tick;
1397                    packet.3 = packet.3.saturating_add(1);
1398                    self.next_retry = self
1399                        .next_retry
1400                        .min(tick.saturating_add(Self::retry_timeout(self.rto, packet.3)));
1401                }
1402            }
1403            self.retries_pending = false;
1404        }
1405
1406        let mut group_sequence = None;
1407        let mut group_bytes = 0;
1408        let mut group_frames = 0;
1409        let datagram_budget = usize::from(self.mtu).saturating_sub(28);
1410        let queued_count = self.packets.len();
1411        for _ in 0..queued_count {
1412            if self.sent_packet.len() >= Self::MAX_IN_FLIGHT_PACKETS && self.queued_unreliable == 0
1413            {
1414                break;
1415            }
1416            let Some(mut packet) = self.packets.pop_front() else {
1417                break;
1418            };
1419            let reliable = packet.is_reliable().unwrap_or(false);
1420            if reliable && self.sent_packet.len() >= Self::MAX_IN_FLIGHT_PACKETS {
1421                self.packets.push_back(packet);
1422                continue;
1423            }
1424
1425            if self.coalesce {
1426                let packable = matches!(packet.reliability(), Ok(Reliability::ReliableOrdered))
1427                    && !packet.is_fragment();
1428                let frame_bytes = packet._size().expect("queued frames were validated") - 4;
1429                if packable
1430                    && group_sequence.is_some()
1431                    && group_frames < Self::MAX_COALESCED_FRAMES
1432                    && group_bytes + frame_bytes <= datagram_budget
1433                {
1434                    packet.sequence_number = group_sequence.unwrap();
1435                    group_bytes += frame_bytes;
1436                    group_frames += 1;
1437                    self.grouped_acks = true;
1438                    ret.coalesced = true;
1439                } else {
1440                    packet.sequence_number = self.sequence_number;
1441                    self.sequence_number = sequence::next(self.sequence_number);
1442                    group_sequence = packable.then_some(packet.sequence_number);
1443                    group_bytes = 4 + frame_bytes;
1444                    // Keep a 16-message application window spread across at
1445                    // least two datagrams so later packets can expose a loss.
1446                    group_frames = 1;
1447                }
1448            } else {
1449                packet.sequence_number = self.sequence_number;
1450                self.sequence_number = sequence::next(self.sequence_number);
1451            }
1452
1453            if reliable {
1454                ret.push(packet.clone());
1455                if self
1456                    .sent_packet
1457                    .last()
1458                    .is_some_and(|previous| previous.0.sequence_number > packet.sequence_number)
1459                {
1460                    self.flight_order_dirty = true;
1461                }
1462                self.sent_packet.push((packet, true, tick, 0, Vec::new()));
1463                self.next_retry = self.next_retry.min(tick.saturating_add(self.rto));
1464            } else {
1465                self.queued_unreliable -= 1;
1466                self.buffered_bytes -= packet.data.len() + Self::FRAME_BUDGET;
1467                ret.push(packet);
1468            }
1469        }
1470
1471        ret
1472    }
1473
1474    pub fn is_empty(&self) -> bool {
1475        self.packets.is_empty() && self.sent_packet.is_empty()
1476    }
1477
1478    pub fn get_reliable_queue_size(&self) -> usize {
1479        self.packets.len()
1480    }
1481
1482    pub fn get_sent_queue_size(&self) -> usize {
1483        self.sent_packet.len()
1484    }
1485}
1486
1487#[test]
1488fn malformed_datagrams_are_rejected() {
1489    assert!(FrameVec::new(&[0x80, 0, 0]).is_err());
1490    assert!(FrameVec::new(&[0x10, 0, 0, 0]).is_err());
1491}
1492
1493#[test]
1494fn send_queue_rejects_an_invalid_mtu() {
1495    let mut send_queue = SendQ::new(59);
1496    assert!(send_queue.insert(Reliability::Reliable, &[0xfe]).is_err());
1497}
1498
1499#[tokio::test]
1500async fn test_recvq_orders_channels_independently() {
1501    let mut recvq = RecvQ::new();
1502
1503    let mut later_on_channel_one = FrameSetPacket::new(Reliability::ReliableOrdered, vec![1]);
1504    later_on_channel_one.sequence_number = 0;
1505    later_on_channel_one.order_channel = 1;
1506    later_on_channel_one.ordered_frame_index = 1;
1507    recvq.insert(later_on_channel_one).unwrap();
1508
1509    let mut first_on_channel_two = FrameSetPacket::new(Reliability::ReliableOrdered, vec![2]);
1510    first_on_channel_two.sequence_number = 1;
1511    first_on_channel_two.reliable_frame_index = 1;
1512    first_on_channel_two.order_channel = 2;
1513    first_on_channel_two.ordered_frame_index = 0;
1514    recvq.insert(first_on_channel_two).unwrap();
1515
1516    let ready = recvq.flush(&"127.0.0.1:0".parse().unwrap());
1517    assert_eq!(ready.len(), 1);
1518    assert_eq!(ready[0].order_channel, 2);
1519
1520    let mut first_on_channel_one = FrameSetPacket::new(Reliability::ReliableOrdered, vec![0]);
1521    first_on_channel_one.sequence_number = 2;
1522    first_on_channel_one.reliable_frame_index = 2;
1523    first_on_channel_one.order_channel = 1;
1524    first_on_channel_one.ordered_frame_index = 0;
1525    recvq.insert(first_on_channel_one).unwrap();
1526
1527    let ready = recvq.flush(&"127.0.0.1:0".parse().unwrap());
1528    assert_eq!(ready.len(), 2);
1529    assert_eq!(ready[0].ordered_frame_index, 0);
1530    assert_eq!(ready[1].ordered_frame_index, 1);
1531    assert!(ready.iter().all(|frame| frame.order_channel == 1));
1532}
1533
1534#[tokio::test]
1535async fn test_sendq_maintains_ordered_indexes_per_channel() {
1536    let mut sendq = SendQ::new(1500);
1537    sendq
1538        .insert_with_order_channel(Reliability::ReliableOrdered, &[0xfe, 1], 3)
1539        .unwrap();
1540    sendq
1541        .insert_with_order_channel(Reliability::ReliableOrdered, &[0xfe, 2], 9)
1542        .unwrap();
1543
1544    let sent = sendq.flush(0, &"127.0.0.1:0".parse().unwrap());
1545    assert_eq!(sent.len(), 2);
1546    assert_eq!(sent[0].order_channel, 3);
1547    assert_eq!(sent[0].ordered_frame_index, 0);
1548    assert_eq!(sent[1].order_channel, 9);
1549    assert_eq!(sent[1].ordered_frame_index, 0);
1550}
1551
1552#[tokio::test]
1553async fn test_ackset() {
1554    let mut ackset = ACKSet::default();
1555
1556    ackset.insert(0);
1557    ackset.insert(1);
1558    ackset.insert(2);
1559    ackset.insert(4);
1560
1561    let acks = ackset.get_ack();
1562
1563    assert!(acks == vec![(0, 2), (4, 4)]);
1564
1565    let mut ackset = ACKSet::default();
1566
1567    ackset.insert(0);
1568    ackset.insert(1);
1569    ackset.insert(2);
1570    ackset.insert(6);
1571
1572    let acks = ackset.get_ack();
1573
1574    assert!(acks == vec![(0, 2), (6, 6)]);
1575
1576    let acks = ackset.get_ack();
1577
1578    assert!(acks == vec![]);
1579
1580    ackset.insert(0);
1581    ackset.insert(2);
1582
1583    let acks = ackset.get_ack();
1584
1585    assert!(acks == vec![(0, 0), (2, 2)]);
1586}
1587
1588#[tokio::test]
1589async fn test_frame_serialize_deserialize() {
1590    // Captured first frame datagram from a Bedrock 1.18.12 client.
1591    let p: Vec<u8> = [
1592        132, 0, 0, 0, 64, 0, 144, 0, 0, 0, 9, 146, 33, 7, 47, 57, 18, 128, 111, 0, 0, 0, 0, 20,
1593        200, 47, 41, 0,
1594    ]
1595    .to_vec();
1596
1597    let a = FrameSetPacket::deserialize(&p).unwrap();
1598    assert!(a.0.serialize().unwrap() == p);
1599}
1600
1601#[tokio::test]
1602async fn test_recvq() {
1603    let mut r = RecvQ::new();
1604    let mut p = FrameSetPacket::new(Reliability::Reliable, vec![]);
1605    p.sequence_number = 0;
1606    p.ordered_frame_index = 0;
1607    r.insert(p).unwrap();
1608
1609    let mut p = FrameSetPacket::new(Reliability::Reliable, vec![]);
1610    p.sequence_number = 1;
1611    p.reliable_frame_index = 1;
1612    p.ordered_frame_index = 1;
1613    r.insert(p).unwrap();
1614
1615    let ret = r.flush(&"0.0.0.0:0".parse().unwrap());
1616    assert!(ret.len() == 2);
1617}
1618
1619#[tokio::test]
1620async fn test_recvq_fragment() {
1621    let mut r = RecvQ::new();
1622    let mut p = FrameSetPacket::new(Reliability::ReliableOrdered, vec![1]);
1623    p.flags |= 16;
1624    p.sequence_number = 0;
1625    p.ordered_frame_index = 0;
1626    p.compound_id = 1;
1627    p.compound_size = 3;
1628    p.fragment_index = 0;
1629    p.order_channel = 7;
1630    r.insert(p).unwrap();
1631
1632    let mut p = FrameSetPacket::new(Reliability::ReliableOrdered, vec![2]);
1633    p.flags |= 16;
1634    p.sequence_number = 1;
1635    p.reliable_frame_index = 1;
1636    p.ordered_frame_index = 0;
1637    p.compound_id = 1;
1638    p.compound_size = 3;
1639    p.fragment_index = 1;
1640    p.order_channel = 7;
1641    r.insert(p).unwrap();
1642
1643    let mut p = FrameSetPacket::new(Reliability::ReliableOrdered, vec![3]);
1644    p.flags |= 16;
1645    p.sequence_number = 2;
1646    p.reliable_frame_index = 2;
1647    p.ordered_frame_index = 0;
1648    p.compound_id = 1;
1649    p.compound_size = 3;
1650    p.fragment_index = 2;
1651    p.order_channel = 7;
1652    r.insert(p).unwrap();
1653
1654    let ret = r.flush(&"0.0.0.0:0".parse().unwrap());
1655    assert!(ret.len() == 1);
1656    assert_eq!(ret[0].data.as_ref(), &[1, 2, 3]);
1657    assert_eq!(ret[0].order_channel, 7);
1658}
1659
1660#[tokio::test]
1661async fn test_sendq() {
1662    let mut s = SendQ::new(1500);
1663    let p = FrameSetPacket::new(Reliability::Reliable, vec![]);
1664    s.insert(Reliability::Reliable, &p.serialize().unwrap())
1665        .unwrap();
1666
1667    let p = FrameSetPacket::new(Reliability::Reliable, vec![]);
1668    s.insert(Reliability::Reliable, &p.serialize().unwrap())
1669        .unwrap();
1670
1671    let sockaddr: SocketAddr = "127.0.0.1:8000".parse().unwrap();
1672    let ret = s.flush(0, &sockaddr);
1673    assert!(ret.len() == 2);
1674
1675    s.ack(0, 0);
1676    s.ack(1, 0);
1677
1678    let ret = s.flush(300, &sockaddr);
1679    assert!(ret.is_empty());
1680}
1681
1682#[test]
1683fn send_queue_pipelines_reliable_packets_with_a_bounded_window() {
1684    let mut sendq = SendQ::new(1500);
1685    let peer = "127.0.0.1:8000".parse().unwrap();
1686
1687    for index in 0..SendQ::MAX_IN_FLIGHT_PACKETS + 1 {
1688        sendq
1689            .insert(Reliability::ReliableOrdered, &[0xfe, index as u8])
1690            .unwrap();
1691        let sent = sendq.flush(0, &peer);
1692        if index < SendQ::MAX_IN_FLIGHT_PACKETS {
1693            assert_eq!(sent.len(), 1);
1694            assert_eq!(sent[0].ordered_frame_index, index as u32);
1695        } else {
1696            assert!(sent.is_empty());
1697        }
1698    }
1699
1700    assert_eq!(sendq.get_sent_queue_size(), SendQ::MAX_IN_FLIGHT_PACKETS);
1701    assert_eq!(sendq.get_reliable_queue_size(), 1);
1702
1703    sendq.ack(0, 1);
1704    let sent = sendq.flush(1, &peer);
1705    assert_eq!(sent.len(), 1);
1706    assert_eq!(
1707        sent[0].ordered_frame_index,
1708        SendQ::MAX_IN_FLIGHT_PACKETS as u32
1709    );
1710    assert_eq!(sendq.get_sent_queue_size(), SendQ::MAX_IN_FLIGHT_PACKETS);
1711    assert_eq!(sendq.get_reliable_queue_size(), 0);
1712}
1713
1714#[test]
1715fn send_queue_retransmits_immediately_after_nack() {
1716    let mut sendq = SendQ::new(1500);
1717    let peer = "127.0.0.1:8000".parse().unwrap();
1718    sendq.insert(Reliability::Reliable, &[0xfe]).unwrap();
1719
1720    let first = sendq.flush(0, &peer);
1721    assert_eq!(first.len(), 1);
1722    assert_eq!(first[0].sequence_number, 0);
1723
1724    sendq.nack(0, 1);
1725    let retransmitted = sendq.flush(1, &peer);
1726    assert_eq!(retransmitted.len(), 1);
1727    assert_eq!(retransmitted[0].sequence_number, 1);
1728}
1729
1730#[tokio::test]
1731async fn test_client_packet1() {
1732    let a = [
1733        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,
1734        189, 203, 114, 234, 74, 183, 239, 185, 79, 175, 170, 30, 99, 159, 110, 125, 59, 36, 1, 222,
1735        166, 122, 19, 35, 97, 48, 18, 19, 161, 11, 82, 69, 197, 23, 128, 248, 38, 32, 9, 107, 218,
1736        152, 91, 69, 61, 79, 53, 234, 141, 78, 243, 52, 234, 5, 170, 119, 90, 149, 41, 165, 48, 41,
1737        11, 12, 2, 95, 214, 154, 255, 198, 47, 86, 120, 77, 15, 75, 202, 203, 24, 57, 46, 153, 249,
1738        223, 255, 199, 127, 253, 47, 255, 246, 111, 255, 229, 255, 253, 111, 255, 227, 191, 254,
1739        63, 255, 243, 191, 253, 219, 255, 249, 239, 163, 201, 96, 58, 255, 247, 255, 237, 127, 255,
1740        247, 241, 166, 53, 25, 54, 70, 211, 206, 180, 165, 152, 91, 181, 172, 221, 53, 159, 155,
1741        243, 95, 162, 215, 107, 222, 52, 125, 177, 105, 247, 61, 165, 107, 5, 205, 158, 84, 29,
1742        244, 250, 209, 111, 85, 214, 106, 166, 21, 52, 122, 91, 93, 209, 77, 165, 222, 51, 117,
1743        215, 21, 20, 197, 109, 148, 55, 166, 220, 122, 234, 216, 101, 105, 108, 43, 157, 241, 180,
1744        218, 49, 26, 250, 189, 165, 184, 243, 129, 242, 171, 50, 170, 7, 247, 109, 241, 113, 173,
1745        221, 235, 205, 225, 60, 18, 218, 226, 196, 234, 134, 186, 57, 240, 43, 83, 43, 112, 167,
1746        150, 57, 89, 13, 75, 90, 205, 146, 244, 123, 183, 46, 111, 199, 182, 176, 214, 182, 147,
1747        141, 214, 16, 187, 227, 134, 38, 247, 234, 150, 219, 107, 84, 231, 78, 201, 17, 186, 115,
1748        189, 174, 139, 154, 51, 82, 212, 210, 192, 178, 30, 13, 49, 216, 186, 179, 218, 203, 192,
1749        143, 238, 61, 177, 37, 186, 211, 234, 147, 41, 105, 91, 87, 169, 61, 142, 239, 22, 207,
1750        170, 28, 205, 199, 117, 253, 121, 32, 107, 117, 213, 119, 166, 255, 234, 62, 254, 7, 249,
1751        238, 153, 219, 111, 9, 3, 219, 141, 28, 73, 17, 92, 83, 17, 189, 198, 100, 57, 10, 3, 97,
1752        76, 190, 221, 187, 39, 127, 167, 183, 154, 186, 253, 201, 170, 57, 35, 239, 61, 235, 150,
1753        58, 117, 103, 173, 25, 242, 186, 125, 215, 138, 220, 134, 245, 226, 53, 200, 239, 90, 53,
1754        209, 9, 215, 145, 35, 44, 130, 241, 153, 109, 214, 145, 45, 117, 32, 5, 229, 177, 185, 158,
1755        121, 210, 122, 48, 154, 7, 150, 105, 107, 162, 106, 233, 146, 41, 87, 23, 61, 163, 117,
1756        167, 149, 92, 167, 83, 215, 94, 220, 70, 165, 111, 6, 214, 196, 110, 8, 37, 237, 222, 107,
1757        184, 161, 76, 191, 243, 217, 19, 149, 142, 213, 112, 55, 134, 226, 54, 29, 163, 213, 29,
1758        218, 214, 203, 72, 246, 90, 154, 31, 61, 246, 76, 209, 234, 133, 74, 223, 158, 183, 126,
1759        15, 77, 241, 119, 199, 168, 117, 134, 194, 162, 163, 7, 90, 167, 59, 183, 218, 110, 67, 40,
1760        143, 130, 32, 178, 239, 181, 208, 233, 63, 110, 123, 91, 85, 26, 223, 221, 174, 45, 163,
1761        41, 245, 238, 107, 247, 170, 18, 149, 123, 155, 170, 173, 90, 206, 148, 124, 243, 139, 19,
1762        58, 211, 206, 76, 150, 180, 250, 72, 234, 212, 127, 73, 154, 161, 84, 239, 126, 253, 199,
1763        63, 158, 123, 119, 119, 203, 126, 120, 247, 220, 113, 55, 245, 97, 189, 212, 172, 255, 136,
1764        30, 159, 164, 122, 255, 95, 245, 141, 220, 159, 41, 149, 169, 218, 173, 174, 5, 249, 247,
1765        83, 205, 188, 185, 81, 220, 113, 251, 229, 101, 213, 249, 245, 123, 212, 248, 71, 239, 105,
1766        48, 151, 68, 103, 32, 175, 215, 63, 220, 113, 216, 169, 252, 243, 247, 211, 118, 230, 255,
1767        179, 210, 173, 173, 123, 230, 203, 63, 170, 163, 127, 12, 52, 39, 26, 247, 158, 182, 147,
1768        113, 52, 154, 4, 75, 219, 122, 168, 223, 120, 255, 152, 223, 138, 173, 135, 122, 79, 43,
1769        245, 27, 255, 254, 191, 210, 81, 92, 214, 250, 38, 29, 197, 90, 79, 9, 74, 164, 149, 221,
1770        158, 188, 88, 218, 126, 112, 51, 152, 213, 234, 93, 50, 12, 117, 255, 89, 208, 77, 171,
1771        214, 21, 2, 217, 182, 189, 154, 110, 76, 20, 163, 177, 136, 198, 247, 129, 234, 148, 188,
1772        103, 210, 74, 21, 203, 82, 102, 158, 161, 152, 94, 80, 251, 57, 52, 253, 77, 151, 244, 139,
1773        93, 255, 181, 29, 134, 250, 139, 37, 182, 44, 199, 154, 44, 180, 173, 94, 210, 67, 119,
1774        162, 217, 238, 168, 45, 173, 75, 166, 89, 49, 221, 121, 75, 181, 252, 201, 68, 13, 106, 11,
1775        215, 174, 172, 116, 193, 151, 122, 225, 164, 101, 88, 214, 131, 99, 121, 131, 81, 24, 45,
1776        12, 251, 177, 162, 202, 149, 101, 79, 168, 52, 76, 161, 114, 231, 153, 11, 127, 104, 76,
1777        54, 182, 29, 56, 35, 201, 157, 140, 103, 90, 91, 221, 186, 229, 126, 182, 7, 196, 213, 210,
1778        154, 41, 118, 115, 186, 154, 58, 246, 122, 78, 70, 227, 84, 183, 212, 109, 167, 222, 37,
1779        35, 153, 14, 228, 156, 142, 145, 201, 36, 38, 19, 59, 212, 151, 67, 179, 178, 28, 134, 90,
1780        64, 196, 74, 234, 204, 41, 107, 51, 191, 172, 209, 137, 62, 107, 10, 228, 191, 2, 249, 125,
1781        129, 14, 232, 81, 73, 141, 155, 111, 40, 69, 68, 110, 68, 59, 60, 24, 223, 255, 72, 255,
1782        46, 249, 125, 89, 84, 233, 223, 37, 127, 107, 52, 215, 35, 55, 12, 102, 78, 95, 15, 186,
1783        125, 75, 24, 52, 170, 155, 65, 95, 175, 52, 103, 145, 48, 154, 91, 1, 253, 123, 78, 191,
1784        187, 255, 78, 165, 68, 54, 240, 73, 243, 8, 244, 119, 205, 123, 107, 58, 108, 4, 179, 158,
1785        100, 85, 232, 39, 25, 230, 196, 245, 4, 171, 102, 155, 147, 246, 80, 140, 90, 227, 240,
1786        113, 213, 21, 20, 221, 54, 221, 182, 38, 91, 74, 215, 212, 90, 186, 18, 204, 187, 166, 181,
1787        26, 26, 90, 93, 187, 91, 180, 212, 128, 40, 129, 198, 194, 232, 88, 171, 229, 80, 28, 109,
1788        92, 203, 43, 121, 115, 125, 221, 19, 162, 178, 102, 138, 174, 109, 77, 12, 215, 168, 217,
1789        186, 36, 151, 71, 164, 139, 61, 223, 26, 12, 132, 245, 114, 68, 148, 196, 64, 138, 106,
1790        166, 160, 77, 6, 210, 66, 232, 137, 122, 107, 228, 59, 226, 184, 111, 169, 35, 203, 85, 61,
1791        165, 86, 25, 247, 221, 126, 215, 94, 76, 186, 118, 180, 30, 207, 38, 91, 77, 209, 219, 61,
1792        203, 213, 186, 225, 164, 231, 206, 213, 167, 14, 153, 252, 142, 45, 170, 227, 198, 164, 57,
1793        188, 143, 30, 109, 197, 93, 147, 103, 205, 173, 251, 214, 202, 178, 221, 27, 39, 80, 250,
1794        134, 160, 210, 46, 50, 255, 53, 31, 119, 199, 195, 137, 182, 49, 141, 199, 40, 108, 191,
1795        244, 212, 222, 63, 198, 213, 255, 188, 239, 206, 102, 155, 223, 102, 235, 159, 255, 252,
1796        241, 16, 244, 194, 233, 68, 170, 7, 27, 189, 211, 250, 189, 104, 143, 255, 241, 159, 66,
1797        221, 121, 169, 73, 98, 189, 90, 107, 78, 23, 29, 229, 215, 96, 54, 27, 153, 183, 182, 223,
1798        155, 223, 55, 127, 24, 227, 219, 167, 217, 237, 188, 31, 74, 154, 226, 255, 115, 220, 169,
1799        143, 165, 231, 135, 95, 245, 217, 118, 174, 201, 134, 255, 88, 121, 92, 132, 129, 123, 251,
1800        175, 250, 204, 189, 169, 46, 138, 78, 144, 126, 109, 161, 10, 170, 240, 32, 248, 27, 83,
1801        156, 172, 6, 162, 90, 233, 223, 85, 151, 214, 182, 21, 88, 37, 79, 242, 238, 149, 118, 143,
1802        152, 10, 131, 232, 111, 91, 209, 2, 85, 113, 239, 29, 99, 178, 37, 170, 76, 210, 173, 232,
1803        201, 104, 84, 183, 230, 220, 122, 26, 248, 138, 209, 149, 148, 167, 65, 73, 111, 91, 50,
1804        249, 194, 153, 85, 241, 204, 245, 218, 242, 215, 130, 121, 31, 84, 188, 192, 171, 13, 36,
1805        165, 54, 152, 43, 55, 157, 123, 85, 176, 228, 69, 203, 242, 197, 187, 129, 210, 10, 71,
1806        155, 231, 50, 25, 45, 147, 161, 185, 46, 15, 228, 201, 243, 56, 156, 56, 214, 92, 9, 212,
1807        134, 103, 142, 230, 53, 203, 157, 71, 83, 211, 242, 126, 118, 55, 196,
1808    ];
1809
1810    let b = FrameVec::new(&a).unwrap();
1811    assert!(b.frames.len() == 1);
1812    assert!(b.frames[0].is_fragment());
1813}
1814
1815#[tokio::test]
1816async fn test_client_packet2() {
1817    // Connection Request - reliable [ reliable_frame_index = 0 ]
1818    let p0 = [
1819        132, 0, 0, 0, 64, 0, 144, 0, 0, 0, 9, 162, 70, 235, 28, 218, 182, 26, 192, 0, 0, 0, 0, 16,
1820        151, 43, 113, 0,
1821    ];
1822    // Connection Request - reliable [ reliable_frame_index = 0 ]
1823    let p1 = [
1824        132, 1, 0, 0, 64, 0, 144, 0, 0, 0, 9, 162, 70, 235, 28, 218, 182, 26, 192, 0, 0, 0, 0, 16,
1825        151, 43, 113, 0,
1826    ];
1827    // 2 frames Incompatible Protocol(extract data?) Connected ping - reliable ordered [ reliable_frame_index = 1 ]
1828    let p2 = [
1829        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,
1830        225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 196, 178, 112, 86, 5, 59, 97, 219, 15, 0,
1831        0, 0, 6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 188, 210, 59, 150, 246,
1832        167, 182, 213, 33, 0, 0, 0, 6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0,
1833        132, 194, 47, 23, 175, 46, 78, 138, 23, 0, 0, 0, 6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128,
1834        0, 0, 0, 0, 0, 0, 136, 219, 85, 240, 191, 125, 172, 233, 10, 0, 0, 0, 6, 23, 0, 225, 138,
1835        0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 80, 211, 212, 44, 191, 227, 124, 40, 13, 0, 0, 0,
1836        6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 77, 13, 19, 149, 102, 140, 134,
1837        77, 16, 0, 0, 0, 4, 83, 237, 239, 254, 225, 138, 4, 63, 87, 214, 254, 225, 138, 4, 83, 236,
1838        159, 254, 225, 138, 4, 63, 87, 46, 254, 225, 138, 4, 63, 87, 56, 128, 225, 138, 4, 63, 87,
1839        56, 123, 225, 138, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255,
1840        255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255,
1841        255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1842        0, 0, 0, 0, 0, 16, 151, 56, 146, 0, 0, 72, 0, 0, 0, 0, 0, 16, 151, 56, 146,
1843    ];
1844    // 1 frames Connected ping - unreliable
1845    let p3 = [132, 3, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 16, 151, 56, 161];
1846    // 1 frames game packet - reliable ordered [is_fragment reliable_frame_index = 2 ordered_frame_index = 1 ]
1847    let p4 = [
1848        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,
1849        189, 203, 114, 234, 202, 214, 239, 249, 157, 94, 85, 61, 198, 119, 186, 181, 79, 72, 2,
1850        188, 77, 245, 140, 145, 48, 24, 137, 137, 208, 5, 169, 162, 98, 7, 32, 246, 4, 36, 97, 77,
1851        155, 201, 173, 162, 158, 231, 188, 81, 53, 171, 89, 47, 80, 189, 211, 170, 148, 148, 194,
1852        164, 156, 96, 16, 248, 178, 214, 252, 55, 126, 177, 194, 107, 122, 88, 82, 94, 198, 200,
1853        113, 201, 204, 255, 231, 127, 252, 215, 255, 242, 31, 255, 241, 95, 254, 223, 255, 251,
1854        127, 252, 215, 255, 254, 63, 255, 199, 127, 252, 159, 255, 57, 154, 12, 166, 243, 255, 252,
1855        223, 254, 247, 255, 28, 111, 90, 147, 97, 99, 52, 237, 76, 91, 138, 185, 85, 203, 218, 125,
1856        243, 165, 57, 255, 41, 122, 189, 230, 77, 211, 23, 155, 118, 223, 83, 186, 86, 208, 236,
1857        73, 213, 65, 175, 31, 253, 82, 101, 173, 102, 90, 65, 163, 183, 213, 21, 221, 84, 234, 61,
1858        83, 119, 93, 65, 81, 172, 70, 107, 233, 25, 138, 210, 179, 149, 23, 79, 18, 205, 142, 41,
1859        8, 163, 134, 179, 177, 77, 87, 182, 131, 86, 121, 80, 106, 213, 135, 125, 179, 162, 139,
1860        122, 203, 241, 131, 138, 109, 4, 93, 51, 168, 173, 135, 74, 75, 29, 214, 29, 97, 104, 4,
1861        55, 222, 182, 86, 26, 205, 189, 242, 192, 127, 217, 90, 219, 174, 48, 40, 233, 115, 171,
1862        49, 105, 141, 109, 189, 63, 182, 91, 63, 70, 141, 167, 237, 120, 166, 148, 213, 173, 92,
1863        30, 110, 149, 78, 91, 12, 66, 93, 241, 5, 93, 208, 45, 45, 156, 56, 143, 130, 18, 90, 194,
1864        147, 104, 55, 116, 209, 8, 163, 103, 211, 94, 151, 134, 91, 189, 50, 174, 235, 191, 135,
1865        138, 213, 237, 218, 21, 211, 182, 252, 233, 191, 187, 79, 255, 141, 124, 247, 204, 237,
1866        183, 132, 129, 237, 70, 142, 164, 8, 174, 169, 136, 94, 99, 178, 28, 133, 129, 48, 38, 223,
1867        238, 61, 180, 68, 183, 183, 154, 186, 253, 201, 170, 57, 123, 90, 107, 179, 110, 169, 83,
1868        119, 214, 154, 33, 175, 219, 247, 173, 200, 109, 88, 191, 189, 6, 249, 93, 171, 38, 58,
1869        225, 58, 114, 132, 69, 48, 62, 179, 205, 58, 178, 165, 14, 164, 160, 60, 54, 215, 51, 79,
1870        90, 15, 70, 243, 192, 50, 109, 77, 84, 45, 93, 50, 229, 234, 162, 103, 180, 238, 181, 146,
1871        235, 116, 234, 218, 111, 183, 81, 233, 155, 129, 53, 177, 27, 66, 73, 123, 240, 26, 110,
1872        40, 139, 238, 180, 250, 226, 137, 74, 199, 106, 184, 27, 67, 113, 155, 142, 209, 234, 14,
1873        109, 235, 247, 72, 246, 90, 154, 31, 61, 245, 76, 209, 234, 133, 74, 223, 158, 183, 126,
1874        13, 77, 241, 87, 199, 168, 117, 134, 194, 162, 163, 7, 90, 167, 59, 183, 218, 110, 67, 40,
1875        143, 130, 32, 178, 31, 180, 208, 233, 63, 109, 123, 91, 85, 26, 223, 223, 174, 45, 163, 41,
1876        245, 30, 106, 15, 170, 18, 149, 123, 155, 170, 173, 90, 206, 148, 124, 243, 111, 39, 116,
1877        166, 157, 153, 44, 105, 245, 145, 212, 169, 255, 148, 52, 67, 169, 222, 255, 252, 111, 237,
1878        167, 127, 74, 191, 234, 254, 100, 169, 140, 42, 171, 201, 92, 173, 142, 252, 127, 77, 86,
1879        247, 77, 251, 95, 254, 175, 127, 215, 127, 223, 246, 42, 255, 26, 253, 235, 165, 108, 133,
1880        255, 246, 151, 203, 202, 211, 250, 151, 175, 12, 203, 193, 124, 221, 155, 255, 67, 126,
1881        190, 109, 253, 99, 242, 243, 95, 211, 167, 219, 187, 237, 157, 107, 254, 43, 24, 107, 81,
1882        79, 22, 171, 225, 38, 252, 183, 240, 24, 4, 255, 114, 31, 21, 213, 235, 11, 195, 81, 239,
1883        159, 253, 161, 97, 169, 222, 77, 215, 41, 173, 164, 231, 254, 68, 157, 151, 199, 131, 31,
1884        15, 51, 229, 63, 255, 215, 120, 20, 151, 181, 190, 25, 143, 98, 173, 167, 4, 37, 210, 202,
1885        110, 79, 94, 44, 109, 63, 184, 25, 204, 106, 245, 174, 165, 184, 186, 255, 34, 232, 166,
1886        85, 235, 10, 129, 108, 219, 94, 77, 55, 38, 138, 209, 88, 68, 227, 135, 64, 117, 74, 222,
1887        11, 105, 165, 138, 101, 41, 51, 50, 138, 77, 47, 168, 253, 24, 154, 254, 166, 75, 250, 197,
1888        174, 255, 220, 14, 67, 253, 183, 37, 182, 44, 199, 154, 44, 180, 173, 94, 210, 67, 119,
1889        162, 217, 238, 168, 45, 173, 75, 166, 89, 49, 221, 121, 75, 181, 252, 201, 68, 13, 106, 11,
1890        215, 174, 172, 116, 193, 151, 122, 225, 164, 101, 88, 214, 163, 99, 121, 131, 81, 24, 45,
1891        12, 251, 169, 162, 202, 149, 101, 79, 168, 52, 76, 161, 114, 239, 153, 11, 127, 104, 76,
1892        54, 182, 29, 56, 35, 201, 157, 140, 103, 90, 91, 221, 186, 229, 126, 190, 7, 196, 213, 210,
1893        154, 41, 118, 115, 186, 154, 58, 246, 122, 78, 70, 227, 84, 183, 212, 109, 167, 222, 37,
1894        35, 57, 30, 200, 156, 142, 145, 201, 36, 38, 19, 59, 212, 151, 67, 179, 178, 28, 134, 90,
1895        64, 196, 74, 234, 204, 41, 107, 51, 191, 172, 197, 19, 125, 214, 20, 200, 127, 5, 242, 251,
1896        66, 60, 160, 71, 37, 53, 105, 190, 161, 20, 17, 185, 81, 220, 225, 193, 248, 225, 46, 251,
1897        187, 228, 247, 101, 81, 141, 255, 46, 249, 91, 163, 185, 30, 185, 97, 48, 115, 250, 122,
1898        208, 237, 91, 194, 160, 81, 221, 12, 250, 122, 165, 57, 139, 132, 209, 220, 10, 226, 191,
1899        231, 244, 187, 251, 239, 84, 74, 101, 3, 159, 52, 143, 16, 255, 174, 249, 96, 77, 135, 141,
1900        96, 214, 147, 172, 74, 252, 73, 134, 57, 113, 61, 193, 170, 217, 230, 164, 61, 20, 163,
1901        214, 56, 124, 90, 117, 5, 69, 39, 10, 164, 173, 201, 150, 210, 53, 181, 150, 174, 4, 243,
1902        174, 105, 173, 134, 134, 86, 215, 238, 23, 45, 53, 208, 156, 81, 99, 97, 116, 172, 213,
1903        114, 40, 142, 54, 174, 229, 149, 188, 185, 190, 238, 9, 81, 89, 51, 69, 215, 182, 38, 134,
1904        107, 212, 108, 93, 146, 203, 35, 210, 197, 158, 111, 13, 6, 194, 122, 57, 18, 91, 226, 64,
1905        138, 106, 166, 160, 77, 6, 210, 66, 232, 17, 165, 52, 242, 29, 113, 220, 183, 212, 145,
1906        229, 170, 158, 82, 171, 140, 251, 110, 191, 107, 47, 38, 93, 59, 90, 143, 103, 147, 173,
1907        166, 232, 237, 158, 229, 106, 221, 112, 210, 115, 231, 234, 115, 135, 76, 126, 199, 22,
1908        213, 113, 99, 210, 28, 62, 68, 79, 182, 226, 174, 201, 179, 230, 214, 67, 107, 101, 217,
1909        238, 141, 19, 40, 125, 67, 80, 227, 46, 50, 255, 61, 31, 119, 199, 195, 137, 182, 49, 141,
1910        167, 40, 108, 255, 238, 169, 189, 127, 140, 171, 255, 124, 232, 206, 102, 155, 95, 102,
1911        235, 95, 255, 186, 123, 12, 122, 225, 116, 34, 213, 131, 141, 222, 105, 253, 90, 180, 199,
1912        255, 248, 167, 80, 119, 126, 215, 36, 177, 94, 173, 53, 167, 139, 142, 242, 115, 48, 155,
1913        141, 204, 91, 219, 239, 205, 31, 154, 119, 198, 248, 246, 121, 118, 59, 239, 135, 146, 166,
1914        248, 255, 26, 119, 234, 99, 233, 229, 241, 103, 125, 182, 157, 107, 178, 225, 63, 85, 158,
1915        22, 97, 224, 222, 254, 187, 62, 115, 111, 170, 139, 162, 19, 164, 95, 91, 168, 130, 42, 60,
1916        10, 254, 198, 20, 39, 171, 129, 168, 86, 250, 247, 213, 165, 181, 109, 5, 86, 201, 147,
1917        188, 7, 165, 221, 35, 166, 194, 176, 2, 215, 86, 180, 64, 85, 220, 7, 199, 152, 108, 137,
1918        42, 147, 116, 43, 122, 54, 26, 213, 173, 57, 183, 158, 7, 190, 98, 116, 37, 229, 153, 168,
1919        243, 182, 37, 147, 47, 156, 89, 21, 207, 92, 175, 45, 127, 45, 152, 15, 65, 197, 11, 188,
1920        218, 64, 82, 106, 131, 185, 114, 211, 121, 80, 5, 75, 94, 180, 44, 95, 188, 31, 40, 173,
1921        112, 180, 121, 41, 147, 209, 50, 25, 154, 235, 242, 64, 158, 188, 140, 137, 154, 183, 230,
1922        74, 160, 54, 60, 115, 52, 175, 89, 238, 60, 154, 154, 150, 247, 163, 187,
1923    ];
1924    // 1 frames Incompatible Protocol(extract data?) - reliable ordered [reliable_frame_index = 1 ordered_frame_index = 0] == p2
1925    let p5 = [
1926        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,
1927        225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 196, 178, 112, 86, 5, 59, 97, 219, 15, 0,
1928        0, 0, 6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 188, 210, 59, 150, 246,
1929        167, 182, 213, 33, 0, 0, 0, 6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0,
1930        132, 194, 47, 23, 175, 46, 78, 138, 23, 0, 0, 0, 6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128,
1931        0, 0, 0, 0, 0, 0, 136, 219, 85, 240, 191, 125, 172, 233, 10, 0, 0, 0, 6, 23, 0, 225, 138,
1932        0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 80, 211, 212, 44, 191, 227, 124, 40, 13, 0, 0, 0,
1933        6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 77, 13, 19, 149, 102, 140, 134,
1934        77, 16, 0, 0, 0, 4, 83, 237, 239, 254, 225, 138, 4, 63, 87, 214, 254, 225, 138, 4, 83, 236,
1935        159, 254, 225, 138, 4, 63, 87, 46, 254, 225, 138, 4, 63, 87, 56, 128, 225, 138, 4, 63, 87,
1936        56, 123, 225, 138, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255,
1937        255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255,
1938        255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1939        0, 0, 0, 0, 0, 16, 151, 56, 146,
1940    ];
1941    // 1 frames game packet - reliable ordered [is_fragment reliable_frame_index = 2 ordered_frame_index = 1 ] == p4
1942    let p6 = [
1943        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,
1944        189, 203, 114, 234, 202, 214, 239, 249, 157, 94, 85, 61, 198, 119, 186, 181, 79, 72, 2,
1945        188, 77, 245, 140, 145, 48, 24, 137, 137, 208, 5, 169, 162, 98, 7, 32, 246, 4, 36, 97, 77,
1946        155, 201, 173, 162, 158, 231, 188, 81, 53, 171, 89, 47, 80, 189, 211, 170, 148, 148, 194,
1947        164, 156, 96, 16, 248, 178, 214, 252, 55, 126, 177, 194, 107, 122, 88, 82, 94, 198, 200,
1948        113, 201, 204, 255, 231, 127, 252, 215, 255, 242, 31, 255, 241, 95, 254, 223, 255, 251,
1949        127, 252, 215, 255, 254, 63, 255, 199, 127, 252, 159, 255, 57, 154, 12, 166, 243, 255, 252,
1950        223, 254, 247, 255, 28, 111, 90, 147, 97, 99, 52, 237, 76, 91, 138, 185, 85, 203, 218, 125,
1951        243, 165, 57, 255, 41, 122, 189, 230, 77, 211, 23, 155, 118, 223, 83, 186, 86, 208, 236,
1952        73, 213, 65, 175, 31, 253, 82, 101, 173, 102, 90, 65, 163, 183, 213, 21, 221, 84, 234, 61,
1953        83, 119, 93, 65, 81, 172, 70, 107, 233, 25, 138, 210, 179, 149, 23, 79, 18, 205, 142, 41,
1954        8, 163, 134, 179, 177, 77, 87, 182, 131, 86, 121, 80, 106, 213, 135, 125, 179, 162, 139,
1955        122, 203, 241, 131, 138, 109, 4, 93, 51, 168, 173, 135, 74, 75, 29, 214, 29, 97, 104, 4,
1956        55, 222, 182, 86, 26, 205, 189, 242, 192, 127, 217, 90, 219, 174, 48, 40, 233, 115, 171,
1957        49, 105, 141, 109, 189, 63, 182, 91, 63, 70, 141, 167, 237, 120, 166, 148, 213, 173, 92,
1958        30, 110, 149, 78, 91, 12, 66, 93, 241, 5, 93, 208, 45, 45, 156, 56, 143, 130, 18, 90, 194,
1959        147, 104, 55, 116, 209, 8, 163, 103, 211, 94, 151, 134, 91, 189, 50, 174, 235, 191, 135,
1960        138, 213, 237, 218, 21, 211, 182, 252, 233, 191, 187, 79, 255, 141, 124, 247, 204, 237,
1961        183, 132, 129, 237, 70, 142, 164, 8, 174, 169, 136, 94, 99, 178, 28, 133, 129, 48, 38, 223,
1962        238, 61, 180, 68, 183, 183, 154, 186, 253, 201, 170, 57, 123, 90, 107, 179, 110, 169, 83,
1963        119, 214, 154, 33, 175, 219, 247, 173, 200, 109, 88, 191, 189, 6, 249, 93, 171, 38, 58,
1964        225, 58, 114, 132, 69, 48, 62, 179, 205, 58, 178, 165, 14, 164, 160, 60, 54, 215, 51, 79,
1965        90, 15, 70, 243, 192, 50, 109, 77, 84, 45, 93, 50, 229, 234, 162, 103, 180, 238, 181, 146,
1966        235, 116, 234, 218, 111, 183, 81, 233, 155, 129, 53, 177, 27, 66, 73, 123, 240, 26, 110,
1967        40, 139, 238, 180, 250, 226, 137, 74, 199, 106, 184, 27, 67, 113, 155, 142, 209, 234, 14,
1968        109, 235, 247, 72, 246, 90, 154, 31, 61, 245, 76, 209, 234, 133, 74, 223, 158, 183, 126,
1969        13, 77, 241, 87, 199, 168, 117, 134, 194, 162, 163, 7, 90, 167, 59, 183, 218, 110, 67, 40,
1970        143, 130, 32, 178, 31, 180, 208, 233, 63, 109, 123, 91, 85, 26, 223, 223, 174, 45, 163, 41,
1971        245, 30, 106, 15, 170, 18, 149, 123, 155, 170, 173, 90, 206, 148, 124, 243, 111, 39, 116,
1972        166, 157, 153, 44, 105, 245, 145, 212, 169, 255, 148, 52, 67, 169, 222, 255, 252, 111, 237,
1973        167, 127, 74, 191, 234, 254, 100, 169, 140, 42, 171, 201, 92, 173, 142, 252, 127, 77, 86,
1974        247, 77, 251, 95, 254, 175, 127, 215, 127, 223, 246, 42, 255, 26, 253, 235, 165, 108, 133,
1975        255, 246, 151, 203, 202, 211, 250, 151, 175, 12, 203, 193, 124, 221, 155, 255, 67, 126,
1976        190, 109, 253, 99, 242, 243, 95, 211, 167, 219, 187, 237, 157, 107, 254, 43, 24, 107, 81,
1977        79, 22, 171, 225, 38, 252, 183, 240, 24, 4, 255, 114, 31, 21, 213, 235, 11, 195, 81, 239,
1978        159, 253, 161, 97, 169, 222, 77, 215, 41, 173, 164, 231, 254, 68, 157, 151, 199, 131, 31,
1979        15, 51, 229, 63, 255, 215, 120, 20, 151, 181, 190, 25, 143, 98, 173, 167, 4, 37, 210, 202,
1980        110, 79, 94, 44, 109, 63, 184, 25, 204, 106, 245, 174, 165, 184, 186, 255, 34, 232, 166,
1981        85, 235, 10, 129, 108, 219, 94, 77, 55, 38, 138, 209, 88, 68, 227, 135, 64, 117, 74, 222,
1982        11, 105, 165, 138, 101, 41, 51, 50, 138, 77, 47, 168, 253, 24, 154, 254, 166, 75, 250, 197,
1983        174, 255, 220, 14, 67, 253, 183, 37, 182, 44, 199, 154, 44, 180, 173, 94, 210, 67, 119,
1984        162, 217, 238, 168, 45, 173, 75, 166, 89, 49, 221, 121, 75, 181, 252, 201, 68, 13, 106, 11,
1985        215, 174, 172, 116, 193, 151, 122, 225, 164, 101, 88, 214, 163, 99, 121, 131, 81, 24, 45,
1986        12, 251, 169, 162, 202, 149, 101, 79, 168, 52, 76, 161, 114, 239, 153, 11, 127, 104, 76,
1987        54, 182, 29, 56, 35, 201, 157, 140, 103, 90, 91, 221, 186, 229, 126, 190, 7, 196, 213, 210,
1988        154, 41, 118, 115, 186, 154, 58, 246, 122, 78, 70, 227, 84, 183, 212, 109, 167, 222, 37,
1989        35, 57, 30, 200, 156, 142, 145, 201, 36, 38, 19, 59, 212, 151, 67, 179, 178, 28, 134, 90,
1990        64, 196, 74, 234, 204, 41, 107, 51, 191, 172, 197, 19, 125, 214, 20, 200, 127, 5, 242, 251,
1991        66, 60, 160, 71, 37, 53, 105, 190, 161, 20, 17, 185, 81, 220, 225, 193, 248, 225, 46, 251,
1992        187, 228, 247, 101, 81, 141, 255, 46, 249, 91, 163, 185, 30, 185, 97, 48, 115, 250, 122,
1993        208, 237, 91, 194, 160, 81, 221, 12, 250, 122, 165, 57, 139, 132, 209, 220, 10, 226, 191,
1994        231, 244, 187, 251, 239, 84, 74, 101, 3, 159, 52, 143, 16, 255, 174, 249, 96, 77, 135, 141,
1995        96, 214, 147, 172, 74, 252, 73, 134, 57, 113, 61, 193, 170, 217, 230, 164, 61, 20, 163,
1996        214, 56, 124, 90, 117, 5, 69, 39, 10, 164, 173, 201, 150, 210, 53, 181, 150, 174, 4, 243,
1997        174, 105, 173, 134, 134, 86, 215, 238, 23, 45, 53, 208, 156, 81, 99, 97, 116, 172, 213,
1998        114, 40, 142, 54, 174, 229, 149, 188, 185, 190, 238, 9, 81, 89, 51, 69, 215, 182, 38, 134,
1999        107, 212, 108, 93, 146, 203, 35, 210, 197, 158, 111, 13, 6, 194, 122, 57, 18, 91, 226, 64,
2000        138, 106, 166, 160, 77, 6, 210, 66, 232, 17, 165, 52, 242, 29, 113, 220, 183, 212, 145,
2001        229, 170, 158, 82, 171, 140, 251, 110, 191, 107, 47, 38, 93, 59, 90, 143, 103, 147, 173,
2002        166, 232, 237, 158, 229, 106, 221, 112, 210, 115, 231, 234, 115, 135, 76, 126, 199, 22,
2003        213, 113, 99, 210, 28, 62, 68, 79, 182, 226, 174, 201, 179, 230, 214, 67, 107, 101, 217,
2004        238, 141, 19, 40, 125, 67, 80, 227, 46, 50, 255, 61, 31, 119, 199, 195, 137, 182, 49, 141,
2005        167, 40, 108, 255, 238, 169, 189, 127, 140, 171, 255, 124, 232, 206, 102, 155, 95, 102,
2006        235, 95, 255, 186, 123, 12, 122, 225, 116, 34, 213, 131, 141, 222, 105, 253, 90, 180, 199,
2007        255, 248, 167, 80, 119, 126, 215, 36, 177, 94, 173, 53, 167, 139, 142, 242, 115, 48, 155,
2008        141, 204, 91, 219, 239, 205, 31, 154, 119, 198, 248, 246, 121, 118, 59, 239, 135, 146, 166,
2009        248, 255, 26, 119, 234, 99, 233, 229, 241, 103, 125, 182, 157, 107, 178, 225, 63, 85, 158,
2010        22, 97, 224, 222, 254, 187, 62, 115, 111, 170, 139, 162, 19, 164, 95, 91, 168, 130, 42, 60,
2011        10, 254, 198, 20, 39, 171, 129, 168, 86, 250, 247, 213, 165, 181, 109, 5, 86, 201, 147,
2012        188, 7, 165, 221, 35, 166, 194, 176, 2, 215, 86, 180, 64, 85, 220, 7, 199, 152, 108, 137,
2013        42, 147, 116, 43, 122, 54, 26, 213, 173, 57, 183, 158, 7, 190, 98, 116, 37, 229, 153, 168,
2014        243, 182, 37, 147, 47, 156, 89, 21, 207, 92, 175, 45, 127, 45, 152, 15, 65, 197, 11, 188,
2015        218, 64, 82, 106, 131, 185, 114, 211, 121, 80, 5, 75, 94, 180, 44, 95, 188, 31, 40, 173,
2016        112, 180, 121, 41, 147, 209, 50, 25, 154, 235, 242, 64, 158, 188, 140, 137, 154, 183, 230,
2017        74, 160, 54, 60, 115, 52, 175, 89, 238, 60, 154, 154, 150, 247, 163, 187,
2018    ];
2019    let ps: Vec<Vec<u8>> = vec![
2020        p0.to_vec(),
2021        p1.to_vec(),
2022        p2.to_vec(),
2023        p3.to_vec(),
2024        p4.to_vec(),
2025        p5.to_vec(),
2026        p6.to_vec(),
2027    ];
2028
2029    let mut n = 0;
2030
2031    let mut rq = RecvQ::new();
2032    for i in ps {
2033        let v = FrameVec::new(&i).unwrap();
2034        for i in v.frames {
2035            rq.insert(i).unwrap();
2036            if !rq.flush(&"0.0.0.0:0".parse().unwrap()).is_empty() {
2037                n += 1;
2038            }
2039        }
2040    }
2041
2042    // p1 retransmits p0 with a new datagram ID but the same reliable frame ID.
2043    assert_eq!(n, 4);
2044}
2045
2046#[cfg(test)]
2047#[path = "arq_tests.rs"]
2048mod regressions;
2049
2050#[test]
2051fn rejects_messages_exceeding_the_receivers_fragment_limit() {
2052    let sendq = SendQ::new(576);
2053    let limit = crate::fragment::MAX_FRAGMENTS * (576 - 60);
2054    assert!(
2055        sendq
2056            .required_bytes(Reliability::ReliableOrdered, limit)
2057            .is_ok()
2058    );
2059    assert!(matches!(
2060        sendq.required_bytes(Reliability::ReliableOrdered, limit + 1),
2061        Err(RaknetError::PacketSizeExceedMTU)
2062    ));
2063}
2064
2065#[test]
2066fn exact_mtu_payload_is_not_marked_as_split() {
2067    let mut sendq = SendQ::new(576);
2068    let payload = vec![0xfe; 516];
2069    sendq
2070        .insert(Reliability::ReliableOrdered, &payload)
2071        .unwrap();
2072    let frames = sendq.flush(0, &"127.0.0.1:19132".parse().unwrap());
2073    assert_eq!(frames.len(), 1);
2074    assert_eq!(frames[0].flags & 16, 0);
2075    assert_eq!(frames[0].data.as_ref(), payload);
2076    sendq.ack(frames[0].sequence_number, 1);
2077    assert!(sendq.is_empty());
2078    assert_eq!(sendq.buffered_bytes, 0);
2079}
2080
2081#[cfg(test)]
2082mod allocation_regressions {
2083    use super::*;
2084
2085    #[test]
2086    fn frame_decoder_reuses_storage_and_discards_previous_frames() {
2087        let packet = FrameSetPacket::new(Reliability::ReliableOrdered, vec![0xfe; 800]);
2088        let encoded = packet.serialize().unwrap();
2089        let mut frames = Vec::new();
2090        FrameVec::decode_into(&encoded, &mut frames).unwrap();
2091        let capacity = frames.capacity();
2092        assert_eq!(frames[0].data.as_ref(), &[0xfe; 800]);
2093        frames.clear();
2094        FrameVec::decode_into(&encoded, &mut frames).unwrap();
2095        assert_eq!(frames.len(), 1);
2096        assert_eq!(frames.capacity(), capacity);
2097        assert!(FrameVec::decode_into(&[0x84], &mut frames).is_err());
2098        assert!(frames.is_empty());
2099    }
2100
2101    #[test]
2102    fn ordered_delivery_retains_the_receive_queue_allocation() {
2103        let mut queue = RecvQ::new();
2104        let mut delivered = Vec::new();
2105        for index in 0..16 {
2106            let mut frame = FrameSetPacket::new(Reliability::ReliableOrdered, vec![0xfe]);
2107            frame.sequence_number = index;
2108            frame.reliable_frame_index = index;
2109            frame.ordered_frame_index = index;
2110            queue.insert(frame).unwrap();
2111            queue.flush_into(&mut delivered);
2112            assert_eq!(delivered.len(), 1);
2113            delivered.clear();
2114            assert!(queue.ready_ordered.capacity() > 0);
2115        }
2116    }
2117}
2118
2119#[cfg(test)]
2120mod serialization_reuse_tests {
2121    use super::*;
2122
2123    #[test]
2124    fn reused_fragment_buffer_preserves_the_wire_format() {
2125        let mut frame = FrameSetPacket::new(Reliability::ReliableOrdered, vec![0xfe; 16]);
2126        frame.flags |= 16;
2127        frame.sequence_number = 0xabcdef;
2128        frame.reliable_frame_index = 0x123456;
2129        frame.ordered_frame_index = 0x654321;
2130        frame.order_channel = 7;
2131        frame.compound_size = 3;
2132        frame.compound_id = 0x1234;
2133        frame.fragment_index = 1;
2134        let mut expected = vec![
2135            0x8c, 0xef, 0xcd, 0xab, 0x70, 0, 0x80, 0x56, 0x34, 0x12, 0x21, 0x43, 0x65, 7, 0, 0, 0,
2136            3, 0x12, 0x34, 0, 0, 0, 1,
2137        ];
2138        expected.extend_from_slice(&[0xfe; 16]);
2139        let mut buffer = Vec::with_capacity(128);
2140        buffer.extend_from_slice(&[0xff; 64]);
2141        for _ in 0..100 {
2142            frame.serialize_into(&mut buffer).unwrap();
2143            assert_eq!(buffer, expected);
2144            assert_eq!(buffer.capacity(), 128);
2145        }
2146        frame.compound_size = 0;
2147        assert!(frame.serialize_into(&mut buffer).is_err());
2148        assert_eq!(buffer, expected);
2149    }
2150}
2151
2152#[cfg(test)]
2153mod shared_fragment_tests {
2154    use super::*;
2155
2156    #[test]
2157    fn retransmitted_fragment_accepts_old_ack_without_releasing_the_budget_twice() {
2158        let peer = "127.0.0.1:19132".parse().unwrap();
2159        let mut queue = SendQ::new(1400);
2160        queue
2161            .insert(Reliability::ReliableOrdered, &[0xfe; 4096])
2162            .unwrap();
2163        let frames = queue.flush(0, &peer);
2164        let old_id = frames[3].sequence_number;
2165        queue.nack(old_id, 1);
2166        let retry = queue.flush(1, &peer);
2167        assert_eq!(retry.len(), 1);
2168        let new_id = retry[0].sequence_number;
2169        queue.ack(old_id, 2);
2170        let budget = queue.buffered_bytes;
2171        queue.ack(old_id, 2);
2172        queue.ack(new_id, 2);
2173        assert_eq!(queue.buffered_bytes, budget);
2174        for frame in &frames[..3] {
2175            queue.ack(frame.sequence_number, 2);
2176        }
2177        assert_eq!(queue.buffered_bytes, 0);
2178    }
2179
2180    #[test]
2181    fn fragment_slices_share_one_allocation_and_keep_its_budget_until_final_ack() {
2182        let peer = "127.0.0.1:19132".parse().unwrap();
2183        let mut queue = SendQ::new(1400);
2184        let payload = vec![0xfe; 4096];
2185        queue
2186            .insert(Reliability::ReliableOrdered, &payload)
2187            .unwrap();
2188        let frames = queue.flush(0, &peer);
2189        assert_eq!(frames.len(), 4);
2190        let owner = frames[0].shared_payload.as_ref().unwrap();
2191        for frame in &frames {
2192            assert!(Arc::ptr_eq(owner, frame.shared_payload.as_ref().unwrap()));
2193        }
2194        let restored: Vec<_> = frames
2195            .iter()
2196            .flat_map(|frame| frame.data.iter().copied())
2197            .collect();
2198        assert_eq!(restored, payload);
2199        let initial = queue.buffered_bytes;
2200        for (index, frame) in frames.iter().enumerate() {
2201            queue.ack(frame.sequence_number, 1);
2202            queue.ack(frame.sequence_number, 1);
2203            if index + 1 < frames.len() {
2204                assert_eq!(
2205                    queue.buffered_bytes,
2206                    initial - (index + 1) * SendQ::FRAME_BUDGET
2207                );
2208            }
2209        }
2210        assert_eq!(queue.buffered_bytes, 0);
2211        assert_eq!(owner.remaining.load(Ordering::Relaxed), 0);
2212    }
2213}
2214
2215#[cfg(test)]
2216mod flight_order_tests {
2217    use super::*;
2218
2219    #[test]
2220    fn retries_and_sequence_wrap_keep_the_existing_numeric_order() {
2221        let peer = "127.0.0.1:19132".parse().unwrap();
2222        let mut queue = SendQ::new(1400);
2223        queue.sequence_number = sequence::MASK;
2224        queue.insert(Reliability::ReliableOrdered, &[0xfe]).unwrap();
2225        queue.insert(Reliability::ReliableOrdered, &[0xfe]).unwrap();
2226        let initial = queue.flush(0, &peer);
2227        assert_eq!(
2228            initial
2229                .iter()
2230                .map(|frame| frame.sequence_number)
2231                .collect::<Vec<_>>(),
2232            [sequence::MASK, 0]
2233        );
2234        assert!(queue.flight_order_dirty);
2235        assert!(queue.flush(1, &peer).is_empty());
2236        assert_eq!(
2237            queue
2238                .sent_packet
2239                .iter()
2240                .map(|packet| packet.0.sequence_number)
2241                .collect::<Vec<_>>(),
2242            [0, sequence::MASK]
2243        );
2244        assert!(!queue.flight_order_dirty);
2245        queue.nack(sequence::MASK, 2);
2246        assert!(queue.flight_order_dirty);
2247        let retry = queue.flush(2, &peer);
2248        assert_eq!(retry.len(), 1);
2249        assert_eq!(retry[0].sequence_number, 1);
2250        assert!(!queue.flight_order_dirty);
2251        assert_eq!(
2252            queue
2253                .sent_packet
2254                .iter()
2255                .map(|packet| packet.0.sequence_number)
2256                .collect::<Vec<_>>(),
2257            [0, 1]
2258        );
2259        queue.ack(sequence::MASK, 3);
2260        queue.ack(0, 3);
2261        assert!(queue.is_empty());
2262        assert_eq!(queue.buffered_bytes, 0);
2263    }
2264}
2265
2266#[cfg(test)]
2267mod owned_decode_tests {
2268    use super::*;
2269
2270    #[test]
2271    fn a_single_frame_moves_the_udp_allocation_into_its_payload() {
2272        let frame = FrameSetPacket::new(Reliability::ReliableOrdered, vec![0xfe; 800]);
2273        let packet = frame.serialize().unwrap();
2274        let pointer = packet.as_ptr();
2275        let mut decoded = Vec::new();
2276        FrameVec::decode_owned_into(packet, &mut decoded).unwrap();
2277        assert_eq!(decoded.len(), 1);
2278        assert_eq!(decoded[0].data.as_ptr(), pointer);
2279        assert_eq!(decoded[0].data.as_ref(), frame.data.as_ref());
2280        let data: Vec<u8> = decoded.pop().unwrap().data.into();
2281        assert_eq!(data.as_ptr(), pointer);
2282    }
2283
2284    #[test]
2285    fn multiple_frames_and_invalid_lengths_keep_the_borrowed_decoder_contract() {
2286        let first = FrameSetPacket::new(Reliability::ReliableOrdered, vec![0xfe; 800]);
2287        let second = FrameSetPacket::new(Reliability::Unreliable, vec![0xfe; 64]);
2288        let mut packet = first.serialize().unwrap();
2289        packet.extend_from_slice(&second.serialize().unwrap()[4..]);
2290        let mut expected = Vec::new();
2291        FrameVec::decode_into(&packet, &mut expected).unwrap();
2292        let mut actual = Vec::new();
2293        FrameVec::decode_owned_into(packet.clone(), &mut actual).unwrap();
2294        assert_eq!(actual.len(), 2);
2295        for (actual, expected) in actual.iter().zip(&expected) {
2296            assert_eq!(actual.serialize().unwrap(), expected.serialize().unwrap());
2297        }
2298        for length in 0..packet.len() {
2299            let mut borrowed = Vec::new();
2300            let mut owned = Vec::new();
2301            assert_eq!(
2302                FrameVec::decode_into(&packet[..length], &mut borrowed).is_ok(),
2303                FrameVec::decode_owned_into(packet[..length].to_vec(), &mut owned).is_ok()
2304            );
2305        }
2306    }
2307}
2308
2309#[cfg(test)]
2310mod scheduling_regressions {
2311    use super::*;
2312
2313    #[test]
2314    fn cached_deadlines_match_a_full_scan_across_ack_loss_and_wrap() {
2315        let peer = "127.0.0.1:19132".parse().unwrap();
2316        let mut cached = SendQ::new(1400);
2317        cached.sequence_number = sequence::MASK - 80;
2318        let mut scanned = SendQ::new(1400);
2319        scanned.sequence_number = cached.sequence_number;
2320        let mut rng = 0x12345678u32;
2321        for tick in 0..4000 {
2322            rng = rng.wrapping_mul(1664525).wrapping_add(1013904223);
2323            if rng & 3 == 0 {
2324                for queue in [&mut cached, &mut scanned] {
2325                    queue
2326                        .insert(Reliability::ReliableOrdered, &[0xfe, 42])
2327                        .unwrap();
2328                }
2329            }
2330            if !cached.sent_packet.is_empty() && rng & 7 == 1 {
2331                let index = (rng as usize >> 8) % cached.sent_packet.len();
2332                let sequence = cached.sent_packet[index].0.sequence_number;
2333                for queue in [&mut cached, &mut scanned] {
2334                    if rng & 16 == 0 {
2335                        queue.ack(sequence, tick);
2336                    } else {
2337                        queue.nack(sequence, tick);
2338                    }
2339                }
2340            }
2341            // The oracle deliberately does the old full scan on every flush.
2342            scanned.next_retry = 0;
2343            scanned.retries_pending = true;
2344            let actual: Vec<_> = cached
2345                .flush(tick, &peer)
2346                .iter()
2347                .map(|f| f.serialize().unwrap())
2348                .collect();
2349            let expected: Vec<_> = scanned
2350                .flush(tick, &peer)
2351                .iter()
2352                .map(|f| f.serialize().unwrap())
2353                .collect();
2354            assert_eq!(actual, expected, "tick {tick}");
2355            assert_eq!(cached.buffered_bytes, scanned.buffered_bytes);
2356        }
2357    }
2358
2359    #[test]
2360    fn lower_rto_invalidates_the_deadline_and_retries_keep_the_backoff() {
2361        let peer = "127.0.0.1:19132".parse().unwrap();
2362        let mut queue = SendQ::new(1400);
2363        queue.srtt = 133;
2364        queue.rto = 200;
2365        for _ in 0..2 {
2366            queue.insert(Reliability::ReliableOrdered, &[0xfe]).unwrap();
2367        }
2368        queue.flush(0, &peer);
2369        queue.ack(0, 50);
2370        assert_eq!(queue.rto, 174);
2371        assert!(queue.flush(173, &peer).is_empty());
2372        assert_eq!(queue.flush(174, &peer).len(), 1);
2373        assert!(queue.flush(434, &peer).is_empty());
2374        assert_eq!(queue.flush(435, &peer).len(), 1);
2375        queue.ack(1, 436);
2376        assert!(queue.is_empty());
2377    }
2378
2379    #[test]
2380    fn ack_storage_is_recycled_without_replaying_old_ranges() {
2381        let mut set = ACKSet::default();
2382        let mut output = Vec::new();
2383        for index in 0..100 {
2384            set.insert(index);
2385            set.take_ack_into(&mut output);
2386            assert_eq!(output, [(index, index)]);
2387        }
2388        set.take_ack_into(&mut output);
2389        assert!(output.is_empty());
2390        assert!(set.ack.capacity() > 0);
2391    }
2392}
2393
2394#[cfg(test)]
2395mod owned_payload_tests {
2396    use super::*;
2397
2398    #[test]
2399    fn owned_sends_match_borrowed_wire_bytes_and_share_retry_storage() {
2400        let peer = "127.0.0.1:19132".parse().unwrap();
2401        for mode in [
2402            Reliability::Unreliable,
2403            Reliability::UnreliableSequenced,
2404            Reliability::Reliable,
2405            Reliability::ReliableOrdered,
2406            Reliability::ReliableSequenced,
2407        ] {
2408            for size in [64, 800, 4096] {
2409                let data = bytes::Bytes::from(vec![0xfe; size]);
2410                let mut owned = SendQ::new(1400);
2411                let mut borrowed = SendQ::new(1400);
2412                let a = owned.insert_bytes(mode, &data, 7);
2413                let b = borrowed.insert_with_order_channel(mode, &data, 7);
2414                assert_eq!(a.is_ok(), b.is_ok());
2415                if a.is_err() {
2416                    continue;
2417                }
2418                let frames = owned.flush(0, &peer);
2419                let expected = borrowed.flush(0, &peer);
2420                assert_eq!(
2421                    frames
2422                        .iter()
2423                        .map(|f| f.serialize().unwrap())
2424                        .collect::<Vec<_>>(),
2425                    expected
2426                        .iter()
2427                        .map(|f| f.serialize().unwrap())
2428                        .collect::<Vec<_>>()
2429                );
2430                let mut offset = 0;
2431                for frame in &frames {
2432                    assert_eq!(frame.data.as_ptr(), data[offset..].as_ptr());
2433                    offset += frame.data.len();
2434                }
2435                if mode != Reliability::Unreliable && mode != Reliability::UnreliableSequenced {
2436                    owned.nack(frames[0].sequence_number, 1);
2437                    let retry = owned.flush(1, &peer);
2438                    assert_eq!(retry[0].data.as_ptr(), data.as_ptr());
2439                    // Old ACK IDs still release each payload budget once.
2440                    owned.ack_ranges(&[(0, (frames.len() - 1) as u32)], 2);
2441                    assert!(owned.is_empty());
2442                    assert_eq!(owned.buffered_bytes, 0);
2443                }
2444            }
2445        }
2446    }
2447}