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