rust_raknet/
arq.rs

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