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