Skip to main content

rust_raknet/
arq.rs

1use crate::sequence::{self, ReliableWindow};
2use bytes::Bytes;
3use std::{
4    collections::{HashMap, VecDeque},
5    net::SocketAddr,
6};
7
8use crate::{datatype::*, error::*, fragment::FragmentQ, raknet_log_debug, utils::*};
9
10/// Delivery and ordering guarantees for a RakNet frame.
11#[derive(Clone, Copy, Debug, PartialEq, Eq)]
12#[repr(u8)]
13pub enum Reliability {
14    /// The frame may be lost or arrive out of order.
15    Unreliable = 0x00,
16    /// Only the newest frame in the ordering stream is delivered.
17    UnreliableSequenced = 0x01,
18    /// The frame is retransmitted until acknowledged, without ordering guarantees.
19    Reliable = 0x02,
20    /// The frame is retransmitted and delivered in order within its channel.
21    ReliableOrdered = 0x03,
22    /// The frame is reliable, but older frames in its ordering stream may be skipped.
23    ReliableSequenced = 0x04,
24}
25
26impl Reliability {
27    pub fn to_u8(&self) -> u8 {
28        *self as u8
29    }
30
31    pub fn from(flags: u8) -> Result<Self> {
32        Self::try_from(flags)
33    }
34}
35
36impl TryFrom<u8> for Reliability {
37    type Error = RaknetError;
38
39    fn try_from(flags: u8) -> Result<Self> {
40        match flags {
41            0x00 => Ok(Self::Unreliable),
42            0x01 => Ok(Self::UnreliableSequenced),
43            0x02 => Ok(Self::Reliable),
44            0x03 => Ok(Self::ReliableOrdered),
45            0x04 => Ok(Self::ReliableSequenced),
46            _ => Err(RaknetError::IncorrectReliability),
47        }
48    }
49}
50
51const NEEDS_B_AND_AS_FLAG: u8 = 0x4;
52const CONTINUOUS_SEND_FLAG: u8 = 0x8;
53
54#[derive(Clone)]
55pub struct FrameSetPacket {
56    pub sequence_number: u32,
57    pub flags: u8,
58    pub length_in_bytes: u16,
59    pub reliable_frame_index: u32,
60    pub sequenced_frame_index: u32,
61    pub ordered_frame_index: u32,
62    pub order_channel: u8,
63    pub compound_size: u32,
64    pub compound_id: u16,
65    pub fragment_index: u32,
66    pub data: Bytes,
67}
68
69impl FrameSetPacket {
70    pub fn new(r: Reliability, data: Vec<u8>) -> Self {
71        let flag = r.to_u8() << 5;
72
73        Self {
74            sequence_number: 0,
75            flags: flag,
76            length_in_bytes: data.len() as u16,
77            reliable_frame_index: 0,
78            sequenced_frame_index: 0,
79            ordered_frame_index: 0,
80            order_channel: 0,
81            compound_size: 0,
82            compound_id: 0,
83            fragment_index: 0,
84            data: data.into(),
85        }
86    }
87
88    #[cfg(test)]
89    pub fn deserialize(buf: &[u8]) -> Result<(Self, bool)> {
90        let mut reader = RaknetReader::new(buf);
91        let input_len = buf.len() as u64;
92
93        let mut ret = Self {
94            sequence_number: 0,
95            flags: 0,
96            length_in_bytes: 0,
97            reliable_frame_index: 0,
98            sequenced_frame_index: 0,
99            ordered_frame_index: 0,
100            order_channel: 0,
101            compound_size: 0,
102            compound_id: 0,
103            fragment_index: 0,
104            data: Bytes::new(),
105        };
106
107        let packet_id = reader.read_u8()?;
108        if !(0x80..=0x8d).contains(&packet_id) {
109            return Err(RaknetError::PacketHeaderError);
110        }
111        ret.sequence_number = reader.read_u24(Endian::Little)?;
112        ret.flags = reader.read_u8()?;
113
114        let length_in_bits = reader.read_u16(Endian::Big)?;
115        if length_in_bits % 8 != 0 {
116            return Err(RaknetError::PacketParseError);
117        }
118        ret.length_in_bytes = length_in_bits / 8;
119
120        if ret.is_reliable()? {
121            ret.reliable_frame_index = reader.read_u24(Endian::Little)?;
122        }
123
124        if ret.is_sequenced()? {
125            ret.sequenced_frame_index = reader.read_u24(Endian::Little)?;
126        }
127        if ret.is_ordered()? {
128            ret.ordered_frame_index = reader.read_u24(Endian::Little)?;
129            ret.order_channel = reader.read_u8()?;
130        }
131
132        if ret.is_fragment() {
133            ret.compound_size = reader.read_u32(Endian::Big)?;
134            ret.compound_id = reader.read_u16(Endian::Big)?;
135            ret.fragment_index = reader.read_u32(Endian::Big)?;
136        }
137
138        let mut data = vec![0; usize::from(ret.length_in_bytes)];
139        reader.read(&mut data)?;
140        ret.data = data.into();
141
142        if ret.is_fragment() && (ret.compound_size == 0 || ret.fragment_index >= ret.compound_size)
143        {
144            return Err(RaknetError::PacketParseError);
145        }
146
147        Ok((ret, reader.pos() == input_len))
148    }
149
150    pub fn serialize(&self) -> Result<Vec<u8>> {
151        if self.data.len() != usize::from(self.length_in_bytes)
152            || self.data.len() > usize::from(u16::MAX / 8)
153            || (self.is_fragment()
154                && (self.compound_size == 0 || self.fragment_index >= self.compound_size))
155        {
156            return Err(RaknetError::PacketParseError);
157        }
158
159        let mut writer = RaknetWriter::with_capacity(self._size()?);
160        let mut id = 0x80 | NEEDS_B_AND_AS_FLAG;
161
162        // Set the continuation bit for all fragments after the first.
163        if (self.flags & 16) != 0 && self.fragment_index != 0 {
164            id |= CONTINUOUS_SEND_FLAG;
165        }
166
167        writer.write_u8(id)?;
168        writer.write_u24(self.sequence_number, Endian::Little)?;
169
170        // The top three bits encode the reliability mode.
171        writer.write_u8(self.flags)?;
172        writer.write_u16(self.length_in_bytes * 8, Endian::Big)?;
173
174        if self.is_reliable()? {
175            writer.write_u24(self.reliable_frame_index, Endian::Little)?;
176        }
177
178        if self.is_sequenced()? {
179            writer.write_u24(self.sequenced_frame_index, Endian::Little)?;
180        }
181        if self.is_ordered()? {
182            writer.write_u24(self.ordered_frame_index, Endian::Little)?;
183            writer.write_u8(self.order_channel)?;
184        }
185
186        // Bit 4 marks a fragmented frame.
187        if (self.flags & 16) != 0 {
188            writer.write_u32(self.compound_size, Endian::Big)?;
189            writer.write_u16(self.compound_id, Endian::Big)?;
190            writer.write_u32(self.fragment_index, Endian::Big)?;
191        }
192        writer.write(self.data.as_ref())?;
193
194        Ok(writer.get_raw_payload())
195    }
196
197    pub fn is_fragment(&self) -> bool {
198        (self.flags & 16) != 0
199    }
200
201    pub fn is_reliable(&self) -> Result<bool> {
202        let r = Reliability::from((self.flags & 224) >> 5)?;
203        Ok(matches!(
204            r,
205            Reliability::Reliable | Reliability::ReliableOrdered | Reliability::ReliableSequenced
206        ))
207    }
208
209    pub fn is_ordered(&self) -> Result<bool> {
210        let r = Reliability::from((self.flags & 224) >> 5)?;
211        Ok(matches!(
212            r,
213            Reliability::UnreliableSequenced
214                | Reliability::ReliableOrdered
215                | Reliability::ReliableSequenced
216        ))
217    }
218
219    pub fn is_sequenced(&self) -> Result<bool> {
220        let r = Reliability::from((self.flags & 224) >> 5)?;
221        Ok(matches!(
222            r,
223            Reliability::UnreliableSequenced | Reliability::ReliableSequenced
224        ))
225    }
226    pub fn reliability(&self) -> Result<Reliability> {
227        Reliability::from((self.flags & 224) >> 5)
228    }
229
230    pub fn _size(&self) -> Result<usize> {
231        let mut ret = 0;
232        // id
233        ret += 1;
234        // sequence number
235        ret += 3;
236        // flags
237        ret += 1;
238        // length_in_bits
239        ret += 2;
240
241        if self.is_reliable()? {
242            // reliable frame index
243            ret += 3;
244        }
245        if self.is_sequenced()? {
246            // sequenced frame index
247            ret += 3;
248        }
249        if self.is_ordered()? {
250            // Ordered frame index and channel.
251            ret += 4;
252        }
253        if (self.flags & 16) != 0 {
254            // Compound size, compound ID, and fragment index.
255            ret += 10;
256        }
257        //body
258        ret += self.data.len();
259        Ok(ret)
260    }
261}
262
263pub struct FrameVec {
264    pub frames: Vec<FrameSetPacket>,
265}
266
267impl FrameVec {
268    pub fn new(buf: &[u8]) -> Result<Self> {
269        let mut reader = RaknetReader::new(buf);
270        let id = reader.read_u8()?;
271        if !(0x80..=0x8d).contains(&id) {
272            return Err(RaknetError::PacketHeaderError);
273        }
274        let sequence_number = reader.read_u24(Endian::Little)?;
275        if reader.pos() == buf.len() as u64 {
276            return Err(RaknetError::PacketParseError);
277        }
278        let mut frames = Vec::new();
279
280        while reader.pos() < buf.len() as u64 {
281            let mut frame = FrameSetPacket {
282                sequence_number,
283                flags: 0,
284                length_in_bytes: 0,
285                reliable_frame_index: 0,
286                sequenced_frame_index: 0,
287                ordered_frame_index: 0,
288                order_channel: 0,
289                compound_size: 0,
290                compound_id: 0,
291                fragment_index: 0,
292                data: Bytes::new(),
293            };
294
295            frame.flags = reader.read_u8()?;
296            let length_in_bits = reader.read_u16(Endian::Big)?;
297            if length_in_bits % 8 != 0 {
298                return Err(RaknetError::PacketParseError);
299            }
300            frame.length_in_bytes = length_in_bits / 8;
301
302            if frame.is_reliable()? {
303                frame.reliable_frame_index = reader.read_u24(Endian::Little)?;
304            }
305            if frame.is_sequenced()? {
306                frame.sequenced_frame_index = reader.read_u24(Endian::Little)?;
307            }
308            if frame.is_ordered()? {
309                frame.ordered_frame_index = reader.read_u24(Endian::Little)?;
310                frame.order_channel = reader.read_u8()?;
311            }
312            if frame.is_fragment() {
313                frame.compound_size = reader.read_u32(Endian::Big)?;
314                frame.compound_id = reader.read_u16(Endian::Big)?;
315                frame.fragment_index = reader.read_u32(Endian::Big)?;
316                if frame.compound_size == 0 || frame.fragment_index >= frame.compound_size {
317                    return Err(RaknetError::PacketParseError);
318                }
319            }
320
321            let data = reader.read_slice(usize::from(frame.length_in_bytes))?;
322            frame.data = Bytes::copy_from_slice(data);
323            frames.push(frame);
324        }
325
326        Ok(Self { frames })
327    }
328}
329
330#[derive(Default)]
331pub struct ACKSet {
332    ack: Vec<(u32, u32)>,
333    nack: Vec<(u32, u32)>,
334    next_expected: u32,
335}
336
337impl ACKSet {
338    pub fn insert(&mut self, s: u32) {
339        // Remove a hole that arrived before the next NACK was emitted.
340        let mut split = None;
341        self.nack.retain_mut(|(start, end)| {
342            if s < *start || s > *end {
343                return true;
344            }
345            if *start == *end {
346                return false;
347            }
348            if s == *start {
349                *start += 1;
350            } else if s == *end {
351                *end -= 1;
352            } else {
353                split = Some((s + 1, *end));
354                *end = s - 1;
355            }
356            true
357        });
358        if let Some(range) = split {
359            self.nack.push(range);
360        }
361        if s == self.next_expected || sequence::newer(s, self.next_expected) {
362            if s != self.next_expected {
363                if s > self.next_expected {
364                    self.nack.push((self.next_expected, s - 1));
365                } else {
366                    self.nack.push((self.next_expected, sequence::MASK));
367                    if s != 0 {
368                        self.nack.push((0, s - 1));
369                    }
370                }
371            }
372            self.next_expected = sequence::next(s);
373        }
374
375        for i in 0..self.ack.len() {
376            let a = self.ack[i];
377            if (a.0..=a.1).contains(&s) {
378                return;
379            }
380            if a.0 != 0 && s == a.0 - 1 {
381                self.ack[i].0 = s;
382                return;
383            }
384            if s == a.1.saturating_add(1) {
385                self.ack[i].1 = s;
386                return;
387            }
388        }
389        self.ack.push((s, s));
390    }
391
392    pub fn get_ack(&mut self) -> Vec<(u32, u32)> {
393        std::mem::take(&mut self.ack)
394    }
395
396    pub fn get_nack(&mut self) -> Vec<(u32, u32)> {
397        std::mem::take(&mut self.nack)
398    }
399}
400
401/// Channel zero is the common path; other channels allocate only when used.
402#[derive(Default)]
403struct ChannelIndexes {
404    primary: u32,
405    others: HashMap<u8, u32>,
406}
407
408impl ChannelIndexes {
409    fn get(&self, channel: u8) -> u32 {
410        if channel == 0 {
411            self.primary
412        } else {
413            self.others.get(&channel).copied().unwrap_or(0)
414        }
415    }
416
417    fn get_mut(&mut self, channel: u8) -> &mut u32 {
418        if channel == 0 {
419            &mut self.primary
420        } else {
421            self.others.entry(channel).or_default()
422        }
423    }
424
425    #[cfg(test)]
426    fn insert(&mut self, channel: u8, index: u32) {
427        *self.get_mut(channel) = index;
428    }
429}
430
431#[derive(Default)]
432pub struct RecvQ {
433    sequenced_frame_indexes: ChannelIndexes,
434    last_ordered_indexes: ChannelIndexes,
435    sequence_number_ackset: ACKSet,
436    packets: HashMap<u32, FrameSetPacket>,
437    ordered_packets: HashMap<(u8, u32), FrameSetPacket>,
438    fragment_queue: FragmentQ,
439    reliable_window: ReliableWindow,
440    ordered_bytes: usize,
441    ready_ordered: Vec<FrameSetPacket>,
442    ready_bytes: usize,
443}
444
445impl RecvQ {
446    pub fn new() -> Self {
447        Self::default()
448    }
449
450    pub fn insert(&mut self, frame: FrameSetPacket) -> Result<()> {
451        let reliability = frame.reliability()?;
452        self.sequence_number_ackset.insert(frame.sequence_number);
453        if frame.is_reliable()? && !self.reliable_window.accept(frame.reliable_frame_index)? {
454            return Ok(());
455        }
456
457        match reliability {
458            Reliability::Unreliable => {
459                self.packets.entry(frame.sequence_number).or_insert(frame);
460            }
461            Reliability::UnreliableSequenced => {
462                let channel = frame.order_channel;
463                let sequence_index = frame.sequenced_frame_index;
464                let sequence_number = frame.sequence_number;
465                let last_index = self.sequenced_frame_indexes.get_mut(channel);
466                if sequence_index == *last_index || sequence::newer(sequence_index, *last_index) {
467                    self.packets.entry(sequence_number).or_insert(frame);
468                    *last_index = sequence::next(sequence_index);
469                }
470            }
471            Reliability::Reliable => {
472                self.packets.insert(frame.sequence_number, frame);
473            }
474            Reliability::ReliableOrdered => {
475                let expected_index = self.last_ordered_indexes.get(frame.order_channel);
476                if sequence::newer(expected_index, frame.ordered_frame_index) {
477                    return Ok(());
478                }
479                if sequence::distance(frame.ordered_frame_index, expected_index)
480                    >= sequence::RECEIVE_WINDOW
481                {
482                    return Err(RaknetError::PacketParseError);
483                }
484                let complete = if frame.is_fragment() {
485                    self.fragment_queue.insert_and_take_completed(frame)?
486                } else {
487                    Some(frame)
488                };
489                if let Some(frame) = complete {
490                    let key = (frame.order_channel, frame.ordered_frame_index);
491                    if self.ordered_packets.contains_key(&key) {
492                        return Ok(());
493                    }
494                    if self.ordered_packets.len() + self.ready_ordered.len()
495                        >= sequence::RECEIVE_WINDOW as usize
496                        || self.ordered_bytes + self.ready_bytes + frame.data.len()
497                            > 64 * 1024 * 1024
498                    {
499                        return Err(RaknetError::PacketParseError);
500                    }
501                    if frame.ordered_frame_index == expected_index {
502                        let channel = frame.order_channel;
503                        self.ready_bytes += frame.data.len();
504                        self.ready_ordered.push(frame);
505                        let expected = self.last_ordered_indexes.get_mut(channel);
506                        *expected = sequence::next(*expected);
507                        // Contiguous traffic bypasses the reordering hash table.
508                        while !self.ordered_packets.is_empty() {
509                            let Some(frame) = self.ordered_packets.remove(&(channel, *expected))
510                            else {
511                                break;
512                            };
513                            self.ordered_bytes -= frame.data.len();
514                            self.ready_bytes += frame.data.len();
515                            self.ready_ordered.push(frame);
516                            *expected = sequence::next(*expected);
517                        }
518                    } else {
519                        self.ordered_bytes += frame.data.len();
520                        self.ordered_packets.insert(key, frame);
521                    }
522                }
523            }
524
525            Reliability::ReliableSequenced => {
526                let channel = frame.order_channel;
527                let sequence_index = frame.sequenced_frame_index;
528                let sequence_number = frame.sequence_number;
529                let last_index = self.sequenced_frame_indexes.get_mut(channel);
530                if sequence_index == *last_index || sequence::newer(sequence_index, *last_index) {
531                    self.packets.entry(sequence_number).or_insert(frame);
532                    *last_index = sequence::next(sequence_index);
533                }
534            }
535        }
536        Ok(())
537    }
538
539    pub fn get_ack(&mut self) -> Vec<(u32, u32)> {
540        self.sequence_number_ackset.get_ack()
541    }
542
543    pub fn get_nack(&mut self) -> Vec<(u32, u32)> {
544        self.sequence_number_ackset.get_nack()
545    }
546
547    pub fn flush(&mut self, _peer_addr: &SocketAddr) -> Vec<FrameSetPacket> {
548        let mut ret = std::mem::take(&mut self.ready_ordered);
549        self.ready_bytes = 0;
550        if self.packets.is_empty() {
551            return ret;
552        }
553
554        let mut packets: Vec<_> = self.packets.drain().map(|(_, frame)| frame).collect();
555        packets.sort_unstable_by_key(|frame| frame.sequence_number);
556        ret.extend(packets);
557        ret
558    }
559    pub fn fragments_expired(&self) -> bool {
560        self.fragment_queue.expired()
561    }
562
563    pub fn get_ordered_packet(&self) -> usize {
564        self.ordered_packets.len() + self.ready_ordered.len()
565    }
566
567    pub fn get_fragment_queue_size(&self) -> usize {
568        self.fragment_queue.size()
569    }
570
571    pub fn get_ordered_keys(&self) -> Vec<(u8, u32)> {
572        self.ordered_packets.keys().copied().collect()
573    }
574
575    pub fn get_size(&self) -> usize {
576        self.packets.len()
577    }
578}
579
580pub struct SendQ {
581    mtu: u16,
582    ack_sequence_number: u32,
583    sequence_number: u32,
584    reliable_frame_index: u32,
585    sequenced_frame_indexes: ChannelIndexes,
586    ordered_frame_indexes: ChannelIndexes,
587    compound_id: u16,
588    // Each entry stores a frame, send state, last send time, retry count, and prior sequence IDs.
589    packets: VecDeque<FrameSetPacket>,
590    queued_unreliable: usize,
591    buffered_bytes: usize,
592    rto: i64,
593    srtt: i64,
594    sent_packet: Vec<(FrameSetPacket, bool, i64, u32, Vec<u32>)>,
595}
596
597impl SendQ {
598    pub const DEFAULT_TIMEOUT_MILLS: i64 = 50;
599    const MAX_IN_FLIGHT_PACKETS: usize = 64;
600    const MAX_BUFFERED_BYTES: usize = 64 * 1024 * 1024;
601    const SEND_HIGH_WATER: usize = 256 * 1024;
602    const FRAME_BUDGET: usize = 128;
603
604    const RTO_UBOUND: i64 = 12000;
605    const RTO_LBOUND: i64 = 50;
606
607    pub fn new(mtu: u16) -> Self {
608        Self {
609            mtu,
610            ack_sequence_number: sequence::MASK,
611            sequence_number: 0,
612            packets: VecDeque::new(),
613            queued_unreliable: 0,
614            buffered_bytes: 0,
615            sent_packet: vec![],
616            reliable_frame_index: 0,
617            sequenced_frame_indexes: ChannelIndexes::default(),
618            ordered_frame_indexes: ChannelIndexes::default(),
619            compound_id: 0,
620
621            rto: SendQ::DEFAULT_TIMEOUT_MILLS,
622            srtt: SendQ::DEFAULT_TIMEOUT_MILLS,
623        }
624    }
625
626    fn required_bytes(&self, reliability: Reliability, len: usize) -> Result<usize> {
627        let payload = usize::from(self.mtu)
628            .checked_sub(60)
629            .filter(|n| *n > 0)
630            .ok_or(RaknetError::PacketSizeExceedMTU)?;
631        let frames = if reliability == Reliability::ReliableOrdered && len > payload {
632            let frames = len.div_ceil(payload);
633            if frames > crate::fragment::MAX_FRAGMENTS {
634                return Err(RaknetError::PacketSizeExceedMTU);
635            }
636            frames
637        } else {
638            1
639        };
640        let bytes = frames
641            .checked_mul(Self::FRAME_BUDGET)
642            .and_then(|n| n.checked_add(len))
643            .filter(|n| *n <= Self::MAX_BUFFERED_BYTES)
644            .ok_or(RaknetError::PacketSizeExceedMTU)?;
645        Ok(bytes)
646    }
647
648    pub fn has_capacity(&self, reliability: Reliability, len: usize) -> Result<bool> {
649        let required = self.required_bytes(reliability, len)?;
650        // Admit a single large message while applying backpressure to bursts.
651        Ok(self.buffered_bytes.saturating_add(required) <= Self::SEND_HIGH_WATER.max(required))
652    }
653
654    pub fn insert(&mut self, reliability: Reliability, buf: &[u8]) -> Result<()> {
655        self.insert_with_order_channel(reliability, buf, 0)
656    }
657
658    pub fn insert_with_order_channel(
659        &mut self,
660        reliability: Reliability,
661        buf: &[u8],
662        order_channel: u8,
663    ) -> Result<()> {
664        let reserved = self.required_bytes(reliability, buf.len())?;
665        if reserved > Self::MAX_BUFFERED_BYTES - self.buffered_bytes {
666            return Err(RaknetError::PacketSizeExceedMTU);
667        }
668        let max_payload = self
669            .mtu
670            .checked_sub(60)
671            .map(usize::from)
672            .filter(|size| *size > 0)
673            .ok_or(RaknetError::PacketSizeExceedMTU)?;
674
675        match reliability {
676            Reliability::Unreliable => {
677                if buf.len() > max_payload {
678                    return Err(RaknetError::PacketSizeExceedMTU);
679                }
680
681                let frame = FrameSetPacket::new(reliability, buf.to_vec());
682                self.packets.push_back(frame);
683            }
684            Reliability::UnreliableSequenced => {
685                if buf.len() > max_payload {
686                    return Err(RaknetError::PacketSizeExceedMTU);
687                }
688
689                let sequenced_frame_index = {
690                    let index = self.sequenced_frame_indexes.get_mut(order_channel);
691                    let current = *index;
692                    *index = sequence::next(*index);
693                    current
694                };
695                let ordered_frame_index = self.ordered_frame_indexes.get(order_channel);
696                let mut frame = FrameSetPacket::new(reliability, buf.to_vec());
697                frame.order_channel = order_channel;
698                frame.ordered_frame_index = ordered_frame_index;
699                frame.sequenced_frame_index = sequenced_frame_index;
700                self.packets.push_back(frame);
701            }
702            Reliability::Reliable => {
703                if buf.len() > max_payload {
704                    return Err(RaknetError::PacketSizeExceedMTU);
705                }
706
707                let mut frame = FrameSetPacket::new(reliability, buf.to_vec());
708                frame.reliable_frame_index = self.reliable_frame_index;
709                self.packets.push_back(frame);
710                self.reliable_frame_index = sequence::next(self.reliable_frame_index);
711            }
712            Reliability::ReliableOrdered => {
713                if buf.len() <= max_payload {
714                    let mut frame = FrameSetPacket::new(reliability, buf.to_vec());
715                    frame.order_channel = order_channel;
716                    frame.reliable_frame_index = self.reliable_frame_index;
717                    frame.ordered_frame_index = *self.ordered_frame_indexes.get_mut(order_channel);
718                    self.packets.push_back(frame);
719                    self.reliable_frame_index = sequence::next(self.reliable_frame_index);
720                } else {
721                    let compound_size = buf.len().div_ceil(max_payload);
722                    let compound_size = u32::try_from(compound_size)
723                        .map_err(|_| RaknetError::PacketSizeExceedMTU)?;
724                    let ordered_frame_index = *self.ordered_frame_indexes.get_mut(order_channel);
725
726                    for (fragment_index, chunk) in buf.chunks(max_payload).enumerate() {
727                        let mut frame = FrameSetPacket::new(reliability, chunk.to_vec());
728                        frame.flags |= 16;
729                        frame.compound_size = compound_size;
730                        frame.compound_id = self.compound_id;
731                        frame.fragment_index = fragment_index as u32;
732                        frame.order_channel = order_channel;
733                        frame.reliable_frame_index = self.reliable_frame_index;
734                        frame.ordered_frame_index = ordered_frame_index;
735                        self.packets.push_back(frame);
736                        self.reliable_frame_index = sequence::next(self.reliable_frame_index);
737                    }
738                    self.compound_id = self.compound_id.wrapping_add(1);
739                }
740                let index = self.ordered_frame_indexes.get_mut(order_channel);
741                *index = sequence::next(*index);
742            }
743            Reliability::ReliableSequenced => {
744                if buf.len() > max_payload {
745                    return Err(RaknetError::PacketSizeExceedMTU);
746                }
747
748                let sequenced_frame_index = {
749                    let index = self.sequenced_frame_indexes.get_mut(order_channel);
750                    let current = *index;
751                    *index = sequence::next(*index);
752                    current
753                };
754                let ordered_frame_index = self.ordered_frame_indexes.get(order_channel);
755                let mut frame = FrameSetPacket::new(reliability, buf.to_vec());
756                frame.order_channel = order_channel;
757                frame.reliable_frame_index = self.reliable_frame_index;
758                frame.sequenced_frame_index = sequenced_frame_index;
759                frame.ordered_frame_index = ordered_frame_index;
760                self.packets.push_back(frame);
761                self.reliable_frame_index = sequence::next(self.reliable_frame_index);
762            }
763        };
764        self.buffered_bytes += reserved;
765        if matches!(
766            reliability,
767            Reliability::Unreliable | Reliability::UnreliableSequenced
768        ) {
769            self.queued_unreliable += 1;
770        }
771        Ok(())
772    }
773
774    fn update_rto(&mut self, rtt: i64) {
775        self.srtt = (self.srtt * 4 + rtt) / 5;
776        self.rto = (self.srtt * 3 / 2).clamp(Self::RTO_LBOUND, Self::RTO_UBOUND);
777    }
778
779    pub fn get_rto(&self) -> i64 {
780        self.rto
781    }
782
783    pub fn nack(&mut self, sequence: u32, tick: i64) {
784        for i in 0..self.sent_packet.len() {
785            let item = &mut self.sent_packet[i];
786            if item.1 && item.0.sequence_number == sequence {
787                raknet_log_debug!(
788                    "packet {}-{}-{} nack {} times",
789                    item.0.sequence_number,
790                    item.0.reliable_frame_index,
791                    item.0.ordered_frame_index,
792                    item.3 + 1
793                );
794                let previous = item.0.sequence_number;
795                item.0.sequence_number = self.sequence_number;
796                self.sequence_number = sequence::next(self.sequence_number);
797                item.1 = false;
798                item.2 = tick;
799
800                if item.4.len() == 64 {
801                    item.4.remove(0);
802                }
803                item.4.push(previous);
804            }
805        }
806    }
807
808    pub fn ack(&mut self, sequence: u32, tick: i64) {
809        // Ignore ACKs outside the actual send history before advancing any state.
810        let Some(index) = self
811            .sent_packet
812            .iter()
813            .position(|item| item.0.sequence_number == sequence || item.4.contains(&sequence))
814        else {
815            return;
816        };
817        let item = self.sent_packet.remove(index);
818        self.buffered_bytes -= item.0.data.len() + Self::FRAME_BUDGET;
819        if sequence::newer(sequence, self.ack_sequence_number) {
820            let span = sequence::distance(sequence, self.ack_sequence_number);
821            let missing: Vec<_> = self
822                .sent_packet
823                .iter()
824                .filter_map(|item| {
825                    let distance =
826                        sequence::distance(item.0.sequence_number, self.ack_sequence_number);
827                    (distance > 0 && distance < span).then_some(item.0.sequence_number)
828                })
829                .collect();
830            for id in missing {
831                self.nack(id, tick);
832            }
833            self.ack_sequence_number = sequence;
834        }
835        // A retransmitted frame has an ambiguous RTT sample (Karn's algorithm).
836        if item.3 == 0 {
837            self.update_rto(tick.saturating_sub(item.2).max(0));
838        }
839    }
840
841    pub fn ack_ranges(&mut self, ranges: &[(u32, u32)], tick: i64) {
842        if let [(start, end)] = ranges {
843            if start == end {
844                self.ack(*start, tick);
845                return;
846            }
847        }
848        let acknowledged: Vec<_> = self
849            .sent_packet
850            .iter()
851            .filter_map(|item| {
852                std::iter::once(item.0.sequence_number)
853                    .chain(item.4.iter().copied())
854                    .find(|id| {
855                        ranges
856                            .iter()
857                            .any(|&(start, end)| start <= *id && *id <= end)
858                    })
859            })
860            .collect();
861        for id in acknowledged {
862            self.ack(id, tick);
863        }
864    }
865
866    pub fn nack_ranges(&mut self, ranges: &[(u32, u32)], tick: i64) {
867        if let [(start, end)] = ranges {
868            if start == end {
869                self.nack(*start, tick);
870                return;
871            }
872        }
873        let missing: Vec<_> = self
874            .sent_packet
875            .iter()
876            .filter_map(|item| {
877                let id = item.0.sequence_number;
878                ranges
879                    .iter()
880                    .any(|&(start, end)| start <= id && id <= end)
881                    .then_some(id)
882            })
883            .collect();
884        for id in missing {
885            self.nack(id, tick);
886        }
887    }
888
889    fn tick(&mut self, tick: i64) {
890        for i in 0..self.sent_packet.len() {
891            let p = &mut self.sent_packet[i];
892
893            let mut cur_rto = self.rto;
894
895            // Bound the existing 1.5x retry backoff, including long-lived losses.
896            for _ in 0..p.3.min(32) {
897                cur_rto = ((cur_rto as f64 * 1.5) as i64).min(Self::RTO_UBOUND);
898            }
899
900            if p.1 && tick - p.2 >= cur_rto {
901                let previous = p.0.sequence_number;
902                p.0.sequence_number = self.sequence_number;
903                self.sequence_number = sequence::next(self.sequence_number);
904                p.1 = false;
905                if p.4.len() == 64 {
906                    p.4.remove(0);
907                }
908                p.4.push(previous);
909            }
910        }
911    }
912
913    pub fn flush(&mut self, tick: i64, peer_addr: &SocketAddr) -> Vec<FrameSetPacket> {
914        self.tick(tick);
915
916        let mut ret = Vec::new();
917        self.sent_packet
918            .sort_unstable_by_key(|packet| packet.0.sequence_number);
919
920        for packet in &mut self.sent_packet {
921            if !packet.1 {
922                raknet_log_debug!(
923                    "{} , packet {}-{}-{} resend {} times",
924                    peer_addr,
925                    packet.0.sequence_number,
926                    packet.0.reliable_frame_index,
927                    packet.0.ordered_frame_index,
928                    packet.3 + 1
929                );
930                ret.push(packet.0.clone());
931                packet.1 = true;
932                packet.2 = tick;
933                packet.3 = packet.3.saturating_add(1);
934            }
935        }
936
937        let queued_count = self.packets.len();
938        for _ in 0..queued_count {
939            if self.sent_packet.len() >= Self::MAX_IN_FLIGHT_PACKETS && self.queued_unreliable == 0
940            {
941                break;
942            }
943            let Some(mut packet) = self.packets.pop_front() else {
944                break;
945            };
946            let reliable = packet.is_reliable().unwrap_or(false);
947            if reliable && self.sent_packet.len() >= Self::MAX_IN_FLIGHT_PACKETS {
948                self.packets.push_back(packet);
949                continue;
950            }
951
952            packet.sequence_number = self.sequence_number;
953            self.sequence_number = sequence::next(self.sequence_number);
954
955            if reliable {
956                ret.push(packet.clone());
957                self.sent_packet.push((packet, true, tick, 0, Vec::new()));
958            } else {
959                self.queued_unreliable -= 1;
960                self.buffered_bytes -= packet.data.len() + Self::FRAME_BUDGET;
961                ret.push(packet);
962            }
963        }
964
965        ret
966    }
967
968    pub fn is_empty(&self) -> bool {
969        self.packets.is_empty() && self.sent_packet.is_empty()
970    }
971
972    pub fn get_reliable_queue_size(&self) -> usize {
973        self.packets.len()
974    }
975
976    pub fn get_sent_queue_size(&self) -> usize {
977        self.sent_packet.len()
978    }
979}
980
981#[test]
982fn malformed_datagrams_are_rejected() {
983    assert!(FrameVec::new(&[0x80, 0, 0]).is_err());
984    assert!(FrameVec::new(&[0x10, 0, 0, 0]).is_err());
985}
986
987#[test]
988fn send_queue_rejects_an_invalid_mtu() {
989    let mut send_queue = SendQ::new(59);
990    assert!(send_queue.insert(Reliability::Reliable, &[0xfe]).is_err());
991}
992
993#[tokio::test]
994async fn test_recvq_orders_channels_independently() {
995    let mut recvq = RecvQ::new();
996
997    let mut later_on_channel_one = FrameSetPacket::new(Reliability::ReliableOrdered, vec![1]);
998    later_on_channel_one.sequence_number = 0;
999    later_on_channel_one.order_channel = 1;
1000    later_on_channel_one.ordered_frame_index = 1;
1001    recvq.insert(later_on_channel_one).unwrap();
1002
1003    let mut first_on_channel_two = FrameSetPacket::new(Reliability::ReliableOrdered, vec![2]);
1004    first_on_channel_two.sequence_number = 1;
1005    first_on_channel_two.reliable_frame_index = 1;
1006    first_on_channel_two.order_channel = 2;
1007    first_on_channel_two.ordered_frame_index = 0;
1008    recvq.insert(first_on_channel_two).unwrap();
1009
1010    let ready = recvq.flush(&"127.0.0.1:0".parse().unwrap());
1011    assert_eq!(ready.len(), 1);
1012    assert_eq!(ready[0].order_channel, 2);
1013
1014    let mut first_on_channel_one = FrameSetPacket::new(Reliability::ReliableOrdered, vec![0]);
1015    first_on_channel_one.sequence_number = 2;
1016    first_on_channel_one.reliable_frame_index = 2;
1017    first_on_channel_one.order_channel = 1;
1018    first_on_channel_one.ordered_frame_index = 0;
1019    recvq.insert(first_on_channel_one).unwrap();
1020
1021    let ready = recvq.flush(&"127.0.0.1:0".parse().unwrap());
1022    assert_eq!(ready.len(), 2);
1023    assert_eq!(ready[0].ordered_frame_index, 0);
1024    assert_eq!(ready[1].ordered_frame_index, 1);
1025    assert!(ready.iter().all(|frame| frame.order_channel == 1));
1026}
1027
1028#[tokio::test]
1029async fn test_sendq_maintains_ordered_indexes_per_channel() {
1030    let mut sendq = SendQ::new(1500);
1031    sendq
1032        .insert_with_order_channel(Reliability::ReliableOrdered, &[0xfe, 1], 3)
1033        .unwrap();
1034    sendq
1035        .insert_with_order_channel(Reliability::ReliableOrdered, &[0xfe, 2], 9)
1036        .unwrap();
1037
1038    let sent = sendq.flush(0, &"127.0.0.1:0".parse().unwrap());
1039    assert_eq!(sent.len(), 2);
1040    assert_eq!(sent[0].order_channel, 3);
1041    assert_eq!(sent[0].ordered_frame_index, 0);
1042    assert_eq!(sent[1].order_channel, 9);
1043    assert_eq!(sent[1].ordered_frame_index, 0);
1044}
1045
1046#[tokio::test]
1047async fn test_ackset() {
1048    let mut ackset = ACKSet::default();
1049
1050    ackset.insert(0);
1051    ackset.insert(1);
1052    ackset.insert(2);
1053    ackset.insert(4);
1054
1055    let acks = ackset.get_ack();
1056
1057    assert!(acks == vec![(0, 2), (4, 4)]);
1058
1059    let mut ackset = ACKSet::default();
1060
1061    ackset.insert(0);
1062    ackset.insert(1);
1063    ackset.insert(2);
1064    ackset.insert(6);
1065
1066    let acks = ackset.get_ack();
1067
1068    assert!(acks == vec![(0, 2), (6, 6)]);
1069
1070    let acks = ackset.get_ack();
1071
1072    assert!(acks == vec![]);
1073
1074    ackset.insert(0);
1075    ackset.insert(2);
1076
1077    let acks = ackset.get_ack();
1078
1079    assert!(acks == vec![(0, 0), (2, 2)]);
1080}
1081
1082#[tokio::test]
1083async fn test_frame_serialize_deserialize() {
1084    // Captured first frame datagram from a Bedrock 1.18.12 client.
1085    let p: Vec<u8> = [
1086        132, 0, 0, 0, 64, 0, 144, 0, 0, 0, 9, 146, 33, 7, 47, 57, 18, 128, 111, 0, 0, 0, 0, 20,
1087        200, 47, 41, 0,
1088    ]
1089    .to_vec();
1090
1091    let a = FrameSetPacket::deserialize(&p).unwrap();
1092    assert!(a.0.serialize().unwrap() == p);
1093}
1094
1095#[tokio::test]
1096async fn test_recvq() {
1097    let mut r = RecvQ::new();
1098    let mut p = FrameSetPacket::new(Reliability::Reliable, vec![]);
1099    p.sequence_number = 0;
1100    p.ordered_frame_index = 0;
1101    r.insert(p).unwrap();
1102
1103    let mut p = FrameSetPacket::new(Reliability::Reliable, vec![]);
1104    p.sequence_number = 1;
1105    p.reliable_frame_index = 1;
1106    p.ordered_frame_index = 1;
1107    r.insert(p).unwrap();
1108
1109    let ret = r.flush(&"0.0.0.0:0".parse().unwrap());
1110    assert!(ret.len() == 2);
1111}
1112
1113#[tokio::test]
1114async fn test_recvq_fragment() {
1115    let mut r = RecvQ::new();
1116    let mut p = FrameSetPacket::new(Reliability::ReliableOrdered, vec![1]);
1117    p.flags |= 16;
1118    p.sequence_number = 0;
1119    p.ordered_frame_index = 0;
1120    p.compound_id = 1;
1121    p.compound_size = 3;
1122    p.fragment_index = 0;
1123    p.order_channel = 7;
1124    r.insert(p).unwrap();
1125
1126    let mut p = FrameSetPacket::new(Reliability::ReliableOrdered, vec![2]);
1127    p.flags |= 16;
1128    p.sequence_number = 1;
1129    p.reliable_frame_index = 1;
1130    p.ordered_frame_index = 0;
1131    p.compound_id = 1;
1132    p.compound_size = 3;
1133    p.fragment_index = 1;
1134    p.order_channel = 7;
1135    r.insert(p).unwrap();
1136
1137    let mut p = FrameSetPacket::new(Reliability::ReliableOrdered, vec![3]);
1138    p.flags |= 16;
1139    p.sequence_number = 2;
1140    p.reliable_frame_index = 2;
1141    p.ordered_frame_index = 0;
1142    p.compound_id = 1;
1143    p.compound_size = 3;
1144    p.fragment_index = 2;
1145    p.order_channel = 7;
1146    r.insert(p).unwrap();
1147
1148    let ret = r.flush(&"0.0.0.0:0".parse().unwrap());
1149    assert!(ret.len() == 1);
1150    assert!(ret[0].data == vec![1, 2, 3]);
1151    assert_eq!(ret[0].order_channel, 7);
1152}
1153
1154#[tokio::test]
1155async fn test_sendq() {
1156    let mut s = SendQ::new(1500);
1157    let p = FrameSetPacket::new(Reliability::Reliable, vec![]);
1158    s.insert(Reliability::Reliable, &p.serialize().unwrap())
1159        .unwrap();
1160
1161    let p = FrameSetPacket::new(Reliability::Reliable, vec![]);
1162    s.insert(Reliability::Reliable, &p.serialize().unwrap())
1163        .unwrap();
1164
1165    let sockaddr: SocketAddr = "127.0.0.1:8000".parse().unwrap();
1166    let ret = s.flush(0, &sockaddr);
1167    assert!(ret.len() == 2);
1168
1169    s.ack(0, 0);
1170    s.ack(1, 0);
1171
1172    let ret = s.flush(300, &sockaddr);
1173    assert!(ret.is_empty());
1174}
1175
1176#[test]
1177fn send_queue_pipelines_reliable_packets_with_a_bounded_window() {
1178    let mut sendq = SendQ::new(1500);
1179    let peer = "127.0.0.1:8000".parse().unwrap();
1180
1181    for index in 0..SendQ::MAX_IN_FLIGHT_PACKETS + 1 {
1182        sendq
1183            .insert(Reliability::ReliableOrdered, &[0xfe, index as u8])
1184            .unwrap();
1185        let sent = sendq.flush(0, &peer);
1186        if index < SendQ::MAX_IN_FLIGHT_PACKETS {
1187            assert_eq!(sent.len(), 1);
1188            assert_eq!(sent[0].ordered_frame_index, index as u32);
1189        } else {
1190            assert!(sent.is_empty());
1191        }
1192    }
1193
1194    assert_eq!(sendq.get_sent_queue_size(), SendQ::MAX_IN_FLIGHT_PACKETS);
1195    assert_eq!(sendq.get_reliable_queue_size(), 1);
1196
1197    sendq.ack(0, 1);
1198    let sent = sendq.flush(1, &peer);
1199    assert_eq!(sent.len(), 1);
1200    assert_eq!(
1201        sent[0].ordered_frame_index,
1202        SendQ::MAX_IN_FLIGHT_PACKETS as u32
1203    );
1204    assert_eq!(sendq.get_sent_queue_size(), SendQ::MAX_IN_FLIGHT_PACKETS);
1205    assert_eq!(sendq.get_reliable_queue_size(), 0);
1206}
1207
1208#[test]
1209fn send_queue_retransmits_immediately_after_nack() {
1210    let mut sendq = SendQ::new(1500);
1211    let peer = "127.0.0.1:8000".parse().unwrap();
1212    sendq.insert(Reliability::Reliable, &[0xfe]).unwrap();
1213
1214    let first = sendq.flush(0, &peer);
1215    assert_eq!(first.len(), 1);
1216    assert_eq!(first[0].sequence_number, 0);
1217
1218    sendq.nack(0, 1);
1219    let retransmitted = sendq.flush(1, &peer);
1220    assert_eq!(retransmitted.len(), 1);
1221    assert_eq!(retransmitted[0].sequence_number, 1);
1222}
1223
1224#[tokio::test]
1225async fn test_client_packet1() {
1226    let a = [
1227        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,
1228        189, 203, 114, 234, 74, 183, 239, 185, 79, 175, 170, 30, 99, 159, 110, 125, 59, 36, 1, 222,
1229        166, 122, 19, 35, 97, 48, 18, 19, 161, 11, 82, 69, 197, 23, 128, 248, 38, 32, 9, 107, 218,
1230        152, 91, 69, 61, 79, 53, 234, 141, 78, 243, 52, 234, 5, 170, 119, 90, 149, 41, 165, 48, 41,
1231        11, 12, 2, 95, 214, 154, 255, 198, 47, 86, 120, 77, 15, 75, 202, 203, 24, 57, 46, 153, 249,
1232        223, 255, 199, 127, 253, 47, 255, 246, 111, 255, 229, 255, 253, 111, 255, 227, 191, 254,
1233        63, 255, 243, 191, 253, 219, 255, 249, 239, 163, 201, 96, 58, 255, 247, 255, 237, 127, 255,
1234        247, 241, 166, 53, 25, 54, 70, 211, 206, 180, 165, 152, 91, 181, 172, 221, 53, 159, 155,
1235        243, 95, 162, 215, 107, 222, 52, 125, 177, 105, 247, 61, 165, 107, 5, 205, 158, 84, 29,
1236        244, 250, 209, 111, 85, 214, 106, 166, 21, 52, 122, 91, 93, 209, 77, 165, 222, 51, 117,
1237        215, 21, 20, 197, 109, 148, 55, 166, 220, 122, 234, 216, 101, 105, 108, 43, 157, 241, 180,
1238        218, 49, 26, 250, 189, 165, 184, 243, 129, 242, 171, 50, 170, 7, 247, 109, 241, 113, 173,
1239        221, 235, 205, 225, 60, 18, 218, 226, 196, 234, 134, 186, 57, 240, 43, 83, 43, 112, 167,
1240        150, 57, 89, 13, 75, 90, 205, 146, 244, 123, 183, 46, 111, 199, 182, 176, 214, 182, 147,
1241        141, 214, 16, 187, 227, 134, 38, 247, 234, 150, 219, 107, 84, 231, 78, 201, 17, 186, 115,
1242        189, 174, 139, 154, 51, 82, 212, 210, 192, 178, 30, 13, 49, 216, 186, 179, 218, 203, 192,
1243        143, 238, 61, 177, 37, 186, 211, 234, 147, 41, 105, 91, 87, 169, 61, 142, 239, 22, 207,
1244        170, 28, 205, 199, 117, 253, 121, 32, 107, 117, 213, 119, 166, 255, 234, 62, 254, 7, 249,
1245        238, 153, 219, 111, 9, 3, 219, 141, 28, 73, 17, 92, 83, 17, 189, 198, 100, 57, 10, 3, 97,
1246        76, 190, 221, 187, 39, 127, 167, 183, 154, 186, 253, 201, 170, 57, 35, 239, 61, 235, 150,
1247        58, 117, 103, 173, 25, 242, 186, 125, 215, 138, 220, 134, 245, 226, 53, 200, 239, 90, 53,
1248        209, 9, 215, 145, 35, 44, 130, 241, 153, 109, 214, 145, 45, 117, 32, 5, 229, 177, 185, 158,
1249        121, 210, 122, 48, 154, 7, 150, 105, 107, 162, 106, 233, 146, 41, 87, 23, 61, 163, 117,
1250        167, 149, 92, 167, 83, 215, 94, 220, 70, 165, 111, 6, 214, 196, 110, 8, 37, 237, 222, 107,
1251        184, 161, 76, 191, 243, 217, 19, 149, 142, 213, 112, 55, 134, 226, 54, 29, 163, 213, 29,
1252        218, 214, 203, 72, 246, 90, 154, 31, 61, 246, 76, 209, 234, 133, 74, 223, 158, 183, 126,
1253        15, 77, 241, 119, 199, 168, 117, 134, 194, 162, 163, 7, 90, 167, 59, 183, 218, 110, 67, 40,
1254        143, 130, 32, 178, 239, 181, 208, 233, 63, 110, 123, 91, 85, 26, 223, 221, 174, 45, 163,
1255        41, 245, 238, 107, 247, 170, 18, 149, 123, 155, 170, 173, 90, 206, 148, 124, 243, 139, 19,
1256        58, 211, 206, 76, 150, 180, 250, 72, 234, 212, 127, 73, 154, 161, 84, 239, 126, 253, 199,
1257        63, 158, 123, 119, 119, 203, 126, 120, 247, 220, 113, 55, 245, 97, 189, 212, 172, 255, 136,
1258        30, 159, 164, 122, 255, 95, 245, 141, 220, 159, 41, 149, 169, 218, 173, 174, 5, 249, 247,
1259        83, 205, 188, 185, 81, 220, 113, 251, 229, 101, 213, 249, 245, 123, 212, 248, 71, 239, 105,
1260        48, 151, 68, 103, 32, 175, 215, 63, 220, 113, 216, 169, 252, 243, 247, 211, 118, 230, 255,
1261        179, 210, 173, 173, 123, 230, 203, 63, 170, 163, 127, 12, 52, 39, 26, 247, 158, 182, 147,
1262        113, 52, 154, 4, 75, 219, 122, 168, 223, 120, 255, 152, 223, 138, 173, 135, 122, 79, 43,
1263        245, 27, 255, 254, 191, 210, 81, 92, 214, 250, 38, 29, 197, 90, 79, 9, 74, 164, 149, 221,
1264        158, 188, 88, 218, 126, 112, 51, 152, 213, 234, 93, 50, 12, 117, 255, 89, 208, 77, 171,
1265        214, 21, 2, 217, 182, 189, 154, 110, 76, 20, 163, 177, 136, 198, 247, 129, 234, 148, 188,
1266        103, 210, 74, 21, 203, 82, 102, 158, 161, 152, 94, 80, 251, 57, 52, 253, 77, 151, 244, 139,
1267        93, 255, 181, 29, 134, 250, 139, 37, 182, 44, 199, 154, 44, 180, 173, 94, 210, 67, 119,
1268        162, 217, 238, 168, 45, 173, 75, 166, 89, 49, 221, 121, 75, 181, 252, 201, 68, 13, 106, 11,
1269        215, 174, 172, 116, 193, 151, 122, 225, 164, 101, 88, 214, 131, 99, 121, 131, 81, 24, 45,
1270        12, 251, 177, 162, 202, 149, 101, 79, 168, 52, 76, 161, 114, 231, 153, 11, 127, 104, 76,
1271        54, 182, 29, 56, 35, 201, 157, 140, 103, 90, 91, 221, 186, 229, 126, 182, 7, 196, 213, 210,
1272        154, 41, 118, 115, 186, 154, 58, 246, 122, 78, 70, 227, 84, 183, 212, 109, 167, 222, 37,
1273        35, 153, 14, 228, 156, 142, 145, 201, 36, 38, 19, 59, 212, 151, 67, 179, 178, 28, 134, 90,
1274        64, 196, 74, 234, 204, 41, 107, 51, 191, 172, 209, 137, 62, 107, 10, 228, 191, 2, 249, 125,
1275        129, 14, 232, 81, 73, 141, 155, 111, 40, 69, 68, 110, 68, 59, 60, 24, 223, 255, 72, 255,
1276        46, 249, 125, 89, 84, 233, 223, 37, 127, 107, 52, 215, 35, 55, 12, 102, 78, 95, 15, 186,
1277        125, 75, 24, 52, 170, 155, 65, 95, 175, 52, 103, 145, 48, 154, 91, 1, 253, 123, 78, 191,
1278        187, 255, 78, 165, 68, 54, 240, 73, 243, 8, 244, 119, 205, 123, 107, 58, 108, 4, 179, 158,
1279        100, 85, 232, 39, 25, 230, 196, 245, 4, 171, 102, 155, 147, 246, 80, 140, 90, 227, 240,
1280        113, 213, 21, 20, 221, 54, 221, 182, 38, 91, 74, 215, 212, 90, 186, 18, 204, 187, 166, 181,
1281        26, 26, 90, 93, 187, 91, 180, 212, 128, 40, 129, 198, 194, 232, 88, 171, 229, 80, 28, 109,
1282        92, 203, 43, 121, 115, 125, 221, 19, 162, 178, 102, 138, 174, 109, 77, 12, 215, 168, 217,
1283        186, 36, 151, 71, 164, 139, 61, 223, 26, 12, 132, 245, 114, 68, 148, 196, 64, 138, 106,
1284        166, 160, 77, 6, 210, 66, 232, 137, 122, 107, 228, 59, 226, 184, 111, 169, 35, 203, 85, 61,
1285        165, 86, 25, 247, 221, 126, 215, 94, 76, 186, 118, 180, 30, 207, 38, 91, 77, 209, 219, 61,
1286        203, 213, 186, 225, 164, 231, 206, 213, 167, 14, 153, 252, 142, 45, 170, 227, 198, 164, 57,
1287        188, 143, 30, 109, 197, 93, 147, 103, 205, 173, 251, 214, 202, 178, 221, 27, 39, 80, 250,
1288        134, 160, 210, 46, 50, 255, 53, 31, 119, 199, 195, 137, 182, 49, 141, 199, 40, 108, 191,
1289        244, 212, 222, 63, 198, 213, 255, 188, 239, 206, 102, 155, 223, 102, 235, 159, 255, 252,
1290        241, 16, 244, 194, 233, 68, 170, 7, 27, 189, 211, 250, 189, 104, 143, 255, 241, 159, 66,
1291        221, 121, 169, 73, 98, 189, 90, 107, 78, 23, 29, 229, 215, 96, 54, 27, 153, 183, 182, 223,
1292        155, 223, 55, 127, 24, 227, 219, 167, 217, 237, 188, 31, 74, 154, 226, 255, 115, 220, 169,
1293        143, 165, 231, 135, 95, 245, 217, 118, 174, 201, 134, 255, 88, 121, 92, 132, 129, 123, 251,
1294        175, 250, 204, 189, 169, 46, 138, 78, 144, 126, 109, 161, 10, 170, 240, 32, 248, 27, 83,
1295        156, 172, 6, 162, 90, 233, 223, 85, 151, 214, 182, 21, 88, 37, 79, 242, 238, 149, 118, 143,
1296        152, 10, 131, 232, 111, 91, 209, 2, 85, 113, 239, 29, 99, 178, 37, 170, 76, 210, 173, 232,
1297        201, 104, 84, 183, 230, 220, 122, 26, 248, 138, 209, 149, 148, 167, 65, 73, 111, 91, 50,
1298        249, 194, 153, 85, 241, 204, 245, 218, 242, 215, 130, 121, 31, 84, 188, 192, 171, 13, 36,
1299        165, 54, 152, 43, 55, 157, 123, 85, 176, 228, 69, 203, 242, 197, 187, 129, 210, 10, 71,
1300        155, 231, 50, 25, 45, 147, 161, 185, 46, 15, 228, 201, 243, 56, 156, 56, 214, 92, 9, 212,
1301        134, 103, 142, 230, 53, 203, 157, 71, 83, 211, 242, 126, 118, 55, 196,
1302    ];
1303
1304    let b = FrameVec::new(&a).unwrap();
1305    assert!(b.frames.len() == 1);
1306    assert!(b.frames[0].is_fragment());
1307}
1308
1309#[tokio::test]
1310async fn test_client_packet2() {
1311    // Connection Request - reliable [ reliable_frame_index = 0 ]
1312    let p0 = [
1313        132, 0, 0, 0, 64, 0, 144, 0, 0, 0, 9, 162, 70, 235, 28, 218, 182, 26, 192, 0, 0, 0, 0, 16,
1314        151, 43, 113, 0,
1315    ];
1316    // Connection Request - reliable [ reliable_frame_index = 0 ]
1317    let p1 = [
1318        132, 1, 0, 0, 64, 0, 144, 0, 0, 0, 9, 162, 70, 235, 28, 218, 182, 26, 192, 0, 0, 0, 0, 16,
1319        151, 43, 113, 0,
1320    ];
1321    // 2 frames Incompatible Protocol(extract data?) Connected ping - reliable ordered [ reliable_frame_index = 1 ]
1322    let p2 = [
1323        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,
1324        225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 196, 178, 112, 86, 5, 59, 97, 219, 15, 0,
1325        0, 0, 6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 188, 210, 59, 150, 246,
1326        167, 182, 213, 33, 0, 0, 0, 6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0,
1327        132, 194, 47, 23, 175, 46, 78, 138, 23, 0, 0, 0, 6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128,
1328        0, 0, 0, 0, 0, 0, 136, 219, 85, 240, 191, 125, 172, 233, 10, 0, 0, 0, 6, 23, 0, 225, 138,
1329        0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 80, 211, 212, 44, 191, 227, 124, 40, 13, 0, 0, 0,
1330        6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 77, 13, 19, 149, 102, 140, 134,
1331        77, 16, 0, 0, 0, 4, 83, 237, 239, 254, 225, 138, 4, 63, 87, 214, 254, 225, 138, 4, 83, 236,
1332        159, 254, 225, 138, 4, 63, 87, 46, 254, 225, 138, 4, 63, 87, 56, 128, 225, 138, 4, 63, 87,
1333        56, 123, 225, 138, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255,
1334        255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255,
1335        255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1336        0, 0, 0, 0, 0, 16, 151, 56, 146, 0, 0, 72, 0, 0, 0, 0, 0, 16, 151, 56, 146,
1337    ];
1338    // 1 frames Connected ping - unreliable
1339    let p3 = [132, 3, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 16, 151, 56, 161];
1340    // 1 frames game packet - reliable ordered [is_fragment reliable_frame_index = 2 ordered_frame_index = 1 ]
1341    let p4 = [
1342        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,
1343        189, 203, 114, 234, 202, 214, 239, 249, 157, 94, 85, 61, 198, 119, 186, 181, 79, 72, 2,
1344        188, 77, 245, 140, 145, 48, 24, 137, 137, 208, 5, 169, 162, 98, 7, 32, 246, 4, 36, 97, 77,
1345        155, 201, 173, 162, 158, 231, 188, 81, 53, 171, 89, 47, 80, 189, 211, 170, 148, 148, 194,
1346        164, 156, 96, 16, 248, 178, 214, 252, 55, 126, 177, 194, 107, 122, 88, 82, 94, 198, 200,
1347        113, 201, 204, 255, 231, 127, 252, 215, 255, 242, 31, 255, 241, 95, 254, 223, 255, 251,
1348        127, 252, 215, 255, 254, 63, 255, 199, 127, 252, 159, 255, 57, 154, 12, 166, 243, 255, 252,
1349        223, 254, 247, 255, 28, 111, 90, 147, 97, 99, 52, 237, 76, 91, 138, 185, 85, 203, 218, 125,
1350        243, 165, 57, 255, 41, 122, 189, 230, 77, 211, 23, 155, 118, 223, 83, 186, 86, 208, 236,
1351        73, 213, 65, 175, 31, 253, 82, 101, 173, 102, 90, 65, 163, 183, 213, 21, 221, 84, 234, 61,
1352        83, 119, 93, 65, 81, 172, 70, 107, 233, 25, 138, 210, 179, 149, 23, 79, 18, 205, 142, 41,
1353        8, 163, 134, 179, 177, 77, 87, 182, 131, 86, 121, 80, 106, 213, 135, 125, 179, 162, 139,
1354        122, 203, 241, 131, 138, 109, 4, 93, 51, 168, 173, 135, 74, 75, 29, 214, 29, 97, 104, 4,
1355        55, 222, 182, 86, 26, 205, 189, 242, 192, 127, 217, 90, 219, 174, 48, 40, 233, 115, 171,
1356        49, 105, 141, 109, 189, 63, 182, 91, 63, 70, 141, 167, 237, 120, 166, 148, 213, 173, 92,
1357        30, 110, 149, 78, 91, 12, 66, 93, 241, 5, 93, 208, 45, 45, 156, 56, 143, 130, 18, 90, 194,
1358        147, 104, 55, 116, 209, 8, 163, 103, 211, 94, 151, 134, 91, 189, 50, 174, 235, 191, 135,
1359        138, 213, 237, 218, 21, 211, 182, 252, 233, 191, 187, 79, 255, 141, 124, 247, 204, 237,
1360        183, 132, 129, 237, 70, 142, 164, 8, 174, 169, 136, 94, 99, 178, 28, 133, 129, 48, 38, 223,
1361        238, 61, 180, 68, 183, 183, 154, 186, 253, 201, 170, 57, 123, 90, 107, 179, 110, 169, 83,
1362        119, 214, 154, 33, 175, 219, 247, 173, 200, 109, 88, 191, 189, 6, 249, 93, 171, 38, 58,
1363        225, 58, 114, 132, 69, 48, 62, 179, 205, 58, 178, 165, 14, 164, 160, 60, 54, 215, 51, 79,
1364        90, 15, 70, 243, 192, 50, 109, 77, 84, 45, 93, 50, 229, 234, 162, 103, 180, 238, 181, 146,
1365        235, 116, 234, 218, 111, 183, 81, 233, 155, 129, 53, 177, 27, 66, 73, 123, 240, 26, 110,
1366        40, 139, 238, 180, 250, 226, 137, 74, 199, 106, 184, 27, 67, 113, 155, 142, 209, 234, 14,
1367        109, 235, 247, 72, 246, 90, 154, 31, 61, 245, 76, 209, 234, 133, 74, 223, 158, 183, 126,
1368        13, 77, 241, 87, 199, 168, 117, 134, 194, 162, 163, 7, 90, 167, 59, 183, 218, 110, 67, 40,
1369        143, 130, 32, 178, 31, 180, 208, 233, 63, 109, 123, 91, 85, 26, 223, 223, 174, 45, 163, 41,
1370        245, 30, 106, 15, 170, 18, 149, 123, 155, 170, 173, 90, 206, 148, 124, 243, 111, 39, 116,
1371        166, 157, 153, 44, 105, 245, 145, 212, 169, 255, 148, 52, 67, 169, 222, 255, 252, 111, 237,
1372        167, 127, 74, 191, 234, 254, 100, 169, 140, 42, 171, 201, 92, 173, 142, 252, 127, 77, 86,
1373        247, 77, 251, 95, 254, 175, 127, 215, 127, 223, 246, 42, 255, 26, 253, 235, 165, 108, 133,
1374        255, 246, 151, 203, 202, 211, 250, 151, 175, 12, 203, 193, 124, 221, 155, 255, 67, 126,
1375        190, 109, 253, 99, 242, 243, 95, 211, 167, 219, 187, 237, 157, 107, 254, 43, 24, 107, 81,
1376        79, 22, 171, 225, 38, 252, 183, 240, 24, 4, 255, 114, 31, 21, 213, 235, 11, 195, 81, 239,
1377        159, 253, 161, 97, 169, 222, 77, 215, 41, 173, 164, 231, 254, 68, 157, 151, 199, 131, 31,
1378        15, 51, 229, 63, 255, 215, 120, 20, 151, 181, 190, 25, 143, 98, 173, 167, 4, 37, 210, 202,
1379        110, 79, 94, 44, 109, 63, 184, 25, 204, 106, 245, 174, 165, 184, 186, 255, 34, 232, 166,
1380        85, 235, 10, 129, 108, 219, 94, 77, 55, 38, 138, 209, 88, 68, 227, 135, 64, 117, 74, 222,
1381        11, 105, 165, 138, 101, 41, 51, 50, 138, 77, 47, 168, 253, 24, 154, 254, 166, 75, 250, 197,
1382        174, 255, 220, 14, 67, 253, 183, 37, 182, 44, 199, 154, 44, 180, 173, 94, 210, 67, 119,
1383        162, 217, 238, 168, 45, 173, 75, 166, 89, 49, 221, 121, 75, 181, 252, 201, 68, 13, 106, 11,
1384        215, 174, 172, 116, 193, 151, 122, 225, 164, 101, 88, 214, 163, 99, 121, 131, 81, 24, 45,
1385        12, 251, 169, 162, 202, 149, 101, 79, 168, 52, 76, 161, 114, 239, 153, 11, 127, 104, 76,
1386        54, 182, 29, 56, 35, 201, 157, 140, 103, 90, 91, 221, 186, 229, 126, 190, 7, 196, 213, 210,
1387        154, 41, 118, 115, 186, 154, 58, 246, 122, 78, 70, 227, 84, 183, 212, 109, 167, 222, 37,
1388        35, 57, 30, 200, 156, 142, 145, 201, 36, 38, 19, 59, 212, 151, 67, 179, 178, 28, 134, 90,
1389        64, 196, 74, 234, 204, 41, 107, 51, 191, 172, 197, 19, 125, 214, 20, 200, 127, 5, 242, 251,
1390        66, 60, 160, 71, 37, 53, 105, 190, 161, 20, 17, 185, 81, 220, 225, 193, 248, 225, 46, 251,
1391        187, 228, 247, 101, 81, 141, 255, 46, 249, 91, 163, 185, 30, 185, 97, 48, 115, 250, 122,
1392        208, 237, 91, 194, 160, 81, 221, 12, 250, 122, 165, 57, 139, 132, 209, 220, 10, 226, 191,
1393        231, 244, 187, 251, 239, 84, 74, 101, 3, 159, 52, 143, 16, 255, 174, 249, 96, 77, 135, 141,
1394        96, 214, 147, 172, 74, 252, 73, 134, 57, 113, 61, 193, 170, 217, 230, 164, 61, 20, 163,
1395        214, 56, 124, 90, 117, 5, 69, 39, 10, 164, 173, 201, 150, 210, 53, 181, 150, 174, 4, 243,
1396        174, 105, 173, 134, 134, 86, 215, 238, 23, 45, 53, 208, 156, 81, 99, 97, 116, 172, 213,
1397        114, 40, 142, 54, 174, 229, 149, 188, 185, 190, 238, 9, 81, 89, 51, 69, 215, 182, 38, 134,
1398        107, 212, 108, 93, 146, 203, 35, 210, 197, 158, 111, 13, 6, 194, 122, 57, 18, 91, 226, 64,
1399        138, 106, 166, 160, 77, 6, 210, 66, 232, 17, 165, 52, 242, 29, 113, 220, 183, 212, 145,
1400        229, 170, 158, 82, 171, 140, 251, 110, 191, 107, 47, 38, 93, 59, 90, 143, 103, 147, 173,
1401        166, 232, 237, 158, 229, 106, 221, 112, 210, 115, 231, 234, 115, 135, 76, 126, 199, 22,
1402        213, 113, 99, 210, 28, 62, 68, 79, 182, 226, 174, 201, 179, 230, 214, 67, 107, 101, 217,
1403        238, 141, 19, 40, 125, 67, 80, 227, 46, 50, 255, 61, 31, 119, 199, 195, 137, 182, 49, 141,
1404        167, 40, 108, 255, 238, 169, 189, 127, 140, 171, 255, 124, 232, 206, 102, 155, 95, 102,
1405        235, 95, 255, 186, 123, 12, 122, 225, 116, 34, 213, 131, 141, 222, 105, 253, 90, 180, 199,
1406        255, 248, 167, 80, 119, 126, 215, 36, 177, 94, 173, 53, 167, 139, 142, 242, 115, 48, 155,
1407        141, 204, 91, 219, 239, 205, 31, 154, 119, 198, 248, 246, 121, 118, 59, 239, 135, 146, 166,
1408        248, 255, 26, 119, 234, 99, 233, 229, 241, 103, 125, 182, 157, 107, 178, 225, 63, 85, 158,
1409        22, 97, 224, 222, 254, 187, 62, 115, 111, 170, 139, 162, 19, 164, 95, 91, 168, 130, 42, 60,
1410        10, 254, 198, 20, 39, 171, 129, 168, 86, 250, 247, 213, 165, 181, 109, 5, 86, 201, 147,
1411        188, 7, 165, 221, 35, 166, 194, 176, 2, 215, 86, 180, 64, 85, 220, 7, 199, 152, 108, 137,
1412        42, 147, 116, 43, 122, 54, 26, 213, 173, 57, 183, 158, 7, 190, 98, 116, 37, 229, 153, 168,
1413        243, 182, 37, 147, 47, 156, 89, 21, 207, 92, 175, 45, 127, 45, 152, 15, 65, 197, 11, 188,
1414        218, 64, 82, 106, 131, 185, 114, 211, 121, 80, 5, 75, 94, 180, 44, 95, 188, 31, 40, 173,
1415        112, 180, 121, 41, 147, 209, 50, 25, 154, 235, 242, 64, 158, 188, 140, 137, 154, 183, 230,
1416        74, 160, 54, 60, 115, 52, 175, 89, 238, 60, 154, 154, 150, 247, 163, 187,
1417    ];
1418    // 1 frames Incompatible Protocol(extract data?) - reliable ordered [reliable_frame_index = 1 ordered_frame_index = 0] == p2
1419    let p5 = [
1420        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,
1421        225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 196, 178, 112, 86, 5, 59, 97, 219, 15, 0,
1422        0, 0, 6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 188, 210, 59, 150, 246,
1423        167, 182, 213, 33, 0, 0, 0, 6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0,
1424        132, 194, 47, 23, 175, 46, 78, 138, 23, 0, 0, 0, 6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128,
1425        0, 0, 0, 0, 0, 0, 136, 219, 85, 240, 191, 125, 172, 233, 10, 0, 0, 0, 6, 23, 0, 225, 138,
1426        0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 80, 211, 212, 44, 191, 227, 124, 40, 13, 0, 0, 0,
1427        6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 77, 13, 19, 149, 102, 140, 134,
1428        77, 16, 0, 0, 0, 4, 83, 237, 239, 254, 225, 138, 4, 63, 87, 214, 254, 225, 138, 4, 83, 236,
1429        159, 254, 225, 138, 4, 63, 87, 46, 254, 225, 138, 4, 63, 87, 56, 128, 225, 138, 4, 63, 87,
1430        56, 123, 225, 138, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255,
1431        255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255,
1432        255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1433        0, 0, 0, 0, 0, 16, 151, 56, 146,
1434    ];
1435    // 1 frames game packet - reliable ordered [is_fragment reliable_frame_index = 2 ordered_frame_index = 1 ] == p4
1436    let p6 = [
1437        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,
1438        189, 203, 114, 234, 202, 214, 239, 249, 157, 94, 85, 61, 198, 119, 186, 181, 79, 72, 2,
1439        188, 77, 245, 140, 145, 48, 24, 137, 137, 208, 5, 169, 162, 98, 7, 32, 246, 4, 36, 97, 77,
1440        155, 201, 173, 162, 158, 231, 188, 81, 53, 171, 89, 47, 80, 189, 211, 170, 148, 148, 194,
1441        164, 156, 96, 16, 248, 178, 214, 252, 55, 126, 177, 194, 107, 122, 88, 82, 94, 198, 200,
1442        113, 201, 204, 255, 231, 127, 252, 215, 255, 242, 31, 255, 241, 95, 254, 223, 255, 251,
1443        127, 252, 215, 255, 254, 63, 255, 199, 127, 252, 159, 255, 57, 154, 12, 166, 243, 255, 252,
1444        223, 254, 247, 255, 28, 111, 90, 147, 97, 99, 52, 237, 76, 91, 138, 185, 85, 203, 218, 125,
1445        243, 165, 57, 255, 41, 122, 189, 230, 77, 211, 23, 155, 118, 223, 83, 186, 86, 208, 236,
1446        73, 213, 65, 175, 31, 253, 82, 101, 173, 102, 90, 65, 163, 183, 213, 21, 221, 84, 234, 61,
1447        83, 119, 93, 65, 81, 172, 70, 107, 233, 25, 138, 210, 179, 149, 23, 79, 18, 205, 142, 41,
1448        8, 163, 134, 179, 177, 77, 87, 182, 131, 86, 121, 80, 106, 213, 135, 125, 179, 162, 139,
1449        122, 203, 241, 131, 138, 109, 4, 93, 51, 168, 173, 135, 74, 75, 29, 214, 29, 97, 104, 4,
1450        55, 222, 182, 86, 26, 205, 189, 242, 192, 127, 217, 90, 219, 174, 48, 40, 233, 115, 171,
1451        49, 105, 141, 109, 189, 63, 182, 91, 63, 70, 141, 167, 237, 120, 166, 148, 213, 173, 92,
1452        30, 110, 149, 78, 91, 12, 66, 93, 241, 5, 93, 208, 45, 45, 156, 56, 143, 130, 18, 90, 194,
1453        147, 104, 55, 116, 209, 8, 163, 103, 211, 94, 151, 134, 91, 189, 50, 174, 235, 191, 135,
1454        138, 213, 237, 218, 21, 211, 182, 252, 233, 191, 187, 79, 255, 141, 124, 247, 204, 237,
1455        183, 132, 129, 237, 70, 142, 164, 8, 174, 169, 136, 94, 99, 178, 28, 133, 129, 48, 38, 223,
1456        238, 61, 180, 68, 183, 183, 154, 186, 253, 201, 170, 57, 123, 90, 107, 179, 110, 169, 83,
1457        119, 214, 154, 33, 175, 219, 247, 173, 200, 109, 88, 191, 189, 6, 249, 93, 171, 38, 58,
1458        225, 58, 114, 132, 69, 48, 62, 179, 205, 58, 178, 165, 14, 164, 160, 60, 54, 215, 51, 79,
1459        90, 15, 70, 243, 192, 50, 109, 77, 84, 45, 93, 50, 229, 234, 162, 103, 180, 238, 181, 146,
1460        235, 116, 234, 218, 111, 183, 81, 233, 155, 129, 53, 177, 27, 66, 73, 123, 240, 26, 110,
1461        40, 139, 238, 180, 250, 226, 137, 74, 199, 106, 184, 27, 67, 113, 155, 142, 209, 234, 14,
1462        109, 235, 247, 72, 246, 90, 154, 31, 61, 245, 76, 209, 234, 133, 74, 223, 158, 183, 126,
1463        13, 77, 241, 87, 199, 168, 117, 134, 194, 162, 163, 7, 90, 167, 59, 183, 218, 110, 67, 40,
1464        143, 130, 32, 178, 31, 180, 208, 233, 63, 109, 123, 91, 85, 26, 223, 223, 174, 45, 163, 41,
1465        245, 30, 106, 15, 170, 18, 149, 123, 155, 170, 173, 90, 206, 148, 124, 243, 111, 39, 116,
1466        166, 157, 153, 44, 105, 245, 145, 212, 169, 255, 148, 52, 67, 169, 222, 255, 252, 111, 237,
1467        167, 127, 74, 191, 234, 254, 100, 169, 140, 42, 171, 201, 92, 173, 142, 252, 127, 77, 86,
1468        247, 77, 251, 95, 254, 175, 127, 215, 127, 223, 246, 42, 255, 26, 253, 235, 165, 108, 133,
1469        255, 246, 151, 203, 202, 211, 250, 151, 175, 12, 203, 193, 124, 221, 155, 255, 67, 126,
1470        190, 109, 253, 99, 242, 243, 95, 211, 167, 219, 187, 237, 157, 107, 254, 43, 24, 107, 81,
1471        79, 22, 171, 225, 38, 252, 183, 240, 24, 4, 255, 114, 31, 21, 213, 235, 11, 195, 81, 239,
1472        159, 253, 161, 97, 169, 222, 77, 215, 41, 173, 164, 231, 254, 68, 157, 151, 199, 131, 31,
1473        15, 51, 229, 63, 255, 215, 120, 20, 151, 181, 190, 25, 143, 98, 173, 167, 4, 37, 210, 202,
1474        110, 79, 94, 44, 109, 63, 184, 25, 204, 106, 245, 174, 165, 184, 186, 255, 34, 232, 166,
1475        85, 235, 10, 129, 108, 219, 94, 77, 55, 38, 138, 209, 88, 68, 227, 135, 64, 117, 74, 222,
1476        11, 105, 165, 138, 101, 41, 51, 50, 138, 77, 47, 168, 253, 24, 154, 254, 166, 75, 250, 197,
1477        174, 255, 220, 14, 67, 253, 183, 37, 182, 44, 199, 154, 44, 180, 173, 94, 210, 67, 119,
1478        162, 217, 238, 168, 45, 173, 75, 166, 89, 49, 221, 121, 75, 181, 252, 201, 68, 13, 106, 11,
1479        215, 174, 172, 116, 193, 151, 122, 225, 164, 101, 88, 214, 163, 99, 121, 131, 81, 24, 45,
1480        12, 251, 169, 162, 202, 149, 101, 79, 168, 52, 76, 161, 114, 239, 153, 11, 127, 104, 76,
1481        54, 182, 29, 56, 35, 201, 157, 140, 103, 90, 91, 221, 186, 229, 126, 190, 7, 196, 213, 210,
1482        154, 41, 118, 115, 186, 154, 58, 246, 122, 78, 70, 227, 84, 183, 212, 109, 167, 222, 37,
1483        35, 57, 30, 200, 156, 142, 145, 201, 36, 38, 19, 59, 212, 151, 67, 179, 178, 28, 134, 90,
1484        64, 196, 74, 234, 204, 41, 107, 51, 191, 172, 197, 19, 125, 214, 20, 200, 127, 5, 242, 251,
1485        66, 60, 160, 71, 37, 53, 105, 190, 161, 20, 17, 185, 81, 220, 225, 193, 248, 225, 46, 251,
1486        187, 228, 247, 101, 81, 141, 255, 46, 249, 91, 163, 185, 30, 185, 97, 48, 115, 250, 122,
1487        208, 237, 91, 194, 160, 81, 221, 12, 250, 122, 165, 57, 139, 132, 209, 220, 10, 226, 191,
1488        231, 244, 187, 251, 239, 84, 74, 101, 3, 159, 52, 143, 16, 255, 174, 249, 96, 77, 135, 141,
1489        96, 214, 147, 172, 74, 252, 73, 134, 57, 113, 61, 193, 170, 217, 230, 164, 61, 20, 163,
1490        214, 56, 124, 90, 117, 5, 69, 39, 10, 164, 173, 201, 150, 210, 53, 181, 150, 174, 4, 243,
1491        174, 105, 173, 134, 134, 86, 215, 238, 23, 45, 53, 208, 156, 81, 99, 97, 116, 172, 213,
1492        114, 40, 142, 54, 174, 229, 149, 188, 185, 190, 238, 9, 81, 89, 51, 69, 215, 182, 38, 134,
1493        107, 212, 108, 93, 146, 203, 35, 210, 197, 158, 111, 13, 6, 194, 122, 57, 18, 91, 226, 64,
1494        138, 106, 166, 160, 77, 6, 210, 66, 232, 17, 165, 52, 242, 29, 113, 220, 183, 212, 145,
1495        229, 170, 158, 82, 171, 140, 251, 110, 191, 107, 47, 38, 93, 59, 90, 143, 103, 147, 173,
1496        166, 232, 237, 158, 229, 106, 221, 112, 210, 115, 231, 234, 115, 135, 76, 126, 199, 22,
1497        213, 113, 99, 210, 28, 62, 68, 79, 182, 226, 174, 201, 179, 230, 214, 67, 107, 101, 217,
1498        238, 141, 19, 40, 125, 67, 80, 227, 46, 50, 255, 61, 31, 119, 199, 195, 137, 182, 49, 141,
1499        167, 40, 108, 255, 238, 169, 189, 127, 140, 171, 255, 124, 232, 206, 102, 155, 95, 102,
1500        235, 95, 255, 186, 123, 12, 122, 225, 116, 34, 213, 131, 141, 222, 105, 253, 90, 180, 199,
1501        255, 248, 167, 80, 119, 126, 215, 36, 177, 94, 173, 53, 167, 139, 142, 242, 115, 48, 155,
1502        141, 204, 91, 219, 239, 205, 31, 154, 119, 198, 248, 246, 121, 118, 59, 239, 135, 146, 166,
1503        248, 255, 26, 119, 234, 99, 233, 229, 241, 103, 125, 182, 157, 107, 178, 225, 63, 85, 158,
1504        22, 97, 224, 222, 254, 187, 62, 115, 111, 170, 139, 162, 19, 164, 95, 91, 168, 130, 42, 60,
1505        10, 254, 198, 20, 39, 171, 129, 168, 86, 250, 247, 213, 165, 181, 109, 5, 86, 201, 147,
1506        188, 7, 165, 221, 35, 166, 194, 176, 2, 215, 86, 180, 64, 85, 220, 7, 199, 152, 108, 137,
1507        42, 147, 116, 43, 122, 54, 26, 213, 173, 57, 183, 158, 7, 190, 98, 116, 37, 229, 153, 168,
1508        243, 182, 37, 147, 47, 156, 89, 21, 207, 92, 175, 45, 127, 45, 152, 15, 65, 197, 11, 188,
1509        218, 64, 82, 106, 131, 185, 114, 211, 121, 80, 5, 75, 94, 180, 44, 95, 188, 31, 40, 173,
1510        112, 180, 121, 41, 147, 209, 50, 25, 154, 235, 242, 64, 158, 188, 140, 137, 154, 183, 230,
1511        74, 160, 54, 60, 115, 52, 175, 89, 238, 60, 154, 154, 150, 247, 163, 187,
1512    ];
1513    let ps: Vec<Vec<u8>> = vec![
1514        p0.to_vec(),
1515        p1.to_vec(),
1516        p2.to_vec(),
1517        p3.to_vec(),
1518        p4.to_vec(),
1519        p5.to_vec(),
1520        p6.to_vec(),
1521    ];
1522
1523    let mut n = 0;
1524
1525    let mut rq = RecvQ::new();
1526    for i in ps {
1527        let v = FrameVec::new(&i).unwrap();
1528        for i in v.frames {
1529            rq.insert(i).unwrap();
1530            if !rq.flush(&"0.0.0.0:0".parse().unwrap()).is_empty() {
1531                n += 1;
1532            }
1533        }
1534    }
1535
1536    // p1 retransmits p0 with a new datagram ID but the same reliable frame ID.
1537    assert_eq!(n, 4);
1538}
1539
1540#[cfg(test)]
1541#[path = "arq_tests.rs"]
1542mod regressions;
1543
1544#[test]
1545fn rejects_messages_exceeding_the_receivers_fragment_limit() {
1546    let sendq = SendQ::new(576);
1547    let limit = crate::fragment::MAX_FRAGMENTS * (576 - 60);
1548    assert!(
1549        sendq
1550            .required_bytes(Reliability::ReliableOrdered, limit)
1551            .is_ok()
1552    );
1553    assert!(matches!(
1554        sendq.required_bytes(Reliability::ReliableOrdered, limit + 1),
1555        Err(RaknetError::PacketSizeExceedMTU)
1556    ));
1557}
1558
1559#[test]
1560fn exact_mtu_payload_is_not_marked_as_split() {
1561    let mut sendq = SendQ::new(576);
1562    let payload = vec![0xfe; 516];
1563    sendq
1564        .insert(Reliability::ReliableOrdered, &payload)
1565        .unwrap();
1566    let frames = sendq.flush(0, &"127.0.0.1:19132".parse().unwrap());
1567    assert_eq!(frames.len(), 1);
1568    assert_eq!(frames[0].flags & 16, 0);
1569    assert_eq!(frames[0].data.as_ref(), payload);
1570    sendq.ack(frames[0].sequence_number, 1);
1571    assert!(sendq.is_empty());
1572    assert_eq!(sendq.buffered_bytes, 0);
1573}