Skip to main content

rust_raknet/
arq.rs

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