1use crate::sequence::{self, ReliableWindow};
2
3use std::{
4 collections::{HashMap, VecDeque},
5 net::SocketAddr,
6 sync::{
7 Arc,
8 atomic::{AtomicUsize, Ordering},
9 },
10};
11
12use crate::{datatype::*, error::*, fragment::FragmentQ, raknet_log_debug, utils::*};
13
14pub(crate) struct OutgoingFrames {
15 frames: Vec<FrameSetPacket>,
16 pub(crate) coalesced: bool,
17}
18
19impl OutgoingFrames {
20 #[cfg(test)]
21 pub(crate) fn new() -> Self {
22 Self::with_capacity(0)
23 }
24
25 fn with_capacity(capacity: usize) -> Self {
26 Self {
27 frames: Vec::with_capacity(capacity),
28 coalesced: false,
29 }
30 }
31}
32
33impl std::ops::Deref for OutgoingFrames {
34 type Target = Vec<FrameSetPacket>;
35 fn deref(&self) -> &Self::Target {
36 &self.frames
37 }
38}
39
40impl std::ops::DerefMut for OutgoingFrames {
41 fn deref_mut(&mut self) -> &mut Self::Target {
42 &mut self.frames
43 }
44}
45
46impl IntoIterator for OutgoingFrames {
47 type Item = FrameSetPacket;
48 type IntoIter = std::vec::IntoIter<FrameSetPacket>;
49 fn into_iter(self) -> Self::IntoIter {
50 self.frames.into_iter()
51 }
52}
53
54impl<'a> IntoIterator for &'a OutgoingFrames {
55 type Item = &'a FrameSetPacket;
56 type IntoIter = std::slice::Iter<'a, FrameSetPacket>;
57 fn into_iter(self) -> Self::IntoIter {
58 self.frames.iter()
59 }
60}
61
62#[derive(Clone, Copy, Debug, PartialEq, Eq)]
64#[repr(u8)]
65pub enum Reliability {
66 Unreliable = 0x00,
68 UnreliableSequenced = 0x01,
70 Reliable = 0x02,
72 ReliableOrdered = 0x03,
74 ReliableSequenced = 0x04,
76}
77
78impl Reliability {
79 pub fn to_u8(&self) -> u8 {
80 *self as u8
81 }
82
83 pub fn from(flags: u8) -> Result<Self> {
84 Self::try_from(flags)
85 }
86}
87
88impl TryFrom<u8> for Reliability {
89 type Error = RaknetError;
90
91 fn try_from(flags: u8) -> Result<Self> {
92 match flags {
93 0x00 => Ok(Self::Unreliable),
94 0x01 => Ok(Self::UnreliableSequenced),
95 0x02 => Ok(Self::Reliable),
96 0x03 => Ok(Self::ReliableOrdered),
97 0x04 => Ok(Self::ReliableSequenced),
98 _ => Err(RaknetError::IncorrectReliability),
99 }
100 }
101}
102
103const NEEDS_B_AND_AS_FLAG: u8 = 0x4;
104const CONTINUOUS_SEND_FLAG: u8 = 0x8;
105
106#[derive(Clone, Debug)]
109pub(crate) enum FramePayload {
110 Owned(Vec<u8>),
111 Bytes(bytes::Bytes),
112 Shared {
113 owner: Arc<[u8]>,
114 start: u32,
115 length: u16,
116 },
117}
118
119impl Default for FramePayload {
120 fn default() -> Self {
121 Self::Owned(Vec::new())
122 }
123}
124
125impl FramePayload {
126 fn copy_shared(data: &[u8]) -> Self {
127 Self::Shared {
128 owner: Arc::from(data),
129 start: 0,
130 length: data.len() as u16,
131 }
132 }
133}
134
135impl std::ops::Deref for FramePayload {
136 type Target = [u8];
137 fn deref(&self) -> &[u8] {
138 match self {
139 Self::Owned(data) => data,
140 Self::Bytes(data) => data,
141 Self::Shared {
142 owner,
143 start,
144 length,
145 } => &owner[*start as usize..*start as usize + usize::from(*length)],
146 }
147 }
148}
149
150impl AsRef<[u8]> for FramePayload {
151 fn as_ref(&self) -> &[u8] {
152 self
153 }
154}
155
156impl From<Vec<u8>> for FramePayload {
157 fn from(data: Vec<u8>) -> Self {
158 Self::Owned(data)
159 }
160}
161
162impl From<FramePayload> for Vec<u8> {
163 fn from(data: FramePayload) -> Self {
164 match data {
165 FramePayload::Owned(data) => data,
166 shared => shared.to_vec(),
167 }
168 }
169}
170
171impl PartialEq for FramePayload {
172 fn eq(&self, other: &Self) -> bool {
173 self.as_ref() == other.as_ref()
174 }
175}
176
177struct SharedPayload {
180 remaining: AtomicUsize,
181 bytes: usize,
182}
183
184#[derive(Clone)]
185pub struct FrameSetPacket {
186 pub sequence_number: u32,
187 pub flags: u8,
188 pub length_in_bytes: u16,
189 pub reliable_frame_index: u32,
190 pub sequenced_frame_index: u32,
191 pub ordered_frame_index: u32,
192 pub order_channel: u8,
193 pub compound_size: u32,
194 pub compound_id: u16,
195 pub fragment_index: u32,
196 pub(crate) data: FramePayload,
197 shared_payload: Option<Arc<SharedPayload>>,
198}
199
200impl FrameSetPacket {
201 pub fn new(r: Reliability, data: Vec<u8>) -> Self {
202 Self::from_payload(r, data.into())
203 }
204
205 fn from_payload(r: Reliability, data: FramePayload) -> Self {
206 let flag = r.to_u8() << 5;
207
208 Self {
209 sequence_number: 0,
210 flags: flag,
211 length_in_bytes: data.len() as u16,
212 reliable_frame_index: 0,
213 sequenced_frame_index: 0,
214 ordered_frame_index: 0,
215 order_channel: 0,
216 compound_size: 0,
217 compound_id: 0,
218 fragment_index: 0,
219 data,
220 shared_payload: None,
221 }
222 }
223
224 #[cfg(test)]
225 pub fn deserialize(buf: &[u8]) -> Result<(Self, bool)> {
226 let mut reader = RaknetReader::new(buf);
227 let input_len = buf.len() as u64;
228
229 let mut ret = Self {
230 sequence_number: 0,
231 flags: 0,
232 length_in_bytes: 0,
233 reliable_frame_index: 0,
234 sequenced_frame_index: 0,
235 ordered_frame_index: 0,
236 order_channel: 0,
237 compound_size: 0,
238 compound_id: 0,
239 fragment_index: 0,
240 data: FramePayload::default(),
241 shared_payload: None,
242 };
243
244 let packet_id = reader.read_u8()?;
245 if !(0x80..=0x8d).contains(&packet_id) {
246 return Err(RaknetError::PacketHeaderError);
247 }
248 ret.sequence_number = reader.read_u24(Endian::Little)?;
249 ret.flags = reader.read_u8()?;
250
251 let length_in_bits = reader.read_u16(Endian::Big)?;
252 if length_in_bits % 8 != 0 {
253 return Err(RaknetError::PacketParseError);
254 }
255 ret.length_in_bytes = length_in_bits / 8;
256
257 if ret.is_reliable()? {
258 ret.reliable_frame_index = reader.read_u24(Endian::Little)?;
259 }
260
261 if ret.is_sequenced()? {
262 ret.sequenced_frame_index = reader.read_u24(Endian::Little)?;
263 }
264 if ret.is_ordered()? {
265 ret.ordered_frame_index = reader.read_u24(Endian::Little)?;
266 ret.order_channel = reader.read_u8()?;
267 }
268
269 if ret.is_fragment() {
270 ret.compound_size = reader.read_u32(Endian::Big)?;
271 ret.compound_id = reader.read_u16(Endian::Big)?;
272 ret.fragment_index = reader.read_u32(Endian::Big)?;
273 }
274
275 let mut data = vec![0; usize::from(ret.length_in_bytes)];
276 reader.read(&mut data)?;
277 ret.data = data.into();
278
279 if ret.is_fragment() && (ret.compound_size == 0 || ret.fragment_index >= ret.compound_size)
280 {
281 return Err(RaknetError::PacketParseError);
282 }
283
284 Ok((ret, reader.pos() == input_len))
285 }
286
287 pub fn serialize(&self) -> Result<Vec<u8>> {
288 let mut buffer = Vec::new();
289 self.serialize_into(&mut buffer)?;
290 Ok(buffer)
291 }
292
293 pub(crate) fn serialize_into(&self, buffer: &mut Vec<u8>) -> Result<()> {
294 self.validate()?;
295 let size = self._size()?;
296 buffer.clear();
297 buffer.reserve(size);
298 let mut writer = RaknetWriter::from_buffer(std::mem::take(buffer));
299 let result = self
300 .write_header(&mut writer)
301 .and_then(|()| writer.write(self.data.as_ref()));
302 *buffer = writer.get_raw_payload();
303 result
304 }
305
306 pub(crate) fn serialize_group_into(frames: &[Self], output: &mut Vec<u8>) -> Result<()> {
307 let first = frames.first().ok_or(RaknetError::PacketParseError)?;
308 output.clear();
309 for (index, frame) in frames.iter().enumerate() {
310 if frame.sequence_number != first.sequence_number {
311 return Err(RaknetError::PacketParseError);
312 }
313 let mut header = [0; 32];
314 let length = frame.encode_header(&mut header)?;
315 output.extend_from_slice(&header[if index == 0 { 0 } else { 4 }..length]);
316 output.extend_from_slice(frame.data.as_ref());
317 }
318 Ok(())
319 }
320
321 pub(crate) fn validate(&self) -> Result<()> {
322 if self.data.len() != usize::from(self.length_in_bytes)
323 || self.data.len() > usize::from(u16::MAX / 8)
324 || (self.is_fragment()
325 && (self.compound_size == 0 || self.fragment_index >= self.compound_size))
326 {
327 return Err(RaknetError::PacketParseError);
328 }
329
330 self._size()?;
331 Ok(())
332 }
333
334 pub(crate) fn encode_header(&self, header: &mut [u8; 32]) -> Result<usize> {
335 self.validate()?;
336 let mut writer = RaknetWriter::from_buffer(header.as_mut_slice());
337 self.write_header(&mut writer)?;
338 Ok(32 - writer.remaining_mut())
339 }
340
341 fn write_header<B: bytes::BufMut>(&self, writer: &mut RaknetWriter<B>) -> Result<()> {
342 let mut id = 0x80 | NEEDS_B_AND_AS_FLAG;
343
344 if (self.flags & 16) != 0 && self.fragment_index != 0 {
346 id |= CONTINUOUS_SEND_FLAG;
347 }
348
349 writer.write_u8(id)?;
350 writer.write_u24(self.sequence_number, Endian::Little)?;
351
352 writer.write_u8(self.flags)?;
354 writer.write_u16(self.length_in_bytes * 8, Endian::Big)?;
355
356 if self.is_reliable()? {
357 writer.write_u24(self.reliable_frame_index, Endian::Little)?;
358 }
359
360 if self.is_sequenced()? {
361 writer.write_u24(self.sequenced_frame_index, Endian::Little)?;
362 }
363 if self.is_ordered()? {
364 writer.write_u24(self.ordered_frame_index, Endian::Little)?;
365 writer.write_u8(self.order_channel)?;
366 }
367
368 if (self.flags & 16) != 0 {
370 writer.write_u32(self.compound_size, Endian::Big)?;
371 writer.write_u16(self.compound_id, Endian::Big)?;
372 writer.write_u32(self.fragment_index, Endian::Big)?;
373 }
374 Ok(())
375 }
376
377 pub fn is_fragment(&self) -> bool {
378 (self.flags & 16) != 0
379 }
380
381 pub fn is_reliable(&self) -> Result<bool> {
382 let r = Reliability::from((self.flags & 224) >> 5)?;
383 Ok(matches!(
384 r,
385 Reliability::Reliable | Reliability::ReliableOrdered | Reliability::ReliableSequenced
386 ))
387 }
388
389 pub fn is_ordered(&self) -> Result<bool> {
390 let r = Reliability::from((self.flags & 224) >> 5)?;
391 Ok(matches!(
392 r,
393 Reliability::UnreliableSequenced
394 | Reliability::ReliableOrdered
395 | Reliability::ReliableSequenced
396 ))
397 }
398
399 pub fn is_sequenced(&self) -> Result<bool> {
400 let r = Reliability::from((self.flags & 224) >> 5)?;
401 Ok(matches!(
402 r,
403 Reliability::UnreliableSequenced | Reliability::ReliableSequenced
404 ))
405 }
406 pub fn reliability(&self) -> Result<Reliability> {
407 Reliability::from((self.flags & 224) >> 5)
408 }
409
410 pub fn _size(&self) -> Result<usize> {
411 let mut ret = 0;
412 ret += 1;
414 ret += 3;
416 ret += 1;
418 ret += 2;
420
421 if self.is_reliable()? {
422 ret += 3;
424 }
425 if self.is_sequenced()? {
426 ret += 3;
428 }
429 if self.is_ordered()? {
430 ret += 4;
432 }
433 if (self.flags & 16) != 0 {
434 ret += 10;
436 }
437 ret += self.data.len();
439 Ok(ret)
440 }
441}
442
443pub struct FrameVec {
444 #[cfg(test)]
445 pub frames: Vec<FrameSetPacket>,
446}
447
448impl FrameVec {
449 #[cfg(test)]
450 pub fn new(buf: &[u8]) -> Result<Self> {
451 let mut frames = Vec::new();
452 Self::decode_into(buf, &mut frames)?;
453 Ok(Self { frames })
454 }
455
456 pub(crate) fn decode_into(buf: &[u8], frames: &mut Vec<FrameSetPacket>) -> Result<()> {
458 Self::decode(buf, frames, false)
459 }
460
461 pub(crate) fn decode_owned_into(
462 mut buf: Vec<u8>,
463 frames: &mut Vec<FrameSetPacket>,
464 ) -> Result<()> {
465 Self::decode(&buf, frames, true)?;
466 if let [frame] = frames.as_mut_slice() {
467 let length = usize::from(frame.length_in_bytes);
470 let offset = buf.len() - length;
471 buf.copy_within(offset.., 0);
472 buf.truncate(length);
473 frame.data = buf.into();
474 }
475 Ok(())
476 }
477
478 fn decode(buf: &[u8], frames: &mut Vec<FrameSetPacket>, owned: bool) -> Result<()> {
479 frames.clear();
480 let mut reader = RaknetReader::new(buf);
481 let id = reader.read_u8()?;
482 if !(0x80..=0x8d).contains(&id) {
483 return Err(RaknetError::PacketHeaderError);
484 }
485 let sequence_number = reader.read_u24(Endian::Little)?;
486 if reader.pos() == buf.len() as u64 {
487 return Err(RaknetError::PacketParseError);
488 }
489 while reader.pos() < buf.len() as u64 {
490 let mut frame = FrameSetPacket {
491 sequence_number,
492 flags: 0,
493 length_in_bytes: 0,
494 reliable_frame_index: 0,
495 sequenced_frame_index: 0,
496 ordered_frame_index: 0,
497 order_channel: 0,
498 compound_size: 0,
499 compound_id: 0,
500 fragment_index: 0,
501 data: FramePayload::default(),
502 shared_payload: None,
503 };
504
505 frame.flags = reader.read_u8()?;
506 let length_in_bits = reader.read_u16(Endian::Big)?;
507 if length_in_bits % 8 != 0 {
508 return Err(RaknetError::PacketParseError);
509 }
510 frame.length_in_bytes = length_in_bits / 8;
511
512 if frame.is_reliable()? {
513 frame.reliable_frame_index = reader.read_u24(Endian::Little)?;
514 }
515 if frame.is_sequenced()? {
516 frame.sequenced_frame_index = reader.read_u24(Endian::Little)?;
517 }
518 if frame.is_ordered()? {
519 frame.ordered_frame_index = reader.read_u24(Endian::Little)?;
520 frame.order_channel = reader.read_u8()?;
521 }
522 if frame.is_fragment() {
523 frame.compound_size = reader.read_u32(Endian::Big)?;
524 frame.compound_id = reader.read_u16(Endian::Big)?;
525 frame.fragment_index = reader.read_u32(Endian::Big)?;
526 if frame.compound_size == 0 || frame.fragment_index >= frame.compound_size {
527 return Err(RaknetError::PacketParseError);
528 }
529 }
530
531 let data = reader.read_slice(usize::from(frame.length_in_bytes))?;
532 if !owned || !frames.is_empty() || reader.pos() != buf.len() as u64 {
535 frame.data = data.to_vec().into();
536 }
537 frames.push(frame);
538 }
539
540 Ok(())
541 }
542}
543
544#[derive(Default)]
545pub struct ACKSet {
546 ack: Vec<(u32, u32)>,
547 nack: Vec<(u32, u32)>,
548 next_expected: u32,
549}
550
551impl ACKSet {
552 pub fn insert(&mut self, s: u32) {
553 let mut split = None;
555 self.nack.retain_mut(|(start, end)| {
556 if s < *start || s > *end {
557 return true;
558 }
559 if *start == *end {
560 return false;
561 }
562 if s == *start {
563 *start += 1;
564 } else if s == *end {
565 *end -= 1;
566 } else {
567 split = Some((s + 1, *end));
568 *end = s - 1;
569 }
570 true
571 });
572 if let Some(range) = split {
573 self.nack.push(range);
574 }
575 if s == self.next_expected || sequence::newer(s, self.next_expected) {
576 if s != self.next_expected {
577 if s > self.next_expected {
578 self.nack.push((self.next_expected, s - 1));
579 } else {
580 self.nack.push((self.next_expected, sequence::MASK));
581 if s != 0 {
582 self.nack.push((0, s - 1));
583 }
584 }
585 }
586 self.next_expected = sequence::next(s);
587 }
588
589 for i in 0..self.ack.len() {
590 let a = self.ack[i];
591 if (a.0..=a.1).contains(&s) {
592 return;
593 }
594 if a.0 != 0 && s == a.0 - 1 {
595 self.ack[i].0 = s;
596 return;
597 }
598 if s == a.1.saturating_add(1) {
599 self.ack[i].1 = s;
600 return;
601 }
602 }
603 self.ack.push((s, s));
604 }
605
606 #[cfg(test)]
607 pub fn get_ack(&mut self) -> Vec<(u32, u32)> {
608 std::mem::take(&mut self.ack)
609 }
610
611 fn take_ack_into(&mut self, output: &mut Vec<(u32, u32)>) {
612 output.clear();
613 std::mem::swap(output, &mut self.ack);
614 }
615
616 fn take_nack_into(&mut self, output: &mut Vec<(u32, u32)>) {
617 output.clear();
618 std::mem::swap(output, &mut self.nack);
619 }
620
621 #[cfg(test)]
622 pub fn get_nack(&mut self) -> Vec<(u32, u32)> {
623 std::mem::take(&mut self.nack)
624 }
625}
626
627#[derive(Default)]
629struct ChannelIndexes {
630 primary: u32,
631 others: HashMap<u8, u32>,
632}
633
634impl ChannelIndexes {
635 fn get(&self, channel: u8) -> u32 {
636 if channel == 0 {
637 self.primary
638 } else {
639 self.others.get(&channel).copied().unwrap_or(0)
640 }
641 }
642
643 fn get_mut(&mut self, channel: u8) -> &mut u32 {
644 if channel == 0 {
645 &mut self.primary
646 } else {
647 self.others.entry(channel).or_default()
648 }
649 }
650
651 #[cfg(test)]
652 fn insert(&mut self, channel: u8, index: u32) {
653 *self.get_mut(channel) = index;
654 }
655}
656
657#[derive(Default)]
658pub struct RecvQ {
659 sequenced_frame_indexes: ChannelIndexes,
660 last_ordered_indexes: ChannelIndexes,
661 sequence_number_ackset: ACKSet,
662 packets: HashMap<u32, FrameSetPacket>,
663 ordered_packets: HashMap<(u8, u32), FrameSetPacket>,
664 fragment_queue: FragmentQ,
665 reliable_window: ReliableWindow,
666 ordered_bytes: usize,
667 ready_ordered: Vec<FrameSetPacket>,
668 ready_bytes: usize,
669}
670
671impl RecvQ {
672 pub fn new() -> Self {
673 Self::default()
674 }
675
676 pub fn insert(&mut self, frame: FrameSetPacket) -> Result<()> {
677 let reliability = frame.reliability()?;
678 self.sequence_number_ackset.insert(frame.sequence_number);
679 if frame.is_reliable()? && !self.reliable_window.accept(frame.reliable_frame_index)? {
680 return Ok(());
681 }
682
683 match reliability {
684 Reliability::Unreliable => {
685 self.packets.entry(frame.sequence_number).or_insert(frame);
686 }
687 Reliability::UnreliableSequenced => {
688 let channel = frame.order_channel;
689 let sequence_index = frame.sequenced_frame_index;
690 let sequence_number = frame.sequence_number;
691 let last_index = self.sequenced_frame_indexes.get_mut(channel);
692 if sequence_index == *last_index || sequence::newer(sequence_index, *last_index) {
693 self.packets.entry(sequence_number).or_insert(frame);
694 *last_index = sequence::next(sequence_index);
695 }
696 }
697 Reliability::Reliable => {
698 self.packets.insert(frame.sequence_number, frame);
699 }
700 Reliability::ReliableOrdered => {
701 let expected_index = self.last_ordered_indexes.get(frame.order_channel);
702 if sequence::newer(expected_index, frame.ordered_frame_index) {
703 return Ok(());
704 }
705 if sequence::distance(frame.ordered_frame_index, expected_index)
706 >= sequence::RECEIVE_WINDOW
707 {
708 return Err(RaknetError::PacketParseError);
709 }
710 let complete = if frame.is_fragment() {
711 self.fragment_queue.insert_and_take_completed(frame)?
712 } else {
713 Some(frame)
714 };
715 if let Some(frame) = complete {
716 let key = (frame.order_channel, frame.ordered_frame_index);
717 if self.ordered_packets.contains_key(&key) {
718 return Ok(());
719 }
720 if self.ordered_packets.len() + self.ready_ordered.len()
721 >= sequence::RECEIVE_WINDOW as usize
722 || self.ordered_bytes + self.ready_bytes + frame.data.len()
723 > 64 * 1024 * 1024
724 {
725 return Err(RaknetError::PacketParseError);
726 }
727 if frame.ordered_frame_index == expected_index {
728 let channel = frame.order_channel;
729 self.ready_bytes += frame.data.len();
730 self.ready_ordered.push(frame);
731 let expected = self.last_ordered_indexes.get_mut(channel);
732 *expected = sequence::next(*expected);
733 while !self.ordered_packets.is_empty() {
735 let Some(frame) = self.ordered_packets.remove(&(channel, *expected))
736 else {
737 break;
738 };
739 self.ordered_bytes -= frame.data.len();
740 self.ready_bytes += frame.data.len();
741 self.ready_ordered.push(frame);
742 *expected = sequence::next(*expected);
743 }
744 } else {
745 self.ordered_bytes += frame.data.len();
746 self.ordered_packets.insert(key, frame);
747 }
748 }
749 }
750
751 Reliability::ReliableSequenced => {
752 let channel = frame.order_channel;
753 let sequence_index = frame.sequenced_frame_index;
754 let sequence_number = frame.sequence_number;
755 let last_index = self.sequenced_frame_indexes.get_mut(channel);
756 if sequence_index == *last_index || sequence::newer(sequence_index, *last_index) {
757 self.packets.entry(sequence_number).or_insert(frame);
758 *last_index = sequence::next(sequence_index);
759 }
760 }
761 }
762 Ok(())
763 }
764
765 #[cfg(test)]
766 pub fn get_ack(&mut self) -> Vec<(u32, u32)> {
767 self.sequence_number_ackset.get_ack()
768 }
769
770 #[cfg(test)]
771 pub fn get_nack(&mut self) -> Vec<(u32, u32)> {
772 self.sequence_number_ackset.get_nack()
773 }
774
775 pub(crate) fn take_ack_into(&mut self, output: &mut Vec<(u32, u32)>) {
776 self.sequence_number_ackset.take_ack_into(output);
777 }
778
779 pub(crate) fn take_nack_into(&mut self, output: &mut Vec<(u32, u32)>) {
780 self.sequence_number_ackset.take_nack_into(output);
781 }
782
783 #[cfg(test)]
784 pub fn flush(&mut self, _peer_addr: &SocketAddr) -> Vec<FrameSetPacket> {
785 let mut frames = Vec::new();
786 self.flush_into(&mut frames);
787 frames
788 }
789
790 pub(crate) fn flush_into(&mut self, frames: &mut Vec<FrameSetPacket>) {
791 frames.append(&mut self.ready_ordered);
792 self.ready_bytes = 0;
793 if self.packets.is_empty() {
794 return;
795 }
796 let mut packets: Vec<_> = self.packets.drain().map(|(_, frame)| frame).collect();
797 packets.sort_unstable_by_key(|frame| frame.sequence_number);
798 frames.extend(packets);
799 }
800 pub(crate) fn needs_maintenance(&self) -> bool {
801 !self.sequence_number_ackset.nack.is_empty() || self.fragment_queue.size() != 0
802 }
803
804 pub fn fragments_expired(&self) -> bool {
805 self.fragment_queue.expired()
806 }
807
808 pub fn get_ordered_packet(&self) -> usize {
809 self.ordered_packets.len() + self.ready_ordered.len()
810 }
811
812 pub fn get_fragment_queue_size(&self) -> usize {
813 self.fragment_queue.size()
814 }
815
816 pub fn get_ordered_keys(&self) -> Vec<(u8, u32)> {
817 self.ordered_packets.keys().copied().collect()
818 }
819
820 pub fn get_size(&self) -> usize {
821 self.packets.len()
822 }
823}
824
825pub struct SendQ {
826 mtu: u16,
827 ack_sequence_number: u32,
828 sequence_number: u32,
829 reliable_frame_index: u32,
830 sequenced_frame_indexes: ChannelIndexes,
831 ordered_frame_indexes: ChannelIndexes,
832 compound_id: u16,
833 packets: VecDeque<FrameSetPacket>,
835 queued_unreliable: usize,
836 buffered_bytes: usize,
837 rto: i64,
838 srtt: i64,
839 sent_packet: Vec<(FrameSetPacket, bool, i64, u32, Vec<u32>)>,
840 flight_order_dirty: bool,
841 next_retry: i64,
842 retries_pending: bool,
843 coalesce: bool,
844 coalescing_allowed: bool,
845 grouped_acks: bool,
846}
847
848impl SendQ {
849 pub const DEFAULT_TIMEOUT_MILLS: i64 = 50;
850 const MAX_IN_FLIGHT_PACKETS: usize = 64;
851 const MAX_COALESCED_FRAMES: usize = 8;
852 const MAX_BUFFERED_BYTES: usize = 64 * 1024 * 1024;
853 const SEND_HIGH_WATER: usize = 256 * 1024;
854 const FRAME_BUDGET: usize = 128;
855
856 const RTO_UBOUND: i64 = 12000;
857 const RTO_LBOUND: i64 = 50;
858
859 pub fn new(mtu: u16) -> Self {
860 Self {
861 mtu,
862 ack_sequence_number: sequence::MASK,
863 sequence_number: 0,
864 packets: VecDeque::new(),
865 queued_unreliable: 0,
866 buffered_bytes: 0,
867 sent_packet: vec![],
868 flight_order_dirty: false,
869 next_retry: i64::MAX,
870 retries_pending: false,
871 coalesce: false,
872 coalescing_allowed: true,
873 grouped_acks: false,
874 reliable_frame_index: 0,
875 sequenced_frame_indexes: ChannelIndexes::default(),
876 ordered_frame_indexes: ChannelIndexes::default(),
877 compound_id: 0,
878
879 rto: SendQ::DEFAULT_TIMEOUT_MILLS,
880 srtt: SendQ::DEFAULT_TIMEOUT_MILLS,
881 }
882 }
883
884 fn required_bytes(&self, reliability: Reliability, len: usize) -> Result<usize> {
885 let payload = usize::from(self.mtu)
886 .checked_sub(60)
887 .filter(|n| *n > 0)
888 .ok_or(RaknetError::PacketSizeExceedMTU)?;
889 let frames = if reliability == Reliability::ReliableOrdered && len > payload {
890 let frames = len.div_ceil(payload);
891 if frames > crate::fragment::MAX_FRAGMENTS {
892 return Err(RaknetError::PacketSizeExceedMTU);
893 }
894 frames
895 } else {
896 1
897 };
898 let bytes = frames
899 .checked_mul(Self::FRAME_BUDGET)
900 .and_then(|n| n.checked_add(len))
901 .filter(|n| *n <= Self::MAX_BUFFERED_BYTES)
902 .ok_or(RaknetError::PacketSizeExceedMTU)?;
903 Ok(bytes)
904 }
905
906 pub fn has_capacity(&self, reliability: Reliability, len: usize) -> Result<bool> {
907 let required = self.required_bytes(reliability, len)?;
908 Ok(self.buffered_bytes.saturating_add(required) <= Self::SEND_HIGH_WATER.max(required))
910 }
911
912 pub(crate) fn enable_coalescing(&mut self) {
913 self.coalesce = self.coalescing_allowed;
914 }
915
916 pub(crate) fn allows_coalescing(&self) -> bool {
917 self.coalescing_allowed
918 }
919
920 pub(crate) fn has_batch_capacity(
921 &self,
922 reliability: Reliability,
923 mut lengths: impl Iterator<Item = usize>,
924 ) -> Result<bool> {
925 let required = lengths.try_fold(0usize, |total, length| {
926 total
927 .checked_add(self.required_bytes(reliability, length)?)
928 .filter(|&bytes| bytes <= Self::MAX_BUFFERED_BYTES)
929 .ok_or(RaknetError::PacketSizeExceedMTU)
930 })?;
931 Ok(self.buffered_bytes.saturating_add(required) <= Self::SEND_HIGH_WATER.max(required))
932 }
933
934 pub fn insert(&mut self, reliability: Reliability, buf: &[u8]) -> Result<()> {
935 self.insert_with_order_channel(reliability, buf, 0)
936 }
937
938 pub fn insert_with_order_channel(
939 &mut self,
940 reliability: Reliability,
941 buf: &[u8],
942 order_channel: u8,
943 ) -> Result<()> {
944 self.insert_payload(reliability, buf, order_channel, None)
945 }
946
947 pub(crate) fn insert_bytes(
948 &mut self,
949 reliability: Reliability,
950 data: &bytes::Bytes,
951 order_channel: u8,
952 ) -> Result<()> {
953 self.insert_payload(reliability, data, order_channel, Some(data))
954 }
955
956 fn insert_payload(
957 &mut self,
958 reliability: Reliability,
959 buf: &[u8],
960 order_channel: u8,
961 owned: Option<&bytes::Bytes>,
962 ) -> Result<()> {
963 let reserved = self.required_bytes(reliability, buf.len())?;
964 if reserved > Self::MAX_BUFFERED_BYTES - self.buffered_bytes {
965 return Err(RaknetError::PacketSizeExceedMTU);
966 }
967 let max_payload = self
968 .mtu
969 .checked_sub(60)
970 .map(usize::from)
971 .filter(|size| *size > 0)
972 .ok_or(RaknetError::PacketSizeExceedMTU)?;
973
974 match reliability {
975 Reliability::Unreliable => {
976 if buf.len() > max_payload {
977 return Err(RaknetError::PacketSizeExceedMTU);
978 }
979
980 let frame = FrameSetPacket::from_payload(
981 reliability,
982 owned.map_or_else(
983 || FramePayload::Owned(buf.to_vec()),
984 |data| FramePayload::Bytes(data.clone()),
985 ),
986 );
987 self.packets.push_back(frame);
988 }
989 Reliability::UnreliableSequenced => {
990 if buf.len() > max_payload {
991 return Err(RaknetError::PacketSizeExceedMTU);
992 }
993
994 let sequenced_frame_index = {
995 let index = self.sequenced_frame_indexes.get_mut(order_channel);
996 let current = *index;
997 *index = sequence::next(*index);
998 current
999 };
1000 let ordered_frame_index = self.ordered_frame_indexes.get(order_channel);
1001 let mut frame = FrameSetPacket::from_payload(
1002 reliability,
1003 owned.map_or_else(
1004 || FramePayload::Owned(buf.to_vec()),
1005 |data| FramePayload::Bytes(data.clone()),
1006 ),
1007 );
1008 frame.order_channel = order_channel;
1009 frame.ordered_frame_index = ordered_frame_index;
1010 frame.sequenced_frame_index = sequenced_frame_index;
1011 self.packets.push_back(frame);
1012 }
1013 Reliability::Reliable => {
1014 if buf.len() > max_payload {
1015 return Err(RaknetError::PacketSizeExceedMTU);
1016 }
1017
1018 let mut frame = FrameSetPacket::from_payload(
1019 reliability,
1020 owned.map_or_else(
1021 || FramePayload::copy_shared(buf),
1022 |data| FramePayload::Bytes(data.clone()),
1023 ),
1024 );
1025 frame.reliable_frame_index = self.reliable_frame_index;
1026 self.packets.push_back(frame);
1027 self.reliable_frame_index = sequence::next(self.reliable_frame_index);
1028 }
1029 Reliability::ReliableOrdered => {
1030 if buf.len() <= max_payload {
1031 let mut frame = FrameSetPacket::from_payload(
1032 reliability,
1033 owned.map_or_else(
1034 || FramePayload::copy_shared(buf),
1035 |data| FramePayload::Bytes(data.clone()),
1036 ),
1037 );
1038 frame.order_channel = order_channel;
1039 frame.reliable_frame_index = self.reliable_frame_index;
1040 frame.ordered_frame_index = *self.ordered_frame_indexes.get_mut(order_channel);
1041 self.packets.push_back(frame);
1042 self.reliable_frame_index = sequence::next(self.reliable_frame_index);
1043 } else {
1044 let compound_size = buf.len().div_ceil(max_payload);
1045 let compound_size = u32::try_from(compound_size)
1046 .map_err(|_| RaknetError::PacketSizeExceedMTU)?;
1047 let ordered_frame_index = *self.ordered_frame_indexes.get_mut(order_channel);
1048
1049 let data: Option<Arc<[u8]>> = owned.is_none().then(|| Arc::from(buf));
1050 let shared_payload = Arc::new(SharedPayload {
1051 remaining: AtomicUsize::new(compound_size as usize),
1052 bytes: buf.len(),
1053 });
1054 for (fragment_index, chunk) in buf.chunks(max_payload).enumerate() {
1055 let start = fragment_index * max_payload;
1056 let mut frame = FrameSetPacket::from_payload(
1057 reliability,
1058 match owned {
1059 Some(data) => {
1060 FramePayload::Bytes(data.slice(start..start + chunk.len()))
1061 }
1062 None => FramePayload::Shared {
1063 owner: data.as_ref().unwrap().clone(),
1064 start: start as u32,
1065 length: chunk.len() as u16,
1066 },
1067 },
1068 );
1069 frame.shared_payload = Some(shared_payload.clone());
1070 frame.flags |= 16;
1071 frame.compound_size = compound_size;
1072 frame.compound_id = self.compound_id;
1073 frame.fragment_index = fragment_index as u32;
1074 frame.order_channel = order_channel;
1075 frame.reliable_frame_index = self.reliable_frame_index;
1076 frame.ordered_frame_index = ordered_frame_index;
1077 self.packets.push_back(frame);
1078 self.reliable_frame_index = sequence::next(self.reliable_frame_index);
1079 }
1080 self.compound_id = self.compound_id.wrapping_add(1);
1081 }
1082 let index = self.ordered_frame_indexes.get_mut(order_channel);
1083 *index = sequence::next(*index);
1084 }
1085 Reliability::ReliableSequenced => {
1086 if buf.len() > max_payload {
1087 return Err(RaknetError::PacketSizeExceedMTU);
1088 }
1089
1090 let sequenced_frame_index = {
1091 let index = self.sequenced_frame_indexes.get_mut(order_channel);
1092 let current = *index;
1093 *index = sequence::next(*index);
1094 current
1095 };
1096 let ordered_frame_index = self.ordered_frame_indexes.get(order_channel);
1097 let mut frame = FrameSetPacket::from_payload(
1098 reliability,
1099 owned.map_or_else(
1100 || FramePayload::copy_shared(buf),
1101 |data| FramePayload::Bytes(data.clone()),
1102 ),
1103 );
1104 frame.order_channel = order_channel;
1105 frame.reliable_frame_index = self.reliable_frame_index;
1106 frame.sequenced_frame_index = sequenced_frame_index;
1107 frame.ordered_frame_index = ordered_frame_index;
1108 self.packets.push_back(frame);
1109 self.reliable_frame_index = sequence::next(self.reliable_frame_index);
1110 }
1111 };
1112 self.buffered_bytes += reserved;
1113 if matches!(
1114 reliability,
1115 Reliability::Unreliable | Reliability::UnreliableSequenced
1116 ) {
1117 self.queued_unreliable += 1;
1118 }
1119 Ok(())
1120 }
1121
1122 fn update_rto(&mut self, rtt: i64) {
1123 let previous = self.rto;
1124 (self.srtt, self.rto) = Self::latency_sample(self.srtt, rtt);
1125 if self.rto != previous {
1126 self.next_retry = 0;
1127 }
1128 }
1129
1130 fn latency_sample(srtt: i64, rtt: i64) -> (i64, i64) {
1131 let srtt = (srtt * 4 + rtt) / 5;
1132 (
1133 srtt,
1134 (srtt * 3 / 2).clamp(Self::RTO_LBOUND, Self::RTO_UBOUND),
1135 )
1136 }
1137
1138 pub(crate) fn mtu(&self) -> u16 {
1139 self.mtu
1140 }
1141
1142 pub fn get_rto(&self) -> i64 {
1143 self.rto
1144 }
1145
1146 pub fn nack(&mut self, sequence: u32, tick: i64) {
1147 for i in 0..self.sent_packet.len() {
1148 let item = &mut self.sent_packet[i];
1149 if item.1 && item.0.sequence_number == sequence {
1150 self.coalescing_allowed = false;
1153 self.coalesce = false;
1154 raknet_log_debug!(
1155 "packet {}-{}-{} nack {} times",
1156 item.0.sequence_number,
1157 item.0.reliable_frame_index,
1158 item.0.ordered_frame_index,
1159 item.3 + 1
1160 );
1161 let previous = item.0.sequence_number;
1162 self.flight_order_dirty = true;
1163 item.0.sequence_number = self.sequence_number;
1164 self.sequence_number = sequence::next(self.sequence_number);
1165 item.1 = false;
1166 self.retries_pending = true;
1167 item.2 = tick;
1168
1169 if item.4.len() == 64 {
1170 item.4.remove(0);
1171 }
1172 item.4.push(previous);
1173 }
1174 }
1175 }
1176
1177 pub fn ack(&mut self, sequence: u32, tick: i64) {
1178 if self.grouped_acks && self.sent_packet.len() > 1 {
1179 self.ack_ranges(&[(sequence, sequence)], tick);
1180 return;
1181 }
1182 let Some(index) = self
1184 .sent_packet
1185 .iter()
1186 .position(|item| item.0.sequence_number == sequence || item.4.contains(&sequence))
1187 else {
1188 return;
1189 };
1190 let item = self.sent_packet.remove(index);
1191 if self.grouped_acks && self.sent_packet.is_empty() {
1192 self.grouped_acks = false;
1193 }
1194 let released_payload = match &item.0.shared_payload {
1195 Some(payload) if payload.remaining.fetch_sub(1, Ordering::Relaxed) == 1 => {
1196 payload.bytes
1197 }
1198 Some(_) => 0,
1199 None => item.0.data.len(),
1200 };
1201 self.buffered_bytes -= released_payload + Self::FRAME_BUDGET;
1202 if sequence::newer(sequence, self.ack_sequence_number) {
1203 let span = sequence::distance(sequence, self.ack_sequence_number);
1204 let missing: Vec<_> = self
1205 .sent_packet
1206 .iter()
1207 .filter_map(|item| {
1208 let distance =
1209 sequence::distance(item.0.sequence_number, self.ack_sequence_number);
1210 (distance > 0 && distance < span).then_some(item.0.sequence_number)
1211 })
1212 .collect();
1213 for id in missing {
1214 self.nack(id, tick);
1215 }
1216 self.ack_sequence_number = sequence;
1217 }
1218 if item.3 == 0 {
1220 self.update_rto(tick.saturating_sub(item.2).max(0));
1221 }
1222 }
1223
1224 #[inline]
1225 pub fn ack_ranges(&mut self, ranges: &[(u32, u32)], tick: i64) {
1226 if self.grouped_acks {
1227 self.ack_ranges_inner::<true>(ranges, tick);
1228 } else {
1229 self.ack_ranges_inner::<false>(ranges, tick);
1230 }
1231 }
1232
1233 fn ack_ranges_inner<const GROUPED: bool>(&mut self, ranges: &[(u32, u32)], tick: i64) {
1234 if let [(start, end)] = ranges {
1235 if start == end && (!GROUPED || self.sent_packet.len() <= 1) {
1236 self.ack(*start, tick);
1237 return;
1238 }
1239 }
1240 let previous = self.ack_sequence_number;
1243 let mut newest = previous;
1244 let mut latency = (self.srtt, self.rto);
1245 let mut released_bytes = 0;
1246 let mut previous_sample = None;
1247 self.sent_packet.retain_mut(|item| {
1248 let acknowledged_id = std::iter::once(item.0.sequence_number)
1249 .chain(item.4.iter().copied())
1250 .find(|id| {
1251 ranges
1252 .iter()
1253 .any(|&(start, end)| start <= *id && *id <= end)
1254 });
1255 let Some(id) = acknowledged_id else {
1256 return true;
1257 };
1258 let payload_bytes = match &item.0.shared_payload {
1259 Some(payload) if payload.remaining.fetch_sub(1, Ordering::Relaxed) == 1 => {
1260 payload.bytes
1261 }
1262 Some(_) => 0,
1263 None => item.0.data.len(),
1264 };
1265 released_bytes += payload_bytes + Self::FRAME_BUDGET;
1266 if sequence::newer(id, newest) {
1267 newest = id;
1268 }
1269 if item.3 == 0 && (!GROUPED || previous_sample != Some(id)) {
1272 if GROUPED {
1273 previous_sample = Some(id);
1274 }
1275 latency = Self::latency_sample(latency.0, tick.saturating_sub(item.2).max(0));
1276 }
1277 false
1278 });
1279 self.buffered_bytes -= released_bytes;
1280 if GROUPED && self.sent_packet.is_empty() {
1281 self.grouped_acks = false;
1282 }
1283
1284 if self.rto != latency.1 {
1285 self.next_retry = 0;
1286 }
1287 (self.srtt, self.rto) = latency;
1288 if newest != previous {
1289 let span = sequence::distance(newest, previous);
1290 let missing: Vec<_> = self
1291 .sent_packet
1292 .iter()
1293 .filter_map(|item| {
1294 let distance = sequence::distance(item.0.sequence_number, previous);
1295 (distance > 0 && distance < span).then_some(item.0.sequence_number)
1296 })
1297 .collect();
1298 for id in missing {
1299 self.nack(id, tick);
1300 }
1301 self.ack_sequence_number = newest;
1302 }
1303 }
1304
1305 pub fn nack_ranges(&mut self, ranges: &[(u32, u32)], tick: i64) {
1306 if let [(start, end)] = ranges {
1307 if start == end {
1308 self.nack(*start, tick);
1309 return;
1310 }
1311 }
1312 let missing: Vec<_> = self
1313 .sent_packet
1314 .iter()
1315 .filter_map(|item| {
1316 let id = item.0.sequence_number;
1317 ranges
1318 .iter()
1319 .any(|&(start, end)| start <= id && id <= end)
1320 .then_some(id)
1321 })
1322 .collect();
1323 for id in missing {
1324 self.nack(id, tick);
1325 }
1326 }
1327
1328 fn retry_timeout(rto: i64, retries: u32) -> i64 {
1329 let mut timeout = rto;
1330 for _ in 0..retries.min(32) {
1331 timeout = ((timeout as f64 * 1.5) as i64).min(Self::RTO_UBOUND);
1332 }
1333 timeout
1334 }
1335
1336 fn tick(&mut self, tick: i64) {
1337 if tick < self.next_retry {
1338 return;
1339 }
1340 self.next_retry = i64::MAX;
1341 for i in 0..self.sent_packet.len() {
1342 let p = &mut self.sent_packet[i];
1343
1344 let cur_rto = Self::retry_timeout(self.rto, p.3);
1345
1346 if p.1 && tick - p.2 >= cur_rto {
1347 self.coalescing_allowed = false;
1348 self.coalesce = false;
1349 let previous = p.0.sequence_number;
1350 self.flight_order_dirty = true;
1351 p.0.sequence_number = self.sequence_number;
1352 self.sequence_number = sequence::next(self.sequence_number);
1353 p.1 = false;
1354 self.retries_pending = true;
1355 if p.4.len() == 64 {
1356 p.4.remove(0);
1357 }
1358 p.4.push(previous);
1359 } else if p.1 {
1360 self.next_retry = self.next_retry.min(p.2.saturating_add(cur_rto));
1361 }
1362 }
1363 }
1364
1365 pub fn flush(&mut self, tick: i64, peer_addr: &SocketAddr) -> OutgoingFrames {
1366 self.tick(tick);
1367
1368 let capacity = self.packets.len().min(
1371 Self::MAX_IN_FLIGHT_PACKETS.saturating_sub(self.sent_packet.len())
1372 + self.queued_unreliable,
1373 );
1374 let mut ret = OutgoingFrames::with_capacity(capacity);
1375 if self.flight_order_dirty {
1378 self.sent_packet
1379 .sort_unstable_by_key(|packet| packet.0.sequence_number);
1380 self.flight_order_dirty = false;
1381 }
1382
1383 if self.retries_pending {
1384 for packet in &mut self.sent_packet {
1385 if !packet.1 {
1386 raknet_log_debug!(
1387 "{} , packet {}-{}-{} resend {} times",
1388 peer_addr,
1389 packet.0.sequence_number,
1390 packet.0.reliable_frame_index,
1391 packet.0.ordered_frame_index,
1392 packet.3 + 1
1393 );
1394 ret.push(packet.0.clone());
1395 packet.1 = true;
1396 packet.2 = tick;
1397 packet.3 = packet.3.saturating_add(1);
1398 self.next_retry = self
1399 .next_retry
1400 .min(tick.saturating_add(Self::retry_timeout(self.rto, packet.3)));
1401 }
1402 }
1403 self.retries_pending = false;
1404 }
1405
1406 let mut group_sequence = None;
1407 let mut group_bytes = 0;
1408 let mut group_frames = 0;
1409 let datagram_budget = usize::from(self.mtu).saturating_sub(28);
1410 let queued_count = self.packets.len();
1411 for _ in 0..queued_count {
1412 if self.sent_packet.len() >= Self::MAX_IN_FLIGHT_PACKETS && self.queued_unreliable == 0
1413 {
1414 break;
1415 }
1416 let Some(mut packet) = self.packets.pop_front() else {
1417 break;
1418 };
1419 let reliable = packet.is_reliable().unwrap_or(false);
1420 if reliable && self.sent_packet.len() >= Self::MAX_IN_FLIGHT_PACKETS {
1421 self.packets.push_back(packet);
1422 continue;
1423 }
1424
1425 if self.coalesce {
1426 let packable = matches!(packet.reliability(), Ok(Reliability::ReliableOrdered))
1427 && !packet.is_fragment();
1428 let frame_bytes = packet._size().expect("queued frames were validated") - 4;
1429 if packable
1430 && group_sequence.is_some()
1431 && group_frames < Self::MAX_COALESCED_FRAMES
1432 && group_bytes + frame_bytes <= datagram_budget
1433 {
1434 packet.sequence_number = group_sequence.unwrap();
1435 group_bytes += frame_bytes;
1436 group_frames += 1;
1437 self.grouped_acks = true;
1438 ret.coalesced = true;
1439 } else {
1440 packet.sequence_number = self.sequence_number;
1441 self.sequence_number = sequence::next(self.sequence_number);
1442 group_sequence = packable.then_some(packet.sequence_number);
1443 group_bytes = 4 + frame_bytes;
1444 group_frames = 1;
1447 }
1448 } else {
1449 packet.sequence_number = self.sequence_number;
1450 self.sequence_number = sequence::next(self.sequence_number);
1451 }
1452
1453 if reliable {
1454 ret.push(packet.clone());
1455 if self
1456 .sent_packet
1457 .last()
1458 .is_some_and(|previous| previous.0.sequence_number > packet.sequence_number)
1459 {
1460 self.flight_order_dirty = true;
1461 }
1462 self.sent_packet.push((packet, true, tick, 0, Vec::new()));
1463 self.next_retry = self.next_retry.min(tick.saturating_add(self.rto));
1464 } else {
1465 self.queued_unreliable -= 1;
1466 self.buffered_bytes -= packet.data.len() + Self::FRAME_BUDGET;
1467 ret.push(packet);
1468 }
1469 }
1470
1471 ret
1472 }
1473
1474 pub fn is_empty(&self) -> bool {
1475 self.packets.is_empty() && self.sent_packet.is_empty()
1476 }
1477
1478 pub fn get_reliable_queue_size(&self) -> usize {
1479 self.packets.len()
1480 }
1481
1482 pub fn get_sent_queue_size(&self) -> usize {
1483 self.sent_packet.len()
1484 }
1485}
1486
1487#[test]
1488fn malformed_datagrams_are_rejected() {
1489 assert!(FrameVec::new(&[0x80, 0, 0]).is_err());
1490 assert!(FrameVec::new(&[0x10, 0, 0, 0]).is_err());
1491}
1492
1493#[test]
1494fn send_queue_rejects_an_invalid_mtu() {
1495 let mut send_queue = SendQ::new(59);
1496 assert!(send_queue.insert(Reliability::Reliable, &[0xfe]).is_err());
1497}
1498
1499#[tokio::test]
1500async fn test_recvq_orders_channels_independently() {
1501 let mut recvq = RecvQ::new();
1502
1503 let mut later_on_channel_one = FrameSetPacket::new(Reliability::ReliableOrdered, vec![1]);
1504 later_on_channel_one.sequence_number = 0;
1505 later_on_channel_one.order_channel = 1;
1506 later_on_channel_one.ordered_frame_index = 1;
1507 recvq.insert(later_on_channel_one).unwrap();
1508
1509 let mut first_on_channel_two = FrameSetPacket::new(Reliability::ReliableOrdered, vec![2]);
1510 first_on_channel_two.sequence_number = 1;
1511 first_on_channel_two.reliable_frame_index = 1;
1512 first_on_channel_two.order_channel = 2;
1513 first_on_channel_two.ordered_frame_index = 0;
1514 recvq.insert(first_on_channel_two).unwrap();
1515
1516 let ready = recvq.flush(&"127.0.0.1:0".parse().unwrap());
1517 assert_eq!(ready.len(), 1);
1518 assert_eq!(ready[0].order_channel, 2);
1519
1520 let mut first_on_channel_one = FrameSetPacket::new(Reliability::ReliableOrdered, vec![0]);
1521 first_on_channel_one.sequence_number = 2;
1522 first_on_channel_one.reliable_frame_index = 2;
1523 first_on_channel_one.order_channel = 1;
1524 first_on_channel_one.ordered_frame_index = 0;
1525 recvq.insert(first_on_channel_one).unwrap();
1526
1527 let ready = recvq.flush(&"127.0.0.1:0".parse().unwrap());
1528 assert_eq!(ready.len(), 2);
1529 assert_eq!(ready[0].ordered_frame_index, 0);
1530 assert_eq!(ready[1].ordered_frame_index, 1);
1531 assert!(ready.iter().all(|frame| frame.order_channel == 1));
1532}
1533
1534#[tokio::test]
1535async fn test_sendq_maintains_ordered_indexes_per_channel() {
1536 let mut sendq = SendQ::new(1500);
1537 sendq
1538 .insert_with_order_channel(Reliability::ReliableOrdered, &[0xfe, 1], 3)
1539 .unwrap();
1540 sendq
1541 .insert_with_order_channel(Reliability::ReliableOrdered, &[0xfe, 2], 9)
1542 .unwrap();
1543
1544 let sent = sendq.flush(0, &"127.0.0.1:0".parse().unwrap());
1545 assert_eq!(sent.len(), 2);
1546 assert_eq!(sent[0].order_channel, 3);
1547 assert_eq!(sent[0].ordered_frame_index, 0);
1548 assert_eq!(sent[1].order_channel, 9);
1549 assert_eq!(sent[1].ordered_frame_index, 0);
1550}
1551
1552#[tokio::test]
1553async fn test_ackset() {
1554 let mut ackset = ACKSet::default();
1555
1556 ackset.insert(0);
1557 ackset.insert(1);
1558 ackset.insert(2);
1559 ackset.insert(4);
1560
1561 let acks = ackset.get_ack();
1562
1563 assert!(acks == vec![(0, 2), (4, 4)]);
1564
1565 let mut ackset = ACKSet::default();
1566
1567 ackset.insert(0);
1568 ackset.insert(1);
1569 ackset.insert(2);
1570 ackset.insert(6);
1571
1572 let acks = ackset.get_ack();
1573
1574 assert!(acks == vec![(0, 2), (6, 6)]);
1575
1576 let acks = ackset.get_ack();
1577
1578 assert!(acks == vec![]);
1579
1580 ackset.insert(0);
1581 ackset.insert(2);
1582
1583 let acks = ackset.get_ack();
1584
1585 assert!(acks == vec![(0, 0), (2, 2)]);
1586}
1587
1588#[tokio::test]
1589async fn test_frame_serialize_deserialize() {
1590 let p: Vec<u8> = [
1592 132, 0, 0, 0, 64, 0, 144, 0, 0, 0, 9, 146, 33, 7, 47, 57, 18, 128, 111, 0, 0, 0, 0, 20,
1593 200, 47, 41, 0,
1594 ]
1595 .to_vec();
1596
1597 let a = FrameSetPacket::deserialize(&p).unwrap();
1598 assert!(a.0.serialize().unwrap() == p);
1599}
1600
1601#[tokio::test]
1602async fn test_recvq() {
1603 let mut r = RecvQ::new();
1604 let mut p = FrameSetPacket::new(Reliability::Reliable, vec![]);
1605 p.sequence_number = 0;
1606 p.ordered_frame_index = 0;
1607 r.insert(p).unwrap();
1608
1609 let mut p = FrameSetPacket::new(Reliability::Reliable, vec![]);
1610 p.sequence_number = 1;
1611 p.reliable_frame_index = 1;
1612 p.ordered_frame_index = 1;
1613 r.insert(p).unwrap();
1614
1615 let ret = r.flush(&"0.0.0.0:0".parse().unwrap());
1616 assert!(ret.len() == 2);
1617}
1618
1619#[tokio::test]
1620async fn test_recvq_fragment() {
1621 let mut r = RecvQ::new();
1622 let mut p = FrameSetPacket::new(Reliability::ReliableOrdered, vec![1]);
1623 p.flags |= 16;
1624 p.sequence_number = 0;
1625 p.ordered_frame_index = 0;
1626 p.compound_id = 1;
1627 p.compound_size = 3;
1628 p.fragment_index = 0;
1629 p.order_channel = 7;
1630 r.insert(p).unwrap();
1631
1632 let mut p = FrameSetPacket::new(Reliability::ReliableOrdered, vec![2]);
1633 p.flags |= 16;
1634 p.sequence_number = 1;
1635 p.reliable_frame_index = 1;
1636 p.ordered_frame_index = 0;
1637 p.compound_id = 1;
1638 p.compound_size = 3;
1639 p.fragment_index = 1;
1640 p.order_channel = 7;
1641 r.insert(p).unwrap();
1642
1643 let mut p = FrameSetPacket::new(Reliability::ReliableOrdered, vec![3]);
1644 p.flags |= 16;
1645 p.sequence_number = 2;
1646 p.reliable_frame_index = 2;
1647 p.ordered_frame_index = 0;
1648 p.compound_id = 1;
1649 p.compound_size = 3;
1650 p.fragment_index = 2;
1651 p.order_channel = 7;
1652 r.insert(p).unwrap();
1653
1654 let ret = r.flush(&"0.0.0.0:0".parse().unwrap());
1655 assert!(ret.len() == 1);
1656 assert_eq!(ret[0].data.as_ref(), &[1, 2, 3]);
1657 assert_eq!(ret[0].order_channel, 7);
1658}
1659
1660#[tokio::test]
1661async fn test_sendq() {
1662 let mut s = SendQ::new(1500);
1663 let p = FrameSetPacket::new(Reliability::Reliable, vec![]);
1664 s.insert(Reliability::Reliable, &p.serialize().unwrap())
1665 .unwrap();
1666
1667 let p = FrameSetPacket::new(Reliability::Reliable, vec![]);
1668 s.insert(Reliability::Reliable, &p.serialize().unwrap())
1669 .unwrap();
1670
1671 let sockaddr: SocketAddr = "127.0.0.1:8000".parse().unwrap();
1672 let ret = s.flush(0, &sockaddr);
1673 assert!(ret.len() == 2);
1674
1675 s.ack(0, 0);
1676 s.ack(1, 0);
1677
1678 let ret = s.flush(300, &sockaddr);
1679 assert!(ret.is_empty());
1680}
1681
1682#[test]
1683fn send_queue_pipelines_reliable_packets_with_a_bounded_window() {
1684 let mut sendq = SendQ::new(1500);
1685 let peer = "127.0.0.1:8000".parse().unwrap();
1686
1687 for index in 0..SendQ::MAX_IN_FLIGHT_PACKETS + 1 {
1688 sendq
1689 .insert(Reliability::ReliableOrdered, &[0xfe, index as u8])
1690 .unwrap();
1691 let sent = sendq.flush(0, &peer);
1692 if index < SendQ::MAX_IN_FLIGHT_PACKETS {
1693 assert_eq!(sent.len(), 1);
1694 assert_eq!(sent[0].ordered_frame_index, index as u32);
1695 } else {
1696 assert!(sent.is_empty());
1697 }
1698 }
1699
1700 assert_eq!(sendq.get_sent_queue_size(), SendQ::MAX_IN_FLIGHT_PACKETS);
1701 assert_eq!(sendq.get_reliable_queue_size(), 1);
1702
1703 sendq.ack(0, 1);
1704 let sent = sendq.flush(1, &peer);
1705 assert_eq!(sent.len(), 1);
1706 assert_eq!(
1707 sent[0].ordered_frame_index,
1708 SendQ::MAX_IN_FLIGHT_PACKETS as u32
1709 );
1710 assert_eq!(sendq.get_sent_queue_size(), SendQ::MAX_IN_FLIGHT_PACKETS);
1711 assert_eq!(sendq.get_reliable_queue_size(), 0);
1712}
1713
1714#[test]
1715fn send_queue_retransmits_immediately_after_nack() {
1716 let mut sendq = SendQ::new(1500);
1717 let peer = "127.0.0.1:8000".parse().unwrap();
1718 sendq.insert(Reliability::Reliable, &[0xfe]).unwrap();
1719
1720 let first = sendq.flush(0, &peer);
1721 assert_eq!(first.len(), 1);
1722 assert_eq!(first[0].sequence_number, 0);
1723
1724 sendq.nack(0, 1);
1725 let retransmitted = sendq.flush(1, &peer);
1726 assert_eq!(retransmitted.len(), 1);
1727 assert_eq!(retransmitted[0].sequence_number, 1);
1728}
1729
1730#[tokio::test]
1731async fn test_client_packet1() {
1732 let a = [
1733 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,
1734 189, 203, 114, 234, 74, 183, 239, 185, 79, 175, 170, 30, 99, 159, 110, 125, 59, 36, 1, 222,
1735 166, 122, 19, 35, 97, 48, 18, 19, 161, 11, 82, 69, 197, 23, 128, 248, 38, 32, 9, 107, 218,
1736 152, 91, 69, 61, 79, 53, 234, 141, 78, 243, 52, 234, 5, 170, 119, 90, 149, 41, 165, 48, 41,
1737 11, 12, 2, 95, 214, 154, 255, 198, 47, 86, 120, 77, 15, 75, 202, 203, 24, 57, 46, 153, 249,
1738 223, 255, 199, 127, 253, 47, 255, 246, 111, 255, 229, 255, 253, 111, 255, 227, 191, 254,
1739 63, 255, 243, 191, 253, 219, 255, 249, 239, 163, 201, 96, 58, 255, 247, 255, 237, 127, 255,
1740 247, 241, 166, 53, 25, 54, 70, 211, 206, 180, 165, 152, 91, 181, 172, 221, 53, 159, 155,
1741 243, 95, 162, 215, 107, 222, 52, 125, 177, 105, 247, 61, 165, 107, 5, 205, 158, 84, 29,
1742 244, 250, 209, 111, 85, 214, 106, 166, 21, 52, 122, 91, 93, 209, 77, 165, 222, 51, 117,
1743 215, 21, 20, 197, 109, 148, 55, 166, 220, 122, 234, 216, 101, 105, 108, 43, 157, 241, 180,
1744 218, 49, 26, 250, 189, 165, 184, 243, 129, 242, 171, 50, 170, 7, 247, 109, 241, 113, 173,
1745 221, 235, 205, 225, 60, 18, 218, 226, 196, 234, 134, 186, 57, 240, 43, 83, 43, 112, 167,
1746 150, 57, 89, 13, 75, 90, 205, 146, 244, 123, 183, 46, 111, 199, 182, 176, 214, 182, 147,
1747 141, 214, 16, 187, 227, 134, 38, 247, 234, 150, 219, 107, 84, 231, 78, 201, 17, 186, 115,
1748 189, 174, 139, 154, 51, 82, 212, 210, 192, 178, 30, 13, 49, 216, 186, 179, 218, 203, 192,
1749 143, 238, 61, 177, 37, 186, 211, 234, 147, 41, 105, 91, 87, 169, 61, 142, 239, 22, 207,
1750 170, 28, 205, 199, 117, 253, 121, 32, 107, 117, 213, 119, 166, 255, 234, 62, 254, 7, 249,
1751 238, 153, 219, 111, 9, 3, 219, 141, 28, 73, 17, 92, 83, 17, 189, 198, 100, 57, 10, 3, 97,
1752 76, 190, 221, 187, 39, 127, 167, 183, 154, 186, 253, 201, 170, 57, 35, 239, 61, 235, 150,
1753 58, 117, 103, 173, 25, 242, 186, 125, 215, 138, 220, 134, 245, 226, 53, 200, 239, 90, 53,
1754 209, 9, 215, 145, 35, 44, 130, 241, 153, 109, 214, 145, 45, 117, 32, 5, 229, 177, 185, 158,
1755 121, 210, 122, 48, 154, 7, 150, 105, 107, 162, 106, 233, 146, 41, 87, 23, 61, 163, 117,
1756 167, 149, 92, 167, 83, 215, 94, 220, 70, 165, 111, 6, 214, 196, 110, 8, 37, 237, 222, 107,
1757 184, 161, 76, 191, 243, 217, 19, 149, 142, 213, 112, 55, 134, 226, 54, 29, 163, 213, 29,
1758 218, 214, 203, 72, 246, 90, 154, 31, 61, 246, 76, 209, 234, 133, 74, 223, 158, 183, 126,
1759 15, 77, 241, 119, 199, 168, 117, 134, 194, 162, 163, 7, 90, 167, 59, 183, 218, 110, 67, 40,
1760 143, 130, 32, 178, 239, 181, 208, 233, 63, 110, 123, 91, 85, 26, 223, 221, 174, 45, 163,
1761 41, 245, 238, 107, 247, 170, 18, 149, 123, 155, 170, 173, 90, 206, 148, 124, 243, 139, 19,
1762 58, 211, 206, 76, 150, 180, 250, 72, 234, 212, 127, 73, 154, 161, 84, 239, 126, 253, 199,
1763 63, 158, 123, 119, 119, 203, 126, 120, 247, 220, 113, 55, 245, 97, 189, 212, 172, 255, 136,
1764 30, 159, 164, 122, 255, 95, 245, 141, 220, 159, 41, 149, 169, 218, 173, 174, 5, 249, 247,
1765 83, 205, 188, 185, 81, 220, 113, 251, 229, 101, 213, 249, 245, 123, 212, 248, 71, 239, 105,
1766 48, 151, 68, 103, 32, 175, 215, 63, 220, 113, 216, 169, 252, 243, 247, 211, 118, 230, 255,
1767 179, 210, 173, 173, 123, 230, 203, 63, 170, 163, 127, 12, 52, 39, 26, 247, 158, 182, 147,
1768 113, 52, 154, 4, 75, 219, 122, 168, 223, 120, 255, 152, 223, 138, 173, 135, 122, 79, 43,
1769 245, 27, 255, 254, 191, 210, 81, 92, 214, 250, 38, 29, 197, 90, 79, 9, 74, 164, 149, 221,
1770 158, 188, 88, 218, 126, 112, 51, 152, 213, 234, 93, 50, 12, 117, 255, 89, 208, 77, 171,
1771 214, 21, 2, 217, 182, 189, 154, 110, 76, 20, 163, 177, 136, 198, 247, 129, 234, 148, 188,
1772 103, 210, 74, 21, 203, 82, 102, 158, 161, 152, 94, 80, 251, 57, 52, 253, 77, 151, 244, 139,
1773 93, 255, 181, 29, 134, 250, 139, 37, 182, 44, 199, 154, 44, 180, 173, 94, 210, 67, 119,
1774 162, 217, 238, 168, 45, 173, 75, 166, 89, 49, 221, 121, 75, 181, 252, 201, 68, 13, 106, 11,
1775 215, 174, 172, 116, 193, 151, 122, 225, 164, 101, 88, 214, 131, 99, 121, 131, 81, 24, 45,
1776 12, 251, 177, 162, 202, 149, 101, 79, 168, 52, 76, 161, 114, 231, 153, 11, 127, 104, 76,
1777 54, 182, 29, 56, 35, 201, 157, 140, 103, 90, 91, 221, 186, 229, 126, 182, 7, 196, 213, 210,
1778 154, 41, 118, 115, 186, 154, 58, 246, 122, 78, 70, 227, 84, 183, 212, 109, 167, 222, 37,
1779 35, 153, 14, 228, 156, 142, 145, 201, 36, 38, 19, 59, 212, 151, 67, 179, 178, 28, 134, 90,
1780 64, 196, 74, 234, 204, 41, 107, 51, 191, 172, 209, 137, 62, 107, 10, 228, 191, 2, 249, 125,
1781 129, 14, 232, 81, 73, 141, 155, 111, 40, 69, 68, 110, 68, 59, 60, 24, 223, 255, 72, 255,
1782 46, 249, 125, 89, 84, 233, 223, 37, 127, 107, 52, 215, 35, 55, 12, 102, 78, 95, 15, 186,
1783 125, 75, 24, 52, 170, 155, 65, 95, 175, 52, 103, 145, 48, 154, 91, 1, 253, 123, 78, 191,
1784 187, 255, 78, 165, 68, 54, 240, 73, 243, 8, 244, 119, 205, 123, 107, 58, 108, 4, 179, 158,
1785 100, 85, 232, 39, 25, 230, 196, 245, 4, 171, 102, 155, 147, 246, 80, 140, 90, 227, 240,
1786 113, 213, 21, 20, 221, 54, 221, 182, 38, 91, 74, 215, 212, 90, 186, 18, 204, 187, 166, 181,
1787 26, 26, 90, 93, 187, 91, 180, 212, 128, 40, 129, 198, 194, 232, 88, 171, 229, 80, 28, 109,
1788 92, 203, 43, 121, 115, 125, 221, 19, 162, 178, 102, 138, 174, 109, 77, 12, 215, 168, 217,
1789 186, 36, 151, 71, 164, 139, 61, 223, 26, 12, 132, 245, 114, 68, 148, 196, 64, 138, 106,
1790 166, 160, 77, 6, 210, 66, 232, 137, 122, 107, 228, 59, 226, 184, 111, 169, 35, 203, 85, 61,
1791 165, 86, 25, 247, 221, 126, 215, 94, 76, 186, 118, 180, 30, 207, 38, 91, 77, 209, 219, 61,
1792 203, 213, 186, 225, 164, 231, 206, 213, 167, 14, 153, 252, 142, 45, 170, 227, 198, 164, 57,
1793 188, 143, 30, 109, 197, 93, 147, 103, 205, 173, 251, 214, 202, 178, 221, 27, 39, 80, 250,
1794 134, 160, 210, 46, 50, 255, 53, 31, 119, 199, 195, 137, 182, 49, 141, 199, 40, 108, 191,
1795 244, 212, 222, 63, 198, 213, 255, 188, 239, 206, 102, 155, 223, 102, 235, 159, 255, 252,
1796 241, 16, 244, 194, 233, 68, 170, 7, 27, 189, 211, 250, 189, 104, 143, 255, 241, 159, 66,
1797 221, 121, 169, 73, 98, 189, 90, 107, 78, 23, 29, 229, 215, 96, 54, 27, 153, 183, 182, 223,
1798 155, 223, 55, 127, 24, 227, 219, 167, 217, 237, 188, 31, 74, 154, 226, 255, 115, 220, 169,
1799 143, 165, 231, 135, 95, 245, 217, 118, 174, 201, 134, 255, 88, 121, 92, 132, 129, 123, 251,
1800 175, 250, 204, 189, 169, 46, 138, 78, 144, 126, 109, 161, 10, 170, 240, 32, 248, 27, 83,
1801 156, 172, 6, 162, 90, 233, 223, 85, 151, 214, 182, 21, 88, 37, 79, 242, 238, 149, 118, 143,
1802 152, 10, 131, 232, 111, 91, 209, 2, 85, 113, 239, 29, 99, 178, 37, 170, 76, 210, 173, 232,
1803 201, 104, 84, 183, 230, 220, 122, 26, 248, 138, 209, 149, 148, 167, 65, 73, 111, 91, 50,
1804 249, 194, 153, 85, 241, 204, 245, 218, 242, 215, 130, 121, 31, 84, 188, 192, 171, 13, 36,
1805 165, 54, 152, 43, 55, 157, 123, 85, 176, 228, 69, 203, 242, 197, 187, 129, 210, 10, 71,
1806 155, 231, 50, 25, 45, 147, 161, 185, 46, 15, 228, 201, 243, 56, 156, 56, 214, 92, 9, 212,
1807 134, 103, 142, 230, 53, 203, 157, 71, 83, 211, 242, 126, 118, 55, 196,
1808 ];
1809
1810 let b = FrameVec::new(&a).unwrap();
1811 assert!(b.frames.len() == 1);
1812 assert!(b.frames[0].is_fragment());
1813}
1814
1815#[tokio::test]
1816async fn test_client_packet2() {
1817 let p0 = [
1819 132, 0, 0, 0, 64, 0, 144, 0, 0, 0, 9, 162, 70, 235, 28, 218, 182, 26, 192, 0, 0, 0, 0, 16,
1820 151, 43, 113, 0,
1821 ];
1822 let p1 = [
1824 132, 1, 0, 0, 64, 0, 144, 0, 0, 0, 9, 162, 70, 235, 28, 218, 182, 26, 192, 0, 0, 0, 0, 16,
1825 151, 43, 113, 0,
1826 ];
1827 let p2 = [
1829 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,
1830 225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 196, 178, 112, 86, 5, 59, 97, 219, 15, 0,
1831 0, 0, 6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 188, 210, 59, 150, 246,
1832 167, 182, 213, 33, 0, 0, 0, 6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0,
1833 132, 194, 47, 23, 175, 46, 78, 138, 23, 0, 0, 0, 6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128,
1834 0, 0, 0, 0, 0, 0, 136, 219, 85, 240, 191, 125, 172, 233, 10, 0, 0, 0, 6, 23, 0, 225, 138,
1835 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 80, 211, 212, 44, 191, 227, 124, 40, 13, 0, 0, 0,
1836 6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 77, 13, 19, 149, 102, 140, 134,
1837 77, 16, 0, 0, 0, 4, 83, 237, 239, 254, 225, 138, 4, 63, 87, 214, 254, 225, 138, 4, 83, 236,
1838 159, 254, 225, 138, 4, 63, 87, 46, 254, 225, 138, 4, 63, 87, 56, 128, 225, 138, 4, 63, 87,
1839 56, 123, 225, 138, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255,
1840 255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255,
1841 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1842 0, 0, 0, 0, 0, 16, 151, 56, 146, 0, 0, 72, 0, 0, 0, 0, 0, 16, 151, 56, 146,
1843 ];
1844 let p3 = [132, 3, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 16, 151, 56, 161];
1846 let p4 = [
1848 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,
1849 189, 203, 114, 234, 202, 214, 239, 249, 157, 94, 85, 61, 198, 119, 186, 181, 79, 72, 2,
1850 188, 77, 245, 140, 145, 48, 24, 137, 137, 208, 5, 169, 162, 98, 7, 32, 246, 4, 36, 97, 77,
1851 155, 201, 173, 162, 158, 231, 188, 81, 53, 171, 89, 47, 80, 189, 211, 170, 148, 148, 194,
1852 164, 156, 96, 16, 248, 178, 214, 252, 55, 126, 177, 194, 107, 122, 88, 82, 94, 198, 200,
1853 113, 201, 204, 255, 231, 127, 252, 215, 255, 242, 31, 255, 241, 95, 254, 223, 255, 251,
1854 127, 252, 215, 255, 254, 63, 255, 199, 127, 252, 159, 255, 57, 154, 12, 166, 243, 255, 252,
1855 223, 254, 247, 255, 28, 111, 90, 147, 97, 99, 52, 237, 76, 91, 138, 185, 85, 203, 218, 125,
1856 243, 165, 57, 255, 41, 122, 189, 230, 77, 211, 23, 155, 118, 223, 83, 186, 86, 208, 236,
1857 73, 213, 65, 175, 31, 253, 82, 101, 173, 102, 90, 65, 163, 183, 213, 21, 221, 84, 234, 61,
1858 83, 119, 93, 65, 81, 172, 70, 107, 233, 25, 138, 210, 179, 149, 23, 79, 18, 205, 142, 41,
1859 8, 163, 134, 179, 177, 77, 87, 182, 131, 86, 121, 80, 106, 213, 135, 125, 179, 162, 139,
1860 122, 203, 241, 131, 138, 109, 4, 93, 51, 168, 173, 135, 74, 75, 29, 214, 29, 97, 104, 4,
1861 55, 222, 182, 86, 26, 205, 189, 242, 192, 127, 217, 90, 219, 174, 48, 40, 233, 115, 171,
1862 49, 105, 141, 109, 189, 63, 182, 91, 63, 70, 141, 167, 237, 120, 166, 148, 213, 173, 92,
1863 30, 110, 149, 78, 91, 12, 66, 93, 241, 5, 93, 208, 45, 45, 156, 56, 143, 130, 18, 90, 194,
1864 147, 104, 55, 116, 209, 8, 163, 103, 211, 94, 151, 134, 91, 189, 50, 174, 235, 191, 135,
1865 138, 213, 237, 218, 21, 211, 182, 252, 233, 191, 187, 79, 255, 141, 124, 247, 204, 237,
1866 183, 132, 129, 237, 70, 142, 164, 8, 174, 169, 136, 94, 99, 178, 28, 133, 129, 48, 38, 223,
1867 238, 61, 180, 68, 183, 183, 154, 186, 253, 201, 170, 57, 123, 90, 107, 179, 110, 169, 83,
1868 119, 214, 154, 33, 175, 219, 247, 173, 200, 109, 88, 191, 189, 6, 249, 93, 171, 38, 58,
1869 225, 58, 114, 132, 69, 48, 62, 179, 205, 58, 178, 165, 14, 164, 160, 60, 54, 215, 51, 79,
1870 90, 15, 70, 243, 192, 50, 109, 77, 84, 45, 93, 50, 229, 234, 162, 103, 180, 238, 181, 146,
1871 235, 116, 234, 218, 111, 183, 81, 233, 155, 129, 53, 177, 27, 66, 73, 123, 240, 26, 110,
1872 40, 139, 238, 180, 250, 226, 137, 74, 199, 106, 184, 27, 67, 113, 155, 142, 209, 234, 14,
1873 109, 235, 247, 72, 246, 90, 154, 31, 61, 245, 76, 209, 234, 133, 74, 223, 158, 183, 126,
1874 13, 77, 241, 87, 199, 168, 117, 134, 194, 162, 163, 7, 90, 167, 59, 183, 218, 110, 67, 40,
1875 143, 130, 32, 178, 31, 180, 208, 233, 63, 109, 123, 91, 85, 26, 223, 223, 174, 45, 163, 41,
1876 245, 30, 106, 15, 170, 18, 149, 123, 155, 170, 173, 90, 206, 148, 124, 243, 111, 39, 116,
1877 166, 157, 153, 44, 105, 245, 145, 212, 169, 255, 148, 52, 67, 169, 222, 255, 252, 111, 237,
1878 167, 127, 74, 191, 234, 254, 100, 169, 140, 42, 171, 201, 92, 173, 142, 252, 127, 77, 86,
1879 247, 77, 251, 95, 254, 175, 127, 215, 127, 223, 246, 42, 255, 26, 253, 235, 165, 108, 133,
1880 255, 246, 151, 203, 202, 211, 250, 151, 175, 12, 203, 193, 124, 221, 155, 255, 67, 126,
1881 190, 109, 253, 99, 242, 243, 95, 211, 167, 219, 187, 237, 157, 107, 254, 43, 24, 107, 81,
1882 79, 22, 171, 225, 38, 252, 183, 240, 24, 4, 255, 114, 31, 21, 213, 235, 11, 195, 81, 239,
1883 159, 253, 161, 97, 169, 222, 77, 215, 41, 173, 164, 231, 254, 68, 157, 151, 199, 131, 31,
1884 15, 51, 229, 63, 255, 215, 120, 20, 151, 181, 190, 25, 143, 98, 173, 167, 4, 37, 210, 202,
1885 110, 79, 94, 44, 109, 63, 184, 25, 204, 106, 245, 174, 165, 184, 186, 255, 34, 232, 166,
1886 85, 235, 10, 129, 108, 219, 94, 77, 55, 38, 138, 209, 88, 68, 227, 135, 64, 117, 74, 222,
1887 11, 105, 165, 138, 101, 41, 51, 50, 138, 77, 47, 168, 253, 24, 154, 254, 166, 75, 250, 197,
1888 174, 255, 220, 14, 67, 253, 183, 37, 182, 44, 199, 154, 44, 180, 173, 94, 210, 67, 119,
1889 162, 217, 238, 168, 45, 173, 75, 166, 89, 49, 221, 121, 75, 181, 252, 201, 68, 13, 106, 11,
1890 215, 174, 172, 116, 193, 151, 122, 225, 164, 101, 88, 214, 163, 99, 121, 131, 81, 24, 45,
1891 12, 251, 169, 162, 202, 149, 101, 79, 168, 52, 76, 161, 114, 239, 153, 11, 127, 104, 76,
1892 54, 182, 29, 56, 35, 201, 157, 140, 103, 90, 91, 221, 186, 229, 126, 190, 7, 196, 213, 210,
1893 154, 41, 118, 115, 186, 154, 58, 246, 122, 78, 70, 227, 84, 183, 212, 109, 167, 222, 37,
1894 35, 57, 30, 200, 156, 142, 145, 201, 36, 38, 19, 59, 212, 151, 67, 179, 178, 28, 134, 90,
1895 64, 196, 74, 234, 204, 41, 107, 51, 191, 172, 197, 19, 125, 214, 20, 200, 127, 5, 242, 251,
1896 66, 60, 160, 71, 37, 53, 105, 190, 161, 20, 17, 185, 81, 220, 225, 193, 248, 225, 46, 251,
1897 187, 228, 247, 101, 81, 141, 255, 46, 249, 91, 163, 185, 30, 185, 97, 48, 115, 250, 122,
1898 208, 237, 91, 194, 160, 81, 221, 12, 250, 122, 165, 57, 139, 132, 209, 220, 10, 226, 191,
1899 231, 244, 187, 251, 239, 84, 74, 101, 3, 159, 52, 143, 16, 255, 174, 249, 96, 77, 135, 141,
1900 96, 214, 147, 172, 74, 252, 73, 134, 57, 113, 61, 193, 170, 217, 230, 164, 61, 20, 163,
1901 214, 56, 124, 90, 117, 5, 69, 39, 10, 164, 173, 201, 150, 210, 53, 181, 150, 174, 4, 243,
1902 174, 105, 173, 134, 134, 86, 215, 238, 23, 45, 53, 208, 156, 81, 99, 97, 116, 172, 213,
1903 114, 40, 142, 54, 174, 229, 149, 188, 185, 190, 238, 9, 81, 89, 51, 69, 215, 182, 38, 134,
1904 107, 212, 108, 93, 146, 203, 35, 210, 197, 158, 111, 13, 6, 194, 122, 57, 18, 91, 226, 64,
1905 138, 106, 166, 160, 77, 6, 210, 66, 232, 17, 165, 52, 242, 29, 113, 220, 183, 212, 145,
1906 229, 170, 158, 82, 171, 140, 251, 110, 191, 107, 47, 38, 93, 59, 90, 143, 103, 147, 173,
1907 166, 232, 237, 158, 229, 106, 221, 112, 210, 115, 231, 234, 115, 135, 76, 126, 199, 22,
1908 213, 113, 99, 210, 28, 62, 68, 79, 182, 226, 174, 201, 179, 230, 214, 67, 107, 101, 217,
1909 238, 141, 19, 40, 125, 67, 80, 227, 46, 50, 255, 61, 31, 119, 199, 195, 137, 182, 49, 141,
1910 167, 40, 108, 255, 238, 169, 189, 127, 140, 171, 255, 124, 232, 206, 102, 155, 95, 102,
1911 235, 95, 255, 186, 123, 12, 122, 225, 116, 34, 213, 131, 141, 222, 105, 253, 90, 180, 199,
1912 255, 248, 167, 80, 119, 126, 215, 36, 177, 94, 173, 53, 167, 139, 142, 242, 115, 48, 155,
1913 141, 204, 91, 219, 239, 205, 31, 154, 119, 198, 248, 246, 121, 118, 59, 239, 135, 146, 166,
1914 248, 255, 26, 119, 234, 99, 233, 229, 241, 103, 125, 182, 157, 107, 178, 225, 63, 85, 158,
1915 22, 97, 224, 222, 254, 187, 62, 115, 111, 170, 139, 162, 19, 164, 95, 91, 168, 130, 42, 60,
1916 10, 254, 198, 20, 39, 171, 129, 168, 86, 250, 247, 213, 165, 181, 109, 5, 86, 201, 147,
1917 188, 7, 165, 221, 35, 166, 194, 176, 2, 215, 86, 180, 64, 85, 220, 7, 199, 152, 108, 137,
1918 42, 147, 116, 43, 122, 54, 26, 213, 173, 57, 183, 158, 7, 190, 98, 116, 37, 229, 153, 168,
1919 243, 182, 37, 147, 47, 156, 89, 21, 207, 92, 175, 45, 127, 45, 152, 15, 65, 197, 11, 188,
1920 218, 64, 82, 106, 131, 185, 114, 211, 121, 80, 5, 75, 94, 180, 44, 95, 188, 31, 40, 173,
1921 112, 180, 121, 41, 147, 209, 50, 25, 154, 235, 242, 64, 158, 188, 140, 137, 154, 183, 230,
1922 74, 160, 54, 60, 115, 52, 175, 89, 238, 60, 154, 154, 150, 247, 163, 187,
1923 ];
1924 let p5 = [
1926 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,
1927 225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 196, 178, 112, 86, 5, 59, 97, 219, 15, 0,
1928 0, 0, 6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 188, 210, 59, 150, 246,
1929 167, 182, 213, 33, 0, 0, 0, 6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0,
1930 132, 194, 47, 23, 175, 46, 78, 138, 23, 0, 0, 0, 6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128,
1931 0, 0, 0, 0, 0, 0, 136, 219, 85, 240, 191, 125, 172, 233, 10, 0, 0, 0, 6, 23, 0, 225, 138,
1932 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 80, 211, 212, 44, 191, 227, 124, 40, 13, 0, 0, 0,
1933 6, 23, 0, 225, 138, 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 77, 13, 19, 149, 102, 140, 134,
1934 77, 16, 0, 0, 0, 4, 83, 237, 239, 254, 225, 138, 4, 63, 87, 214, 254, 225, 138, 4, 83, 236,
1935 159, 254, 225, 138, 4, 63, 87, 46, 254, 225, 138, 4, 63, 87, 56, 128, 225, 138, 4, 63, 87,
1936 56, 123, 225, 138, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255,
1937 255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255,
1938 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 4, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1939 0, 0, 0, 0, 0, 16, 151, 56, 146,
1940 ];
1941 let p6 = [
1943 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,
1944 189, 203, 114, 234, 202, 214, 239, 249, 157, 94, 85, 61, 198, 119, 186, 181, 79, 72, 2,
1945 188, 77, 245, 140, 145, 48, 24, 137, 137, 208, 5, 169, 162, 98, 7, 32, 246, 4, 36, 97, 77,
1946 155, 201, 173, 162, 158, 231, 188, 81, 53, 171, 89, 47, 80, 189, 211, 170, 148, 148, 194,
1947 164, 156, 96, 16, 248, 178, 214, 252, 55, 126, 177, 194, 107, 122, 88, 82, 94, 198, 200,
1948 113, 201, 204, 255, 231, 127, 252, 215, 255, 242, 31, 255, 241, 95, 254, 223, 255, 251,
1949 127, 252, 215, 255, 254, 63, 255, 199, 127, 252, 159, 255, 57, 154, 12, 166, 243, 255, 252,
1950 223, 254, 247, 255, 28, 111, 90, 147, 97, 99, 52, 237, 76, 91, 138, 185, 85, 203, 218, 125,
1951 243, 165, 57, 255, 41, 122, 189, 230, 77, 211, 23, 155, 118, 223, 83, 186, 86, 208, 236,
1952 73, 213, 65, 175, 31, 253, 82, 101, 173, 102, 90, 65, 163, 183, 213, 21, 221, 84, 234, 61,
1953 83, 119, 93, 65, 81, 172, 70, 107, 233, 25, 138, 210, 179, 149, 23, 79, 18, 205, 142, 41,
1954 8, 163, 134, 179, 177, 77, 87, 182, 131, 86, 121, 80, 106, 213, 135, 125, 179, 162, 139,
1955 122, 203, 241, 131, 138, 109, 4, 93, 51, 168, 173, 135, 74, 75, 29, 214, 29, 97, 104, 4,
1956 55, 222, 182, 86, 26, 205, 189, 242, 192, 127, 217, 90, 219, 174, 48, 40, 233, 115, 171,
1957 49, 105, 141, 109, 189, 63, 182, 91, 63, 70, 141, 167, 237, 120, 166, 148, 213, 173, 92,
1958 30, 110, 149, 78, 91, 12, 66, 93, 241, 5, 93, 208, 45, 45, 156, 56, 143, 130, 18, 90, 194,
1959 147, 104, 55, 116, 209, 8, 163, 103, 211, 94, 151, 134, 91, 189, 50, 174, 235, 191, 135,
1960 138, 213, 237, 218, 21, 211, 182, 252, 233, 191, 187, 79, 255, 141, 124, 247, 204, 237,
1961 183, 132, 129, 237, 70, 142, 164, 8, 174, 169, 136, 94, 99, 178, 28, 133, 129, 48, 38, 223,
1962 238, 61, 180, 68, 183, 183, 154, 186, 253, 201, 170, 57, 123, 90, 107, 179, 110, 169, 83,
1963 119, 214, 154, 33, 175, 219, 247, 173, 200, 109, 88, 191, 189, 6, 249, 93, 171, 38, 58,
1964 225, 58, 114, 132, 69, 48, 62, 179, 205, 58, 178, 165, 14, 164, 160, 60, 54, 215, 51, 79,
1965 90, 15, 70, 243, 192, 50, 109, 77, 84, 45, 93, 50, 229, 234, 162, 103, 180, 238, 181, 146,
1966 235, 116, 234, 218, 111, 183, 81, 233, 155, 129, 53, 177, 27, 66, 73, 123, 240, 26, 110,
1967 40, 139, 238, 180, 250, 226, 137, 74, 199, 106, 184, 27, 67, 113, 155, 142, 209, 234, 14,
1968 109, 235, 247, 72, 246, 90, 154, 31, 61, 245, 76, 209, 234, 133, 74, 223, 158, 183, 126,
1969 13, 77, 241, 87, 199, 168, 117, 134, 194, 162, 163, 7, 90, 167, 59, 183, 218, 110, 67, 40,
1970 143, 130, 32, 178, 31, 180, 208, 233, 63, 109, 123, 91, 85, 26, 223, 223, 174, 45, 163, 41,
1971 245, 30, 106, 15, 170, 18, 149, 123, 155, 170, 173, 90, 206, 148, 124, 243, 111, 39, 116,
1972 166, 157, 153, 44, 105, 245, 145, 212, 169, 255, 148, 52, 67, 169, 222, 255, 252, 111, 237,
1973 167, 127, 74, 191, 234, 254, 100, 169, 140, 42, 171, 201, 92, 173, 142, 252, 127, 77, 86,
1974 247, 77, 251, 95, 254, 175, 127, 215, 127, 223, 246, 42, 255, 26, 253, 235, 165, 108, 133,
1975 255, 246, 151, 203, 202, 211, 250, 151, 175, 12, 203, 193, 124, 221, 155, 255, 67, 126,
1976 190, 109, 253, 99, 242, 243, 95, 211, 167, 219, 187, 237, 157, 107, 254, 43, 24, 107, 81,
1977 79, 22, 171, 225, 38, 252, 183, 240, 24, 4, 255, 114, 31, 21, 213, 235, 11, 195, 81, 239,
1978 159, 253, 161, 97, 169, 222, 77, 215, 41, 173, 164, 231, 254, 68, 157, 151, 199, 131, 31,
1979 15, 51, 229, 63, 255, 215, 120, 20, 151, 181, 190, 25, 143, 98, 173, 167, 4, 37, 210, 202,
1980 110, 79, 94, 44, 109, 63, 184, 25, 204, 106, 245, 174, 165, 184, 186, 255, 34, 232, 166,
1981 85, 235, 10, 129, 108, 219, 94, 77, 55, 38, 138, 209, 88, 68, 227, 135, 64, 117, 74, 222,
1982 11, 105, 165, 138, 101, 41, 51, 50, 138, 77, 47, 168, 253, 24, 154, 254, 166, 75, 250, 197,
1983 174, 255, 220, 14, 67, 253, 183, 37, 182, 44, 199, 154, 44, 180, 173, 94, 210, 67, 119,
1984 162, 217, 238, 168, 45, 173, 75, 166, 89, 49, 221, 121, 75, 181, 252, 201, 68, 13, 106, 11,
1985 215, 174, 172, 116, 193, 151, 122, 225, 164, 101, 88, 214, 163, 99, 121, 131, 81, 24, 45,
1986 12, 251, 169, 162, 202, 149, 101, 79, 168, 52, 76, 161, 114, 239, 153, 11, 127, 104, 76,
1987 54, 182, 29, 56, 35, 201, 157, 140, 103, 90, 91, 221, 186, 229, 126, 190, 7, 196, 213, 210,
1988 154, 41, 118, 115, 186, 154, 58, 246, 122, 78, 70, 227, 84, 183, 212, 109, 167, 222, 37,
1989 35, 57, 30, 200, 156, 142, 145, 201, 36, 38, 19, 59, 212, 151, 67, 179, 178, 28, 134, 90,
1990 64, 196, 74, 234, 204, 41, 107, 51, 191, 172, 197, 19, 125, 214, 20, 200, 127, 5, 242, 251,
1991 66, 60, 160, 71, 37, 53, 105, 190, 161, 20, 17, 185, 81, 220, 225, 193, 248, 225, 46, 251,
1992 187, 228, 247, 101, 81, 141, 255, 46, 249, 91, 163, 185, 30, 185, 97, 48, 115, 250, 122,
1993 208, 237, 91, 194, 160, 81, 221, 12, 250, 122, 165, 57, 139, 132, 209, 220, 10, 226, 191,
1994 231, 244, 187, 251, 239, 84, 74, 101, 3, 159, 52, 143, 16, 255, 174, 249, 96, 77, 135, 141,
1995 96, 214, 147, 172, 74, 252, 73, 134, 57, 113, 61, 193, 170, 217, 230, 164, 61, 20, 163,
1996 214, 56, 124, 90, 117, 5, 69, 39, 10, 164, 173, 201, 150, 210, 53, 181, 150, 174, 4, 243,
1997 174, 105, 173, 134, 134, 86, 215, 238, 23, 45, 53, 208, 156, 81, 99, 97, 116, 172, 213,
1998 114, 40, 142, 54, 174, 229, 149, 188, 185, 190, 238, 9, 81, 89, 51, 69, 215, 182, 38, 134,
1999 107, 212, 108, 93, 146, 203, 35, 210, 197, 158, 111, 13, 6, 194, 122, 57, 18, 91, 226, 64,
2000 138, 106, 166, 160, 77, 6, 210, 66, 232, 17, 165, 52, 242, 29, 113, 220, 183, 212, 145,
2001 229, 170, 158, 82, 171, 140, 251, 110, 191, 107, 47, 38, 93, 59, 90, 143, 103, 147, 173,
2002 166, 232, 237, 158, 229, 106, 221, 112, 210, 115, 231, 234, 115, 135, 76, 126, 199, 22,
2003 213, 113, 99, 210, 28, 62, 68, 79, 182, 226, 174, 201, 179, 230, 214, 67, 107, 101, 217,
2004 238, 141, 19, 40, 125, 67, 80, 227, 46, 50, 255, 61, 31, 119, 199, 195, 137, 182, 49, 141,
2005 167, 40, 108, 255, 238, 169, 189, 127, 140, 171, 255, 124, 232, 206, 102, 155, 95, 102,
2006 235, 95, 255, 186, 123, 12, 122, 225, 116, 34, 213, 131, 141, 222, 105, 253, 90, 180, 199,
2007 255, 248, 167, 80, 119, 126, 215, 36, 177, 94, 173, 53, 167, 139, 142, 242, 115, 48, 155,
2008 141, 204, 91, 219, 239, 205, 31, 154, 119, 198, 248, 246, 121, 118, 59, 239, 135, 146, 166,
2009 248, 255, 26, 119, 234, 99, 233, 229, 241, 103, 125, 182, 157, 107, 178, 225, 63, 85, 158,
2010 22, 97, 224, 222, 254, 187, 62, 115, 111, 170, 139, 162, 19, 164, 95, 91, 168, 130, 42, 60,
2011 10, 254, 198, 20, 39, 171, 129, 168, 86, 250, 247, 213, 165, 181, 109, 5, 86, 201, 147,
2012 188, 7, 165, 221, 35, 166, 194, 176, 2, 215, 86, 180, 64, 85, 220, 7, 199, 152, 108, 137,
2013 42, 147, 116, 43, 122, 54, 26, 213, 173, 57, 183, 158, 7, 190, 98, 116, 37, 229, 153, 168,
2014 243, 182, 37, 147, 47, 156, 89, 21, 207, 92, 175, 45, 127, 45, 152, 15, 65, 197, 11, 188,
2015 218, 64, 82, 106, 131, 185, 114, 211, 121, 80, 5, 75, 94, 180, 44, 95, 188, 31, 40, 173,
2016 112, 180, 121, 41, 147, 209, 50, 25, 154, 235, 242, 64, 158, 188, 140, 137, 154, 183, 230,
2017 74, 160, 54, 60, 115, 52, 175, 89, 238, 60, 154, 154, 150, 247, 163, 187,
2018 ];
2019 let ps: Vec<Vec<u8>> = vec![
2020 p0.to_vec(),
2021 p1.to_vec(),
2022 p2.to_vec(),
2023 p3.to_vec(),
2024 p4.to_vec(),
2025 p5.to_vec(),
2026 p6.to_vec(),
2027 ];
2028
2029 let mut n = 0;
2030
2031 let mut rq = RecvQ::new();
2032 for i in ps {
2033 let v = FrameVec::new(&i).unwrap();
2034 for i in v.frames {
2035 rq.insert(i).unwrap();
2036 if !rq.flush(&"0.0.0.0:0".parse().unwrap()).is_empty() {
2037 n += 1;
2038 }
2039 }
2040 }
2041
2042 assert_eq!(n, 4);
2044}
2045
2046#[cfg(test)]
2047#[path = "arq_tests.rs"]
2048mod regressions;
2049
2050#[test]
2051fn rejects_messages_exceeding_the_receivers_fragment_limit() {
2052 let sendq = SendQ::new(576);
2053 let limit = crate::fragment::MAX_FRAGMENTS * (576 - 60);
2054 assert!(
2055 sendq
2056 .required_bytes(Reliability::ReliableOrdered, limit)
2057 .is_ok()
2058 );
2059 assert!(matches!(
2060 sendq.required_bytes(Reliability::ReliableOrdered, limit + 1),
2061 Err(RaknetError::PacketSizeExceedMTU)
2062 ));
2063}
2064
2065#[test]
2066fn exact_mtu_payload_is_not_marked_as_split() {
2067 let mut sendq = SendQ::new(576);
2068 let payload = vec![0xfe; 516];
2069 sendq
2070 .insert(Reliability::ReliableOrdered, &payload)
2071 .unwrap();
2072 let frames = sendq.flush(0, &"127.0.0.1:19132".parse().unwrap());
2073 assert_eq!(frames.len(), 1);
2074 assert_eq!(frames[0].flags & 16, 0);
2075 assert_eq!(frames[0].data.as_ref(), payload);
2076 sendq.ack(frames[0].sequence_number, 1);
2077 assert!(sendq.is_empty());
2078 assert_eq!(sendq.buffered_bytes, 0);
2079}
2080
2081#[cfg(test)]
2082mod allocation_regressions {
2083 use super::*;
2084
2085 #[test]
2086 fn frame_decoder_reuses_storage_and_discards_previous_frames() {
2087 let packet = FrameSetPacket::new(Reliability::ReliableOrdered, vec![0xfe; 800]);
2088 let encoded = packet.serialize().unwrap();
2089 let mut frames = Vec::new();
2090 FrameVec::decode_into(&encoded, &mut frames).unwrap();
2091 let capacity = frames.capacity();
2092 assert_eq!(frames[0].data.as_ref(), &[0xfe; 800]);
2093 frames.clear();
2094 FrameVec::decode_into(&encoded, &mut frames).unwrap();
2095 assert_eq!(frames.len(), 1);
2096 assert_eq!(frames.capacity(), capacity);
2097 assert!(FrameVec::decode_into(&[0x84], &mut frames).is_err());
2098 assert!(frames.is_empty());
2099 }
2100
2101 #[test]
2102 fn ordered_delivery_retains_the_receive_queue_allocation() {
2103 let mut queue = RecvQ::new();
2104 let mut delivered = Vec::new();
2105 for index in 0..16 {
2106 let mut frame = FrameSetPacket::new(Reliability::ReliableOrdered, vec![0xfe]);
2107 frame.sequence_number = index;
2108 frame.reliable_frame_index = index;
2109 frame.ordered_frame_index = index;
2110 queue.insert(frame).unwrap();
2111 queue.flush_into(&mut delivered);
2112 assert_eq!(delivered.len(), 1);
2113 delivered.clear();
2114 assert!(queue.ready_ordered.capacity() > 0);
2115 }
2116 }
2117}
2118
2119#[cfg(test)]
2120mod serialization_reuse_tests {
2121 use super::*;
2122
2123 #[test]
2124 fn reused_fragment_buffer_preserves_the_wire_format() {
2125 let mut frame = FrameSetPacket::new(Reliability::ReliableOrdered, vec![0xfe; 16]);
2126 frame.flags |= 16;
2127 frame.sequence_number = 0xabcdef;
2128 frame.reliable_frame_index = 0x123456;
2129 frame.ordered_frame_index = 0x654321;
2130 frame.order_channel = 7;
2131 frame.compound_size = 3;
2132 frame.compound_id = 0x1234;
2133 frame.fragment_index = 1;
2134 let mut expected = vec![
2135 0x8c, 0xef, 0xcd, 0xab, 0x70, 0, 0x80, 0x56, 0x34, 0x12, 0x21, 0x43, 0x65, 7, 0, 0, 0,
2136 3, 0x12, 0x34, 0, 0, 0, 1,
2137 ];
2138 expected.extend_from_slice(&[0xfe; 16]);
2139 let mut buffer = Vec::with_capacity(128);
2140 buffer.extend_from_slice(&[0xff; 64]);
2141 for _ in 0..100 {
2142 frame.serialize_into(&mut buffer).unwrap();
2143 assert_eq!(buffer, expected);
2144 assert_eq!(buffer.capacity(), 128);
2145 }
2146 frame.compound_size = 0;
2147 assert!(frame.serialize_into(&mut buffer).is_err());
2148 assert_eq!(buffer, expected);
2149 }
2150}
2151
2152#[cfg(test)]
2153mod shared_fragment_tests {
2154 use super::*;
2155
2156 #[test]
2157 fn retransmitted_fragment_accepts_old_ack_without_releasing_the_budget_twice() {
2158 let peer = "127.0.0.1:19132".parse().unwrap();
2159 let mut queue = SendQ::new(1400);
2160 queue
2161 .insert(Reliability::ReliableOrdered, &[0xfe; 4096])
2162 .unwrap();
2163 let frames = queue.flush(0, &peer);
2164 let old_id = frames[3].sequence_number;
2165 queue.nack(old_id, 1);
2166 let retry = queue.flush(1, &peer);
2167 assert_eq!(retry.len(), 1);
2168 let new_id = retry[0].sequence_number;
2169 queue.ack(old_id, 2);
2170 let budget = queue.buffered_bytes;
2171 queue.ack(old_id, 2);
2172 queue.ack(new_id, 2);
2173 assert_eq!(queue.buffered_bytes, budget);
2174 for frame in &frames[..3] {
2175 queue.ack(frame.sequence_number, 2);
2176 }
2177 assert_eq!(queue.buffered_bytes, 0);
2178 }
2179
2180 #[test]
2181 fn fragment_slices_share_one_allocation_and_keep_its_budget_until_final_ack() {
2182 let peer = "127.0.0.1:19132".parse().unwrap();
2183 let mut queue = SendQ::new(1400);
2184 let payload = vec![0xfe; 4096];
2185 queue
2186 .insert(Reliability::ReliableOrdered, &payload)
2187 .unwrap();
2188 let frames = queue.flush(0, &peer);
2189 assert_eq!(frames.len(), 4);
2190 let owner = frames[0].shared_payload.as_ref().unwrap();
2191 for frame in &frames {
2192 assert!(Arc::ptr_eq(owner, frame.shared_payload.as_ref().unwrap()));
2193 }
2194 let restored: Vec<_> = frames
2195 .iter()
2196 .flat_map(|frame| frame.data.iter().copied())
2197 .collect();
2198 assert_eq!(restored, payload);
2199 let initial = queue.buffered_bytes;
2200 for (index, frame) in frames.iter().enumerate() {
2201 queue.ack(frame.sequence_number, 1);
2202 queue.ack(frame.sequence_number, 1);
2203 if index + 1 < frames.len() {
2204 assert_eq!(
2205 queue.buffered_bytes,
2206 initial - (index + 1) * SendQ::FRAME_BUDGET
2207 );
2208 }
2209 }
2210 assert_eq!(queue.buffered_bytes, 0);
2211 assert_eq!(owner.remaining.load(Ordering::Relaxed), 0);
2212 }
2213}
2214
2215#[cfg(test)]
2216mod flight_order_tests {
2217 use super::*;
2218
2219 #[test]
2220 fn retries_and_sequence_wrap_keep_the_existing_numeric_order() {
2221 let peer = "127.0.0.1:19132".parse().unwrap();
2222 let mut queue = SendQ::new(1400);
2223 queue.sequence_number = sequence::MASK;
2224 queue.insert(Reliability::ReliableOrdered, &[0xfe]).unwrap();
2225 queue.insert(Reliability::ReliableOrdered, &[0xfe]).unwrap();
2226 let initial = queue.flush(0, &peer);
2227 assert_eq!(
2228 initial
2229 .iter()
2230 .map(|frame| frame.sequence_number)
2231 .collect::<Vec<_>>(),
2232 [sequence::MASK, 0]
2233 );
2234 assert!(queue.flight_order_dirty);
2235 assert!(queue.flush(1, &peer).is_empty());
2236 assert_eq!(
2237 queue
2238 .sent_packet
2239 .iter()
2240 .map(|packet| packet.0.sequence_number)
2241 .collect::<Vec<_>>(),
2242 [0, sequence::MASK]
2243 );
2244 assert!(!queue.flight_order_dirty);
2245 queue.nack(sequence::MASK, 2);
2246 assert!(queue.flight_order_dirty);
2247 let retry = queue.flush(2, &peer);
2248 assert_eq!(retry.len(), 1);
2249 assert_eq!(retry[0].sequence_number, 1);
2250 assert!(!queue.flight_order_dirty);
2251 assert_eq!(
2252 queue
2253 .sent_packet
2254 .iter()
2255 .map(|packet| packet.0.sequence_number)
2256 .collect::<Vec<_>>(),
2257 [0, 1]
2258 );
2259 queue.ack(sequence::MASK, 3);
2260 queue.ack(0, 3);
2261 assert!(queue.is_empty());
2262 assert_eq!(queue.buffered_bytes, 0);
2263 }
2264}
2265
2266#[cfg(test)]
2267mod owned_decode_tests {
2268 use super::*;
2269
2270 #[test]
2271 fn a_single_frame_moves_the_udp_allocation_into_its_payload() {
2272 let frame = FrameSetPacket::new(Reliability::ReliableOrdered, vec![0xfe; 800]);
2273 let packet = frame.serialize().unwrap();
2274 let pointer = packet.as_ptr();
2275 let mut decoded = Vec::new();
2276 FrameVec::decode_owned_into(packet, &mut decoded).unwrap();
2277 assert_eq!(decoded.len(), 1);
2278 assert_eq!(decoded[0].data.as_ptr(), pointer);
2279 assert_eq!(decoded[0].data.as_ref(), frame.data.as_ref());
2280 let data: Vec<u8> = decoded.pop().unwrap().data.into();
2281 assert_eq!(data.as_ptr(), pointer);
2282 }
2283
2284 #[test]
2285 fn multiple_frames_and_invalid_lengths_keep_the_borrowed_decoder_contract() {
2286 let first = FrameSetPacket::new(Reliability::ReliableOrdered, vec![0xfe; 800]);
2287 let second = FrameSetPacket::new(Reliability::Unreliable, vec![0xfe; 64]);
2288 let mut packet = first.serialize().unwrap();
2289 packet.extend_from_slice(&second.serialize().unwrap()[4..]);
2290 let mut expected = Vec::new();
2291 FrameVec::decode_into(&packet, &mut expected).unwrap();
2292 let mut actual = Vec::new();
2293 FrameVec::decode_owned_into(packet.clone(), &mut actual).unwrap();
2294 assert_eq!(actual.len(), 2);
2295 for (actual, expected) in actual.iter().zip(&expected) {
2296 assert_eq!(actual.serialize().unwrap(), expected.serialize().unwrap());
2297 }
2298 for length in 0..packet.len() {
2299 let mut borrowed = Vec::new();
2300 let mut owned = Vec::new();
2301 assert_eq!(
2302 FrameVec::decode_into(&packet[..length], &mut borrowed).is_ok(),
2303 FrameVec::decode_owned_into(packet[..length].to_vec(), &mut owned).is_ok()
2304 );
2305 }
2306 }
2307}
2308
2309#[cfg(test)]
2310mod scheduling_regressions {
2311 use super::*;
2312
2313 #[test]
2314 fn cached_deadlines_match_a_full_scan_across_ack_loss_and_wrap() {
2315 let peer = "127.0.0.1:19132".parse().unwrap();
2316 let mut cached = SendQ::new(1400);
2317 cached.sequence_number = sequence::MASK - 80;
2318 let mut scanned = SendQ::new(1400);
2319 scanned.sequence_number = cached.sequence_number;
2320 let mut rng = 0x12345678u32;
2321 for tick in 0..4000 {
2322 rng = rng.wrapping_mul(1664525).wrapping_add(1013904223);
2323 if rng & 3 == 0 {
2324 for queue in [&mut cached, &mut scanned] {
2325 queue
2326 .insert(Reliability::ReliableOrdered, &[0xfe, 42])
2327 .unwrap();
2328 }
2329 }
2330 if !cached.sent_packet.is_empty() && rng & 7 == 1 {
2331 let index = (rng as usize >> 8) % cached.sent_packet.len();
2332 let sequence = cached.sent_packet[index].0.sequence_number;
2333 for queue in [&mut cached, &mut scanned] {
2334 if rng & 16 == 0 {
2335 queue.ack(sequence, tick);
2336 } else {
2337 queue.nack(sequence, tick);
2338 }
2339 }
2340 }
2341 scanned.next_retry = 0;
2343 scanned.retries_pending = true;
2344 let actual: Vec<_> = cached
2345 .flush(tick, &peer)
2346 .iter()
2347 .map(|f| f.serialize().unwrap())
2348 .collect();
2349 let expected: Vec<_> = scanned
2350 .flush(tick, &peer)
2351 .iter()
2352 .map(|f| f.serialize().unwrap())
2353 .collect();
2354 assert_eq!(actual, expected, "tick {tick}");
2355 assert_eq!(cached.buffered_bytes, scanned.buffered_bytes);
2356 }
2357 }
2358
2359 #[test]
2360 fn lower_rto_invalidates_the_deadline_and_retries_keep_the_backoff() {
2361 let peer = "127.0.0.1:19132".parse().unwrap();
2362 let mut queue = SendQ::new(1400);
2363 queue.srtt = 133;
2364 queue.rto = 200;
2365 for _ in 0..2 {
2366 queue.insert(Reliability::ReliableOrdered, &[0xfe]).unwrap();
2367 }
2368 queue.flush(0, &peer);
2369 queue.ack(0, 50);
2370 assert_eq!(queue.rto, 174);
2371 assert!(queue.flush(173, &peer).is_empty());
2372 assert_eq!(queue.flush(174, &peer).len(), 1);
2373 assert!(queue.flush(434, &peer).is_empty());
2374 assert_eq!(queue.flush(435, &peer).len(), 1);
2375 queue.ack(1, 436);
2376 assert!(queue.is_empty());
2377 }
2378
2379 #[test]
2380 fn ack_storage_is_recycled_without_replaying_old_ranges() {
2381 let mut set = ACKSet::default();
2382 let mut output = Vec::new();
2383 for index in 0..100 {
2384 set.insert(index);
2385 set.take_ack_into(&mut output);
2386 assert_eq!(output, [(index, index)]);
2387 }
2388 set.take_ack_into(&mut output);
2389 assert!(output.is_empty());
2390 assert!(set.ack.capacity() > 0);
2391 }
2392}
2393
2394#[cfg(test)]
2395mod owned_payload_tests {
2396 use super::*;
2397
2398 #[test]
2399 fn owned_sends_match_borrowed_wire_bytes_and_share_retry_storage() {
2400 let peer = "127.0.0.1:19132".parse().unwrap();
2401 for mode in [
2402 Reliability::Unreliable,
2403 Reliability::UnreliableSequenced,
2404 Reliability::Reliable,
2405 Reliability::ReliableOrdered,
2406 Reliability::ReliableSequenced,
2407 ] {
2408 for size in [64, 800, 4096] {
2409 let data = bytes::Bytes::from(vec![0xfe; size]);
2410 let mut owned = SendQ::new(1400);
2411 let mut borrowed = SendQ::new(1400);
2412 let a = owned.insert_bytes(mode, &data, 7);
2413 let b = borrowed.insert_with_order_channel(mode, &data, 7);
2414 assert_eq!(a.is_ok(), b.is_ok());
2415 if a.is_err() {
2416 continue;
2417 }
2418 let frames = owned.flush(0, &peer);
2419 let expected = borrowed.flush(0, &peer);
2420 assert_eq!(
2421 frames
2422 .iter()
2423 .map(|f| f.serialize().unwrap())
2424 .collect::<Vec<_>>(),
2425 expected
2426 .iter()
2427 .map(|f| f.serialize().unwrap())
2428 .collect::<Vec<_>>()
2429 );
2430 let mut offset = 0;
2431 for frame in &frames {
2432 assert_eq!(frame.data.as_ptr(), data[offset..].as_ptr());
2433 offset += frame.data.len();
2434 }
2435 if mode != Reliability::Unreliable && mode != Reliability::UnreliableSequenced {
2436 owned.nack(frames[0].sequence_number, 1);
2437 let retry = owned.flush(1, &peer);
2438 assert_eq!(retry[0].data.as_ptr(), data.as_ptr());
2439 owned.ack_ranges(&[(0, (frames.len() - 1) as u32)], 2);
2441 assert!(owned.is_empty());
2442 assert_eq!(owned.buffered_bytes, 0);
2443 }
2444 }
2445 }
2446 }
2447}