1use std::{collections::HashMap, net::SocketAddr};
2
3use crate::{datatype::*, error::*, fragment::FragmentQ, raknet_log_debug, utils::*};
4
5#[derive(Clone)]
7pub enum Reliability {
8 Unreliable = 0x00,
12 UnreliableSequenced = 0x01,
15 Reliable = 0x02,
19 ReliableOrdered = 0x03,
22 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 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 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 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 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 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 ret += 1;
233 ret += 3;
235 ret += 1;
237 ret += 2;
239
240 if self.is_reliable()? {
241 ret += 3;
243 }
244 if self.is_sequenced()? {
245 ret += 3;
247 }
248 if self.is_ordered()? {
249 ret += 4;
251 }
252 if (self.flags & 16) != 0 {
253 ret += 10;
255 }
256 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 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 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 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 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 match frame.reliability()? {
466 Reliability::Unreliable => {
468 self.packets.entry(frame.sequence_number).or_insert(frame);
469 }
470 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 Reliability::Reliable => {
486 self.packets.insert(frame.sequence_number, frame);
487 }
488 Reliability::ReliableOrdered => {
490 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 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 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 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 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 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 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 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 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 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 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 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 self.srtt = ((self.srtt as f64 * 0.8) + (rtt as f64 * 0.2)) as i64;
715 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 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 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 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 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 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 let p3 = [132, 3, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 16, 151, 56, 161];
1103 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 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 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}