Skip to main content

rust_raknet/
arq.rs

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