1use std::cmp;
28
29use std::sync::Arc;
30
31use std::collections::hash_map;
32use std::collections::HashMap;
33use std::collections::HashSet;
34
35use intrusive_collections::intrusive_adapter;
36use intrusive_collections::KeyAdapter;
37use intrusive_collections::RBTree;
38use intrusive_collections::RBTreeAtomicLink;
39
40use smallvec::SmallVec;
41
42use crate::buffers::DefaultBufFactory;
43use crate::ranges::RangeSet;
44use crate::BufFactory;
45use crate::Error;
46use crate::Result;
47
48const DEFAULT_URGENCY: u8 = 127;
49
50pub const MAX_STREAM_WINDOW: u64 = 16 * 1024 * 1024;
52
53#[derive(Default)]
58pub struct StreamIdHasher {
59 id: u64,
60}
61
62#[derive(Debug, PartialEq, Clone, Copy)]
64pub struct RecvBufResetReturn {
65 pub max_data_delta: u64,
68
69 pub consumed_flowcontrol: u64,
72}
73
74impl RecvBufResetReturn {
75 pub fn zero() -> Self {
76 Self {
77 max_data_delta: 0,
78 consumed_flowcontrol: 0,
79 }
80 }
81}
82
83pub enum RecvAction<T: bytes::BufMut> {
85 Emit { out: T },
87 Discard { len: usize },
89}
90
91impl std::hash::Hasher for StreamIdHasher {
92 #[inline]
93 fn finish(&self) -> u64 {
94 self.id
95 }
96
97 #[inline]
98 fn write_u64(&mut self, id: u64) {
99 self.id = id;
100 }
101
102 #[inline]
103 fn write(&mut self, _: &[u8]) {
104 unimplemented!()
107 }
108}
109
110type BuildStreamIdHasher = std::hash::BuildHasherDefault<StreamIdHasher>;
111
112pub type StreamIdHashMap<V> = HashMap<u64, V, BuildStreamIdHasher>;
113pub type StreamIdHashSet = HashSet<u64, BuildStreamIdHasher>;
114
115#[derive(Default)]
117struct CollectedStreams {
118 ranges: Option<Box<[RangeSet; 4]>>,
122}
123
124impl CollectedStreams {
125 fn insert(&mut self, stream_id: u64) {
126 let ranges = self.ranges.get_or_insert_with(Default::default);
129 ranges[(stream_id & 0x3) as usize].push_item(stream_id >> 2);
130 }
131
132 fn contains(&self, stream_id: u64) -> bool {
133 let Some(ranges) = &self.ranges else {
134 return false;
135 };
136
137 ranges[(stream_id & 0x3) as usize].contains(stream_id >> 2)
138 }
139}
140
141#[derive(Default)]
143pub struct StreamMap<F: BufFactory = DefaultBufFactory> {
144 streams: StreamIdHashMap<Stream<F>>,
146
147 collected: CollectedStreams,
153
154 peer_max_streams_bidi: u64,
156
157 peer_max_streams_uni: u64,
159
160 peer_opened_streams_bidi: u64,
162
163 peer_opened_streams_uni: u64,
165
166 local_max_streams_bidi: u64,
168 local_max_streams_bidi_next: u64,
169
170 initial_max_streams_bidi: u64,
172
173 local_max_streams_uni: u64,
175 local_max_streams_uni_next: u64,
176
177 initial_max_streams_uni: u64,
179
180 local_opened_streams_bidi: u64,
182
183 local_opened_streams_uni: u64,
185
186 flushable: RBTree<StreamFlushablePriorityAdapter>,
190
191 pub readable: RBTree<StreamReadablePriorityAdapter>,
195
196 pub writable: RBTree<StreamWritablePriorityAdapter>,
199
200 stopped_writable: RBTree<StreamStoppedWritablePriorityAdapter>,
202
203 almost_full: StreamIdHashSet,
208
209 blocked: StreamIdHashMap<u64>,
213
214 reset: StreamIdHashMap<(u64, u64)>,
218
219 stopped: StreamIdHashMap<u64>,
223
224 max_stream_window: u64,
226
227 tx_buffered: usize,
229}
230
231impl<F: BufFactory> StreamMap<F> {
232 pub fn new(
233 max_streams_bidi: u64, max_streams_uni: u64, max_stream_window: u64,
234 ) -> Self {
235 StreamMap {
236 local_max_streams_bidi: max_streams_bidi,
237 local_max_streams_bidi_next: max_streams_bidi,
238 initial_max_streams_bidi: max_streams_bidi,
239
240 local_max_streams_uni: max_streams_uni,
241 local_max_streams_uni_next: max_streams_uni,
242 initial_max_streams_uni: max_streams_uni,
243
244 max_stream_window,
245
246 ..StreamMap::default()
247 }
248 }
249
250 pub fn get(&self, id: u64) -> Option<&Stream<F>> {
252 self.streams.get(&id)
253 }
254
255 pub fn get_mut(&mut self, id: u64) -> Option<&mut Stream<F>> {
257 self.streams.get_mut(&id)
258 }
259
260 pub(crate) fn get_or_create(
271 &mut self, id: u64, local_params: &crate::TransportParams,
272 peer_params: &crate::TransportParams, local: bool, is_server: bool,
273 ) -> Result<&mut Stream<F>> {
274 let (stream, is_new_and_writable) = match self.streams.entry(id) {
275 hash_map::Entry::Vacant(v) => {
276 if self.collected.contains(id) {
278 return Err(Error::Done);
279 }
280
281 if local != is_local(id, is_server) {
282 return Err(Error::InvalidStreamState(id));
283 }
284
285 let (max_rx_data, max_tx_data) = match (local, is_bidi(id)) {
286 (true, true) => (
288 local_params.initial_max_stream_data_bidi_local,
289 peer_params.initial_max_stream_data_bidi_remote,
290 ),
291
292 (true, false) => (0, peer_params.initial_max_stream_data_uni),
294
295 (false, true) => (
297 local_params.initial_max_stream_data_bidi_remote,
298 peer_params.initial_max_stream_data_bidi_local,
299 ),
300
301 (false, false) =>
303 (local_params.initial_max_stream_data_uni, 0),
304 };
305
306 let stream_sequence = id >> 2;
310
311 match (is_local(id, is_server), is_bidi(id)) {
313 (true, true) => {
314 let n = cmp::max(
315 self.local_opened_streams_bidi,
316 stream_sequence + 1,
317 );
318
319 if n > self.peer_max_streams_bidi {
320 return Err(Error::StreamLimit);
321 }
322
323 self.local_opened_streams_bidi = n;
324 },
325
326 (true, false) => {
327 let n = cmp::max(
328 self.local_opened_streams_uni,
329 stream_sequence + 1,
330 );
331
332 if n > self.peer_max_streams_uni {
333 return Err(Error::StreamLimit);
334 }
335
336 self.local_opened_streams_uni = n;
337 },
338
339 (false, true) => {
340 let n = cmp::max(
341 self.peer_opened_streams_bidi,
342 stream_sequence + 1,
343 );
344
345 if n > self.local_max_streams_bidi {
346 return Err(Error::StreamLimit);
347 }
348
349 self.peer_opened_streams_bidi = n;
350 },
351
352 (false, false) => {
353 let n = cmp::max(
354 self.peer_opened_streams_uni,
355 stream_sequence + 1,
356 );
357
358 if n > self.local_max_streams_uni {
359 return Err(Error::StreamLimit);
360 }
361
362 self.peer_opened_streams_uni = n;
363 },
364 };
365
366 let initial_window = max_rx_data;
367 let s = Stream::new(
368 id,
369 max_rx_data,
370 max_tx_data,
371 local,
372 initial_window,
373 self.max_stream_window,
374 );
375
376 let is_writable = s.is_writable();
377
378 (v.insert(s), is_writable)
379 },
380
381 hash_map::Entry::Occupied(v) => (v.into_mut(), false),
382 };
383
384 if is_new_and_writable {
387 self.writable.insert(Arc::clone(&stream.priority_key));
388 }
389
390 Ok(stream)
391 }
392
393 pub fn insert_readable(&mut self, priority_key: &Arc<StreamPriorityKey>) {
397 if !priority_key.readable.is_linked() {
398 self.readable.insert(Arc::clone(priority_key));
399 }
400 }
401
402 pub fn remove_readable(&mut self, priority_key: &Arc<StreamPriorityKey>) {
404 if !priority_key.readable.is_linked() {
405 return;
406 }
407
408 let mut c = {
409 let ptr = Arc::as_ptr(priority_key);
410 unsafe { self.readable.cursor_mut_from_ptr(ptr) }
411 };
412
413 c.remove();
414 }
415
416 pub fn insert_writable(&mut self, priority_key: &Arc<StreamPriorityKey>) {
423 if !priority_key.writable.is_linked() {
424 self.writable.insert(Arc::clone(priority_key));
425 }
426 }
427
428 pub fn insert_stopped_writable(
430 &mut self, priority_key: &Arc<StreamPriorityKey>,
431 ) {
432 if !priority_key.stopped_writable.is_linked() {
433 self.stopped_writable.insert(Arc::clone(priority_key));
434 }
435
436 self.insert_writable(priority_key);
437 }
438
439 pub fn remove_writable(&mut self, priority_key: &Arc<StreamPriorityKey>) {
444 if priority_key.stopped_writable.is_linked() {
445 let ptr = Arc::as_ptr(priority_key);
446 let mut c = unsafe { self.stopped_writable.cursor_mut_from_ptr(ptr) };
451 c.remove();
452 }
453
454 if !priority_key.writable.is_linked() {
455 return;
456 }
457
458 let mut c = {
459 let ptr = Arc::as_ptr(priority_key);
460 unsafe { self.writable.cursor_mut_from_ptr(ptr) }
461 };
462
463 c.remove();
464 }
465
466 pub fn insert_flushable(&mut self, priority_key: &Arc<StreamPriorityKey>) {
470 if !priority_key.flushable.is_linked() {
471 self.flushable.insert(Arc::clone(priority_key));
472 }
473 }
474
475 pub fn remove_flushable(&mut self, priority_key: &Arc<StreamPriorityKey>) {
477 if !priority_key.flushable.is_linked() {
478 return;
479 }
480
481 let mut c = {
482 let ptr = Arc::as_ptr(priority_key);
483 unsafe { self.flushable.cursor_mut_from_ptr(ptr) }
484 };
485
486 c.remove();
487 }
488
489 pub fn peek_flushable(&self) -> Option<Arc<StreamPriorityKey>> {
490 self.flushable.front().clone_pointer()
491 }
492
493 pub fn update_priority(
495 &mut self, old: &Arc<StreamPriorityKey>, new: &Arc<StreamPriorityKey>,
496 ) {
497 if old.readable.is_linked() {
498 self.remove_readable(old);
499 self.readable.insert(Arc::clone(new));
500 }
501
502 if old.writable.is_linked() {
503 let stopped = old.stopped_writable.is_linked();
504 self.remove_writable(old);
505 if stopped {
506 self.insert_stopped_writable(new);
507 } else {
508 self.insert_writable(new);
509 }
510 }
511
512 if old.flushable.is_linked() {
513 self.remove_flushable(old);
514 self.flushable.insert(Arc::clone(new));
515 }
516 }
517
518 pub fn insert_almost_full(&mut self, stream_id: u64) {
522 self.almost_full.insert(stream_id);
523 }
524
525 pub fn remove_almost_full(&mut self, stream_id: u64) {
527 self.almost_full.remove(&stream_id);
528 }
529
530 pub fn insert_blocked(&mut self, stream_id: u64, off: u64) {
535 self.blocked.insert(stream_id, off);
536 }
537
538 pub fn remove_blocked(&mut self, stream_id: u64) {
540 self.blocked.remove(&stream_id);
541 }
542
543 pub fn insert_reset(
548 &mut self, stream_id: u64, error_code: u64, final_size: u64,
549 ) {
550 self.reset.insert(stream_id, (error_code, final_size));
551 }
552
553 pub fn remove_reset(&mut self, stream_id: u64) {
555 self.reset.remove(&stream_id);
556 }
557
558 pub fn insert_stopped(&mut self, stream_id: u64, error_code: u64) {
563 self.stopped.insert(stream_id, error_code);
564 }
565
566 pub fn remove_stopped(&mut self, stream_id: u64) {
568 self.stopped.remove(&stream_id);
569 }
570
571 pub fn update_peer_max_streams_bidi(&mut self, v: u64) {
573 self.peer_max_streams_bidi = cmp::max(self.peer_max_streams_bidi, v);
574 }
575
576 pub fn update_peer_max_streams_uni(&mut self, v: u64) {
578 self.peer_max_streams_uni = cmp::max(self.peer_max_streams_uni, v);
579 }
580
581 pub fn update_max_streams_bidi(&mut self) {
583 self.local_max_streams_bidi = self.local_max_streams_bidi_next;
584 }
585
586 pub fn set_max_streams_bidi(&mut self, max: u64) {
588 self.local_max_streams_bidi = max;
589 self.local_max_streams_bidi_next = max;
590 self.initial_max_streams_bidi = max;
591 }
592
593 pub fn max_streams_bidi(&self) -> u64 {
595 self.local_max_streams_bidi
596 }
597
598 pub fn max_streams_bidi_next(&mut self) -> u64 {
600 self.local_max_streams_bidi_next
601 }
602
603 pub fn update_max_streams_uni(&mut self) {
605 self.local_max_streams_uni = self.local_max_streams_uni_next;
606 }
607
608 pub fn max_streams_uni_next(&mut self) -> u64 {
610 self.local_max_streams_uni_next
611 }
612
613 pub fn peer_max_streams_bidi(&self) -> u64 {
615 self.peer_max_streams_bidi
616 }
617
618 pub fn peer_streams_left_bidi(&self) -> u64 {
621 self.peer_max_streams_bidi - self.local_opened_streams_bidi
622 }
623
624 pub fn peer_max_streams_uni(&self) -> u64 {
626 self.peer_max_streams_uni
627 }
628
629 pub fn peer_streams_left_uni(&self) -> u64 {
632 self.peer_max_streams_uni - self.local_opened_streams_uni
633 }
634
635 pub fn mark_stop_reported(&mut self, stream_id: u64) {
637 let Some(stream) = self.streams.get_mut(&stream_id) else {
638 return;
639 };
640 stream.send.mark_stop_reported();
641
642 if stream.is_collectable() {
643 let local = stream.local;
644 self.collect(stream_id, local);
645 } else {
646 let priority_key = Arc::clone(&stream.priority_key);
647 self.remove_writable(&priority_key);
648 }
649 }
650
651 pub fn collect(&mut self, stream_id: u64, local: bool) {
656 if !local {
657 if is_bidi(stream_id) {
660 self.local_max_streams_bidi_next =
661 self.local_max_streams_bidi_next.saturating_add(1);
662 } else {
663 self.local_max_streams_uni_next =
664 self.local_max_streams_uni_next.saturating_add(1);
665 }
666 }
667
668 let s = self.streams.remove(&stream_id).unwrap();
669
670 self.remove_readable(&s.priority_key);
671
672 self.remove_writable(&s.priority_key);
673
674 self.remove_flushable(&s.priority_key);
675
676 self.collected.insert(stream_id);
677 }
678
679 pub(crate) fn try_collect(&mut self, stream_id: u64) {
681 let Some(stream) = self.get(stream_id) else {
682 return;
683 };
684
685 let collect = stream.is_collectable();
686 let local = stream.local;
687
688 if collect {
689 self.collect(stream_id, local);
690 }
691 }
692
693 pub fn readable(&self) -> StreamIter {
695 StreamIter {
696 streams: self.readable.iter().map(|s| s.id).collect(),
697 index: 0,
698 }
699 }
700
701 pub fn writable(&self) -> StreamIter {
703 StreamIter {
704 streams: self.writable.iter().map(|s| s.id).collect(),
705 index: 0,
706 }
707 }
708
709 pub fn stopped_writable(&self) -> StreamIter {
711 if self.stopped_writable.is_empty() {
712 return StreamIter::default();
713 }
714
715 StreamIter {
716 streams: self.stopped_writable.iter().map(|key| key.id).collect(),
717 index: 0,
718 }
719 }
720
721 pub fn pop_stopped_writable(&mut self) -> Option<u64> {
723 let priority_key = self.stopped_writable.front().clone_pointer()?;
724 self.remove_writable(&priority_key);
725 Some(priority_key.id)
726 }
727
728 pub fn local_stream_opened(&self, stream_id: u64) -> bool {
733 let opened = if is_bidi(stream_id) {
734 self.local_opened_streams_bidi
735 } else {
736 self.local_opened_streams_uni
737 };
738
739 stream_id >> 2 < opened
740 }
741
742 pub fn almost_full(&self) -> StreamIter {
744 StreamIter::from(&self.almost_full)
745 }
746
747 pub fn blocked(&self) -> hash_map::Iter<'_, u64, u64> {
749 self.blocked.iter()
750 }
751
752 pub fn reset(&self) -> hash_map::Iter<'_, u64, (u64, u64)> {
754 self.reset.iter()
755 }
756
757 pub fn stopped(&self) -> hash_map::Iter<'_, u64, u64> {
759 self.stopped.iter()
760 }
761
762 pub fn is_collected(&self, stream_id: u64) -> bool {
764 self.collected.contains(stream_id)
765 }
766
767 pub fn has_flushable(&self) -> bool {
769 !self.flushable.is_empty()
770 }
771
772 pub fn has_readable(&self) -> bool {
774 !self.readable.is_empty()
775 }
776
777 pub fn has_almost_full(&self) -> bool {
780 !self.almost_full.is_empty()
781 }
782
783 pub fn has_blocked(&self) -> bool {
785 !self.blocked.is_empty()
786 }
787
788 pub fn has_reset(&self) -> bool {
790 !self.reset.is_empty()
791 }
792
793 pub fn has_stopped(&self) -> bool {
795 !self.stopped.is_empty()
796 }
797
798 pub fn should_update_max_streams_bidi(&self) -> bool {
804 let available = self
805 .local_max_streams_bidi
806 .saturating_sub(self.peer_opened_streams_bidi);
807 self.local_max_streams_bidi_next != self.local_max_streams_bidi &&
808 available <= self.initial_max_streams_bidi / 2
809 }
810
811 pub fn should_update_max_streams_uni(&self) -> bool {
817 let available = self
818 .local_max_streams_uni
819 .saturating_sub(self.peer_opened_streams_uni);
820 self.local_max_streams_uni_next != self.local_max_streams_uni &&
821 available <= self.initial_max_streams_uni / 2
822 }
823
824 #[cfg(test)]
826 pub fn len(&self) -> usize {
827 self.streams.len()
828 }
829
830 pub(crate) fn tx_buffered(&self) -> usize {
832 self.tx_buffered
833 }
834
835 fn tx_buffered_actual(&self) -> usize {
839 self.streams
840 .values()
841 .map(|s| s.send.buffered_bytes() as usize)
842 .sum()
843 }
844
845 pub(crate) fn tx_buffered_is_consistent(&self) -> bool {
848 self.tx_buffered == self.tx_buffered_actual()
849 }
850
851 pub(crate) fn add_tx_buffered(&mut self, delta: usize) {
853 self.tx_buffered += delta;
854
855 #[cfg(debug_assertions)]
856 self.debug_check_tx_buffered_consistency();
857 }
858
859 pub(crate) fn sub_tx_buffered(&mut self, delta: usize) {
861 debug_assert!(self.tx_buffered >= delta);
862 self.tx_buffered = self.tx_buffered.saturating_sub(delta);
863
864 #[cfg(debug_assertions)]
865 self.debug_check_tx_buffered_consistency();
866 }
867
868 #[cfg(debug_assertions)]
872 pub(crate) fn debug_check_tx_buffered_consistency(&self) {
873 if !self.tx_buffered_is_consistent() {
874 let buffered_per_stream = self
875 .streams
876 .iter()
877 .map(|(id, s)| (*id, s.send.buffered_bytes()))
878 .collect::<Vec<_>>();
879
880 let actual = self.tx_buffered_actual();
881 let stored = self.tx_buffered;
882 panic!(
883 "tx_buffered mismatch: stored={}, actual={}, diff={}, buffered_per_stream={:?}",
884 stored,
885 actual,
886 stored as i64 - actual as i64,
887 buffered_per_stream
888 );
889 }
890 }
891}
892
893pub struct Stream<F: BufFactory = DefaultBufFactory> {
895 pub recv: recv_buf::RecvBuf,
897
898 pub send: send_buf::SendBuf<F>,
900
901 pub send_lowat: usize,
902
903 pub bidi: bool,
905
906 pub local: bool,
908
909 pub urgency: u8,
911
912 pub incremental: bool,
914
915 pub priority_key: Arc<StreamPriorityKey>,
916}
917
918impl<F: BufFactory> Stream<F> {
919 pub fn new(
921 id: u64, max_rx_data: u64, max_tx_data: u64, local: bool,
922 initial_window: u64, max_window: u64,
923 ) -> Self {
924 let priority_key = Arc::new(StreamPriorityKey {
925 id,
926 ..Default::default()
927 });
928
929 Stream {
930 recv: recv_buf::RecvBuf::new(max_rx_data, initial_window, max_window),
931 send: send_buf::SendBuf::new(max_tx_data),
932 send_lowat: 1,
933 bidi: is_bidi(id),
934 local,
935 urgency: priority_key.urgency,
936 incremental: priority_key.incremental,
937 priority_key,
938 }
939 }
940
941 pub fn is_readable(&self) -> bool {
943 self.recv.ready()
944 }
945
946 pub fn is_writable(&self) -> bool {
949 !self.send.is_shutdown() &&
950 !self.send.is_fin() &&
951 (self.send.off_back() + self.send_lowat as u64) <
952 self.send.max_off()
953 }
954
955 pub fn is_flushable(&self) -> bool {
958 let off_front = self.send.off_front();
959
960 !self.send.is_empty() &&
961 off_front < self.send.off_back() &&
962 off_front < self.send.max_off()
963 }
964
965 pub fn is_complete(&self) -> bool {
975 match (self.bidi, self.local) {
976 (true, _) => self.recv.is_fin() && self.send.is_complete(),
979
980 (false, true) => self.send.is_complete(),
983
984 (false, false) => self.recv.is_fin(),
987 }
988 }
989
990 pub fn is_collectable(&self) -> bool {
992 self.is_complete() &&
993 !self.is_readable() &&
994 !self.send.has_unreported_stop()
995 }
996}
997
998pub fn is_local(stream_id: u64, is_server: bool) -> bool {
1000 (stream_id & 0x1) == (is_server as u64)
1001}
1002
1003pub fn is_bidi(stream_id: u64) -> bool {
1005 (stream_id & 0x2) == 0
1006}
1007
1008#[derive(Clone, Debug)]
1009pub struct StreamPriorityKey {
1010 pub urgency: u8,
1011 pub incremental: bool,
1012 pub id: u64,
1013
1014 pub readable: RBTreeAtomicLink,
1015 pub writable: RBTreeAtomicLink,
1016 pub stopped_writable: RBTreeAtomicLink,
1017 pub flushable: RBTreeAtomicLink,
1018}
1019
1020impl Default for StreamPriorityKey {
1021 fn default() -> Self {
1022 Self {
1023 urgency: DEFAULT_URGENCY,
1024 incremental: true,
1025 id: Default::default(),
1026 readable: Default::default(),
1027 writable: Default::default(),
1028 stopped_writable: Default::default(),
1029 flushable: Default::default(),
1030 }
1031 }
1032}
1033
1034impl PartialEq for StreamPriorityKey {
1035 fn eq(&self, other: &Self) -> bool {
1036 self.id == other.id
1037 }
1038}
1039
1040impl Eq for StreamPriorityKey {}
1041
1042impl PartialOrd for StreamPriorityKey {
1043 fn partial_cmp(&self, other: &Self) -> Option<cmp::Ordering> {
1044 Some(self.cmp(other))
1045 }
1046}
1047
1048impl Ord for StreamPriorityKey {
1049 fn cmp(&self, other: &Self) -> cmp::Ordering {
1050 if self.id == other.id {
1052 return cmp::Ordering::Equal;
1053 }
1054
1055 if self.urgency != other.urgency {
1057 return self.urgency.cmp(&other.urgency);
1058 }
1059
1060 if !self.incremental && !other.incremental {
1063 return self.id.cmp(&other.id);
1064 }
1065
1066 if self.incremental && !other.incremental {
1068 return cmp::Ordering::Greater;
1069 }
1070 if !self.incremental && other.incremental {
1071 return cmp::Ordering::Less;
1072 }
1073
1074 cmp::Ordering::Greater
1078 }
1079}
1080
1081intrusive_adapter!(pub StreamWritablePriorityAdapter = Arc<StreamPriorityKey>: StreamPriorityKey { writable => RBTreeAtomicLink });
1082
1083impl KeyAdapter<'_> for StreamWritablePriorityAdapter {
1084 type Key = StreamPriorityKey;
1085
1086 fn get_key(&self, s: &StreamPriorityKey) -> Self::Key {
1087 s.clone()
1088 }
1089}
1090
1091intrusive_adapter!(pub StreamStoppedWritablePriorityAdapter = Arc<StreamPriorityKey>: StreamPriorityKey { stopped_writable => RBTreeAtomicLink });
1092
1093impl KeyAdapter<'_> for StreamStoppedWritablePriorityAdapter {
1094 type Key = StreamPriorityKey;
1095
1096 fn get_key(&self, s: &StreamPriorityKey) -> Self::Key {
1097 s.clone()
1098 }
1099}
1100
1101intrusive_adapter!(pub StreamReadablePriorityAdapter = Arc<StreamPriorityKey>: StreamPriorityKey { readable => RBTreeAtomicLink });
1102
1103impl KeyAdapter<'_> for StreamReadablePriorityAdapter {
1104 type Key = StreamPriorityKey;
1105
1106 fn get_key(&self, s: &StreamPriorityKey) -> Self::Key {
1107 s.clone()
1108 }
1109}
1110
1111intrusive_adapter!(pub StreamFlushablePriorityAdapter = Arc<StreamPriorityKey>: StreamPriorityKey { flushable => RBTreeAtomicLink });
1112
1113impl KeyAdapter<'_> for StreamFlushablePriorityAdapter {
1114 type Key = StreamPriorityKey;
1115
1116 fn get_key(&self, s: &StreamPriorityKey) -> Self::Key {
1117 s.clone()
1118 }
1119}
1120
1121#[derive(Default)]
1123pub struct StreamIter {
1124 streams: SmallVec<[u64; 8]>,
1125 index: usize,
1126}
1127
1128impl StreamIter {
1129 #[inline]
1130 fn from(streams: &StreamIdHashSet) -> Self {
1131 StreamIter {
1132 streams: streams.iter().copied().collect(),
1133 index: 0,
1134 }
1135 }
1136}
1137
1138impl Iterator for StreamIter {
1139 type Item = u64;
1140
1141 #[inline]
1142 fn next(&mut self) -> Option<Self::Item> {
1143 let v = self.streams.get(self.index)?;
1144 self.index += 1;
1145 Some(*v)
1146 }
1147}
1148
1149impl ExactSizeIterator for StreamIter {
1150 #[inline]
1151 fn len(&self) -> usize {
1152 self.streams.len() - self.index
1153 }
1154}
1155
1156#[cfg(test)]
1157mod tests {
1158 use rstest::rstest;
1159
1160 use crate::range_buf::RangeBuf;
1161 use crate::test_utils::Pipe;
1162
1163 use super::*;
1164
1165 const DEFAULT_STREAM_WINDOW: u64 = 32 * 1024;
1167
1168 #[rstest]
1169 fn collected_streams_per_type(#[values(0, 1, 2, 3)] stream_type: u64) {
1170 let mut collected = CollectedStreams::default();
1171 assert!(collected.ranges.is_none());
1172
1173 for id in 0..4 {
1174 assert!(!collected.contains(id));
1175 }
1176 assert!(collected.ranges.is_none());
1177
1178 collected.insert(stream_type);
1179 assert!(collected.ranges.is_some());
1180
1181 for id in 0..4 {
1182 assert_eq!(collected.contains(id), id == stream_type);
1183 }
1184
1185 collected.insert(8 | stream_type);
1186 assert!(!collected.contains(4 | stream_type));
1187 assert_eq!(
1188 collected.ranges.as_ref().unwrap()[stream_type as usize].len(),
1189 2
1190 );
1191
1192 collected.insert(4 | stream_type);
1193 collected.insert(4 | stream_type);
1194 assert_eq!(
1195 collected.ranges.as_ref().unwrap()[stream_type as usize],
1196 0..3
1197 );
1198
1199 for id in 0..12 {
1200 assert_eq!(collected.contains(id), id & 0x3 == stream_type);
1201 }
1202 }
1203
1204 #[test]
1205 fn collected_streams_preserve_fragmented_and_large_ids() {
1206 let mut collected = CollectedStreams::default();
1207
1208 for sequence in (0..2048).step_by(2) {
1209 for stream_type in 0..4 {
1210 collected.insert((sequence << 2) | stream_type);
1211 }
1212 }
1213
1214 for sequence in 0..2048 {
1215 for stream_type in 0..4 {
1216 assert_eq!(
1217 collected.contains((sequence << 2) | stream_type),
1218 sequence % 2 == 0
1219 );
1220 }
1221 }
1222
1223 for stream_type in 0..4 {
1224 assert_eq!(
1225 collected.ranges.as_ref().unwrap()[stream_type as usize].len(),
1226 1024
1227 );
1228
1229 let stream_id = ((1u64 << 62) - 4) | stream_type;
1230 assert!(!collected.contains(stream_id));
1231 collected.insert(stream_id);
1232 assert!(collected.contains(stream_id));
1233 assert!(!collected.contains(stream_id - 4));
1234 assert!(!collected.contains((1u64 << 40) | stream_type));
1235 }
1236 }
1237
1238 fn collect_pipe_stream(pipe: &mut Pipe, stream_id: u64) {
1241 let mut buf = [0; 1];
1242
1243 assert_eq!(pipe.client.stream_send(stream_id, b"a", true), Ok(1));
1244 assert_eq!(pipe.advance(), Ok(()));
1245 assert_eq!(pipe.server.stream_recv(stream_id, &mut buf), Ok((1, true)));
1246
1247 if is_bidi(stream_id) {
1248 assert_eq!(pipe.server.stream_send(stream_id, b"a", true), Ok(1));
1249 assert_eq!(pipe.advance(), Ok(()));
1250 assert_eq!(
1251 pipe.client.stream_recv(stream_id, &mut buf),
1252 Ok((1, true))
1253 );
1254 }
1255
1256 assert_eq!(pipe.advance(), Ok(()));
1257 }
1258
1259 #[rstest]
1260 fn collected_streams_out_of_order(
1261 #[values("cubic", "bbr2_gcongestion")] cc_algorithm_name: &str,
1262 #[values(0, 2)] stream_type: u64,
1263 ) {
1264 let mut pipe = Pipe::new(cc_algorithm_name).unwrap();
1265 assert_eq!(pipe.handshake(), Ok(()));
1266
1267 for sequence in [2, 0, 1] {
1268 let stream_id = (sequence << 2) | stream_type;
1269 collect_pipe_stream(&mut pipe, stream_id);
1270
1271 for conn in [&mut pipe.client, &mut pipe.server] {
1272 assert!(conn.streams.get(stream_id).is_none());
1273 assert!(conn.streams.is_collected(stream_id));
1274 assert!(conn.stream_closed(stream_id));
1275 assert_eq!(
1276 conn.streams
1277 .get_or_create(
1278 stream_id,
1279 &conn.local_transport_params,
1280 &conn.peer_transport_params,
1281 !conn.is_server,
1282 conn.is_server,
1283 )
1284 .err(),
1285 Some(Error::Done)
1286 );
1287 }
1288 }
1289
1290 assert_eq!(
1291 pipe.server.streams.collected.ranges.as_ref().unwrap()
1292 [stream_type as usize],
1293 0..3
1294 );
1295
1296 let frames = [crate::frame::Frame::Stream {
1298 stream_id: 8 | stream_type,
1299 data: RangeBuf::from(b"a", 0, true),
1300 }];
1301 assert!(pipe
1302 .send_pkt_to_server(crate::Type::Short, &frames, &mut [0; 1280])
1303 .is_ok());
1304 assert_eq!(pipe.server.streams.len(), 0);
1305 }
1306
1307 #[rstest]
1308 fn collected_streams_sparse_peer_credit(
1309 #[values("cubic", "bbr2_gcongestion")] cc_algorithm_name: &str,
1310 #[values(0, 2)] stream_type: u64, #[values(1, 8)] initial_limit: u64,
1311 ) {
1312 let mut config = Pipe::default_config(cc_algorithm_name).unwrap();
1313 config.set_initial_max_streams_bidi(initial_limit);
1314 config.set_initial_max_streams_uni(initial_limit);
1315
1316 let mut pipe = Pipe::with_config(&mut config).unwrap();
1317 assert_eq!(pipe.handshake(), Ok(()));
1318
1319 for index in 0..initial_limit {
1320 let stream_id = (index << 3) | stream_type;
1321 collect_pipe_stream(&mut pipe, stream_id);
1322
1323 assert_eq!(
1324 pipe.server.streams.collected.ranges.as_ref().unwrap()
1325 [stream_type as usize]
1326 .len(),
1327 index as usize + 1
1328 );
1329 assert!(pipe.server.stream_closed(stream_id));
1330 assert!(pipe.client.stream_closed(stream_id));
1331 assert_eq!(pipe.server.streams.len(), 0);
1332 }
1333
1334 let peer_limit = if is_bidi(stream_type) {
1335 pipe.client.streams.peer_max_streams_bidi()
1336 } else {
1337 pipe.client.streams.peer_max_streams_uni()
1338 };
1339 assert_eq!(peer_limit, 2 * initial_limit);
1340
1341 for sequence in (1..2 * initial_limit - 1).step_by(2) {
1343 let stream_id = (sequence << 2) | stream_type;
1344
1345 for conn in [&pipe.client, &pipe.server] {
1346 assert!(conn.streams.get(stream_id).is_none());
1347 assert!(!conn.streams.is_collected(stream_id));
1348 assert!(!conn.stream_closed(stream_id));
1349 }
1350 }
1351
1352 for sequence in (1..2 * initial_limit - 1).step_by(2) {
1354 collect_pipe_stream(&mut pipe, (sequence << 2) | stream_type);
1355 }
1356
1357 assert_eq!(
1358 pipe.server.streams.collected.ranges.as_ref().unwrap()
1359 [stream_type as usize],
1360 0..2 * initial_limit - 1
1361 );
1362 }
1363
1364 #[rstest]
1365 fn collected_streams_fragmented_local(
1366 #[values("cubic", "bbr2_gcongestion")] cc_algorithm_name: &str,
1367 #[values(0, 2)] stream_type: u64,
1368 ) {
1369 let mut client_config = Pipe::default_config(cc_algorithm_name).unwrap();
1370 client_config.set_initial_max_streams_bidi(1);
1371 client_config.set_initial_max_streams_uni(1);
1372
1373 let mut server_config = Pipe::default_config(cc_algorithm_name).unwrap();
1374 server_config.set_initial_max_streams_bidi(32);
1375 server_config.set_initial_max_streams_uni(32);
1376
1377 let mut pipe = Pipe::with_client_and_server_config(
1378 &mut client_config,
1379 &mut server_config,
1380 )
1381 .unwrap();
1382 assert_eq!(pipe.handshake(), Ok(()));
1383
1384 for index in 0..32 {
1387 collect_pipe_stream(&mut pipe, (index << 3) | stream_type);
1388 assert_eq!(
1389 pipe.client.streams.collected.ranges.as_ref().unwrap()
1390 [stream_type as usize]
1391 .len(),
1392 index as usize + 1
1393 );
1394 assert_eq!(pipe.client.streams.len(), 0);
1395 }
1396 }
1397
1398 #[rstest]
1399 fn stream_limit_does_not_collect(
1400 #[values(0, 1, 2, 3)] stream_type: u64,
1401 #[values(true, false)] local: bool,
1402 ) {
1403 let params = crate::TransportParams::default();
1404 let mut streams = <StreamMap>::new(1, 1, DEFAULT_STREAM_WINDOW);
1405 streams.update_peer_max_streams_bidi(1);
1406 streams.update_peer_max_streams_uni(1);
1407
1408 let stream_id = 4 | stream_type;
1409 let is_server = (stream_type & 1 != 0) == local;
1410 assert_eq!(
1411 streams
1412 .get_or_create(stream_id, ¶ms, ¶ms, local, is_server)
1413 .err(),
1414 Some(Error::StreamLimit)
1415 );
1416 assert!(!streams.is_collected(stream_id));
1417 assert_eq!(streams.len(), 0);
1418 assert!(streams.collected.ranges.is_none());
1419
1420 if local {
1421 streams.update_peer_max_streams_bidi(2);
1422 streams.update_peer_max_streams_uni(2);
1423 } else {
1424 streams.local_max_streams_bidi_next = 2;
1425 streams.local_max_streams_uni_next = 2;
1426 streams.update_max_streams_bidi();
1427 streams.update_max_streams_uni();
1428 }
1429
1430 assert!(streams
1431 .get_or_create(stream_id, ¶ms, ¶ms, local, is_server)
1432 .is_ok());
1433 assert!(streams.collected.ranges.is_none());
1434 }
1435
1436 #[test]
1437 fn recv_flow_control() {
1438 let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1439 assert!(!stream.recv.almost_full());
1440
1441 let mut buf = [0; 32];
1442
1443 let first = RangeBuf::from(b"hello", 0, false);
1444 let second = RangeBuf::from(b"world", 5, false);
1445 let third = RangeBuf::from(b"something", 10, false);
1446
1447 assert_eq!(stream.recv.write(second), Ok(()));
1448 assert_eq!(stream.recv.write(first), Ok(()));
1449 assert!(!stream.recv.almost_full());
1450
1451 assert_eq!(stream.recv.write(third), Err(Error::FlowControl));
1452
1453 let (len, fin) = stream.recv.emit(&mut buf).unwrap();
1454 assert_eq!(&buf[..len], b"helloworld");
1455 assert!(!fin);
1456
1457 assert!(stream.recv.almost_full());
1458
1459 stream.recv.update_max_data(std::time::Instant::now());
1460 assert_eq!(stream.recv.max_data_next(), 25);
1461 assert!(!stream.recv.almost_full());
1462
1463 let third = RangeBuf::from(b"something", 10, false);
1464 assert_eq!(stream.recv.write(third), Ok(()));
1465 }
1466
1467 #[test]
1468 fn recv_past_fin() {
1469 let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1470 assert!(!stream.recv.almost_full());
1471
1472 let first = RangeBuf::from(b"hello", 0, true);
1473 let second = RangeBuf::from(b"world", 5, false);
1474
1475 assert_eq!(stream.recv.write(first), Ok(()));
1476 assert_eq!(stream.recv.write(second), Err(Error::FinalSize));
1477 }
1478
1479 #[test]
1480 fn recv_fin_dup() {
1481 let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1482 assert!(!stream.recv.almost_full());
1483
1484 let first = RangeBuf::from(b"hello", 0, true);
1485 let second = RangeBuf::from(b"hello", 0, true);
1486
1487 assert_eq!(stream.recv.write(first), Ok(()));
1488 assert_eq!(stream.recv.write(second), Ok(()));
1489
1490 let mut buf = [0; 32];
1491
1492 let (len, fin) = stream.recv.emit(&mut buf).unwrap();
1493 assert_eq!(&buf[..len], b"hello");
1494 assert!(fin);
1495 }
1496
1497 #[test]
1498 fn recv_fin_change() {
1499 let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1500 assert!(!stream.recv.almost_full());
1501
1502 let first = RangeBuf::from(b"hello", 0, true);
1503 let second = RangeBuf::from(b"world", 5, true);
1504
1505 assert_eq!(stream.recv.write(second), Ok(()));
1506 assert_eq!(stream.recv.write(first), Err(Error::FinalSize));
1507 }
1508
1509 #[test]
1510 fn recv_fin_lower_than_received() {
1511 let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1512 assert!(!stream.recv.almost_full());
1513
1514 let first = RangeBuf::from(b"hello", 0, true);
1515 let second = RangeBuf::from(b"world", 5, false);
1516
1517 assert_eq!(stream.recv.write(second), Ok(()));
1518 assert_eq!(stream.recv.write(first), Err(Error::FinalSize));
1519 }
1520
1521 #[test]
1522 fn recv_fin_flow_control() {
1523 let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1524 assert!(!stream.recv.almost_full());
1525
1526 let mut buf = [0; 32];
1527
1528 let first = RangeBuf::from(b"hello", 0, false);
1529 let second = RangeBuf::from(b"world", 5, true);
1530
1531 assert_eq!(stream.recv.write(first), Ok(()));
1532 assert_eq!(stream.recv.write(second), Ok(()));
1533
1534 let (len, fin) = stream.recv.emit(&mut buf).unwrap();
1535 assert_eq!(&buf[..len], b"helloworld");
1536 assert!(fin);
1537
1538 assert!(!stream.recv.almost_full());
1539 }
1540
1541 #[test]
1542 fn recv_fin_reset_mismatch() {
1543 let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1544 assert!(!stream.recv.almost_full());
1545
1546 let first = RangeBuf::from(b"hello", 0, true);
1547
1548 assert_eq!(stream.recv.write(first), Ok(()));
1549 assert_eq!(stream.recv.reset(0, 10), Err(Error::FinalSize));
1550 }
1551
1552 #[test]
1553 fn recv_reset_with_gap() {
1554 let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1555 assert!(!stream.recv.almost_full());
1556
1557 let first = RangeBuf::from(b"hello", 0, false);
1558
1559 assert_eq!(stream.recv.write(first), Ok(()));
1560 assert_eq!(stream.recv.emit(&mut [0; 1]), Ok((1, false)));
1562 assert_eq!(
1564 stream.recv.reset(0, 10),
1565 Ok(RecvBufResetReturn {
1566 max_data_delta: 5,
1567 consumed_flowcontrol: 9
1569 })
1570 );
1571 assert_eq!(stream.recv.reset(0, 10), Ok(RecvBufResetReturn::zero()));
1572 }
1573
1574 #[test]
1575 fn recv_reset_dup() {
1576 let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1577 assert!(!stream.recv.almost_full());
1578
1579 let first = RangeBuf::from(b"hello", 0, false);
1580
1581 assert_eq!(stream.recv.write(first), Ok(()));
1582 assert_eq!(
1583 stream.recv.reset(0, 5),
1584 Ok(RecvBufResetReturn {
1585 max_data_delta: 0,
1586 consumed_flowcontrol: 5
1587 })
1588 );
1589 assert_eq!(stream.recv.reset(0, 5), Ok(RecvBufResetReturn::zero()));
1590 }
1591
1592 #[test]
1593 fn recv_reset_change() {
1594 let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1595 assert!(!stream.recv.almost_full());
1596
1597 let first = RangeBuf::from(b"hello", 0, false);
1598
1599 assert_eq!(stream.recv.write(first), Ok(()));
1600 assert_eq!(
1601 stream.recv.reset(0, 5),
1602 Ok(RecvBufResetReturn {
1603 max_data_delta: 0,
1604 consumed_flowcontrol: 5
1605 })
1606 );
1607 assert_eq!(stream.recv.reset(0, 10), Err(Error::FinalSize));
1608 }
1609
1610 #[test]
1611 fn recv_reset_lower_than_received() {
1612 let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1613 assert!(!stream.recv.almost_full());
1614
1615 let first = RangeBuf::from(b"hello", 0, false);
1616
1617 assert_eq!(stream.recv.write(first), Ok(()));
1618 assert_eq!(stream.recv.reset(0, 4), Err(Error::FinalSize));
1619 }
1620
1621 #[test]
1622 fn send_flow_control() {
1623 let mut buf = [0; 25];
1624
1625 let mut stream = <Stream>::new(0, 0, 15, true, 0, DEFAULT_STREAM_WINDOW);
1626
1627 let first = b"hello";
1628 let second = b"world";
1629 let third = b"something";
1630
1631 assert!(stream.send.write(first, false).is_ok());
1632 assert!(stream.send.write(second, false).is_ok());
1633 assert!(stream.send.write(third, false).is_ok());
1634
1635 assert_eq!(stream.send.off_front(), 0);
1636
1637 let (written, fin) = stream.send.emit(&mut buf[..25]).unwrap();
1638 assert_eq!(written, 15);
1639 assert!(!fin);
1640 assert_eq!(&buf[..written], b"helloworldsomet");
1641
1642 assert_eq!(stream.send.off_front(), 15);
1643
1644 let (written, fin) = stream.send.emit(&mut buf[..25]).unwrap();
1645 assert_eq!(written, 0);
1646 assert!(!fin);
1647 assert_eq!(&buf[..written], b"");
1648
1649 stream.send.retransmit(0, 15);
1650
1651 assert_eq!(stream.send.off_front(), 0);
1652
1653 let (written, fin) = stream.send.emit(&mut buf[..10]).unwrap();
1654 assert_eq!(written, 10);
1655 assert!(!fin);
1656 assert_eq!(&buf[..written], b"helloworld");
1657
1658 assert_eq!(stream.send.off_front(), 10);
1659
1660 let (written, fin) = stream.send.emit(&mut buf[..10]).unwrap();
1661 assert_eq!(written, 5);
1662 assert!(!fin);
1663 assert_eq!(&buf[..written], b"somet");
1664 }
1665
1666 #[test]
1667 fn send_past_fin() {
1668 let mut stream = <Stream>::new(0, 0, 15, true, 0, DEFAULT_STREAM_WINDOW);
1669
1670 let first = b"hello";
1671 let second = b"world";
1672 let third = b"third";
1673
1674 assert_eq!(stream.send.write(first, false), Ok(5));
1675
1676 assert_eq!(stream.send.write(second, true), Ok(5));
1677 assert!(stream.send.is_fin());
1678
1679 assert_eq!(stream.send.write(third, false), Err(Error::FinalSize));
1680 }
1681
1682 #[test]
1683 fn send_fin_dup() {
1684 let mut stream = <Stream>::new(0, 0, 15, true, 0, DEFAULT_STREAM_WINDOW);
1685
1686 assert_eq!(stream.send.write(b"hello", true), Ok(5));
1687 assert!(stream.send.is_fin());
1688
1689 assert_eq!(stream.send.write(b"", true), Ok(0));
1690 assert!(stream.send.is_fin());
1691 }
1692
1693 #[test]
1694 fn send_undo_fin() {
1695 let mut stream = <Stream>::new(0, 0, 15, true, 0, DEFAULT_STREAM_WINDOW);
1696
1697 assert_eq!(stream.send.write(b"hello", true), Ok(5));
1698 assert!(stream.send.is_fin());
1699
1700 assert_eq!(
1701 stream.send.write(b"helloworld", true),
1702 Err(Error::FinalSize)
1703 );
1704 }
1705
1706 #[test]
1707 fn send_fin_max_data_match() {
1708 let mut buf = [0; 15];
1709
1710 let mut stream = <Stream>::new(0, 0, 15, true, 0, DEFAULT_STREAM_WINDOW);
1711
1712 let slice = b"hellohellohello";
1713
1714 assert!(stream.send.write(slice, true).is_ok());
1715
1716 let (written, fin) = stream.send.emit(&mut buf[..15]).unwrap();
1717 assert_eq!(written, 15);
1718 assert!(fin);
1719 assert_eq!(&buf[..written], slice);
1720 }
1721
1722 #[test]
1723 fn send_fin_zero_length() {
1724 let mut buf = [0; 5];
1725
1726 let mut stream = <Stream>::new(0, 0, 15, true, 0, DEFAULT_STREAM_WINDOW);
1727
1728 assert_eq!(stream.send.write(b"hello", false), Ok(5));
1729 assert_eq!(stream.send.write(b"", true), Ok(0));
1730 assert!(stream.send.is_fin());
1731
1732 let (written, fin) = stream.send.emit(&mut buf[..5]).unwrap();
1733 assert_eq!(written, 5);
1734 assert!(fin);
1735 assert_eq!(&buf[..written], b"hello");
1736 }
1737
1738 #[test]
1739 fn send_ack() {
1740 let mut buf = [0; 5];
1741
1742 let mut stream = <Stream>::new(0, 0, 15, true, 0, DEFAULT_STREAM_WINDOW);
1743
1744 assert_eq!(stream.send.write(b"hello", false), Ok(5));
1745 assert_eq!(stream.send.write(b"world", false), Ok(5));
1746 assert_eq!(stream.send.write(b"", true), Ok(0));
1747 assert!(stream.send.is_fin());
1748
1749 assert_eq!(stream.send.off_front(), 0);
1750
1751 let (written, fin) = stream.send.emit(&mut buf[..5]).unwrap();
1752 assert_eq!(written, 5);
1753 assert!(!fin);
1754 assert_eq!(&buf[..written], b"hello");
1755
1756 stream.send.ack_and_drop(0, 5);
1757
1758 stream.send.retransmit(0, 5);
1759
1760 assert_eq!(stream.send.off_front(), 5);
1761
1762 let (written, fin) = stream.send.emit(&mut buf[..5]).unwrap();
1763 assert_eq!(written, 5);
1764 assert!(fin);
1765 assert_eq!(&buf[..written], b"world");
1766 }
1767
1768 #[test]
1769 fn send_ack_reordering() {
1770 let mut buf = [0; 5];
1771
1772 let mut stream = <Stream>::new(0, 0, 15, true, 0, DEFAULT_STREAM_WINDOW);
1773
1774 assert_eq!(stream.send.write(b"hello", false), Ok(5));
1775 assert_eq!(stream.send.write(b"world", false), Ok(5));
1776 assert_eq!(stream.send.write(b"", true), Ok(0));
1777 assert!(stream.send.is_fin());
1778
1779 assert_eq!(stream.send.off_front(), 0);
1780
1781 let (written, fin) = stream.send.emit(&mut buf[..5]).unwrap();
1782 assert_eq!(written, 5);
1783 assert!(!fin);
1784 assert_eq!(&buf[..written], b"hello");
1785
1786 assert_eq!(stream.send.off_front(), 5);
1787
1788 let (written, fin) = stream.send.emit(&mut buf[..1]).unwrap();
1789 assert_eq!(written, 1);
1790 assert!(!fin);
1791 assert_eq!(&buf[..written], b"w");
1792
1793 stream.send.ack_and_drop(5, 1);
1794 stream.send.ack_and_drop(0, 5);
1795
1796 stream.send.retransmit(0, 5);
1797 stream.send.retransmit(5, 1);
1798
1799 assert_eq!(stream.send.off_front(), 6);
1800
1801 let (written, fin) = stream.send.emit(&mut buf[..5]).unwrap();
1802 assert_eq!(written, 4);
1803 assert!(fin);
1804 assert_eq!(&buf[..written], b"orld");
1805 }
1806
1807 #[test]
1808 fn recv_data_below_off() {
1809 let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1810
1811 let first = RangeBuf::from(b"hello", 0, false);
1812
1813 assert_eq!(stream.recv.write(first), Ok(()));
1814
1815 let mut buf = [0; 10];
1816
1817 let (len, fin) = stream.recv.emit(&mut buf).unwrap();
1818 assert_eq!(&buf[..len], b"hello");
1819 assert!(!fin);
1820
1821 let first = RangeBuf::from(b"elloworld", 1, true);
1822 assert_eq!(stream.recv.write(first), Ok(()));
1823
1824 let (len, fin) = stream.recv.emit(&mut buf).unwrap();
1825 assert_eq!(&buf[..len], b"world");
1826 assert!(fin);
1827 }
1828
1829 #[test]
1830 fn stream_complete() {
1831 let mut stream =
1832 <Stream>::new(0, 30, 30, true, 30, DEFAULT_STREAM_WINDOW);
1833
1834 assert_eq!(stream.send.write(b"hello", false), Ok(5));
1835 assert_eq!(stream.send.write(b"world", false), Ok(5));
1836
1837 assert!(!stream.send.is_complete());
1838 assert!(!stream.send.is_fin());
1839
1840 assert_eq!(stream.send.write(b"", true), Ok(0));
1841
1842 assert!(!stream.send.is_complete());
1843 assert!(stream.send.is_fin());
1844
1845 let buf = RangeBuf::from(b"hello", 0, true);
1846 assert!(stream.recv.write(buf).is_ok());
1847 assert!(!stream.recv.is_fin());
1848
1849 stream.send.ack(6, 4);
1850 assert!(!stream.send.is_complete());
1851
1852 let mut buf = [0; 2];
1853 assert_eq!(stream.recv.emit(&mut buf), Ok((2, false)));
1854 assert!(!stream.recv.is_fin());
1855
1856 stream.send.ack(1, 5);
1857 assert!(!stream.send.is_complete());
1858
1859 stream.send.ack(0, 1);
1860 assert!(!stream.send.is_complete());
1861
1862 stream.send.ack_fin();
1863 assert!(stream.send.is_complete());
1864
1865 assert!(!stream.is_complete());
1866
1867 let mut buf = [0; 3];
1868 assert_eq!(stream.recv.emit(&mut buf), Ok((3, true)));
1869 assert!(stream.recv.is_fin());
1870
1871 assert!(stream.is_complete());
1872 }
1873
1874 #[test]
1875 fn send_fin_zero_length_output() {
1876 let mut buf = [0; 5];
1877
1878 let mut stream = <Stream>::new(0, 0, 15, true, 0, DEFAULT_STREAM_WINDOW);
1879
1880 assert_eq!(stream.send.write(b"hello", false), Ok(5));
1881 assert_eq!(stream.send.off_front(), 0);
1882 assert!(!stream.send.is_fin());
1883
1884 let (written, fin) = stream.send.emit(&mut buf).unwrap();
1885 assert_eq!(written, 5);
1886 assert!(!fin);
1887 assert_eq!(&buf[..written], b"hello");
1888
1889 assert_eq!(stream.send.write(b"", true), Ok(0));
1890 assert!(stream.send.is_fin());
1891 assert_eq!(stream.send.off_front(), 5);
1892
1893 let (written, fin) = stream.send.emit(&mut buf).unwrap();
1894 assert_eq!(written, 0);
1895 assert!(fin);
1896 assert_eq!(&buf[..written], b"");
1897 }
1898
1899 fn stream_send_ready(stream: &Stream) -> bool {
1900 !stream.send.is_empty() &&
1901 stream.send.off_front() < stream.send.off_back()
1902 }
1903
1904 #[test]
1905 fn send_emit() {
1906 let mut buf = [0; 5];
1907
1908 let mut stream = <Stream>::new(0, 0, 20, true, 0, DEFAULT_STREAM_WINDOW);
1909
1910 assert_eq!(stream.send.write(b"hello", false), Ok(5));
1911 assert_eq!(stream.send.write(b"world", false), Ok(5));
1912 assert_eq!(stream.send.write(b"olleh", false), Ok(5));
1913 assert_eq!(stream.send.write(b"dlrow", true), Ok(5));
1914 assert_eq!(stream.send.off_front(), 0);
1915 assert_eq!(stream.send.bufs_count(), 4);
1916
1917 assert!(stream.is_flushable());
1918
1919 assert!(stream_send_ready(&stream));
1920 assert_eq!(stream.send.emit(&mut buf[..4]), Ok((4, false)));
1921 assert_eq!(stream.send.off_front(), 4);
1922 assert_eq!(&buf[..4], b"hell");
1923
1924 assert!(stream_send_ready(&stream));
1925 assert_eq!(stream.send.emit(&mut buf[..4]), Ok((4, false)));
1926 assert_eq!(stream.send.off_front(), 8);
1927 assert_eq!(&buf[..4], b"owor");
1928
1929 assert!(stream_send_ready(&stream));
1930 assert_eq!(stream.send.emit(&mut buf[..2]), Ok((2, false)));
1931 assert_eq!(stream.send.off_front(), 10);
1932 assert_eq!(&buf[..2], b"ld");
1933
1934 assert!(stream_send_ready(&stream));
1935 assert_eq!(stream.send.emit(&mut buf[..1]), Ok((1, false)));
1936 assert_eq!(stream.send.off_front(), 11);
1937 assert_eq!(&buf[..1], b"o");
1938
1939 assert!(stream_send_ready(&stream));
1940 assert_eq!(stream.send.emit(&mut buf[..5]), Ok((5, false)));
1941 assert_eq!(stream.send.off_front(), 16);
1942 assert_eq!(&buf[..5], b"llehd");
1943
1944 assert!(stream_send_ready(&stream));
1945 assert_eq!(stream.send.emit(&mut buf[..5]), Ok((4, true)));
1946 assert_eq!(stream.send.off_front(), 20);
1947 assert_eq!(&buf[..4], b"lrow");
1948
1949 assert!(!stream.is_flushable());
1950
1951 assert!(!stream_send_ready(&stream));
1952 assert_eq!(stream.send.emit(&mut buf[..5]), Ok((0, true)));
1953 assert_eq!(stream.send.off_front(), 20);
1954 }
1955
1956 #[test]
1957 fn send_emit_ack() {
1958 let mut buf = [0; 5];
1959
1960 let mut stream = <Stream>::new(0, 0, 20, true, 0, DEFAULT_STREAM_WINDOW);
1961
1962 assert_eq!(stream.send.write(b"hello", false), Ok(5));
1963 assert_eq!(stream.send.write(b"world", false), Ok(5));
1964 assert_eq!(stream.send.write(b"olleh", false), Ok(5));
1965 assert_eq!(stream.send.write(b"dlrow", true), Ok(5));
1966 assert_eq!(stream.send.off_front(), 0);
1967 assert_eq!(stream.send.bufs_count(), 4);
1968
1969 assert!(stream.is_flushable());
1970
1971 assert!(stream_send_ready(&stream));
1972 assert_eq!(stream.send.emit(&mut buf[..4]), Ok((4, false)));
1973 assert_eq!(stream.send.off_front(), 4);
1974 assert_eq!(&buf[..4], b"hell");
1975
1976 assert!(stream_send_ready(&stream));
1977 assert_eq!(stream.send.emit(&mut buf[..4]), Ok((4, false)));
1978 assert_eq!(stream.send.off_front(), 8);
1979 assert_eq!(&buf[..4], b"owor");
1980
1981 stream.send.ack_and_drop(0, 5);
1982 assert_eq!(stream.send.bufs_count(), 3);
1983
1984 assert!(stream_send_ready(&stream));
1985 assert_eq!(stream.send.emit(&mut buf[..2]), Ok((2, false)));
1986 assert_eq!(stream.send.off_front(), 10);
1987 assert_eq!(&buf[..2], b"ld");
1988
1989 stream.send.ack_and_drop(7, 5);
1990 assert_eq!(stream.send.bufs_count(), 3);
1991
1992 assert!(stream_send_ready(&stream));
1993 assert_eq!(stream.send.emit(&mut buf[..1]), Ok((1, false)));
1994 assert_eq!(stream.send.off_front(), 11);
1995 assert_eq!(&buf[..1], b"o");
1996
1997 assert!(stream_send_ready(&stream));
1998 assert_eq!(stream.send.emit(&mut buf[..5]), Ok((5, false)));
1999 assert_eq!(stream.send.off_front(), 16);
2000 assert_eq!(&buf[..5], b"llehd");
2001
2002 stream.send.ack_and_drop(5, 7);
2003 assert_eq!(stream.send.bufs_count(), 2);
2004
2005 assert!(stream_send_ready(&stream));
2006 assert_eq!(stream.send.emit(&mut buf[..5]), Ok((4, true)));
2007 assert_eq!(stream.send.off_front(), 20);
2008 assert_eq!(&buf[..4], b"lrow");
2009
2010 assert!(!stream.is_flushable());
2011
2012 assert!(!stream_send_ready(&stream));
2013 assert_eq!(stream.send.emit(&mut buf[..5]), Ok((0, true)));
2014 assert_eq!(stream.send.off_front(), 20);
2015
2016 stream.send.ack_and_drop(22, 4);
2017 assert_eq!(stream.send.bufs_count(), 2);
2018
2019 stream.send.ack_and_drop(20, 1);
2020 assert_eq!(stream.send.bufs_count(), 2);
2021 }
2022
2023 #[test]
2024 fn send_emit_retransmit() {
2025 let mut buf = [0; 5];
2026
2027 let mut stream = <Stream>::new(
2028 0,
2029 0,
2030 20,
2031 true,
2032 DEFAULT_STREAM_WINDOW,
2033 DEFAULT_STREAM_WINDOW,
2034 );
2035
2036 assert_eq!(stream.send.write(b"hello", false), Ok(5));
2037 assert_eq!(stream.send.write(b"world", false), Ok(5));
2038 assert_eq!(stream.send.write(b"olleh", false), Ok(5));
2039 assert_eq!(stream.send.write(b"dlrow", true), Ok(5));
2040 assert_eq!(stream.send.off_front(), 0);
2041 assert_eq!(stream.send.bufs_count(), 4);
2042
2043 assert!(stream.is_flushable());
2044
2045 assert!(stream_send_ready(&stream));
2046 assert_eq!(stream.send.emit(&mut buf[..4]), Ok((4, false)));
2047 assert_eq!(stream.send.off_front(), 4);
2048 assert_eq!(&buf[..4], b"hell");
2049
2050 assert!(stream_send_ready(&stream));
2051 assert_eq!(stream.send.emit(&mut buf[..4]), Ok((4, false)));
2052 assert_eq!(stream.send.off_front(), 8);
2053 assert_eq!(&buf[..4], b"owor");
2054
2055 stream.send.retransmit(3, 3);
2056 assert_eq!(stream.send.off_front(), 3);
2057
2058 assert!(stream_send_ready(&stream));
2059 assert_eq!(stream.send.emit(&mut buf[..3]), Ok((3, false)));
2060 assert_eq!(stream.send.off_front(), 8);
2061 assert_eq!(&buf[..3], b"low");
2062
2063 assert!(stream_send_ready(&stream));
2064 assert_eq!(stream.send.emit(&mut buf[..2]), Ok((2, false)));
2065 assert_eq!(stream.send.off_front(), 10);
2066 assert_eq!(&buf[..2], b"ld");
2067
2068 stream.send.ack_and_drop(7, 2);
2069
2070 stream.send.retransmit(8, 2);
2071
2072 assert!(stream_send_ready(&stream));
2073 assert_eq!(stream.send.emit(&mut buf[..2]), Ok((2, false)));
2074 assert_eq!(stream.send.off_front(), 10);
2075 assert_eq!(&buf[..2], b"ld");
2076
2077 assert!(stream_send_ready(&stream));
2078 assert_eq!(stream.send.emit(&mut buf[..1]), Ok((1, false)));
2079 assert_eq!(stream.send.off_front(), 11);
2080 assert_eq!(&buf[..1], b"o");
2081
2082 assert!(stream_send_ready(&stream));
2083 assert_eq!(stream.send.emit(&mut buf[..5]), Ok((5, false)));
2084 assert_eq!(stream.send.off_front(), 16);
2085 assert_eq!(&buf[..5], b"llehd");
2086
2087 stream.send.retransmit(12, 2);
2088
2089 assert!(stream_send_ready(&stream));
2090 assert_eq!(stream.send.emit(&mut buf[..2]), Ok((2, false)));
2091 assert_eq!(stream.send.off_front(), 16);
2092 assert_eq!(&buf[..2], b"le");
2093
2094 assert!(stream_send_ready(&stream));
2095 assert_eq!(stream.send.emit(&mut buf[..5]), Ok((4, true)));
2096 assert_eq!(stream.send.off_front(), 20);
2097 assert_eq!(&buf[..4], b"lrow");
2098
2099 assert!(!stream.is_flushable());
2100
2101 assert!(!stream_send_ready(&stream));
2102 assert_eq!(stream.send.emit(&mut buf[..5]), Ok((0, true)));
2103 assert_eq!(stream.send.off_front(), 20);
2104
2105 stream.send.retransmit(7, 12);
2106
2107 assert!(stream_send_ready(&stream));
2108 assert_eq!(stream.send.emit(&mut buf[..5]), Ok((5, false)));
2109 assert_eq!(stream.send.off_front(), 12);
2110 assert_eq!(&buf[..5], b"rldol");
2111
2112 assert!(stream_send_ready(&stream));
2113 assert_eq!(stream.send.emit(&mut buf[..5]), Ok((5, false)));
2114 assert_eq!(stream.send.off_front(), 17);
2115 assert_eq!(&buf[..5], b"lehdl");
2116
2117 assert!(stream_send_ready(&stream));
2118 assert_eq!(stream.send.emit(&mut buf[..5]), Ok((2, false)));
2119 assert_eq!(stream.send.off_front(), 20);
2120 assert_eq!(&buf[..2], b"ro");
2121
2122 stream.send.ack_and_drop(12, 7);
2123
2124 stream.send.retransmit(7, 12);
2125
2126 assert!(stream_send_ready(&stream));
2127 assert_eq!(stream.send.emit(&mut buf[..5]), Ok((5, false)));
2128 assert_eq!(stream.send.off_front(), 12);
2129 assert_eq!(&buf[..5], b"rldol");
2130
2131 assert!(stream_send_ready(&stream));
2132 assert_eq!(stream.send.emit(&mut buf[..5]), Ok((5, false)));
2133 assert_eq!(stream.send.off_front(), 17);
2134 assert_eq!(&buf[..5], b"lehdl");
2135
2136 assert!(stream_send_ready(&stream));
2137 assert_eq!(stream.send.emit(&mut buf[..5]), Ok((2, false)));
2138 assert_eq!(stream.send.off_front(), 20);
2139 assert_eq!(&buf[..2], b"ro");
2140 }
2141
2142 #[test]
2143 fn send_buf_empty_fin_next() {
2144 let mut stream = <Stream>::new(0, 0, 20, true, 0, DEFAULT_STREAM_WINDOW);
2145
2146 assert!(!stream.send.empty_fin_next());
2147 assert_eq!(stream.send.write(b"hello", false), Ok(5));
2148
2149 let mut buf = [0; 5];
2150 assert_eq!(stream.send.emit(&mut buf), Ok((5, false)));
2151 assert!(!stream.send.empty_fin_next());
2152
2153 assert_eq!(stream.send.write(b"", true), Ok(0));
2154 assert!(stream.send.empty_fin_next());
2155
2156 let mut empty = [];
2157 assert_eq!(stream.send.emit(&mut empty), Ok((0, true)));
2158 }
2159
2160 #[test]
2161 fn rangebuf_split_off() {
2162 let mut buf = <RangeBuf>::from(b"helloworld", 5, true);
2163 assert_eq!(buf.start, 0);
2164 assert_eq!(buf.pos, 0);
2165 assert_eq!(buf.len, 10);
2166 assert_eq!(buf.off, 5);
2167 assert!(buf.fin);
2168
2169 assert_eq!(buf.len(), 10);
2170 assert_eq!(buf.off(), 5);
2171 assert!(buf.fin());
2172
2173 assert_eq!(&buf[..], b"helloworld");
2174
2175 buf.consume(5);
2177
2178 assert_eq!(buf.start, 0);
2179 assert_eq!(buf.pos, 5);
2180 assert_eq!(buf.len, 10);
2181 assert_eq!(buf.off, 5);
2182 assert!(buf.fin);
2183
2184 assert_eq!(buf.len(), 5);
2185 assert_eq!(buf.off(), 10);
2186 assert!(buf.fin());
2187
2188 assert_eq!(&buf[..], b"world");
2189
2190 let mut new_buf = buf.split_off(3);
2192
2193 assert_eq!(buf.start, 0);
2194 assert_eq!(buf.pos, 3);
2195 assert_eq!(buf.len, 3);
2196 assert_eq!(buf.off, 5);
2197 assert!(!buf.fin);
2198
2199 assert_eq!(buf.len(), 0);
2200 assert_eq!(buf.off(), 8);
2201 assert!(!buf.fin());
2202
2203 assert_eq!(&buf[..], b"");
2204
2205 assert_eq!(new_buf.start, 3);
2206 assert_eq!(new_buf.pos, 5);
2207 assert_eq!(new_buf.len, 7);
2208 assert_eq!(new_buf.off, 8);
2209 assert!(new_buf.fin);
2210
2211 assert_eq!(new_buf.len(), 5);
2212 assert_eq!(new_buf.off(), 10);
2213 assert!(new_buf.fin());
2214
2215 assert_eq!(&new_buf[..], b"world");
2216
2217 new_buf.consume(2);
2219
2220 assert_eq!(new_buf.start, 3);
2221 assert_eq!(new_buf.pos, 7);
2222 assert_eq!(new_buf.len, 7);
2223 assert_eq!(new_buf.off, 8);
2224 assert!(new_buf.fin);
2225
2226 assert_eq!(new_buf.len(), 3);
2227 assert_eq!(new_buf.off(), 12);
2228 assert!(new_buf.fin());
2229
2230 assert_eq!(&new_buf[..], b"rld");
2231
2232 let mut new_new_buf = new_buf.split_off(5);
2234
2235 assert_eq!(new_buf.start, 3);
2236 assert_eq!(new_buf.pos, 7);
2237 assert_eq!(new_buf.len, 5);
2238 assert_eq!(new_buf.off, 8);
2239 assert!(!new_buf.fin);
2240
2241 assert_eq!(new_buf.len(), 1);
2242 assert_eq!(new_buf.off(), 12);
2243 assert!(!new_buf.fin());
2244
2245 assert_eq!(&new_buf[..], b"r");
2246
2247 assert_eq!(new_new_buf.start, 8);
2248 assert_eq!(new_new_buf.pos, 8);
2249 assert_eq!(new_new_buf.len, 2);
2250 assert_eq!(new_new_buf.off, 13);
2251 assert!(new_new_buf.fin);
2252
2253 assert_eq!(new_new_buf.len(), 2);
2254 assert_eq!(new_new_buf.off(), 13);
2255 assert!(new_new_buf.fin());
2256
2257 assert_eq!(&new_new_buf[..], b"ld");
2258
2259 new_new_buf.consume(2);
2261
2262 assert_eq!(new_new_buf.start, 8);
2263 assert_eq!(new_new_buf.pos, 10);
2264 assert_eq!(new_new_buf.len, 2);
2265 assert_eq!(new_new_buf.off, 13);
2266 assert!(new_new_buf.fin);
2267
2268 assert_eq!(new_new_buf.len(), 0);
2269 assert_eq!(new_new_buf.off(), 15);
2270 assert!(new_new_buf.fin());
2271
2272 assert_eq!(&new_new_buf[..], b"");
2273 }
2274
2275 #[test]
2278 fn stream_limit_auto_open() {
2279 let local_tp = crate::TransportParams::default();
2280 let peer_tp = crate::TransportParams::default();
2281
2282 let mut streams = <StreamMap>::new(5, 5, 5);
2283
2284 let stream_id = 500;
2285 assert!(!is_local(stream_id, true), "stream id is peer initiated");
2286 assert!(is_bidi(stream_id), "stream id is bidirectional");
2287 assert_eq!(
2288 streams
2289 .get_or_create(stream_id, &local_tp, &peer_tp, false, true)
2290 .err(),
2291 Some(Error::StreamLimit),
2292 "stream limit should be exceeded"
2293 );
2294 }
2295
2296 #[test]
2299 fn stream_create_out_of_order() {
2300 let local_tp = crate::TransportParams::default();
2301 let peer_tp = crate::TransportParams::default();
2302
2303 let mut streams = <StreamMap>::new(5, 5, 5);
2304
2305 for stream_id in [8, 12, 4] {
2306 assert!(is_local(stream_id, false), "stream id is client initiated");
2307 assert!(is_bidi(stream_id), "stream id is bidirectional");
2308 assert!(streams
2309 .get_or_create(stream_id, &local_tp, &peer_tp, false, true)
2310 .is_ok());
2311 }
2312 }
2313
2314 #[test]
2316 fn stream_limit_edge() {
2317 let local_tp = crate::TransportParams::default();
2318 let peer_tp = crate::TransportParams::default();
2319
2320 let mut streams = <StreamMap>::new(3, 3, 3);
2321
2322 let stream_id = 8;
2324 assert!(streams
2325 .get_or_create(stream_id, &local_tp, &peer_tp, false, true)
2326 .is_ok());
2327
2328 let stream_id = 12;
2330 assert_eq!(
2331 streams
2332 .get_or_create(stream_id, &local_tp, &peer_tp, false, true)
2333 .err(),
2334 Some(Error::StreamLimit)
2335 );
2336 }
2337
2338 fn cycle_stream_priority(stream_id: u64, streams: &mut StreamMap) {
2339 let key = streams.get(stream_id).unwrap().priority_key.clone();
2340 streams.update_priority(&key.clone(), &key);
2341 }
2342
2343 #[test]
2344 fn writable_prioritized_default_priority() {
2345 let local_tp = crate::TransportParams::default();
2346 let peer_tp = crate::TransportParams {
2347 initial_max_stream_data_bidi_local: 100,
2348 initial_max_stream_data_uni: 100,
2349 ..Default::default()
2350 };
2351
2352 let mut streams = StreamMap::new(100, 100, 100);
2353
2354 for id in [0, 4, 8, 12] {
2355 assert!(streams
2356 .get_or_create(id, &local_tp, &peer_tp, false, true)
2357 .is_ok());
2358 }
2359
2360 let walk_1: Vec<u64> = streams.writable().collect();
2361 cycle_stream_priority(*walk_1.first().unwrap(), &mut streams);
2362 let walk_2: Vec<u64> = streams.writable().collect();
2363 cycle_stream_priority(*walk_2.first().unwrap(), &mut streams);
2364 let walk_3: Vec<u64> = streams.writable().collect();
2365 cycle_stream_priority(*walk_3.first().unwrap(), &mut streams);
2366 let walk_4: Vec<u64> = streams.writable().collect();
2367 cycle_stream_priority(*walk_4.first().unwrap(), &mut streams);
2368 let walk_5: Vec<u64> = streams.writable().collect();
2369
2370 assert_eq!(walk_1, vec![0, 4, 8, 12]);
2373 assert_eq!(walk_2, vec![4, 8, 12, 0]);
2374 assert_eq!(walk_3, vec![8, 12, 0, 4]);
2375 assert_eq!(walk_4, vec![12, 0, 4, 8,]);
2376 assert_eq!(walk_5, vec![0, 4, 8, 12]);
2377 }
2378
2379 #[test]
2380 fn writable_prioritized_insert_order() {
2381 let local_tp = crate::TransportParams::default();
2382 let peer_tp = crate::TransportParams {
2383 initial_max_stream_data_bidi_local: 100,
2384 initial_max_stream_data_uni: 100,
2385 ..Default::default()
2386 };
2387
2388 let mut streams = StreamMap::new(100, 100, 100);
2389
2390 for id in [12, 4, 8, 0] {
2393 assert!(streams
2394 .get_or_create(id, &local_tp, &peer_tp, false, true)
2395 .is_ok());
2396 }
2397
2398 let walk_1: Vec<u64> = streams.writable().collect();
2399 cycle_stream_priority(*walk_1.first().unwrap(), &mut streams);
2400 let walk_2: Vec<u64> = streams.writable().collect();
2401 cycle_stream_priority(*walk_2.first().unwrap(), &mut streams);
2402 let walk_3: Vec<u64> = streams.writable().collect();
2403 cycle_stream_priority(*walk_3.first().unwrap(), &mut streams);
2404 let walk_4: Vec<u64> = streams.writable().collect();
2405 cycle_stream_priority(*walk_4.first().unwrap(), &mut streams);
2406 let walk_5: Vec<u64> = streams.writable().collect();
2407 assert_eq!(walk_1, vec![12, 4, 8, 0]);
2408 assert_eq!(walk_2, vec![4, 8, 0, 12]);
2409 assert_eq!(walk_3, vec![8, 0, 12, 4,]);
2410 assert_eq!(walk_4, vec![0, 12, 4, 8]);
2411 assert_eq!(walk_5, vec![12, 4, 8, 0]);
2412 }
2413
2414 #[test]
2415 fn writable_prioritized_mixed_urgency() {
2416 let local_tp = crate::TransportParams::default();
2417 let peer_tp = crate::TransportParams {
2418 initial_max_stream_data_bidi_local: 100,
2419 initial_max_stream_data_uni: 100,
2420 ..Default::default()
2421 };
2422
2423 let mut streams = <StreamMap>::new(100, 100, 100);
2424
2425 let input = vec![
2428 (0, 100),
2429 (4, 90),
2430 (8, 80),
2431 (12, 70),
2432 (16, 60),
2433 (20, 50),
2434 (24, 40),
2435 (28, 30),
2436 (32, 20),
2437 (36, 10),
2438 (40, 0),
2439 ];
2440
2441 for (id, urgency) in input.clone() {
2442 let stream = streams
2445 .get_or_create(id, &local_tp, &peer_tp, false, true)
2446 .unwrap();
2447
2448 stream.urgency = urgency;
2449
2450 let new_priority_key = Arc::new(StreamPriorityKey {
2451 urgency: stream.urgency,
2452 incremental: stream.incremental,
2453 id,
2454 ..Default::default()
2455 });
2456
2457 let old_priority_key = std::mem::replace(
2458 &mut stream.priority_key,
2459 new_priority_key.clone(),
2460 );
2461
2462 streams.update_priority(&old_priority_key, &new_priority_key);
2463 }
2464
2465 let walk_1: Vec<u64> = streams.writable().collect();
2466 assert_eq!(walk_1, vec![40, 36, 32, 28, 24, 20, 16, 12, 8, 4, 0]);
2467
2468 for (id, urgency) in input {
2470 let stream = streams
2473 .get_or_create(id, &local_tp, &peer_tp, false, true)
2474 .unwrap();
2475
2476 stream.urgency = urgency;
2477
2478 let new_priority_key = Arc::new(StreamPriorityKey {
2479 urgency: stream.urgency,
2480 incremental: stream.incremental,
2481 id,
2482 ..Default::default()
2483 });
2484
2485 let old_priority_key = std::mem::replace(
2486 &mut stream.priority_key,
2487 new_priority_key.clone(),
2488 );
2489
2490 streams.update_priority(&old_priority_key, &new_priority_key);
2491 }
2492
2493 let walk_2: Vec<u64> = streams.writable().collect();
2494 assert_eq!(walk_2, vec![40, 36, 32, 28, 24, 20, 16, 12, 8, 4, 0]);
2495
2496 streams.collect(24, true);
2498
2499 let walk_3: Vec<u64> = streams.writable().collect();
2500 assert_eq!(walk_3, vec![40, 36, 32, 28, 20, 16, 12, 8, 4, 0]);
2501
2502 streams.collect(40, true);
2503 streams.collect(0, true);
2504
2505 let walk_4: Vec<u64> = streams.writable().collect();
2506 assert_eq!(walk_4, vec![36, 32, 28, 20, 16, 12, 8, 4]);
2507
2508 streams
2510 .get_or_create(44, &local_tp, &peer_tp, false, true)
2511 .unwrap();
2512
2513 let walk_5: Vec<u64> = streams.writable().collect();
2514 assert_eq!(walk_5, vec![36, 32, 28, 20, 16, 12, 8, 4, 44]);
2515 }
2516
2517 #[test]
2518 fn writable_prioritized_mixed_urgencies_incrementals() {
2519 let local_tp = crate::TransportParams::default();
2520 let peer_tp = crate::TransportParams {
2521 initial_max_stream_data_bidi_local: 100,
2522 initial_max_stream_data_uni: 100,
2523 ..Default::default()
2524 };
2525
2526 let mut streams = StreamMap::new(100, 100, 100);
2527
2528 let input = vec![
2530 (0, 100),
2531 (4, 20),
2532 (8, 100),
2533 (12, 20),
2534 (16, 90),
2535 (20, 25),
2536 (24, 90),
2537 (28, 30),
2538 (32, 80),
2539 (36, 20),
2540 (40, 0),
2541 ];
2542
2543 for (id, urgency) in input.clone() {
2544 let stream = streams
2547 .get_or_create(id, &local_tp, &peer_tp, false, true)
2548 .unwrap();
2549
2550 stream.urgency = urgency;
2551
2552 let new_priority_key = Arc::new(StreamPriorityKey {
2553 urgency: stream.urgency,
2554 incremental: stream.incremental,
2555 id,
2556 ..Default::default()
2557 });
2558
2559 let old_priority_key = std::mem::replace(
2560 &mut stream.priority_key,
2561 new_priority_key.clone(),
2562 );
2563
2564 streams.update_priority(&old_priority_key, &new_priority_key);
2565 }
2566
2567 let walk_1: Vec<u64> = streams.writable().collect();
2568 cycle_stream_priority(4, &mut streams);
2569 cycle_stream_priority(16, &mut streams);
2570 cycle_stream_priority(0, &mut streams);
2571 let walk_2: Vec<u64> = streams.writable().collect();
2572 cycle_stream_priority(12, &mut streams);
2573 cycle_stream_priority(24, &mut streams);
2574 cycle_stream_priority(8, &mut streams);
2575 let walk_3: Vec<u64> = streams.writable().collect();
2576 cycle_stream_priority(36, &mut streams);
2577 cycle_stream_priority(16, &mut streams);
2578 cycle_stream_priority(0, &mut streams);
2579 let walk_4: Vec<u64> = streams.writable().collect();
2580 cycle_stream_priority(4, &mut streams);
2581 cycle_stream_priority(24, &mut streams);
2582 cycle_stream_priority(8, &mut streams);
2583 let walk_5: Vec<u64> = streams.writable().collect();
2584 cycle_stream_priority(12, &mut streams);
2585 cycle_stream_priority(16, &mut streams);
2586 cycle_stream_priority(0, &mut streams);
2587 let walk_6: Vec<u64> = streams.writable().collect();
2588 cycle_stream_priority(36, &mut streams);
2589 cycle_stream_priority(24, &mut streams);
2590 cycle_stream_priority(8, &mut streams);
2591 let walk_7: Vec<u64> = streams.writable().collect();
2592 cycle_stream_priority(4, &mut streams);
2593 cycle_stream_priority(16, &mut streams);
2594 cycle_stream_priority(0, &mut streams);
2595 let walk_8: Vec<u64> = streams.writable().collect();
2596 cycle_stream_priority(12, &mut streams);
2597 cycle_stream_priority(24, &mut streams);
2598 cycle_stream_priority(8, &mut streams);
2599 let walk_9: Vec<u64> = streams.writable().collect();
2600 cycle_stream_priority(36, &mut streams);
2601 cycle_stream_priority(16, &mut streams);
2602 cycle_stream_priority(0, &mut streams);
2603
2604 assert_eq!(walk_1, vec![40, 4, 12, 36, 20, 28, 32, 16, 24, 0, 8]);
2605 assert_eq!(walk_2, vec![40, 12, 36, 4, 20, 28, 32, 24, 16, 8, 0]);
2606 assert_eq!(walk_3, vec![40, 36, 4, 12, 20, 28, 32, 16, 24, 0, 8]);
2607 assert_eq!(walk_4, vec![40, 4, 12, 36, 20, 28, 32, 24, 16, 8, 0]);
2608 assert_eq!(walk_5, vec![40, 12, 36, 4, 20, 28, 32, 16, 24, 0, 8]);
2609 assert_eq!(walk_6, vec![40, 36, 4, 12, 20, 28, 32, 24, 16, 8, 0]);
2610 assert_eq!(walk_7, vec![40, 4, 12, 36, 20, 28, 32, 16, 24, 0, 8]);
2611 assert_eq!(walk_8, vec![40, 12, 36, 4, 20, 28, 32, 24, 16, 8, 0]);
2612 assert_eq!(walk_9, vec![40, 36, 4, 12, 20, 28, 32, 16, 24, 0, 8]);
2613
2614 streams.collect(20, true);
2616
2617 let walk_10: Vec<u64> = streams.writable().collect();
2618 assert_eq!(walk_10, vec![40, 4, 12, 36, 28, 32, 24, 16, 8, 0]);
2619
2620 let stream = streams
2622 .get_or_create(44, &local_tp, &peer_tp, false, true)
2623 .unwrap();
2624
2625 stream.urgency = 20;
2626 stream.incremental = true;
2627
2628 let new_priority_key = Arc::new(StreamPriorityKey {
2629 urgency: stream.urgency,
2630 incremental: stream.incremental,
2631 id: 44,
2632 ..Default::default()
2633 });
2634
2635 let old_priority_key =
2636 std::mem::replace(&mut stream.priority_key, new_priority_key.clone());
2637
2638 streams.update_priority(&old_priority_key, &new_priority_key);
2639
2640 let walk_11: Vec<u64> = streams.writable().collect();
2641 assert_eq!(walk_11, vec![40, 4, 12, 36, 44, 28, 32, 24, 16, 8, 0]);
2642 }
2643
2644 #[test]
2645 fn priority_tree_dupes() {
2646 let mut prioritized_writable: RBTree<StreamWritablePriorityAdapter> =
2647 Default::default();
2648
2649 for id in [0, 4, 8, 12] {
2650 let s = Arc::new(StreamPriorityKey {
2651 urgency: 0,
2652 incremental: false,
2653 id,
2654 ..Default::default()
2655 });
2656
2657 prioritized_writable.insert(s);
2658 }
2659
2660 let walk_1: Vec<u64> =
2661 prioritized_writable.iter().map(|s| s.id).collect();
2662 assert_eq!(walk_1, vec![0, 4, 8, 12]);
2663
2664 for id in [0, 4, 8, 12] {
2667 let s = Arc::new(StreamPriorityKey {
2668 urgency: 0,
2669 incremental: false,
2670 id,
2671 ..Default::default()
2672 });
2673
2674 prioritized_writable.insert(s);
2675 }
2676
2677 let walk_2: Vec<u64> =
2678 prioritized_writable.iter().map(|s| s.id).collect();
2679 assert_eq!(walk_2, vec![0, 0, 4, 4, 8, 8, 12, 12]);
2680 }
2681
2682 #[test]
2683 fn retransmit_returns_zero_when_already_acked() {
2684 let mut stream = <Stream>::new(0, 15, 15, true, 0, 15);
2685
2686 assert_eq!(stream.send.write(b"hello", false), Ok(5));
2688 assert_eq!(stream.send.buffered_bytes(), 5);
2689
2690 let mut buf = [0; 10];
2691 let (written, _) = stream.send.emit(&mut buf).unwrap();
2692 assert_eq!(written, 5);
2693 assert_eq!(stream.send.buffered_bytes(), 0);
2694
2695 let retransmitted = stream.send.retransmit(0, 5);
2697 assert_eq!(retransmitted, 5);
2698 assert_eq!(stream.send.buffered_bytes(), 5);
2699
2700 stream.send.ack_and_drop(0, 5);
2702 assert_eq!(stream.send.buffered_bytes(), 0);
2703
2704 let retransmitted = stream.send.retransmit(0, 5);
2706 assert_eq!(retransmitted, 0);
2707 assert_eq!(stream.send.buffered_bytes(), 0);
2708 }
2709
2710 #[test]
2711 fn retransmit_returns_partial_when_some_acked() {
2712 let mut stream = <Stream>::new(0, 15, 15, true, 0, 15);
2713
2714 assert_eq!(stream.send.write(b"helloworld", false), Ok(10));
2716 assert_eq!(stream.send.buffered_bytes(), 10);
2717
2718 let mut buf = [0; 10];
2719 let (written, _) = stream.send.emit(&mut buf).unwrap();
2720 assert_eq!(written, 10);
2721 assert_eq!(stream.send.buffered_bytes(), 0);
2722
2723 let retransmitted = stream.send.retransmit(0, 10);
2725 assert_eq!(retransmitted, 10);
2726 assert_eq!(stream.send.buffered_bytes(), 10);
2727
2728 let dropped = stream.send.ack_and_drop(0, 5);
2730 assert_eq!(dropped, 5);
2731 assert_eq!(stream.send.buffered_bytes(), 5);
2732
2733 let retransmitted = stream.send.retransmit(0, 10);
2736 assert_eq!(retransmitted, 0); assert_eq!(stream.send.buffered_bytes(), 5);
2738 }
2739
2740 #[test]
2741 fn ack_and_drop_decrements_len_and_returns_dropped() {
2742 let mut stream = <Stream>::new(0, 15, 15, true, 0, 15);
2743
2744 assert_eq!(stream.send.write(b"hello", false), Ok(5));
2746 assert_eq!(stream.send.buffered_bytes(), 5);
2747
2748 let mut buf = [0; 10];
2750 let (written, _) = stream.send.emit(&mut buf).unwrap();
2751 assert_eq!(written, 5);
2752 assert_eq!(stream.send.buffered_bytes(), 0);
2753
2754 let retransmitted = stream.send.retransmit(0, 5);
2756 assert_eq!(retransmitted, 5);
2757 assert_eq!(stream.send.buffered_bytes(), 5);
2758
2759 let dropped = stream.send.ack_and_drop(0, 5);
2761 assert_eq!(dropped, 5);
2762 assert_eq!(stream.send.buffered_bytes(), 0);
2763 }
2764
2765 #[test]
2766 fn ack_and_drop_partial_buffer() {
2767 let mut stream = <Stream>::new(0, 30, 30, true, 0, 30);
2768
2769 assert_eq!(stream.send.write(b"hello", false), Ok(5));
2771 assert_eq!(stream.send.write(b"world", false), Ok(5));
2772 assert_eq!(stream.send.buffered_bytes(), 10);
2773
2774 let mut buf = [0; 10];
2775 let (written, _) = stream.send.emit(&mut buf).unwrap();
2776 assert_eq!(written, 10);
2777 assert_eq!(stream.send.buffered_bytes(), 0);
2778
2779 let retransmitted = stream.send.retransmit(0, 10);
2781 assert_eq!(retransmitted, 10);
2782 assert_eq!(stream.send.buffered_bytes(), 10);
2783
2784 let dropped = stream.send.ack_and_drop(0, 5);
2786 assert_eq!(dropped, 5);
2787 assert_eq!(stream.send.buffered_bytes(), 5);
2788
2789 let dropped = stream.send.ack_and_drop(5, 5);
2791 assert_eq!(dropped, 5);
2792 assert_eq!(stream.send.buffered_bytes(), 0);
2793 }
2794
2795 #[test]
2796 fn ack_and_drop_returns_zero_when_nothing_dropped() {
2797 let mut stream = <Stream>::new(0, 15, 15, true, 0, 15);
2798
2799 assert_eq!(stream.send.write(b"hello", false), Ok(5));
2801 let mut buf = [0; 10];
2802 let (written, _) = stream.send.emit(&mut buf).unwrap();
2803 assert_eq!(written, 5);
2804
2805 let dropped = stream.send.ack_and_drop(0, 5);
2808 assert_eq!(dropped, 0);
2809 assert_eq!(stream.send.buffered_bytes(), 0);
2810 }
2811
2812 #[test]
2813 fn cache_consistency_through_full_lifecycle() {
2814 let mut streams = <StreamMap>::new(5, 5, 15);
2818
2819 let local_params = crate::TransportParams {
2821 initial_max_data: 30,
2822 initial_max_stream_data_bidi_local: 15,
2823 initial_max_stream_data_bidi_remote: 15,
2824 initial_max_stream_data_uni: 10,
2825 initial_max_streams_bidi: 5,
2826 initial_max_streams_uni: 5,
2827 ..Default::default()
2828 };
2829 let peer_params = local_params.clone();
2830
2831 streams.update_peer_max_streams_bidi(5);
2833 streams.update_peer_max_streams_uni(5);
2834
2835 let stream_id = 0u64;
2836
2837 {
2839 let stream = streams
2840 .get_or_create(
2841 stream_id,
2842 &local_params,
2843 &peer_params,
2844 true,
2845 false,
2846 )
2847 .unwrap();
2848 assert_eq!(stream.send.write(b"hello", false), Ok(5));
2849 }
2850 streams.add_tx_buffered(5);
2851 assert_eq!(streams.get(stream_id).unwrap().send.buffered_bytes(), 5);
2852 assert_eq!(streams.tx_buffered(), 5);
2853 assert!(streams.tx_buffered_is_consistent());
2854
2855 let mut buf = [0; 10];
2857 let written = {
2858 let stream = streams.get_mut(stream_id).unwrap();
2859 let (written, _) = stream.send.emit(&mut buf).unwrap();
2860 written
2861 };
2862 assert_eq!(written, 5);
2863 streams.sub_tx_buffered(5);
2864 assert_eq!(streams.get(stream_id).unwrap().send.buffered_bytes(), 0);
2865 assert_eq!(streams.tx_buffered(), 0);
2866 assert!(streams.tx_buffered_is_consistent());
2867
2868 let retransmitted = {
2870 let stream = streams.get_mut(stream_id).unwrap();
2871 stream.send.retransmit(0, 5)
2872 };
2873 assert_eq!(retransmitted, 5);
2874 streams.add_tx_buffered(retransmitted);
2875 assert_eq!(streams.get(stream_id).unwrap().send.buffered_bytes(), 5);
2876 assert_eq!(streams.tx_buffered(), 5);
2877 assert!(streams.tx_buffered_is_consistent());
2878
2879 let dropped = {
2882 let stream = streams.get_mut(stream_id).unwrap();
2883 stream.send.ack_and_drop(0, 5)
2884 };
2885 assert_eq!(dropped, 5);
2886 streams.sub_tx_buffered(dropped);
2887 assert_eq!(streams.get(stream_id).unwrap().send.buffered_bytes(), 0);
2888 assert_eq!(streams.tx_buffered(), 0);
2889 assert!(streams.tx_buffered_is_consistent());
2890 }
2891
2892 #[test]
2893 fn send_buf_len_reflects_buffered_data() {
2894 let mut stream = <Stream>::new(0, 15, 15, true, 0, 15);
2895
2896 assert_eq!(stream.send.buffered_bytes(), 0);
2898
2899 assert_eq!(stream.send.write(b"hello", false), Ok(5));
2901 assert_eq!(stream.send.buffered_bytes(), 5);
2902
2903 let mut buf = [0; 10];
2905 let (written, _) = stream.send.emit(&mut buf).unwrap();
2906 assert_eq!(written, 5);
2907 assert_eq!(stream.send.buffered_bytes(), 0);
2908
2909 let retransmitted = stream.send.retransmit(0, 5);
2911 assert_eq!(retransmitted, 5);
2912 assert_eq!(stream.send.buffered_bytes(), 5);
2913
2914 let dropped = stream.send.ack_and_drop(0, 5);
2916 assert_eq!(dropped, 5);
2917 assert_eq!(stream.send.buffered_bytes(), 0);
2918 }
2919}
2920
2921mod recv_buf;
2922mod send_buf;