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::new();
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![];
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                let frame = self.ordered_packets[&(channel, index)].clone();
460                ret.push(frame);
461                self.ordered_packets.remove(&(channel, index));
462                *expected_index = index + 1;
463            }
464        }
465
466        let mut packets_keys: Vec<u32> = self.packets.keys().cloned().collect();
467        packets_keys.sort_unstable();
468
469        for sequence in packets_keys {
470            if let Some(frame) = self.packets.remove(&sequence) {
471                ret.push(frame);
472            }
473        }
474        ret
475    }
476    pub fn get_ordered_packet(&self) -> usize {
477        self.ordered_packets.len()
478    }
479
480    pub fn get_fragment_queue_size(&self) -> usize {
481        self.fragment_queue.size()
482    }
483
484    pub fn get_ordered_keys(&self) -> Vec<(u8, u32)> {
485        self.ordered_packets.keys().copied().collect()
486    }
487
488    pub fn get_size(&self) -> usize {
489        self.packets.len()
490    }
491}
492
493pub struct SendQ {
494    mtu: u16,
495    ack_sequence_number: u32,
496    sequence_number: u32,
497    reliable_frame_index: u32,
498    sequenced_frame_indexes: HashMap<u8, u32>,
499    ordered_frame_indexes: HashMap<u8, u32>,
500    compound_id: u16,
501    // Each entry stores a frame, send state, last send time, retry count, and prior sequence IDs.
502    packets: Vec<FrameSetPacket>,
503    rto: i64,
504    srtt: i64,
505    sent_packet: Vec<(FrameSetPacket, bool, i64, u32, Vec<u32>)>,
506}
507
508impl SendQ {
509    pub const DEFAULT_TIMEOUT_MILLS: i64 = 50;
510
511    const RTO_UBOUND: i64 = 12000;
512    const RTO_LBOUND: i64 = 50;
513
514    pub fn new(mtu: u16) -> Self {
515        Self {
516            mtu,
517            ack_sequence_number: 0,
518            sequence_number: 0,
519            packets: vec![],
520            sent_packet: vec![],
521            reliable_frame_index: 0,
522            sequenced_frame_indexes: HashMap::new(),
523            ordered_frame_indexes: HashMap::new(),
524            compound_id: 0,
525
526            rto: SendQ::DEFAULT_TIMEOUT_MILLS,
527            srtt: SendQ::DEFAULT_TIMEOUT_MILLS,
528        }
529    }
530
531    pub fn insert(&mut self, reliability: Reliability, buf: &[u8]) -> Result<()> {
532        self.insert_with_order_channel(reliability, buf, 0)
533    }
534
535    pub fn insert_with_order_channel(
536        &mut self,
537        reliability: Reliability,
538        buf: &[u8],
539        order_channel: u8,
540    ) -> Result<()> {
541        let max_payload = self
542            .mtu
543            .checked_sub(60)
544            .map(usize::from)
545            .filter(|size| *size > 0)
546            .ok_or(RaknetError::PacketSizeExceedMTU)?;
547
548        match reliability {
549            Reliability::Unreliable => {
550                if buf.len() > max_payload {
551                    return Err(RaknetError::PacketSizeExceedMTU);
552                }
553
554                let frame = FrameSetPacket::new(reliability, buf.to_vec());
555                self.packets.push(frame);
556            }
557            Reliability::UnreliableSequenced => {
558                if buf.len() > max_payload {
559                    return Err(RaknetError::PacketSizeExceedMTU);
560                }
561
562                let sequenced_frame_index = {
563                    let index = self
564                        .sequenced_frame_indexes
565                        .entry(order_channel)
566                        .or_default();
567                    let current = *index;
568                    *index += 1;
569                    current
570                };
571                let ordered_frame_index = self
572                    .ordered_frame_indexes
573                    .get(&order_channel)
574                    .copied()
575                    .unwrap_or(0);
576                let mut frame = FrameSetPacket::new(reliability, buf.to_vec());
577                frame.order_channel = order_channel;
578                frame.ordered_frame_index = ordered_frame_index;
579                frame.sequenced_frame_index = sequenced_frame_index;
580                self.packets.push(frame);
581            }
582            Reliability::Reliable => {
583                if buf.len() > max_payload {
584                    return Err(RaknetError::PacketSizeExceedMTU);
585                }
586
587                let mut frame = FrameSetPacket::new(reliability, buf.to_vec());
588                frame.reliable_frame_index = self.reliable_frame_index;
589                self.packets.push(frame);
590                self.reliable_frame_index += 1;
591            }
592            Reliability::ReliableOrdered => {
593                if buf.len() < max_payload {
594                    let mut frame = FrameSetPacket::new(reliability, buf.to_vec());
595                    frame.order_channel = order_channel;
596                    frame.reliable_frame_index = self.reliable_frame_index;
597                    frame.ordered_frame_index =
598                        *self.ordered_frame_indexes.entry(order_channel).or_default();
599                    self.packets.push(frame);
600                    self.reliable_frame_index += 1;
601                } else {
602                    let compound_size = buf.len().div_ceil(max_payload);
603                    let compound_size = u32::try_from(compound_size)
604                        .map_err(|_| RaknetError::PacketSizeExceedMTU)?;
605                    let ordered_frame_index =
606                        *self.ordered_frame_indexes.entry(order_channel).or_default();
607
608                    for (fragment_index, chunk) in buf.chunks(max_payload).enumerate() {
609                        let mut frame = FrameSetPacket::new(reliability, chunk.to_vec());
610                        frame.flags |= 16;
611                        frame.compound_size = compound_size;
612                        frame.compound_id = self.compound_id;
613                        frame.fragment_index = fragment_index as u32;
614                        frame.order_channel = order_channel;
615                        frame.reliable_frame_index = self.reliable_frame_index;
616                        frame.ordered_frame_index = ordered_frame_index;
617                        self.packets.push(frame);
618                        self.reliable_frame_index += 1;
619                    }
620                    self.compound_id += 1;
621                }
622                *self.ordered_frame_indexes.entry(order_channel).or_default() += 1;
623            }
624            Reliability::ReliableSequenced => {
625                if buf.len() > max_payload {
626                    return Err(RaknetError::PacketSizeExceedMTU);
627                }
628
629                let sequenced_frame_index = {
630                    let index = self
631                        .sequenced_frame_indexes
632                        .entry(order_channel)
633                        .or_default();
634                    let current = *index;
635                    *index += 1;
636                    current
637                };
638                let ordered_frame_index = self
639                    .ordered_frame_indexes
640                    .get(&order_channel)
641                    .copied()
642                    .unwrap_or(0);
643                let mut frame = FrameSetPacket::new(reliability, buf.to_vec());
644                frame.order_channel = order_channel;
645                frame.reliable_frame_index = self.reliable_frame_index;
646                frame.sequenced_frame_index = sequenced_frame_index;
647                frame.ordered_frame_index = ordered_frame_index;
648                self.packets.push(frame);
649                self.reliable_frame_index += 1;
650            }
651        };
652        Ok(())
653    }
654
655    fn update_rto(&mut self, rtt: i64) {
656        // SRTT = ( ALPHA * SRTT ) + ((1-ALPHA) * RTT)
657        // ALPHA = 0.8
658        self.srtt = ((self.srtt as f64 * 0.8) + (rtt as f64 * 0.2)) as i64;
659        // RTO = min[UBOUND,max[LBOUND,(BETA*SRTT)]]
660        // BETA = 1.5
661        let rto_right = (1.5 * self.srtt as f64) as i64;
662        let rto_right = if rto_right > SendQ::RTO_LBOUND {
663            rto_right
664        } else {
665            SendQ::RTO_LBOUND
666        };
667        self.rto = if rto_right < SendQ::RTO_UBOUND {
668            rto_right
669        } else {
670            SendQ::RTO_UBOUND
671        };
672    }
673
674    pub fn get_rto(&self) -> i64 {
675        self.rto
676    }
677
678    pub fn nack(&mut self, sequence: u32, tick: i64) {
679        for i in 0..self.sent_packet.len() {
680            let item = &mut self.sent_packet[i];
681            if item.1 && item.0.sequence_number == sequence {
682                raknet_log_debug!(
683                    "packet {}-{}-{} nack {} times",
684                    item.0.sequence_number,
685                    item.0.reliable_frame_index,
686                    item.0.ordered_frame_index,
687                    item.3 + 1
688                );
689                item.0.sequence_number = self.sequence_number;
690                self.sequence_number += 1;
691                item.2 = tick;
692                item.3 += 1;
693                item.4.push(item.0.sequence_number);
694            }
695        }
696    }
697
698    pub fn ack(&mut self, sequence: u32, tick: i64) {
699        if sequence != 0 && sequence != self.ack_sequence_number + 1 {
700            for i in self.ack_sequence_number + 1..sequence {
701                self.nack(i, tick);
702            }
703        }
704
705        self.ack_sequence_number = sequence;
706
707        let mut rtts = vec![];
708
709        for i in 0..self.sent_packet.len() {
710            let item = &mut self.sent_packet[i];
711            if item.0.sequence_number == sequence || item.4.contains(&sequence) {
712                rtts.push(tick - item.2);
713                self.sent_packet.remove(i);
714                break;
715            }
716        }
717
718        for i in rtts {
719            self.update_rto(i);
720        }
721    }
722
723    fn tick(&mut self, tick: i64) {
724        for i in 0..self.sent_packet.len() {
725            let p = &mut self.sent_packet[i];
726
727            let mut cur_rto = self.rto;
728
729            // Increase the retransmission timeout by 1.5 for each retry to avoid
730            // the exponential backoff used by TCP.
731            for _ in 0..p.3 {
732                cur_rto = (cur_rto as f64 * 1.5) as i64;
733            }
734
735            if p.1 && tick - p.2 >= cur_rto {
736                p.0.sequence_number = self.sequence_number;
737                self.sequence_number += 1;
738                p.1 = false;
739                p.4.push(p.0.sequence_number);
740            }
741        }
742    }
743
744    pub fn flush(&mut self, tick: i64, peer_addr: &SocketAddr) -> Vec<FrameSetPacket> {
745        self.tick(tick);
746
747        let mut ret = vec![];
748
749        if !self.sent_packet.is_empty() {
750            self.sent_packet
751                .sort_by(|x, y| x.0.sequence_number.cmp(&y.0.sequence_number));
752
753            for i in 0..self.sent_packet.len() {
754                let p = &mut self.sent_packet[i];
755                if !p.1 {
756                    raknet_log_debug!(
757                        "{} , packet {}-{}-{} resend {} times",
758                        peer_addr,
759                        p.0.sequence_number,
760                        p.0.reliable_frame_index,
761                        p.0.ordered_frame_index,
762                        p.3 + 1
763                    );
764                    ret.push(p.0.clone());
765                    p.1 = true;
766                    p.2 = tick;
767                    p.3 += 1;
768                }
769            }
770            return ret;
771        }
772
773        for mut packet in self.packets.drain(..) {
774            packet.sequence_number = self.sequence_number;
775            self.sequence_number += 1;
776
777            if packet.is_reliable().unwrap_or(false) {
778                ret.push(packet.clone());
779                let sequence_number = packet.sequence_number;
780                self.sent_packet
781                    .push((packet, true, tick, 0, vec![sequence_number]));
782            } else {
783                ret.push(packet);
784            }
785        }
786
787        ret
788    }
789
790    pub fn is_empty(&self) -> bool {
791        self.packets.is_empty() && self.sent_packet.is_empty()
792    }
793
794    pub fn get_reliable_queue_size(&self) -> usize {
795        self.packets.len()
796    }
797
798    pub fn get_sent_queue_size(&self) -> usize {
799        self.sent_packet.len()
800    }
801}
802
803#[test]
804fn malformed_datagrams_are_rejected() {
805    assert!(FrameVec::new(&[0x80, 0, 0]).is_err());
806    assert!(FrameVec::new(&[0x10, 0, 0, 0]).is_err());
807}
808
809#[test]
810fn send_queue_rejects_an_invalid_mtu() {
811    let mut send_queue = SendQ::new(59);
812    assert!(send_queue.insert(Reliability::Reliable, &[0xfe]).is_err());
813}
814
815#[tokio::test]
816async fn test_recvq_orders_channels_independently() {
817    let mut recvq = RecvQ::new();
818
819    let mut later_on_channel_one = FrameSetPacket::new(Reliability::ReliableOrdered, vec![1]);
820    later_on_channel_one.sequence_number = 0;
821    later_on_channel_one.order_channel = 1;
822    later_on_channel_one.ordered_frame_index = 1;
823    recvq.insert(later_on_channel_one).unwrap();
824
825    let mut first_on_channel_two = FrameSetPacket::new(Reliability::ReliableOrdered, vec![2]);
826    first_on_channel_two.sequence_number = 1;
827    first_on_channel_two.order_channel = 2;
828    first_on_channel_two.ordered_frame_index = 0;
829    recvq.insert(first_on_channel_two).unwrap();
830
831    let ready = recvq.flush(&"127.0.0.1:0".parse().unwrap());
832    assert_eq!(ready.len(), 1);
833    assert_eq!(ready[0].order_channel, 2);
834
835    let mut first_on_channel_one = FrameSetPacket::new(Reliability::ReliableOrdered, vec![0]);
836    first_on_channel_one.sequence_number = 2;
837    first_on_channel_one.order_channel = 1;
838    first_on_channel_one.ordered_frame_index = 0;
839    recvq.insert(first_on_channel_one).unwrap();
840
841    let ready = recvq.flush(&"127.0.0.1:0".parse().unwrap());
842    assert_eq!(ready.len(), 2);
843    assert_eq!(ready[0].ordered_frame_index, 0);
844    assert_eq!(ready[1].ordered_frame_index, 1);
845    assert!(ready.iter().all(|frame| frame.order_channel == 1));
846}
847
848#[tokio::test]
849async fn test_sendq_maintains_ordered_indexes_per_channel() {
850    let mut sendq = SendQ::new(1500);
851    sendq
852        .insert_with_order_channel(Reliability::ReliableOrdered, &[0xfe, 1], 3)
853        .unwrap();
854    sendq
855        .insert_with_order_channel(Reliability::ReliableOrdered, &[0xfe, 2], 9)
856        .unwrap();
857
858    let sent = sendq.flush(0, &"127.0.0.1:0".parse().unwrap());
859    assert_eq!(sent.len(), 2);
860    assert_eq!(sent[0].order_channel, 3);
861    assert_eq!(sent[0].ordered_frame_index, 0);
862    assert_eq!(sent[1].order_channel, 9);
863    assert_eq!(sent[1].ordered_frame_index, 0);
864}
865
866#[tokio::test]
867async fn test_ackset() {
868    let mut ackset = ACKSet::default();
869
870    ackset.insert(0);
871    ackset.insert(1);
872    ackset.insert(2);
873    ackset.insert(4);
874
875    let acks = ackset.get_ack();
876
877    assert!(acks == vec![(0, 2), (4, 4)]);
878
879    let mut ackset = ACKSet::default();
880
881    ackset.insert(0);
882    ackset.insert(1);
883    ackset.insert(2);
884    ackset.insert(6);
885
886    let acks = ackset.get_ack();
887
888    assert!(acks == vec![(0, 2), (6, 6)]);
889
890    let acks = ackset.get_ack();
891
892    assert!(acks == vec![]);
893
894    ackset.insert(0);
895    ackset.insert(2);
896
897    let acks = ackset.get_ack();
898
899    assert!(acks == vec![(0, 0), (2, 2)]);
900}
901
902#[tokio::test]
903async fn test_frame_serialize_deserialize() {
904    // Captured first frame datagram from a Bedrock 1.18.12 client.
905    let p: Vec<u8> = [
906        132, 0, 0, 0, 64, 0, 144, 0, 0, 0, 9, 146, 33, 7, 47, 57, 18, 128, 111, 0, 0, 0, 0, 20,
907        200, 47, 41, 0,
908    ]
909    .to_vec();
910
911    let a = FrameSetPacket::deserialize(&p).unwrap();
912    assert!(a.0.serialize().unwrap() == p);
913}
914
915#[tokio::test]
916async fn test_recvq() {
917    let mut r = RecvQ::new();
918    let mut p = FrameSetPacket::new(Reliability::Reliable, vec![]);
919    p.sequence_number = 0;
920    p.ordered_frame_index = 0;
921    r.insert(p).unwrap();
922
923    let mut p = FrameSetPacket::new(Reliability::Reliable, vec![]);
924    p.sequence_number = 1;
925    p.ordered_frame_index = 1;
926    r.insert(p).unwrap();
927
928    let ret = r.flush(&"0.0.0.0:0".parse().unwrap());
929    assert!(ret.len() == 2);
930}
931
932#[tokio::test]
933async fn test_recvq_fragment() {
934    let mut r = RecvQ::new();
935    let mut p = FrameSetPacket::new(Reliability::ReliableOrdered, vec![1]);
936    p.flags |= 16;
937    p.sequence_number = 0;
938    p.ordered_frame_index = 0;
939    p.compound_id = 1;
940    p.compound_size = 3;
941    p.fragment_index = 0;
942    p.order_channel = 7;
943    r.insert(p).unwrap();
944
945    let mut p = FrameSetPacket::new(Reliability::ReliableOrdered, vec![2]);
946    p.flags |= 16;
947    p.sequence_number = 1;
948    p.ordered_frame_index = 0;
949    p.compound_id = 1;
950    p.compound_size = 3;
951    p.fragment_index = 1;
952    p.order_channel = 7;
953    r.insert(p).unwrap();
954
955    let mut p = FrameSetPacket::new(Reliability::ReliableOrdered, vec![3]);
956    p.flags |= 16;
957    p.sequence_number = 2;
958    p.ordered_frame_index = 0;
959    p.compound_id = 1;
960    p.compound_size = 3;
961    p.fragment_index = 2;
962    p.order_channel = 7;
963    r.insert(p).unwrap();
964
965    let ret = r.flush(&"0.0.0.0:0".parse().unwrap());
966    assert!(ret.len() == 1);
967    assert!(ret[0].data == vec![1, 2, 3]);
968    assert_eq!(ret[0].order_channel, 7);
969}
970
971#[tokio::test]
972async fn test_sendq() {
973    let mut s = SendQ::new(1500);
974    let p = FrameSetPacket::new(Reliability::Reliable, vec![]);
975    s.insert(Reliability::Reliable, &p.serialize().unwrap())
976        .unwrap();
977
978    let p = FrameSetPacket::new(Reliability::Reliable, vec![]);
979    s.insert(Reliability::Reliable, &p.serialize().unwrap())
980        .unwrap();
981
982    let sockaddr: SocketAddr = "127.0.0.1:8000".parse().unwrap();
983    let ret = s.flush(0, &sockaddr);
984    assert!(ret.len() == 2);
985
986    s.ack(0, 0);
987    s.ack(1, 0);
988
989    let ret = s.flush(300, &sockaddr);
990    assert!(ret.is_empty());
991}
992
993#[tokio::test]
994async fn test_client_packet1() {
995    let a = [
996        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,
997        189, 203, 114, 234, 74, 183, 239, 185, 79, 175, 170, 30, 99, 159, 110, 125, 59, 36, 1, 222,
998        166, 122, 19, 35, 97, 48, 18, 19, 161, 11, 82, 69, 197, 23, 128, 248, 38, 32, 9, 107, 218,
999        152, 91, 69, 61, 79, 53, 234, 141, 78, 243, 52, 234, 5, 170, 119, 90, 149, 41, 165, 48, 41,
1000        11, 12, 2, 95, 214, 154, 255, 198, 47, 86, 120, 77, 15, 75, 202, 203, 24, 57, 46, 153, 249,
1001        223, 255, 199, 127, 253, 47, 255, 246, 111, 255, 229, 255, 253, 111, 255, 227, 191, 254,
1002        63, 255, 243, 191, 253, 219, 255, 249, 239, 163, 201, 96, 58, 255, 247, 255, 237, 127, 255,
1003        247, 241, 166, 53, 25, 54, 70, 211, 206, 180, 165, 152, 91, 181, 172, 221, 53, 159, 155,
1004        243, 95, 162, 215, 107, 222, 52, 125, 177, 105, 247, 61, 165, 107, 5, 205, 158, 84, 29,
1005        244, 250, 209, 111, 85, 214, 106, 166, 21, 52, 122, 91, 93, 209, 77, 165, 222, 51, 117,
1006        215, 21, 20, 197, 109, 148, 55, 166, 220, 122, 234, 216, 101, 105, 108, 43, 157, 241, 180,
1007        218, 49, 26, 250, 189, 165, 184, 243, 129, 242, 171, 50, 170, 7, 247, 109, 241, 113, 173,
1008        221, 235, 205, 225, 60, 18, 218, 226, 196, 234, 134, 186, 57, 240, 43, 83, 43, 112, 167,
1009        150, 57, 89, 13, 75, 90, 205, 146, 244, 123, 183, 46, 111, 199, 182, 176, 214, 182, 147,
1010        141, 214, 16, 187, 227, 134, 38, 247, 234, 150, 219, 107, 84, 231, 78, 201, 17, 186, 115,
1011        189, 174, 139, 154, 51, 82, 212, 210, 192, 178, 30, 13, 49, 216, 186, 179, 218, 203, 192,
1012        143, 238, 61, 177, 37, 186, 211, 234, 147, 41, 105, 91, 87, 169, 61, 142, 239, 22, 207,
1013        170, 28, 205, 199, 117, 253, 121, 32, 107, 117, 213, 119, 166, 255, 234, 62, 254, 7, 249,
1014        238, 153, 219, 111, 9, 3, 219, 141, 28, 73, 17, 92, 83, 17, 189, 198, 100, 57, 10, 3, 97,
1015        76, 190, 221, 187, 39, 127, 167, 183, 154, 186, 253, 201, 170, 57, 35, 239, 61, 235, 150,
1016        58, 117, 103, 173, 25, 242, 186, 125, 215, 138, 220, 134, 245, 226, 53, 200, 239, 90, 53,
1017        209, 9, 215, 145, 35, 44, 130, 241, 153, 109, 214, 145, 45, 117, 32, 5, 229, 177, 185, 158,
1018        121, 210, 122, 48, 154, 7, 150, 105, 107, 162, 106, 233, 146, 41, 87, 23, 61, 163, 117,
1019        167, 149, 92, 167, 83, 215, 94, 220, 70, 165, 111, 6, 214, 196, 110, 8, 37, 237, 222, 107,
1020        184, 161, 76, 191, 243, 217, 19, 149, 142, 213, 112, 55, 134, 226, 54, 29, 163, 213, 29,
1021        218, 214, 203, 72, 246, 90, 154, 31, 61, 246, 76, 209, 234, 133, 74, 223, 158, 183, 126,
1022        15, 77, 241, 119, 199, 168, 117, 134, 194, 162, 163, 7, 90, 167, 59, 183, 218, 110, 67, 40,
1023        143, 130, 32, 178, 239, 181, 208, 233, 63, 110, 123, 91, 85, 26, 223, 221, 174, 45, 163,
1024        41, 245, 238, 107, 247, 170, 18, 149, 123, 155, 170, 173, 90, 206, 148, 124, 243, 139, 19,
1025        58, 211, 206, 76, 150, 180, 250, 72, 234, 212, 127, 73, 154, 161, 84, 239, 126, 253, 199,
1026        63, 158, 123, 119, 119, 203, 126, 120, 247, 220, 113, 55, 245, 97, 189, 212, 172, 255, 136,
1027        30, 159, 164, 122, 255, 95, 245, 141, 220, 159, 41, 149, 169, 218, 173, 174, 5, 249, 247,
1028        83, 205, 188, 185, 81, 220, 113, 251, 229, 101, 213, 249, 245, 123, 212, 248, 71, 239, 105,
1029        48, 151, 68, 103, 32, 175, 215, 63, 220, 113, 216, 169, 252, 243, 247, 211, 118, 230, 255,
1030        179, 210, 173, 173, 123, 230, 203, 63, 170, 163, 127, 12, 52, 39, 26, 247, 158, 182, 147,
1031        113, 52, 154, 4, 75, 219, 122, 168, 223, 120, 255, 152, 223, 138, 173, 135, 122, 79, 43,
1032        245, 27, 255, 254, 191, 210, 81, 92, 214, 250, 38, 29, 197, 90, 79, 9, 74, 164, 149, 221,
1033        158, 188, 88, 218, 126, 112, 51, 152, 213, 234, 93, 50, 12, 117, 255, 89, 208, 77, 171,
1034        214, 21, 2, 217, 182, 189, 154, 110, 76, 20, 163, 177, 136, 198, 247, 129, 234, 148, 188,
1035        103, 210, 74, 21, 203, 82, 102, 158, 161, 152, 94, 80, 251, 57, 52, 253, 77, 151, 244, 139,
1036        93, 255, 181, 29, 134, 250, 139, 37, 182, 44, 199, 154, 44, 180, 173, 94, 210, 67, 119,
1037        162, 217, 238, 168, 45, 173, 75, 166, 89, 49, 221, 121, 75, 181, 252, 201, 68, 13, 106, 11,
1038        215, 174, 172, 116, 193, 151, 122, 225, 164, 101, 88, 214, 131, 99, 121, 131, 81, 24, 45,
1039        12, 251, 177, 162, 202, 149, 101, 79, 168, 52, 76, 161, 114, 231, 153, 11, 127, 104, 76,
1040        54, 182, 29, 56, 35, 201, 157, 140, 103, 90, 91, 221, 186, 229, 126, 182, 7, 196, 213, 210,
1041        154, 41, 118, 115, 186, 154, 58, 246, 122, 78, 70, 227, 84, 183, 212, 109, 167, 222, 37,
1042        35, 153, 14, 228, 156, 142, 145, 201, 36, 38, 19, 59, 212, 151, 67, 179, 178, 28, 134, 90,
1043        64, 196, 74, 234, 204, 41, 107, 51, 191, 172, 209, 137, 62, 107, 10, 228, 191, 2, 249, 125,
1044        129, 14, 232, 81, 73, 141, 155, 111, 40, 69, 68, 110, 68, 59, 60, 24, 223, 255, 72, 255,
1045        46, 249, 125, 89, 84, 233, 223, 37, 127, 107, 52, 215, 35, 55, 12, 102, 78, 95, 15, 186,
1046        125, 75, 24, 52, 170, 155, 65, 95, 175, 52, 103, 145, 48, 154, 91, 1, 253, 123, 78, 191,
1047        187, 255, 78, 165, 68, 54, 240, 73, 243, 8, 244, 119, 205, 123, 107, 58, 108, 4, 179, 158,
1048        100, 85, 232, 39, 25, 230, 196, 245, 4, 171, 102, 155, 147, 246, 80, 140, 90, 227, 240,
1049        113, 213, 21, 20, 221, 54, 221, 182, 38, 91, 74, 215, 212, 90, 186, 18, 204, 187, 166, 181,
1050        26, 26, 90, 93, 187, 91, 180, 212, 128, 40, 129, 198, 194, 232, 88, 171, 229, 80, 28, 109,
1051        92, 203, 43, 121, 115, 125, 221, 19, 162, 178, 102, 138, 174, 109, 77, 12, 215, 168, 217,
1052        186, 36, 151, 71, 164, 139, 61, 223, 26, 12, 132, 245, 114, 68, 148, 196, 64, 138, 106,
1053        166, 160, 77, 6, 210, 66, 232, 137, 122, 107, 228, 59, 226, 184, 111, 169, 35, 203, 85, 61,
1054        165, 86, 25, 247, 221, 126, 215, 94, 76, 186, 118, 180, 30, 207, 38, 91, 77, 209, 219, 61,
1055        203, 213, 186, 225, 164, 231, 206, 213, 167, 14, 153, 252, 142, 45, 170, 227, 198, 164, 57,
1056        188, 143, 30, 109, 197, 93, 147, 103, 205, 173, 251, 214, 202, 178, 221, 27, 39, 80, 250,
1057        134, 160, 210, 46, 50, 255, 53, 31, 119, 199, 195, 137, 182, 49, 141, 199, 40, 108, 191,
1058        244, 212, 222, 63, 198, 213, 255, 188, 239, 206, 102, 155, 223, 102, 235, 159, 255, 252,
1059        241, 16, 244, 194, 233, 68, 170, 7, 27, 189, 211, 250, 189, 104, 143, 255, 241, 159, 66,
1060        221, 121, 169, 73, 98, 189, 90, 107, 78, 23, 29, 229, 215, 96, 54, 27, 153, 183, 182, 223,
1061        155, 223, 55, 127, 24, 227, 219, 167, 217, 237, 188, 31, 74, 154, 226, 255, 115, 220, 169,
1062        143, 165, 231, 135, 95, 245, 217, 118, 174, 201, 134, 255, 88, 121, 92, 132, 129, 123, 251,
1063        175, 250, 204, 189, 169, 46, 138, 78, 144, 126, 109, 161, 10, 170, 240, 32, 248, 27, 83,
1064        156, 172, 6, 162, 90, 233, 223, 85, 151, 214, 182, 21, 88, 37, 79, 242, 238, 149, 118, 143,
1065        152, 10, 131, 232, 111, 91, 209, 2, 85, 113, 239, 29, 99, 178, 37, 170, 76, 210, 173, 232,
1066        201, 104, 84, 183, 230, 220, 122, 26, 248, 138, 209, 149, 148, 167, 65, 73, 111, 91, 50,
1067        249, 194, 153, 85, 241, 204, 245, 218, 242, 215, 130, 121, 31, 84, 188, 192, 171, 13, 36,
1068        165, 54, 152, 43, 55, 157, 123, 85, 176, 228, 69, 203, 242, 197, 187, 129, 210, 10, 71,
1069        155, 231, 50, 25, 45, 147, 161, 185, 46, 15, 228, 201, 243, 56, 156, 56, 214, 92, 9, 212,
1070        134, 103, 142, 230, 53, 203, 157, 71, 83, 211, 242, 126, 118, 55, 196,
1071    ];
1072
1073    let b = FrameVec::new(&a).unwrap();
1074    assert!(b.frames.len() == 1);
1075    assert!(b.frames[0].is_fragment());
1076}
1077
1078#[tokio::test]
1079async fn test_client_packet2() {
1080    // Connection Request - reliable [ reliable_frame_index = 0 ]
1081    let p0 = [
1082        132, 0, 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    // Connection Request - reliable [ reliable_frame_index = 0 ]
1086    let p1 = [
1087        132, 1, 0, 0, 64, 0, 144, 0, 0, 0, 9, 162, 70, 235, 28, 218, 182, 26, 192, 0, 0, 0, 0, 16,
1088        151, 43, 113, 0,
1089    ];
1090    // 2 frames Incompatible Protocol(extract data?) Connected ping - reliable ordered [ reliable_frame_index = 1 ]
1091    let p2 = [
1092        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,
1093        225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 196, 178, 112, 86, 5, 59, 97, 219, 15, 0,
1094        0, 0, 6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 188, 210, 59, 150, 246,
1095        167, 182, 213, 33, 0, 0, 0, 6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0,
1096        132, 194, 47, 23, 175, 46, 78, 138, 23, 0, 0, 0, 6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128,
1097        0, 0, 0, 0, 0, 0, 136, 219, 85, 240, 191, 125, 172, 233, 10, 0, 0, 0, 6, 23, 0, 225, 138,
1098        0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 80, 211, 212, 44, 191, 227, 124, 40, 13, 0, 0, 0,
1099        6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 77, 13, 19, 149, 102, 140, 134,
1100        77, 16, 0, 0, 0, 4, 83, 237, 239, 254, 225, 138, 4, 63, 87, 214, 254, 225, 138, 4, 83, 236,
1101        159, 254, 225, 138, 4, 63, 87, 46, 254, 225, 138, 4, 63, 87, 56, 128, 225, 138, 4, 63, 87,
1102        56, 123, 225, 138, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255,
1103        255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255,
1104        255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1105        0, 0, 0, 0, 0, 16, 151, 56, 146, 0, 0, 72, 0, 0, 0, 0, 0, 16, 151, 56, 146,
1106    ];
1107    // 1 frames Connected ping - unreliable
1108    let p3 = [132, 3, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 16, 151, 56, 161];
1109    // 1 frames game packet - reliable ordered [is_fragment reliable_frame_index = 2 ordered_frame_index = 1 ]
1110    let p4 = [
1111        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,
1112        189, 203, 114, 234, 202, 214, 239, 249, 157, 94, 85, 61, 198, 119, 186, 181, 79, 72, 2,
1113        188, 77, 245, 140, 145, 48, 24, 137, 137, 208, 5, 169, 162, 98, 7, 32, 246, 4, 36, 97, 77,
1114        155, 201, 173, 162, 158, 231, 188, 81, 53, 171, 89, 47, 80, 189, 211, 170, 148, 148, 194,
1115        164, 156, 96, 16, 248, 178, 214, 252, 55, 126, 177, 194, 107, 122, 88, 82, 94, 198, 200,
1116        113, 201, 204, 255, 231, 127, 252, 215, 255, 242, 31, 255, 241, 95, 254, 223, 255, 251,
1117        127, 252, 215, 255, 254, 63, 255, 199, 127, 252, 159, 255, 57, 154, 12, 166, 243, 255, 252,
1118        223, 254, 247, 255, 28, 111, 90, 147, 97, 99, 52, 237, 76, 91, 138, 185, 85, 203, 218, 125,
1119        243, 165, 57, 255, 41, 122, 189, 230, 77, 211, 23, 155, 118, 223, 83, 186, 86, 208, 236,
1120        73, 213, 65, 175, 31, 253, 82, 101, 173, 102, 90, 65, 163, 183, 213, 21, 221, 84, 234, 61,
1121        83, 119, 93, 65, 81, 172, 70, 107, 233, 25, 138, 210, 179, 149, 23, 79, 18, 205, 142, 41,
1122        8, 163, 134, 179, 177, 77, 87, 182, 131, 86, 121, 80, 106, 213, 135, 125, 179, 162, 139,
1123        122, 203, 241, 131, 138, 109, 4, 93, 51, 168, 173, 135, 74, 75, 29, 214, 29, 97, 104, 4,
1124        55, 222, 182, 86, 26, 205, 189, 242, 192, 127, 217, 90, 219, 174, 48, 40, 233, 115, 171,
1125        49, 105, 141, 109, 189, 63, 182, 91, 63, 70, 141, 167, 237, 120, 166, 148, 213, 173, 92,
1126        30, 110, 149, 78, 91, 12, 66, 93, 241, 5, 93, 208, 45, 45, 156, 56, 143, 130, 18, 90, 194,
1127        147, 104, 55, 116, 209, 8, 163, 103, 211, 94, 151, 134, 91, 189, 50, 174, 235, 191, 135,
1128        138, 213, 237, 218, 21, 211, 182, 252, 233, 191, 187, 79, 255, 141, 124, 247, 204, 237,
1129        183, 132, 129, 237, 70, 142, 164, 8, 174, 169, 136, 94, 99, 178, 28, 133, 129, 48, 38, 223,
1130        238, 61, 180, 68, 183, 183, 154, 186, 253, 201, 170, 57, 123, 90, 107, 179, 110, 169, 83,
1131        119, 214, 154, 33, 175, 219, 247, 173, 200, 109, 88, 191, 189, 6, 249, 93, 171, 38, 58,
1132        225, 58, 114, 132, 69, 48, 62, 179, 205, 58, 178, 165, 14, 164, 160, 60, 54, 215, 51, 79,
1133        90, 15, 70, 243, 192, 50, 109, 77, 84, 45, 93, 50, 229, 234, 162, 103, 180, 238, 181, 146,
1134        235, 116, 234, 218, 111, 183, 81, 233, 155, 129, 53, 177, 27, 66, 73, 123, 240, 26, 110,
1135        40, 139, 238, 180, 250, 226, 137, 74, 199, 106, 184, 27, 67, 113, 155, 142, 209, 234, 14,
1136        109, 235, 247, 72, 246, 90, 154, 31, 61, 245, 76, 209, 234, 133, 74, 223, 158, 183, 126,
1137        13, 77, 241, 87, 199, 168, 117, 134, 194, 162, 163, 7, 90, 167, 59, 183, 218, 110, 67, 40,
1138        143, 130, 32, 178, 31, 180, 208, 233, 63, 109, 123, 91, 85, 26, 223, 223, 174, 45, 163, 41,
1139        245, 30, 106, 15, 170, 18, 149, 123, 155, 170, 173, 90, 206, 148, 124, 243, 111, 39, 116,
1140        166, 157, 153, 44, 105, 245, 145, 212, 169, 255, 148, 52, 67, 169, 222, 255, 252, 111, 237,
1141        167, 127, 74, 191, 234, 254, 100, 169, 140, 42, 171, 201, 92, 173, 142, 252, 127, 77, 86,
1142        247, 77, 251, 95, 254, 175, 127, 215, 127, 223, 246, 42, 255, 26, 253, 235, 165, 108, 133,
1143        255, 246, 151, 203, 202, 211, 250, 151, 175, 12, 203, 193, 124, 221, 155, 255, 67, 126,
1144        190, 109, 253, 99, 242, 243, 95, 211, 167, 219, 187, 237, 157, 107, 254, 43, 24, 107, 81,
1145        79, 22, 171, 225, 38, 252, 183, 240, 24, 4, 255, 114, 31, 21, 213, 235, 11, 195, 81, 239,
1146        159, 253, 161, 97, 169, 222, 77, 215, 41, 173, 164, 231, 254, 68, 157, 151, 199, 131, 31,
1147        15, 51, 229, 63, 255, 215, 120, 20, 151, 181, 190, 25, 143, 98, 173, 167, 4, 37, 210, 202,
1148        110, 79, 94, 44, 109, 63, 184, 25, 204, 106, 245, 174, 165, 184, 186, 255, 34, 232, 166,
1149        85, 235, 10, 129, 108, 219, 94, 77, 55, 38, 138, 209, 88, 68, 227, 135, 64, 117, 74, 222,
1150        11, 105, 165, 138, 101, 41, 51, 50, 138, 77, 47, 168, 253, 24, 154, 254, 166, 75, 250, 197,
1151        174, 255, 220, 14, 67, 253, 183, 37, 182, 44, 199, 154, 44, 180, 173, 94, 210, 67, 119,
1152        162, 217, 238, 168, 45, 173, 75, 166, 89, 49, 221, 121, 75, 181, 252, 201, 68, 13, 106, 11,
1153        215, 174, 172, 116, 193, 151, 122, 225, 164, 101, 88, 214, 163, 99, 121, 131, 81, 24, 45,
1154        12, 251, 169, 162, 202, 149, 101, 79, 168, 52, 76, 161, 114, 239, 153, 11, 127, 104, 76,
1155        54, 182, 29, 56, 35, 201, 157, 140, 103, 90, 91, 221, 186, 229, 126, 190, 7, 196, 213, 210,
1156        154, 41, 118, 115, 186, 154, 58, 246, 122, 78, 70, 227, 84, 183, 212, 109, 167, 222, 37,
1157        35, 57, 30, 200, 156, 142, 145, 201, 36, 38, 19, 59, 212, 151, 67, 179, 178, 28, 134, 90,
1158        64, 196, 74, 234, 204, 41, 107, 51, 191, 172, 197, 19, 125, 214, 20, 200, 127, 5, 242, 251,
1159        66, 60, 160, 71, 37, 53, 105, 190, 161, 20, 17, 185, 81, 220, 225, 193, 248, 225, 46, 251,
1160        187, 228, 247, 101, 81, 141, 255, 46, 249, 91, 163, 185, 30, 185, 97, 48, 115, 250, 122,
1161        208, 237, 91, 194, 160, 81, 221, 12, 250, 122, 165, 57, 139, 132, 209, 220, 10, 226, 191,
1162        231, 244, 187, 251, 239, 84, 74, 101, 3, 159, 52, 143, 16, 255, 174, 249, 96, 77, 135, 141,
1163        96, 214, 147, 172, 74, 252, 73, 134, 57, 113, 61, 193, 170, 217, 230, 164, 61, 20, 163,
1164        214, 56, 124, 90, 117, 5, 69, 39, 10, 164, 173, 201, 150, 210, 53, 181, 150, 174, 4, 243,
1165        174, 105, 173, 134, 134, 86, 215, 238, 23, 45, 53, 208, 156, 81, 99, 97, 116, 172, 213,
1166        114, 40, 142, 54, 174, 229, 149, 188, 185, 190, 238, 9, 81, 89, 51, 69, 215, 182, 38, 134,
1167        107, 212, 108, 93, 146, 203, 35, 210, 197, 158, 111, 13, 6, 194, 122, 57, 18, 91, 226, 64,
1168        138, 106, 166, 160, 77, 6, 210, 66, 232, 17, 165, 52, 242, 29, 113, 220, 183, 212, 145,
1169        229, 170, 158, 82, 171, 140, 251, 110, 191, 107, 47, 38, 93, 59, 90, 143, 103, 147, 173,
1170        166, 232, 237, 158, 229, 106, 221, 112, 210, 115, 231, 234, 115, 135, 76, 126, 199, 22,
1171        213, 113, 99, 210, 28, 62, 68, 79, 182, 226, 174, 201, 179, 230, 214, 67, 107, 101, 217,
1172        238, 141, 19, 40, 125, 67, 80, 227, 46, 50, 255, 61, 31, 119, 199, 195, 137, 182, 49, 141,
1173        167, 40, 108, 255, 238, 169, 189, 127, 140, 171, 255, 124, 232, 206, 102, 155, 95, 102,
1174        235, 95, 255, 186, 123, 12, 122, 225, 116, 34, 213, 131, 141, 222, 105, 253, 90, 180, 199,
1175        255, 248, 167, 80, 119, 126, 215, 36, 177, 94, 173, 53, 167, 139, 142, 242, 115, 48, 155,
1176        141, 204, 91, 219, 239, 205, 31, 154, 119, 198, 248, 246, 121, 118, 59, 239, 135, 146, 166,
1177        248, 255, 26, 119, 234, 99, 233, 229, 241, 103, 125, 182, 157, 107, 178, 225, 63, 85, 158,
1178        22, 97, 224, 222, 254, 187, 62, 115, 111, 170, 139, 162, 19, 164, 95, 91, 168, 130, 42, 60,
1179        10, 254, 198, 20, 39, 171, 129, 168, 86, 250, 247, 213, 165, 181, 109, 5, 86, 201, 147,
1180        188, 7, 165, 221, 35, 166, 194, 176, 2, 215, 86, 180, 64, 85, 220, 7, 199, 152, 108, 137,
1181        42, 147, 116, 43, 122, 54, 26, 213, 173, 57, 183, 158, 7, 190, 98, 116, 37, 229, 153, 168,
1182        243, 182, 37, 147, 47, 156, 89, 21, 207, 92, 175, 45, 127, 45, 152, 15, 65, 197, 11, 188,
1183        218, 64, 82, 106, 131, 185, 114, 211, 121, 80, 5, 75, 94, 180, 44, 95, 188, 31, 40, 173,
1184        112, 180, 121, 41, 147, 209, 50, 25, 154, 235, 242, 64, 158, 188, 140, 137, 154, 183, 230,
1185        74, 160, 54, 60, 115, 52, 175, 89, 238, 60, 154, 154, 150, 247, 163, 187,
1186    ];
1187    // 1 frames Incompatible Protocol(extract data?) - reliable ordered [reliable_frame_index = 1 ordered_frame_index = 0] == p2
1188    let p5 = [
1189        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,
1190        225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 196, 178, 112, 86, 5, 59, 97, 219, 15, 0,
1191        0, 0, 6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 188, 210, 59, 150, 246,
1192        167, 182, 213, 33, 0, 0, 0, 6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0,
1193        132, 194, 47, 23, 175, 46, 78, 138, 23, 0, 0, 0, 6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128,
1194        0, 0, 0, 0, 0, 0, 136, 219, 85, 240, 191, 125, 172, 233, 10, 0, 0, 0, 6, 23, 0, 225, 138,
1195        0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 80, 211, 212, 44, 191, 227, 124, 40, 13, 0, 0, 0,
1196        6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 77, 13, 19, 149, 102, 140, 134,
1197        77, 16, 0, 0, 0, 4, 83, 237, 239, 254, 225, 138, 4, 63, 87, 214, 254, 225, 138, 4, 83, 236,
1198        159, 254, 225, 138, 4, 63, 87, 46, 254, 225, 138, 4, 63, 87, 56, 128, 225, 138, 4, 63, 87,
1199        56, 123, 225, 138, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255,
1200        255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255,
1201        255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1202        0, 0, 0, 0, 0, 16, 151, 56, 146,
1203    ];
1204    // 1 frames game packet - reliable ordered [is_fragment reliable_frame_index = 2 ordered_frame_index = 1 ] == p4
1205    let p6 = [
1206        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,
1207        189, 203, 114, 234, 202, 214, 239, 249, 157, 94, 85, 61, 198, 119, 186, 181, 79, 72, 2,
1208        188, 77, 245, 140, 145, 48, 24, 137, 137, 208, 5, 169, 162, 98, 7, 32, 246, 4, 36, 97, 77,
1209        155, 201, 173, 162, 158, 231, 188, 81, 53, 171, 89, 47, 80, 189, 211, 170, 148, 148, 194,
1210        164, 156, 96, 16, 248, 178, 214, 252, 55, 126, 177, 194, 107, 122, 88, 82, 94, 198, 200,
1211        113, 201, 204, 255, 231, 127, 252, 215, 255, 242, 31, 255, 241, 95, 254, 223, 255, 251,
1212        127, 252, 215, 255, 254, 63, 255, 199, 127, 252, 159, 255, 57, 154, 12, 166, 243, 255, 252,
1213        223, 254, 247, 255, 28, 111, 90, 147, 97, 99, 52, 237, 76, 91, 138, 185, 85, 203, 218, 125,
1214        243, 165, 57, 255, 41, 122, 189, 230, 77, 211, 23, 155, 118, 223, 83, 186, 86, 208, 236,
1215        73, 213, 65, 175, 31, 253, 82, 101, 173, 102, 90, 65, 163, 183, 213, 21, 221, 84, 234, 61,
1216        83, 119, 93, 65, 81, 172, 70, 107, 233, 25, 138, 210, 179, 149, 23, 79, 18, 205, 142, 41,
1217        8, 163, 134, 179, 177, 77, 87, 182, 131, 86, 121, 80, 106, 213, 135, 125, 179, 162, 139,
1218        122, 203, 241, 131, 138, 109, 4, 93, 51, 168, 173, 135, 74, 75, 29, 214, 29, 97, 104, 4,
1219        55, 222, 182, 86, 26, 205, 189, 242, 192, 127, 217, 90, 219, 174, 48, 40, 233, 115, 171,
1220        49, 105, 141, 109, 189, 63, 182, 91, 63, 70, 141, 167, 237, 120, 166, 148, 213, 173, 92,
1221        30, 110, 149, 78, 91, 12, 66, 93, 241, 5, 93, 208, 45, 45, 156, 56, 143, 130, 18, 90, 194,
1222        147, 104, 55, 116, 209, 8, 163, 103, 211, 94, 151, 134, 91, 189, 50, 174, 235, 191, 135,
1223        138, 213, 237, 218, 21, 211, 182, 252, 233, 191, 187, 79, 255, 141, 124, 247, 204, 237,
1224        183, 132, 129, 237, 70, 142, 164, 8, 174, 169, 136, 94, 99, 178, 28, 133, 129, 48, 38, 223,
1225        238, 61, 180, 68, 183, 183, 154, 186, 253, 201, 170, 57, 123, 90, 107, 179, 110, 169, 83,
1226        119, 214, 154, 33, 175, 219, 247, 173, 200, 109, 88, 191, 189, 6, 249, 93, 171, 38, 58,
1227        225, 58, 114, 132, 69, 48, 62, 179, 205, 58, 178, 165, 14, 164, 160, 60, 54, 215, 51, 79,
1228        90, 15, 70, 243, 192, 50, 109, 77, 84, 45, 93, 50, 229, 234, 162, 103, 180, 238, 181, 146,
1229        235, 116, 234, 218, 111, 183, 81, 233, 155, 129, 53, 177, 27, 66, 73, 123, 240, 26, 110,
1230        40, 139, 238, 180, 250, 226, 137, 74, 199, 106, 184, 27, 67, 113, 155, 142, 209, 234, 14,
1231        109, 235, 247, 72, 246, 90, 154, 31, 61, 245, 76, 209, 234, 133, 74, 223, 158, 183, 126,
1232        13, 77, 241, 87, 199, 168, 117, 134, 194, 162, 163, 7, 90, 167, 59, 183, 218, 110, 67, 40,
1233        143, 130, 32, 178, 31, 180, 208, 233, 63, 109, 123, 91, 85, 26, 223, 223, 174, 45, 163, 41,
1234        245, 30, 106, 15, 170, 18, 149, 123, 155, 170, 173, 90, 206, 148, 124, 243, 111, 39, 116,
1235        166, 157, 153, 44, 105, 245, 145, 212, 169, 255, 148, 52, 67, 169, 222, 255, 252, 111, 237,
1236        167, 127, 74, 191, 234, 254, 100, 169, 140, 42, 171, 201, 92, 173, 142, 252, 127, 77, 86,
1237        247, 77, 251, 95, 254, 175, 127, 215, 127, 223, 246, 42, 255, 26, 253, 235, 165, 108, 133,
1238        255, 246, 151, 203, 202, 211, 250, 151, 175, 12, 203, 193, 124, 221, 155, 255, 67, 126,
1239        190, 109, 253, 99, 242, 243, 95, 211, 167, 219, 187, 237, 157, 107, 254, 43, 24, 107, 81,
1240        79, 22, 171, 225, 38, 252, 183, 240, 24, 4, 255, 114, 31, 21, 213, 235, 11, 195, 81, 239,
1241        159, 253, 161, 97, 169, 222, 77, 215, 41, 173, 164, 231, 254, 68, 157, 151, 199, 131, 31,
1242        15, 51, 229, 63, 255, 215, 120, 20, 151, 181, 190, 25, 143, 98, 173, 167, 4, 37, 210, 202,
1243        110, 79, 94, 44, 109, 63, 184, 25, 204, 106, 245, 174, 165, 184, 186, 255, 34, 232, 166,
1244        85, 235, 10, 129, 108, 219, 94, 77, 55, 38, 138, 209, 88, 68, 227, 135, 64, 117, 74, 222,
1245        11, 105, 165, 138, 101, 41, 51, 50, 138, 77, 47, 168, 253, 24, 154, 254, 166, 75, 250, 197,
1246        174, 255, 220, 14, 67, 253, 183, 37, 182, 44, 199, 154, 44, 180, 173, 94, 210, 67, 119,
1247        162, 217, 238, 168, 45, 173, 75, 166, 89, 49, 221, 121, 75, 181, 252, 201, 68, 13, 106, 11,
1248        215, 174, 172, 116, 193, 151, 122, 225, 164, 101, 88, 214, 163, 99, 121, 131, 81, 24, 45,
1249        12, 251, 169, 162, 202, 149, 101, 79, 168, 52, 76, 161, 114, 239, 153, 11, 127, 104, 76,
1250        54, 182, 29, 56, 35, 201, 157, 140, 103, 90, 91, 221, 186, 229, 126, 190, 7, 196, 213, 210,
1251        154, 41, 118, 115, 186, 154, 58, 246, 122, 78, 70, 227, 84, 183, 212, 109, 167, 222, 37,
1252        35, 57, 30, 200, 156, 142, 145, 201, 36, 38, 19, 59, 212, 151, 67, 179, 178, 28, 134, 90,
1253        64, 196, 74, 234, 204, 41, 107, 51, 191, 172, 197, 19, 125, 214, 20, 200, 127, 5, 242, 251,
1254        66, 60, 160, 71, 37, 53, 105, 190, 161, 20, 17, 185, 81, 220, 225, 193, 248, 225, 46, 251,
1255        187, 228, 247, 101, 81, 141, 255, 46, 249, 91, 163, 185, 30, 185, 97, 48, 115, 250, 122,
1256        208, 237, 91, 194, 160, 81, 221, 12, 250, 122, 165, 57, 139, 132, 209, 220, 10, 226, 191,
1257        231, 244, 187, 251, 239, 84, 74, 101, 3, 159, 52, 143, 16, 255, 174, 249, 96, 77, 135, 141,
1258        96, 214, 147, 172, 74, 252, 73, 134, 57, 113, 61, 193, 170, 217, 230, 164, 61, 20, 163,
1259        214, 56, 124, 90, 117, 5, 69, 39, 10, 164, 173, 201, 150, 210, 53, 181, 150, 174, 4, 243,
1260        174, 105, 173, 134, 134, 86, 215, 238, 23, 45, 53, 208, 156, 81, 99, 97, 116, 172, 213,
1261        114, 40, 142, 54, 174, 229, 149, 188, 185, 190, 238, 9, 81, 89, 51, 69, 215, 182, 38, 134,
1262        107, 212, 108, 93, 146, 203, 35, 210, 197, 158, 111, 13, 6, 194, 122, 57, 18, 91, 226, 64,
1263        138, 106, 166, 160, 77, 6, 210, 66, 232, 17, 165, 52, 242, 29, 113, 220, 183, 212, 145,
1264        229, 170, 158, 82, 171, 140, 251, 110, 191, 107, 47, 38, 93, 59, 90, 143, 103, 147, 173,
1265        166, 232, 237, 158, 229, 106, 221, 112, 210, 115, 231, 234, 115, 135, 76, 126, 199, 22,
1266        213, 113, 99, 210, 28, 62, 68, 79, 182, 226, 174, 201, 179, 230, 214, 67, 107, 101, 217,
1267        238, 141, 19, 40, 125, 67, 80, 227, 46, 50, 255, 61, 31, 119, 199, 195, 137, 182, 49, 141,
1268        167, 40, 108, 255, 238, 169, 189, 127, 140, 171, 255, 124, 232, 206, 102, 155, 95, 102,
1269        235, 95, 255, 186, 123, 12, 122, 225, 116, 34, 213, 131, 141, 222, 105, 253, 90, 180, 199,
1270        255, 248, 167, 80, 119, 126, 215, 36, 177, 94, 173, 53, 167, 139, 142, 242, 115, 48, 155,
1271        141, 204, 91, 219, 239, 205, 31, 154, 119, 198, 248, 246, 121, 118, 59, 239, 135, 146, 166,
1272        248, 255, 26, 119, 234, 99, 233, 229, 241, 103, 125, 182, 157, 107, 178, 225, 63, 85, 158,
1273        22, 97, 224, 222, 254, 187, 62, 115, 111, 170, 139, 162, 19, 164, 95, 91, 168, 130, 42, 60,
1274        10, 254, 198, 20, 39, 171, 129, 168, 86, 250, 247, 213, 165, 181, 109, 5, 86, 201, 147,
1275        188, 7, 165, 221, 35, 166, 194, 176, 2, 215, 86, 180, 64, 85, 220, 7, 199, 152, 108, 137,
1276        42, 147, 116, 43, 122, 54, 26, 213, 173, 57, 183, 158, 7, 190, 98, 116, 37, 229, 153, 168,
1277        243, 182, 37, 147, 47, 156, 89, 21, 207, 92, 175, 45, 127, 45, 152, 15, 65, 197, 11, 188,
1278        218, 64, 82, 106, 131, 185, 114, 211, 121, 80, 5, 75, 94, 180, 44, 95, 188, 31, 40, 173,
1279        112, 180, 121, 41, 147, 209, 50, 25, 154, 235, 242, 64, 158, 188, 140, 137, 154, 183, 230,
1280        74, 160, 54, 60, 115, 52, 175, 89, 238, 60, 154, 154, 150, 247, 163, 187,
1281    ];
1282    let ps: Vec<Vec<u8>> = vec![
1283        p0.to_vec(),
1284        p1.to_vec(),
1285        p2.to_vec(),
1286        p3.to_vec(),
1287        p4.to_vec(),
1288        p5.to_vec(),
1289        p6.to_vec(),
1290    ];
1291
1292    let mut n = 0;
1293
1294    let mut rq = RecvQ::new();
1295    for i in ps {
1296        let v = FrameVec::new(&i).unwrap();
1297        for i in v.frames {
1298            rq.insert(i).unwrap();
1299            if !rq.flush(&"0.0.0.0:0".parse().unwrap()).is_empty() {
1300                n += 1;
1301            }
1302        }
1303    }
1304
1305    assert!(n == 5);
1306}