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