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
48pub(crate) use self::send_buf::PeerStopSendingState;
49
50const DEFAULT_URGENCY: u8 = 127;
51
52pub const MAX_STREAM_WINDOW: u64 = 16 * 1024 * 1024;
54
55#[derive(Default)]
60pub struct StreamIdHasher {
61 id: u64,
62}
63
64#[derive(Debug, PartialEq, Clone, Copy)]
66pub struct RecvBufResetReturn {
67 pub max_data_delta: u64,
70
71 pub consumed_flowcontrol: u64,
74}
75
76impl RecvBufResetReturn {
77 pub fn zero() -> Self {
78 Self {
79 max_data_delta: 0,
80 consumed_flowcontrol: 0,
81 }
82 }
83}
84
85pub enum RecvAction<T: bytes::BufMut> {
87 Emit { out: T },
89 Discard { len: usize },
91}
92
93impl std::hash::Hasher for StreamIdHasher {
94 #[inline]
95 fn finish(&self) -> u64 {
96 self.id
97 }
98
99 #[inline]
100 fn write_u64(&mut self, id: u64) {
101 self.id = id;
102 }
103
104 #[inline]
105 fn write(&mut self, _: &[u8]) {
106 unimplemented!()
109 }
110}
111
112type BuildStreamIdHasher = std::hash::BuildHasherDefault<StreamIdHasher>;
113
114pub type StreamIdHashMap<V> = HashMap<u64, V, BuildStreamIdHasher>;
115pub type StreamIdHashSet = HashSet<u64, BuildStreamIdHasher>;
116
117#[derive(Default)]
119struct CollectedStreams {
120 ranges: Option<Box<[RangeSet; 4]>>,
124}
125
126impl CollectedStreams {
127 fn insert(&mut self, stream_id: u64) {
128 let ranges = self.ranges.get_or_insert_with(Default::default);
131 ranges[(stream_id & 0x3) as usize].push_item(stream_id >> 2);
132 }
133
134 fn contains(&self, stream_id: u64) -> bool {
135 let Some(ranges) = &self.ranges else {
136 return false;
137 };
138
139 ranges[(stream_id & 0x3) as usize].contains(stream_id >> 2)
140 }
141}
142
143#[derive(Default)]
145pub struct StreamMap<F: BufFactory = DefaultBufFactory> {
146 streams: StreamIdHashMap<Stream<F>>,
148
149 collected: CollectedStreams,
155
156 peer_max_streams_bidi: u64,
158
159 peer_max_streams_uni: u64,
161
162 peer_opened_streams_bidi: u64,
164
165 peer_opened_streams_uni: u64,
167
168 local_max_streams_bidi: u64,
170 local_max_streams_bidi_next: u64,
171
172 initial_max_streams_bidi: u64,
174
175 local_max_streams_uni: u64,
177 local_max_streams_uni_next: u64,
178
179 initial_max_streams_uni: u64,
181
182 local_opened_streams_bidi: u64,
184
185 local_opened_streams_uni: u64,
187
188 flushable: RBTree<StreamFlushablePriorityAdapter>,
192
193 pub readable: RBTree<StreamReadablePriorityAdapter>,
197
198 pub writable: RBTree<StreamWritablePriorityAdapter>,
201
202 stopped_writable: RBTree<StreamStoppedWritablePriorityAdapter>,
204
205 almost_full: StreamIdHashSet,
210
211 blocked: StreamIdHashMap<u64>,
215
216 reset: StreamIdHashMap<(u64, u64)>,
220
221 stopped: StreamIdHashMap<u64>,
225
226 max_stream_window: u64,
228
229 tx_buffered: usize,
231}
232
233impl<F: BufFactory> StreamMap<F> {
234 pub fn new(
235 max_streams_bidi: u64, max_streams_uni: u64, max_stream_window: u64,
236 ) -> Self {
237 StreamMap {
238 local_max_streams_bidi: max_streams_bidi,
239 local_max_streams_bidi_next: max_streams_bidi,
240 initial_max_streams_bidi: max_streams_bidi,
241
242 local_max_streams_uni: max_streams_uni,
243 local_max_streams_uni_next: max_streams_uni,
244 initial_max_streams_uni: max_streams_uni,
245
246 max_stream_window,
247
248 ..StreamMap::default()
249 }
250 }
251
252 pub fn get(&self, id: u64) -> Option<&Stream<F>> {
254 self.streams.get(&id)
255 }
256
257 pub fn get_mut(&mut self, id: u64) -> Option<&mut Stream<F>> {
259 self.streams.get_mut(&id)
260 }
261
262 pub(crate) fn get_or_create(
273 &mut self, id: u64, local_params: &crate::TransportParams,
274 peer_params: &crate::TransportParams, local: bool, is_server: bool,
275 ) -> Result<&mut Stream<F>> {
276 let (stream, is_new_and_writable) = match self.streams.entry(id) {
277 hash_map::Entry::Vacant(v) => {
278 if self.collected.contains(id) {
280 return Err(Error::Done);
281 }
282
283 if local != is_local(id, is_server) {
284 return Err(Error::InvalidStreamState(id));
285 }
286
287 let (max_rx_data, max_tx_data) = match (local, is_bidi(id)) {
288 (true, true) => (
290 local_params.initial_max_stream_data_bidi_local,
291 peer_params.initial_max_stream_data_bidi_remote,
292 ),
293
294 (true, false) => (0, peer_params.initial_max_stream_data_uni),
296
297 (false, true) => (
299 local_params.initial_max_stream_data_bidi_remote,
300 peer_params.initial_max_stream_data_bidi_local,
301 ),
302
303 (false, false) =>
305 (local_params.initial_max_stream_data_uni, 0),
306 };
307
308 let stream_sequence = id >> 2;
312
313 match (is_local(id, is_server), is_bidi(id)) {
315 (true, true) => {
316 let n = cmp::max(
317 self.local_opened_streams_bidi,
318 stream_sequence + 1,
319 );
320
321 if n > self.peer_max_streams_bidi {
322 return Err(Error::StreamLimit);
323 }
324
325 self.local_opened_streams_bidi = n;
326 },
327
328 (true, false) => {
329 let n = cmp::max(
330 self.local_opened_streams_uni,
331 stream_sequence + 1,
332 );
333
334 if n > self.peer_max_streams_uni {
335 return Err(Error::StreamLimit);
336 }
337
338 self.local_opened_streams_uni = n;
339 },
340
341 (false, true) => {
342 let n = cmp::max(
343 self.peer_opened_streams_bidi,
344 stream_sequence + 1,
345 );
346
347 if n > self.local_max_streams_bidi {
348 return Err(Error::StreamLimit);
349 }
350
351 self.peer_opened_streams_bidi = n;
352 },
353
354 (false, false) => {
355 let n = cmp::max(
356 self.peer_opened_streams_uni,
357 stream_sequence + 1,
358 );
359
360 if n > self.local_max_streams_uni {
361 return Err(Error::StreamLimit);
362 }
363
364 self.peer_opened_streams_uni = n;
365 },
366 };
367
368 let initial_window = max_rx_data;
369 let s = Stream::new(
370 id,
371 max_rx_data,
372 max_tx_data,
373 local,
374 initial_window,
375 self.max_stream_window,
376 );
377
378 let is_writable = s.is_writable();
379
380 (v.insert(s), is_writable)
381 },
382
383 hash_map::Entry::Occupied(v) => (v.into_mut(), false),
384 };
385
386 if is_new_and_writable {
389 self.writable.insert(Arc::clone(&stream.priority_key));
390 }
391
392 Ok(stream)
393 }
394
395 pub fn insert_readable(&mut self, priority_key: &Arc<StreamPriorityKey>) {
399 if !priority_key.readable.is_linked() {
400 self.readable.insert(Arc::clone(priority_key));
401 }
402 }
403
404 pub fn remove_readable(&mut self, priority_key: &Arc<StreamPriorityKey>) {
406 if !priority_key.readable.is_linked() {
407 return;
408 }
409
410 let mut c = {
411 let ptr = Arc::as_ptr(priority_key);
412 unsafe { self.readable.cursor_mut_from_ptr(ptr) }
413 };
414
415 c.remove();
416 }
417
418 pub fn insert_writable(&mut self, priority_key: &Arc<StreamPriorityKey>) {
425 if !priority_key.writable.is_linked() {
426 self.writable.insert(Arc::clone(priority_key));
427 }
428 }
429
430 pub fn insert_stopped_writable(
432 &mut self, priority_key: &Arc<StreamPriorityKey>,
433 ) {
434 if !priority_key.stopped_writable.is_linked() {
435 self.stopped_writable.insert(Arc::clone(priority_key));
436 }
437
438 self.insert_writable(priority_key);
439 }
440
441 pub fn remove_writable(&mut self, priority_key: &Arc<StreamPriorityKey>) {
446 if priority_key.stopped_writable.is_linked() {
447 let ptr = Arc::as_ptr(priority_key);
448 let mut c = unsafe { self.stopped_writable.cursor_mut_from_ptr(ptr) };
453 c.remove();
454 }
455
456 if !priority_key.writable.is_linked() {
457 return;
458 }
459
460 let mut c = {
461 let ptr = Arc::as_ptr(priority_key);
462 unsafe { self.writable.cursor_mut_from_ptr(ptr) }
463 };
464
465 c.remove();
466 }
467
468 pub fn insert_flushable(&mut self, priority_key: &Arc<StreamPriorityKey>) {
472 if !priority_key.flushable.is_linked() {
473 self.flushable.insert(Arc::clone(priority_key));
474 }
475 }
476
477 pub fn remove_flushable(&mut self, priority_key: &Arc<StreamPriorityKey>) {
479 if !priority_key.flushable.is_linked() {
480 return;
481 }
482
483 let mut c = {
484 let ptr = Arc::as_ptr(priority_key);
485 unsafe { self.flushable.cursor_mut_from_ptr(ptr) }
486 };
487
488 c.remove();
489 }
490
491 pub fn peek_flushable(&self) -> Option<Arc<StreamPriorityKey>> {
492 self.flushable.front().clone_pointer()
493 }
494
495 pub fn update_priority(
497 &mut self, old: &Arc<StreamPriorityKey>, new: &Arc<StreamPriorityKey>,
498 ) {
499 if old.readable.is_linked() {
500 self.remove_readable(old);
501 self.readable.insert(Arc::clone(new));
502 }
503
504 if old.writable.is_linked() {
505 let stopped = old.stopped_writable.is_linked();
506 self.remove_writable(old);
507 if stopped {
508 self.insert_stopped_writable(new);
509 } else {
510 self.insert_writable(new);
511 }
512 }
513
514 if old.flushable.is_linked() {
515 self.remove_flushable(old);
516 self.flushable.insert(Arc::clone(new));
517 }
518 }
519
520 pub fn insert_almost_full(&mut self, stream_id: u64) {
524 self.almost_full.insert(stream_id);
525 }
526
527 pub fn remove_almost_full(&mut self, stream_id: u64) {
529 self.almost_full.remove(&stream_id);
530 }
531
532 pub fn insert_blocked(&mut self, stream_id: u64, off: u64) {
537 self.blocked.insert(stream_id, off);
538 }
539
540 pub fn remove_blocked(&mut self, stream_id: u64) {
542 self.blocked.remove(&stream_id);
543 }
544
545 pub fn insert_reset(
550 &mut self, stream_id: u64, error_code: u64, final_size: u64,
551 ) {
552 self.reset.insert(stream_id, (error_code, final_size));
553 }
554
555 pub fn remove_reset(&mut self, stream_id: u64) {
557 self.reset.remove(&stream_id);
558 }
559
560 pub fn insert_stopped(&mut self, stream_id: u64, error_code: u64) {
565 self.stopped.insert(stream_id, error_code);
566 }
567
568 pub fn remove_stopped(&mut self, stream_id: u64) {
570 self.stopped.remove(&stream_id);
571 }
572
573 pub fn update_peer_max_streams_bidi(&mut self, v: u64) {
575 self.peer_max_streams_bidi = cmp::max(self.peer_max_streams_bidi, v);
576 }
577
578 pub fn update_peer_max_streams_uni(&mut self, v: u64) {
580 self.peer_max_streams_uni = cmp::max(self.peer_max_streams_uni, v);
581 }
582
583 pub fn update_max_streams_bidi(&mut self) {
585 self.local_max_streams_bidi = self.local_max_streams_bidi_next;
586 }
587
588 pub fn set_max_streams_bidi(&mut self, max: u64) {
590 self.local_max_streams_bidi = max;
591 self.local_max_streams_bidi_next = max;
592 self.initial_max_streams_bidi = max;
593 }
594
595 pub fn max_streams_bidi(&self) -> u64 {
597 self.local_max_streams_bidi
598 }
599
600 pub fn max_streams_bidi_next(&mut self) -> u64 {
602 self.local_max_streams_bidi_next
603 }
604
605 pub fn update_max_streams_uni(&mut self) {
607 self.local_max_streams_uni = self.local_max_streams_uni_next;
608 }
609
610 pub fn max_streams_uni_next(&mut self) -> u64 {
612 self.local_max_streams_uni_next
613 }
614
615 pub fn peer_max_streams_bidi(&self) -> u64 {
617 self.peer_max_streams_bidi
618 }
619
620 pub fn peer_streams_left_bidi(&self) -> u64 {
623 self.peer_max_streams_bidi - self.local_opened_streams_bidi
624 }
625
626 pub fn peer_max_streams_uni(&self) -> u64 {
628 self.peer_max_streams_uni
629 }
630
631 pub fn peer_streams_left_uni(&self) -> u64 {
634 self.peer_max_streams_uni - self.local_opened_streams_uni
635 }
636
637 pub fn on_stop_sending_reported(&mut self, stream_id: u64) {
639 let Some(stream) = self.streams.get_mut(&stream_id) else {
640 return;
641 };
642
643 if stream.state() == StreamState::Collectable {
644 let local = stream.local;
645 self.collect(stream_id, local);
646 } else {
647 let priority_key = Arc::clone(&stream.priority_key);
648 self.remove_writable(&priority_key);
649 }
650 }
651
652 pub fn collect(&mut self, stream_id: u64, local: bool) {
657 if !local {
658 if is_bidi(stream_id) {
661 self.local_max_streams_bidi_next =
662 self.local_max_streams_bidi_next.saturating_add(1);
663 } else {
664 self.local_max_streams_uni_next =
665 self.local_max_streams_uni_next.saturating_add(1);
666 }
667 }
668
669 let s = self.streams.remove(&stream_id).unwrap();
670
671 self.remove_readable(&s.priority_key);
672
673 self.remove_writable(&s.priority_key);
674
675 self.remove_flushable(&s.priority_key);
676
677 self.collected.insert(stream_id);
678 }
679
680 pub(crate) fn try_collect(&mut self, stream_id: u64) {
682 let Some(stream) = self.get(stream_id) else {
683 return;
684 };
685
686 let local = stream.local;
687
688 if stream.state() == StreamState::Collectable {
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
893#[derive(Clone, Copy, Debug, PartialEq, Eq)]
895pub(crate) enum StreamState {
896 Incomplete,
898 CompleteWithPendingDelivery,
900 Collectable,
902}
903
904pub struct Stream<F: BufFactory = DefaultBufFactory> {
906 pub recv: recv_buf::RecvBuf,
908
909 pub send: send_buf::SendBuf<F>,
911
912 pub send_lowat: usize,
913
914 pub bidi: bool,
916
917 pub local: bool,
919
920 pub urgency: u8,
922
923 pub incremental: bool,
925
926 pub priority_key: Arc<StreamPriorityKey>,
927}
928
929impl<F: BufFactory> Stream<F> {
930 pub fn new(
932 id: u64, max_rx_data: u64, max_tx_data: u64, local: bool,
933 initial_window: u64, max_window: u64,
934 ) -> Self {
935 let priority_key = Arc::new(StreamPriorityKey {
936 id,
937 ..Default::default()
938 });
939
940 Stream {
941 recv: recv_buf::RecvBuf::new(max_rx_data, initial_window, max_window),
942 send: send_buf::SendBuf::new(max_tx_data),
943 send_lowat: 1,
944 bidi: is_bidi(id),
945 local,
946 urgency: priority_key.urgency,
947 incremental: priority_key.incremental,
948 priority_key,
949 }
950 }
951
952 pub fn is_readable(&self) -> bool {
954 self.recv.ready()
955 }
956
957 pub fn is_writable(&self) -> bool {
960 !self.send.is_shutdown() &&
961 !self.send.is_fin() &&
962 (self.send.off_back() + self.send_lowat as u64) <
963 self.send.max_off()
964 }
965
966 pub fn is_flushable(&self) -> bool {
969 let off_front = self.send.off_front();
970
971 !self.send.is_empty() &&
972 off_front < self.send.off_back() &&
973 off_front < self.send.max_off()
974 }
975
976 pub(crate) fn state(&self) -> StreamState {
986 let complete = match (self.bidi, self.local) {
987 (true, _) => self.recv.is_fin() && self.send.is_complete(),
990
991 (false, true) => self.send.is_complete(),
994
995 (false, false) => self.recv.is_fin(),
998 };
999
1000 let pending_stop_sending = match self.send.peer_stop_sending_state() {
1001 PeerStopSendingState::NotReported(_) => !self.send.is_shutdown(),
1002 PeerStopSendingState::NotReceived |
1003 PeerStopSendingState::Reported(_) => false,
1004 };
1005
1006 if !complete {
1007 StreamState::Incomplete
1008 } else if self.is_readable() || pending_stop_sending {
1009 StreamState::CompleteWithPendingDelivery
1010 } else {
1011 StreamState::Collectable
1012 }
1013 }
1014}
1015
1016pub fn is_local(stream_id: u64, is_server: bool) -> bool {
1018 (stream_id & 0x1) == (is_server as u64)
1019}
1020
1021pub fn is_bidi(stream_id: u64) -> bool {
1023 (stream_id & 0x2) == 0
1024}
1025
1026#[derive(Clone, Debug)]
1027pub struct StreamPriorityKey {
1028 pub urgency: u8,
1029 pub incremental: bool,
1030 pub id: u64,
1031
1032 pub readable: RBTreeAtomicLink,
1033 pub writable: RBTreeAtomicLink,
1034 pub stopped_writable: RBTreeAtomicLink,
1035 pub flushable: RBTreeAtomicLink,
1036}
1037
1038impl Default for StreamPriorityKey {
1039 fn default() -> Self {
1040 Self {
1041 urgency: DEFAULT_URGENCY,
1042 incremental: true,
1043 id: Default::default(),
1044 readable: Default::default(),
1045 writable: Default::default(),
1046 stopped_writable: Default::default(),
1047 flushable: Default::default(),
1048 }
1049 }
1050}
1051
1052impl PartialEq for StreamPriorityKey {
1053 fn eq(&self, other: &Self) -> bool {
1054 self.id == other.id
1055 }
1056}
1057
1058impl Eq for StreamPriorityKey {}
1059
1060impl PartialOrd for StreamPriorityKey {
1061 fn partial_cmp(&self, other: &Self) -> Option<cmp::Ordering> {
1062 Some(self.cmp(other))
1063 }
1064}
1065
1066impl Ord for StreamPriorityKey {
1067 fn cmp(&self, other: &Self) -> cmp::Ordering {
1068 if self.id == other.id {
1070 return cmp::Ordering::Equal;
1071 }
1072
1073 if self.urgency != other.urgency {
1075 return self.urgency.cmp(&other.urgency);
1076 }
1077
1078 if !self.incremental && !other.incremental {
1081 return self.id.cmp(&other.id);
1082 }
1083
1084 if self.incremental && !other.incremental {
1086 return cmp::Ordering::Greater;
1087 }
1088 if !self.incremental && other.incremental {
1089 return cmp::Ordering::Less;
1090 }
1091
1092 cmp::Ordering::Greater
1096 }
1097}
1098
1099intrusive_adapter!(pub StreamWritablePriorityAdapter = Arc<StreamPriorityKey>: StreamPriorityKey { writable => RBTreeAtomicLink });
1100
1101impl KeyAdapter<'_> for StreamWritablePriorityAdapter {
1102 type Key = StreamPriorityKey;
1103
1104 fn get_key(&self, s: &StreamPriorityKey) -> Self::Key {
1105 s.clone()
1106 }
1107}
1108
1109intrusive_adapter!(pub StreamStoppedWritablePriorityAdapter = Arc<StreamPriorityKey>: StreamPriorityKey { stopped_writable => RBTreeAtomicLink });
1110
1111impl KeyAdapter<'_> for StreamStoppedWritablePriorityAdapter {
1112 type Key = StreamPriorityKey;
1113
1114 fn get_key(&self, s: &StreamPriorityKey) -> Self::Key {
1115 s.clone()
1116 }
1117}
1118
1119intrusive_adapter!(pub StreamReadablePriorityAdapter = Arc<StreamPriorityKey>: StreamPriorityKey { readable => RBTreeAtomicLink });
1120
1121impl KeyAdapter<'_> for StreamReadablePriorityAdapter {
1122 type Key = StreamPriorityKey;
1123
1124 fn get_key(&self, s: &StreamPriorityKey) -> Self::Key {
1125 s.clone()
1126 }
1127}
1128
1129intrusive_adapter!(pub StreamFlushablePriorityAdapter = Arc<StreamPriorityKey>: StreamPriorityKey { flushable => RBTreeAtomicLink });
1130
1131impl KeyAdapter<'_> for StreamFlushablePriorityAdapter {
1132 type Key = StreamPriorityKey;
1133
1134 fn get_key(&self, s: &StreamPriorityKey) -> Self::Key {
1135 s.clone()
1136 }
1137}
1138
1139#[derive(Default)]
1141pub struct StreamIter {
1142 streams: SmallVec<[u64; 8]>,
1143 index: usize,
1144}
1145
1146impl StreamIter {
1147 #[inline]
1148 fn from(streams: &StreamIdHashSet) -> Self {
1149 StreamIter {
1150 streams: streams.iter().copied().collect(),
1151 index: 0,
1152 }
1153 }
1154}
1155
1156impl Iterator for StreamIter {
1157 type Item = u64;
1158
1159 #[inline]
1160 fn next(&mut self) -> Option<Self::Item> {
1161 let v = self.streams.get(self.index)?;
1162 self.index += 1;
1163 Some(*v)
1164 }
1165}
1166
1167impl ExactSizeIterator for StreamIter {
1168 #[inline]
1169 fn len(&self) -> usize {
1170 self.streams.len() - self.index
1171 }
1172}
1173
1174#[cfg(test)]
1175mod tests {
1176 use rstest::rstest;
1177
1178 use crate::range_buf::RangeBuf;
1179 use crate::test_utils::Pipe;
1180
1181 use super::*;
1182
1183 const DEFAULT_STREAM_WINDOW: u64 = 32 * 1024;
1185
1186 #[rstest]
1187 fn collected_streams_per_type(#[values(0, 1, 2, 3)] stream_type: u64) {
1188 let mut collected = CollectedStreams::default();
1189 assert!(collected.ranges.is_none());
1190
1191 for id in 0..4 {
1192 assert!(!collected.contains(id));
1193 }
1194 assert!(collected.ranges.is_none());
1195
1196 collected.insert(stream_type);
1197 assert!(collected.ranges.is_some());
1198
1199 for id in 0..4 {
1200 assert_eq!(collected.contains(id), id == stream_type);
1201 }
1202
1203 collected.insert(8 | stream_type);
1204 assert!(!collected.contains(4 | stream_type));
1205 assert_eq!(
1206 collected.ranges.as_ref().unwrap()[stream_type as usize].len(),
1207 2
1208 );
1209
1210 collected.insert(4 | stream_type);
1211 collected.insert(4 | stream_type);
1212 assert_eq!(
1213 collected.ranges.as_ref().unwrap()[stream_type as usize],
1214 0..3
1215 );
1216
1217 for id in 0..12 {
1218 assert_eq!(collected.contains(id), id & 0x3 == stream_type);
1219 }
1220 }
1221
1222 #[test]
1223 fn collected_streams_preserve_fragmented_and_large_ids() {
1224 let mut collected = CollectedStreams::default();
1225
1226 for sequence in (0..2048).step_by(2) {
1227 for stream_type in 0..4 {
1228 collected.insert((sequence << 2) | stream_type);
1229 }
1230 }
1231
1232 for sequence in 0..2048 {
1233 for stream_type in 0..4 {
1234 assert_eq!(
1235 collected.contains((sequence << 2) | stream_type),
1236 sequence % 2 == 0
1237 );
1238 }
1239 }
1240
1241 for stream_type in 0..4 {
1242 assert_eq!(
1243 collected.ranges.as_ref().unwrap()[stream_type as usize].len(),
1244 1024
1245 );
1246
1247 let stream_id = ((1u64 << 62) - 4) | stream_type;
1248 assert!(!collected.contains(stream_id));
1249 collected.insert(stream_id);
1250 assert!(collected.contains(stream_id));
1251 assert!(!collected.contains(stream_id - 4));
1252 assert!(!collected.contains((1u64 << 40) | stream_type));
1253 }
1254 }
1255
1256 fn collect_pipe_stream(pipe: &mut Pipe, stream_id: u64) {
1259 let mut buf = [0; 1];
1260
1261 assert_eq!(pipe.client.stream_send(stream_id, b"a", true), Ok(1));
1262 assert_eq!(pipe.advance(), Ok(()));
1263 assert_eq!(pipe.server.stream_recv(stream_id, &mut buf), Ok((1, true)));
1264
1265 if is_bidi(stream_id) {
1266 assert_eq!(pipe.server.stream_send(stream_id, b"a", true), Ok(1));
1267 assert_eq!(pipe.advance(), Ok(()));
1268 assert_eq!(
1269 pipe.client.stream_recv(stream_id, &mut buf),
1270 Ok((1, true))
1271 );
1272 }
1273
1274 assert_eq!(pipe.advance(), Ok(()));
1275 }
1276
1277 #[rstest]
1278 fn collected_streams_out_of_order(
1279 #[values("cubic", "bbr2_gcongestion")] cc_algorithm_name: &str,
1280 #[values(0, 2)] stream_type: u64,
1281 ) {
1282 let mut pipe = Pipe::new(cc_algorithm_name).unwrap();
1283 assert_eq!(pipe.handshake(), Ok(()));
1284
1285 for sequence in [2, 0, 1] {
1286 let stream_id = (sequence << 2) | stream_type;
1287 collect_pipe_stream(&mut pipe, stream_id);
1288
1289 for conn in [&mut pipe.client, &mut pipe.server] {
1290 assert!(conn.streams.get(stream_id).is_none());
1291 assert!(conn.streams.is_collected(stream_id));
1292 assert!(conn.stream_closed(stream_id));
1293 assert_eq!(
1294 conn.streams
1295 .get_or_create(
1296 stream_id,
1297 &conn.local_transport_params,
1298 &conn.peer_transport_params,
1299 !conn.is_server,
1300 conn.is_server,
1301 )
1302 .err(),
1303 Some(Error::Done)
1304 );
1305 }
1306 }
1307
1308 assert_eq!(
1309 pipe.server.streams.collected.ranges.as_ref().unwrap()
1310 [stream_type as usize],
1311 0..3
1312 );
1313
1314 let frames = [crate::frame::Frame::Stream {
1316 stream_id: 8 | stream_type,
1317 data: RangeBuf::from(b"a", 0, true),
1318 }];
1319 assert!(pipe
1320 .send_pkt_to_server(crate::Type::Short, &frames, &mut [0; 1280])
1321 .is_ok());
1322 assert_eq!(pipe.server.streams.len(), 0);
1323 }
1324
1325 #[rstest]
1326 fn collected_streams_sparse_peer_credit(
1327 #[values("cubic", "bbr2_gcongestion")] cc_algorithm_name: &str,
1328 #[values(0, 2)] stream_type: u64, #[values(1, 8)] initial_limit: u64,
1329 ) {
1330 let mut config = Pipe::default_config(cc_algorithm_name).unwrap();
1331 config.set_initial_max_streams_bidi(initial_limit);
1332 config.set_initial_max_streams_uni(initial_limit);
1333
1334 let mut pipe = Pipe::with_config(&mut config).unwrap();
1335 assert_eq!(pipe.handshake(), Ok(()));
1336
1337 for index in 0..initial_limit {
1338 let stream_id = (index << 3) | stream_type;
1339 collect_pipe_stream(&mut pipe, stream_id);
1340
1341 assert_eq!(
1342 pipe.server.streams.collected.ranges.as_ref().unwrap()
1343 [stream_type as usize]
1344 .len(),
1345 index as usize + 1
1346 );
1347 assert!(pipe.server.stream_closed(stream_id));
1348 assert!(pipe.client.stream_closed(stream_id));
1349 assert_eq!(pipe.server.streams.len(), 0);
1350 }
1351
1352 let peer_limit = if is_bidi(stream_type) {
1353 pipe.client.streams.peer_max_streams_bidi()
1354 } else {
1355 pipe.client.streams.peer_max_streams_uni()
1356 };
1357 assert_eq!(peer_limit, 2 * initial_limit);
1358
1359 for sequence in (1..2 * initial_limit - 1).step_by(2) {
1361 let stream_id = (sequence << 2) | stream_type;
1362
1363 for conn in [&pipe.client, &pipe.server] {
1364 assert!(conn.streams.get(stream_id).is_none());
1365 assert!(!conn.streams.is_collected(stream_id));
1366 assert!(!conn.stream_closed(stream_id));
1367 }
1368 }
1369
1370 for sequence in (1..2 * initial_limit - 1).step_by(2) {
1372 collect_pipe_stream(&mut pipe, (sequence << 2) | stream_type);
1373 }
1374
1375 assert_eq!(
1376 pipe.server.streams.collected.ranges.as_ref().unwrap()
1377 [stream_type as usize],
1378 0..2 * initial_limit - 1
1379 );
1380 }
1381
1382 #[rstest]
1383 fn collected_streams_fragmented_local(
1384 #[values("cubic", "bbr2_gcongestion")] cc_algorithm_name: &str,
1385 #[values(0, 2)] stream_type: u64,
1386 ) {
1387 let mut client_config = Pipe::default_config(cc_algorithm_name).unwrap();
1388 client_config.set_initial_max_streams_bidi(1);
1389 client_config.set_initial_max_streams_uni(1);
1390
1391 let mut server_config = Pipe::default_config(cc_algorithm_name).unwrap();
1392 server_config.set_initial_max_streams_bidi(32);
1393 server_config.set_initial_max_streams_uni(32);
1394
1395 let mut pipe = Pipe::with_client_and_server_config(
1396 &mut client_config,
1397 &mut server_config,
1398 )
1399 .unwrap();
1400 assert_eq!(pipe.handshake(), Ok(()));
1401
1402 for index in 0..32 {
1405 collect_pipe_stream(&mut pipe, (index << 3) | stream_type);
1406 assert_eq!(
1407 pipe.client.streams.collected.ranges.as_ref().unwrap()
1408 [stream_type as usize]
1409 .len(),
1410 index as usize + 1
1411 );
1412 assert_eq!(pipe.client.streams.len(), 0);
1413 }
1414 }
1415
1416 #[rstest]
1417 fn stream_limit_does_not_collect(
1418 #[values(0, 1, 2, 3)] stream_type: u64,
1419 #[values(true, false)] local: bool,
1420 ) {
1421 let params = crate::TransportParams::default();
1422 let mut streams = <StreamMap>::new(1, 1, DEFAULT_STREAM_WINDOW);
1423 streams.update_peer_max_streams_bidi(1);
1424 streams.update_peer_max_streams_uni(1);
1425
1426 let stream_id = 4 | stream_type;
1427 let is_server = (stream_type & 1 != 0) == local;
1428 assert_eq!(
1429 streams
1430 .get_or_create(stream_id, ¶ms, ¶ms, local, is_server)
1431 .err(),
1432 Some(Error::StreamLimit)
1433 );
1434 assert!(!streams.is_collected(stream_id));
1435 assert_eq!(streams.len(), 0);
1436 assert!(streams.collected.ranges.is_none());
1437
1438 if local {
1439 streams.update_peer_max_streams_bidi(2);
1440 streams.update_peer_max_streams_uni(2);
1441 } else {
1442 streams.local_max_streams_bidi_next = 2;
1443 streams.local_max_streams_uni_next = 2;
1444 streams.update_max_streams_bidi();
1445 streams.update_max_streams_uni();
1446 }
1447
1448 assert!(streams
1449 .get_or_create(stream_id, ¶ms, ¶ms, local, is_server)
1450 .is_ok());
1451 assert!(streams.collected.ranges.is_none());
1452 }
1453
1454 #[test]
1455 fn recv_flow_control() {
1456 let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1457 assert!(!stream.recv.almost_full());
1458
1459 let mut buf = [0; 32];
1460
1461 let first = RangeBuf::from(b"hello", 0, false);
1462 let second = RangeBuf::from(b"world", 5, false);
1463 let third = RangeBuf::from(b"something", 10, false);
1464
1465 assert_eq!(stream.recv.write(second), Ok(()));
1466 assert_eq!(stream.recv.write(first), Ok(()));
1467 assert!(!stream.recv.almost_full());
1468
1469 assert_eq!(stream.recv.write(third), Err(Error::FlowControl));
1470
1471 let (len, fin) = stream.recv.emit(&mut buf).unwrap();
1472 assert_eq!(&buf[..len], b"helloworld");
1473 assert!(!fin);
1474
1475 assert!(stream.recv.almost_full());
1476
1477 stream.recv.update_max_data(std::time::Instant::now());
1478 assert_eq!(stream.recv.max_data_next(), 25);
1479 assert!(!stream.recv.almost_full());
1480
1481 let third = RangeBuf::from(b"something", 10, false);
1482 assert_eq!(stream.recv.write(third), Ok(()));
1483 }
1484
1485 #[test]
1486 fn recv_past_fin() {
1487 let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1488 assert!(!stream.recv.almost_full());
1489
1490 let first = RangeBuf::from(b"hello", 0, true);
1491 let second = RangeBuf::from(b"world", 5, false);
1492
1493 assert_eq!(stream.recv.write(first), Ok(()));
1494 assert_eq!(stream.recv.write(second), Err(Error::FinalSize));
1495 }
1496
1497 #[test]
1498 fn recv_fin_dup() {
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"hello", 0, true);
1504
1505 assert_eq!(stream.recv.write(first), Ok(()));
1506 assert_eq!(stream.recv.write(second), Ok(()));
1507
1508 let mut buf = [0; 32];
1509
1510 let (len, fin) = stream.recv.emit(&mut buf).unwrap();
1511 assert_eq!(&buf[..len], b"hello");
1512 assert!(fin);
1513 }
1514
1515 #[test]
1516 fn recv_fin_change() {
1517 let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1518 assert!(!stream.recv.almost_full());
1519
1520 let first = RangeBuf::from(b"hello", 0, true);
1521 let second = RangeBuf::from(b"world", 5, true);
1522
1523 assert_eq!(stream.recv.write(second), Ok(()));
1524 assert_eq!(stream.recv.write(first), Err(Error::FinalSize));
1525 }
1526
1527 #[test]
1528 fn recv_fin_lower_than_received() {
1529 let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1530 assert!(!stream.recv.almost_full());
1531
1532 let first = RangeBuf::from(b"hello", 0, true);
1533 let second = RangeBuf::from(b"world", 5, false);
1534
1535 assert_eq!(stream.recv.write(second), Ok(()));
1536 assert_eq!(stream.recv.write(first), Err(Error::FinalSize));
1537 }
1538
1539 #[test]
1540 fn recv_fin_flow_control() {
1541 let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1542 assert!(!stream.recv.almost_full());
1543
1544 let mut buf = [0; 32];
1545
1546 let first = RangeBuf::from(b"hello", 0, false);
1547 let second = RangeBuf::from(b"world", 5, true);
1548
1549 assert_eq!(stream.recv.write(first), Ok(()));
1550 assert_eq!(stream.recv.write(second), Ok(()));
1551
1552 let (len, fin) = stream.recv.emit(&mut buf).unwrap();
1553 assert_eq!(&buf[..len], b"helloworld");
1554 assert!(fin);
1555
1556 assert!(!stream.recv.almost_full());
1557 }
1558
1559 #[test]
1560 fn recv_fin_reset_mismatch() {
1561 let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1562 assert!(!stream.recv.almost_full());
1563
1564 let first = RangeBuf::from(b"hello", 0, true);
1565
1566 assert_eq!(stream.recv.write(first), Ok(()));
1567 assert_eq!(stream.recv.reset(0, 10), Err(Error::FinalSize));
1568 }
1569
1570 #[test]
1571 fn recv_reset_with_gap() {
1572 let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1573 assert!(!stream.recv.almost_full());
1574
1575 let first = RangeBuf::from(b"hello", 0, false);
1576
1577 assert_eq!(stream.recv.write(first), Ok(()));
1578 assert_eq!(stream.recv.emit(&mut [0; 1]), Ok((1, false)));
1580 assert_eq!(
1582 stream.recv.reset(0, 10),
1583 Ok(RecvBufResetReturn {
1584 max_data_delta: 5,
1585 consumed_flowcontrol: 9
1587 })
1588 );
1589 assert_eq!(stream.recv.reset(0, 10), Ok(RecvBufResetReturn::zero()));
1590 }
1591
1592 #[test]
1593 fn recv_reset_dup() {
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, 5), Ok(RecvBufResetReturn::zero()));
1608 }
1609
1610 #[test]
1611 fn recv_reset_change() {
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!(
1619 stream.recv.reset(0, 5),
1620 Ok(RecvBufResetReturn {
1621 max_data_delta: 0,
1622 consumed_flowcontrol: 5
1623 })
1624 );
1625 assert_eq!(stream.recv.reset(0, 10), Err(Error::FinalSize));
1626 }
1627
1628 #[test]
1629 fn recv_reset_lower_than_received() {
1630 let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1631 assert!(!stream.recv.almost_full());
1632
1633 let first = RangeBuf::from(b"hello", 0, false);
1634
1635 assert_eq!(stream.recv.write(first), Ok(()));
1636 assert_eq!(stream.recv.reset(0, 4), Err(Error::FinalSize));
1637 }
1638
1639 #[test]
1640 fn send_flow_control() {
1641 let mut buf = [0; 25];
1642
1643 let mut stream = <Stream>::new(0, 0, 15, true, 0, DEFAULT_STREAM_WINDOW);
1644
1645 let first = b"hello";
1646 let second = b"world";
1647 let third = b"something";
1648
1649 assert!(stream.send.write(first, false).is_ok());
1650 assert!(stream.send.write(second, false).is_ok());
1651 assert!(stream.send.write(third, false).is_ok());
1652
1653 assert_eq!(stream.send.off_front(), 0);
1654
1655 let (written, fin) = stream.send.emit(&mut buf[..25]).unwrap();
1656 assert_eq!(written, 15);
1657 assert!(!fin);
1658 assert_eq!(&buf[..written], b"helloworldsomet");
1659
1660 assert_eq!(stream.send.off_front(), 15);
1661
1662 let (written, fin) = stream.send.emit(&mut buf[..25]).unwrap();
1663 assert_eq!(written, 0);
1664 assert!(!fin);
1665 assert_eq!(&buf[..written], b"");
1666
1667 stream.send.retransmit(0, 15);
1668
1669 assert_eq!(stream.send.off_front(), 0);
1670
1671 let (written, fin) = stream.send.emit(&mut buf[..10]).unwrap();
1672 assert_eq!(written, 10);
1673 assert!(!fin);
1674 assert_eq!(&buf[..written], b"helloworld");
1675
1676 assert_eq!(stream.send.off_front(), 10);
1677
1678 let (written, fin) = stream.send.emit(&mut buf[..10]).unwrap();
1679 assert_eq!(written, 5);
1680 assert!(!fin);
1681 assert_eq!(&buf[..written], b"somet");
1682 }
1683
1684 #[test]
1685 fn send_past_fin() {
1686 let mut stream = <Stream>::new(0, 0, 15, true, 0, DEFAULT_STREAM_WINDOW);
1687
1688 let first = b"hello";
1689 let second = b"world";
1690 let third = b"third";
1691
1692 assert_eq!(stream.send.write(first, false), Ok(5));
1693
1694 assert_eq!(stream.send.write(second, true), Ok(5));
1695 assert!(stream.send.is_fin());
1696
1697 assert_eq!(stream.send.write(third, false), Err(Error::FinalSize));
1698 }
1699
1700 #[test]
1701 fn send_fin_dup() {
1702 let mut stream = <Stream>::new(0, 0, 15, true, 0, DEFAULT_STREAM_WINDOW);
1703
1704 assert_eq!(stream.send.write(b"hello", true), Ok(5));
1705 assert!(stream.send.is_fin());
1706
1707 assert_eq!(stream.send.write(b"", true), Ok(0));
1708 assert!(stream.send.is_fin());
1709 }
1710
1711 #[test]
1712 fn send_undo_fin() {
1713 let mut stream = <Stream>::new(0, 0, 15, true, 0, DEFAULT_STREAM_WINDOW);
1714
1715 assert_eq!(stream.send.write(b"hello", true), Ok(5));
1716 assert!(stream.send.is_fin());
1717
1718 assert_eq!(
1719 stream.send.write(b"helloworld", true),
1720 Err(Error::FinalSize)
1721 );
1722 }
1723
1724 #[test]
1725 fn send_fin_max_data_match() {
1726 let mut buf = [0; 15];
1727
1728 let mut stream = <Stream>::new(0, 0, 15, true, 0, DEFAULT_STREAM_WINDOW);
1729
1730 let slice = b"hellohellohello";
1731
1732 assert!(stream.send.write(slice, true).is_ok());
1733
1734 let (written, fin) = stream.send.emit(&mut buf[..15]).unwrap();
1735 assert_eq!(written, 15);
1736 assert!(fin);
1737 assert_eq!(&buf[..written], slice);
1738 }
1739
1740 #[test]
1741 fn send_fin_zero_length() {
1742 let mut buf = [0; 5];
1743
1744 let mut stream = <Stream>::new(0, 0, 15, true, 0, DEFAULT_STREAM_WINDOW);
1745
1746 assert_eq!(stream.send.write(b"hello", false), Ok(5));
1747 assert_eq!(stream.send.write(b"", true), Ok(0));
1748 assert!(stream.send.is_fin());
1749
1750 let (written, fin) = stream.send.emit(&mut buf[..5]).unwrap();
1751 assert_eq!(written, 5);
1752 assert!(fin);
1753 assert_eq!(&buf[..written], b"hello");
1754 }
1755
1756 #[test]
1757 fn send_ack() {
1758 let mut buf = [0; 5];
1759
1760 let mut stream = <Stream>::new(0, 0, 15, true, 0, DEFAULT_STREAM_WINDOW);
1761
1762 assert_eq!(stream.send.write(b"hello", false), Ok(5));
1763 assert_eq!(stream.send.write(b"world", false), Ok(5));
1764 assert_eq!(stream.send.write(b"", true), Ok(0));
1765 assert!(stream.send.is_fin());
1766
1767 assert_eq!(stream.send.off_front(), 0);
1768
1769 let (written, fin) = stream.send.emit(&mut buf[..5]).unwrap();
1770 assert_eq!(written, 5);
1771 assert!(!fin);
1772 assert_eq!(&buf[..written], b"hello");
1773
1774 stream.send.ack_and_drop(0, 5);
1775
1776 stream.send.retransmit(0, 5);
1777
1778 assert_eq!(stream.send.off_front(), 5);
1779
1780 let (written, fin) = stream.send.emit(&mut buf[..5]).unwrap();
1781 assert_eq!(written, 5);
1782 assert!(fin);
1783 assert_eq!(&buf[..written], b"world");
1784 }
1785
1786 #[test]
1787 fn send_ack_reordering() {
1788 let mut buf = [0; 5];
1789
1790 let mut stream = <Stream>::new(0, 0, 15, true, 0, DEFAULT_STREAM_WINDOW);
1791
1792 assert_eq!(stream.send.write(b"hello", false), Ok(5));
1793 assert_eq!(stream.send.write(b"world", false), Ok(5));
1794 assert_eq!(stream.send.write(b"", true), Ok(0));
1795 assert!(stream.send.is_fin());
1796
1797 assert_eq!(stream.send.off_front(), 0);
1798
1799 let (written, fin) = stream.send.emit(&mut buf[..5]).unwrap();
1800 assert_eq!(written, 5);
1801 assert!(!fin);
1802 assert_eq!(&buf[..written], b"hello");
1803
1804 assert_eq!(stream.send.off_front(), 5);
1805
1806 let (written, fin) = stream.send.emit(&mut buf[..1]).unwrap();
1807 assert_eq!(written, 1);
1808 assert!(!fin);
1809 assert_eq!(&buf[..written], b"w");
1810
1811 stream.send.ack_and_drop(5, 1);
1812 stream.send.ack_and_drop(0, 5);
1813
1814 stream.send.retransmit(0, 5);
1815 stream.send.retransmit(5, 1);
1816
1817 assert_eq!(stream.send.off_front(), 6);
1818
1819 let (written, fin) = stream.send.emit(&mut buf[..5]).unwrap();
1820 assert_eq!(written, 4);
1821 assert!(fin);
1822 assert_eq!(&buf[..written], b"orld");
1823 }
1824
1825 #[test]
1826 fn recv_data_below_off() {
1827 let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1828
1829 let first = RangeBuf::from(b"hello", 0, false);
1830
1831 assert_eq!(stream.recv.write(first), Ok(()));
1832
1833 let mut buf = [0; 10];
1834
1835 let (len, fin) = stream.recv.emit(&mut buf).unwrap();
1836 assert_eq!(&buf[..len], b"hello");
1837 assert!(!fin);
1838
1839 let first = RangeBuf::from(b"elloworld", 1, true);
1840 assert_eq!(stream.recv.write(first), Ok(()));
1841
1842 let (len, fin) = stream.recv.emit(&mut buf).unwrap();
1843 assert_eq!(&buf[..len], b"world");
1844 assert!(fin);
1845 }
1846
1847 #[test]
1848 fn stream_complete() {
1849 let mut stream =
1850 <Stream>::new(0, 30, 30, true, 30, DEFAULT_STREAM_WINDOW);
1851
1852 assert_eq!(stream.send.write(b"hello", false), Ok(5));
1853 assert_eq!(stream.send.write(b"world", false), Ok(5));
1854
1855 assert!(!stream.send.is_complete());
1856 assert!(!stream.send.is_fin());
1857
1858 assert_eq!(stream.send.write(b"", true), Ok(0));
1859
1860 assert!(!stream.send.is_complete());
1861 assert!(stream.send.is_fin());
1862
1863 assert_eq!(stream.send.emit(&mut [0; 10]), Ok((10, true)));
1864
1865 let buf = RangeBuf::from(b"hello", 0, true);
1866 assert!(stream.recv.write(buf).is_ok());
1867 assert!(!stream.recv.is_fin());
1868
1869 stream.send.ack(6, 4);
1870 assert!(!stream.send.is_complete());
1871
1872 let mut buf = [0; 2];
1873 assert_eq!(stream.recv.emit(&mut buf), Ok((2, false)));
1874 assert!(!stream.recv.is_fin());
1875
1876 stream.send.ack(1, 5);
1877 assert!(!stream.send.is_complete());
1878
1879 stream.send.ack(0, 1);
1880 assert!(!stream.send.is_complete());
1881
1882 stream.send.ack_fin();
1883 assert!(stream.send.is_complete());
1884
1885 assert_eq!(stream.state(), StreamState::Incomplete);
1886
1887 let mut buf = [0; 3];
1888 assert_eq!(stream.recv.emit(&mut buf), Ok((3, true)));
1889 assert!(stream.recv.is_fin());
1890
1891 assert_eq!(stream.state(), StreamState::Collectable);
1892
1893 stream.send.stop(42).unwrap();
1895 assert_eq!(stream.state(), StreamState::CompleteWithPendingDelivery);
1896 assert_eq!(
1897 stream.send.cap_and_report_stop_sending(),
1898 Err(Error::StreamStopped(42))
1899 );
1900 assert_eq!(stream.state(), StreamState::Collectable);
1901
1902 let mut stream =
1903 <Stream>::new(0, 30, 30, true, 30, DEFAULT_STREAM_WINDOW);
1904 stream.send.shutdown().unwrap();
1905 stream.recv.reset(43, 5).unwrap();
1906 assert_eq!(stream.state(), StreamState::CompleteWithPendingDelivery);
1907 assert_eq!(stream.recv.emit(&mut buf), Err(Error::StreamReset(43)));
1908 assert_eq!(stream.state(), StreamState::Collectable);
1909
1910 stream.send.stop(42).unwrap();
1913 assert_eq!(stream.state(), StreamState::Collectable);
1914 assert_eq!(
1915 stream.send.peer_stop_sending_state(),
1916 PeerStopSendingState::NotReported(42)
1917 );
1918 }
1919
1920 #[test]
1921 fn send_fin_zero_length_output() {
1922 let mut buf = [0; 5];
1923
1924 let mut stream = <Stream>::new(0, 0, 15, true, 0, DEFAULT_STREAM_WINDOW);
1925
1926 assert_eq!(stream.send.write(b"hello", false), Ok(5));
1927 assert_eq!(stream.send.off_front(), 0);
1928 assert!(!stream.send.is_fin());
1929
1930 let (written, fin) = stream.send.emit(&mut buf).unwrap();
1931 assert_eq!(written, 5);
1932 assert!(!fin);
1933 assert_eq!(&buf[..written], b"hello");
1934
1935 assert_eq!(stream.send.write(b"", true), Ok(0));
1936 assert!(stream.send.is_fin());
1937 assert_eq!(stream.send.off_front(), 5);
1938
1939 let (written, fin) = stream.send.emit(&mut buf).unwrap();
1940 assert_eq!(written, 0);
1941 assert!(fin);
1942 assert_eq!(&buf[..written], b"");
1943 }
1944
1945 fn stream_send_ready(stream: &Stream) -> bool {
1946 !stream.send.is_empty() &&
1947 stream.send.off_front() < stream.send.off_back()
1948 }
1949
1950 #[test]
1951 fn send_emit() {
1952 let mut buf = [0; 5];
1953
1954 let mut stream = <Stream>::new(0, 0, 20, true, 0, DEFAULT_STREAM_WINDOW);
1955
1956 assert_eq!(stream.send.write(b"hello", false), Ok(5));
1957 assert_eq!(stream.send.write(b"world", false), Ok(5));
1958 assert_eq!(stream.send.write(b"olleh", false), Ok(5));
1959 assert_eq!(stream.send.write(b"dlrow", true), Ok(5));
1960 assert_eq!(stream.send.off_front(), 0);
1961 assert_eq!(stream.send.bufs_count(), 4);
1962
1963 assert!(stream.is_flushable());
1964
1965 assert!(stream_send_ready(&stream));
1966 assert_eq!(stream.send.emit(&mut buf[..4]), Ok((4, false)));
1967 assert_eq!(stream.send.off_front(), 4);
1968 assert_eq!(&buf[..4], b"hell");
1969
1970 assert!(stream_send_ready(&stream));
1971 assert_eq!(stream.send.emit(&mut buf[..4]), Ok((4, false)));
1972 assert_eq!(stream.send.off_front(), 8);
1973 assert_eq!(&buf[..4], b"owor");
1974
1975 assert!(stream_send_ready(&stream));
1976 assert_eq!(stream.send.emit(&mut buf[..2]), Ok((2, false)));
1977 assert_eq!(stream.send.off_front(), 10);
1978 assert_eq!(&buf[..2], b"ld");
1979
1980 assert!(stream_send_ready(&stream));
1981 assert_eq!(stream.send.emit(&mut buf[..1]), Ok((1, false)));
1982 assert_eq!(stream.send.off_front(), 11);
1983 assert_eq!(&buf[..1], b"o");
1984
1985 assert!(stream_send_ready(&stream));
1986 assert_eq!(stream.send.emit(&mut buf[..5]), Ok((5, false)));
1987 assert_eq!(stream.send.off_front(), 16);
1988 assert_eq!(&buf[..5], b"llehd");
1989
1990 assert!(stream_send_ready(&stream));
1991 assert_eq!(stream.send.emit(&mut buf[..5]), Ok((4, true)));
1992 assert_eq!(stream.send.off_front(), 20);
1993 assert_eq!(&buf[..4], b"lrow");
1994
1995 assert!(!stream.is_flushable());
1996
1997 assert!(!stream_send_ready(&stream));
1998 assert_eq!(stream.send.emit(&mut buf[..5]), Ok((0, true)));
1999 assert_eq!(stream.send.off_front(), 20);
2000 }
2001
2002 #[test]
2003 fn send_emit_ack() {
2004 let mut buf = [0; 5];
2005
2006 let mut stream = <Stream>::new(0, 0, 20, true, 0, DEFAULT_STREAM_WINDOW);
2007
2008 assert_eq!(stream.send.write(b"hello", false), Ok(5));
2009 assert_eq!(stream.send.write(b"world", false), Ok(5));
2010 assert_eq!(stream.send.write(b"olleh", false), Ok(5));
2011 assert_eq!(stream.send.write(b"dlrow", true), Ok(5));
2012 assert_eq!(stream.send.off_front(), 0);
2013 assert_eq!(stream.send.bufs_count(), 4);
2014
2015 assert!(stream.is_flushable());
2016
2017 assert!(stream_send_ready(&stream));
2018 assert_eq!(stream.send.emit(&mut buf[..4]), Ok((4, false)));
2019 assert_eq!(stream.send.off_front(), 4);
2020 assert_eq!(&buf[..4], b"hell");
2021
2022 assert!(stream_send_ready(&stream));
2023 assert_eq!(stream.send.emit(&mut buf[..4]), Ok((4, false)));
2024 assert_eq!(stream.send.off_front(), 8);
2025 assert_eq!(&buf[..4], b"owor");
2026
2027 stream.send.ack_and_drop(0, 5);
2028 assert_eq!(stream.send.bufs_count(), 3);
2029
2030 assert!(stream_send_ready(&stream));
2031 assert_eq!(stream.send.emit(&mut buf[..2]), Ok((2, false)));
2032 assert_eq!(stream.send.off_front(), 10);
2033 assert_eq!(&buf[..2], b"ld");
2034
2035 stream.send.ack_and_drop(7, 5);
2036 assert_eq!(stream.send.bufs_count(), 3);
2037
2038 assert!(stream_send_ready(&stream));
2039 assert_eq!(stream.send.emit(&mut buf[..1]), Ok((1, false)));
2040 assert_eq!(stream.send.off_front(), 11);
2041 assert_eq!(&buf[..1], b"o");
2042
2043 assert!(stream_send_ready(&stream));
2044 assert_eq!(stream.send.emit(&mut buf[..5]), Ok((5, false)));
2045 assert_eq!(stream.send.off_front(), 16);
2046 assert_eq!(&buf[..5], b"llehd");
2047
2048 stream.send.ack_and_drop(5, 7);
2049 assert_eq!(stream.send.bufs_count(), 2);
2050
2051 assert!(stream_send_ready(&stream));
2052 assert_eq!(stream.send.emit(&mut buf[..5]), Ok((4, true)));
2053 assert_eq!(stream.send.off_front(), 20);
2054 assert_eq!(&buf[..4], b"lrow");
2055
2056 assert!(!stream.is_flushable());
2057
2058 assert!(!stream_send_ready(&stream));
2059 assert_eq!(stream.send.emit(&mut buf[..5]), Ok((0, true)));
2060 assert_eq!(stream.send.off_front(), 20);
2061
2062 stream.send.ack_and_drop(22, 4);
2063 assert_eq!(stream.send.bufs_count(), 2);
2064
2065 stream.send.ack_and_drop(20, 1);
2066 assert_eq!(stream.send.bufs_count(), 2);
2067 }
2068
2069 #[test]
2070 fn send_emit_retransmit() {
2071 let mut buf = [0; 5];
2072
2073 let mut stream = <Stream>::new(
2074 0,
2075 0,
2076 20,
2077 true,
2078 DEFAULT_STREAM_WINDOW,
2079 DEFAULT_STREAM_WINDOW,
2080 );
2081
2082 assert_eq!(stream.send.write(b"hello", false), Ok(5));
2083 assert_eq!(stream.send.write(b"world", false), Ok(5));
2084 assert_eq!(stream.send.write(b"olleh", false), Ok(5));
2085 assert_eq!(stream.send.write(b"dlrow", true), Ok(5));
2086 assert_eq!(stream.send.off_front(), 0);
2087 assert_eq!(stream.send.bufs_count(), 4);
2088
2089 assert!(stream.is_flushable());
2090
2091 assert!(stream_send_ready(&stream));
2092 assert_eq!(stream.send.emit(&mut buf[..4]), Ok((4, false)));
2093 assert_eq!(stream.send.off_front(), 4);
2094 assert_eq!(&buf[..4], b"hell");
2095
2096 assert!(stream_send_ready(&stream));
2097 assert_eq!(stream.send.emit(&mut buf[..4]), Ok((4, false)));
2098 assert_eq!(stream.send.off_front(), 8);
2099 assert_eq!(&buf[..4], b"owor");
2100
2101 stream.send.retransmit(3, 3);
2102 assert_eq!(stream.send.off_front(), 3);
2103
2104 assert!(stream_send_ready(&stream));
2105 assert_eq!(stream.send.emit(&mut buf[..3]), Ok((3, false)));
2106 assert_eq!(stream.send.off_front(), 8);
2107 assert_eq!(&buf[..3], b"low");
2108
2109 assert!(stream_send_ready(&stream));
2110 assert_eq!(stream.send.emit(&mut buf[..2]), Ok((2, false)));
2111 assert_eq!(stream.send.off_front(), 10);
2112 assert_eq!(&buf[..2], b"ld");
2113
2114 stream.send.ack_and_drop(7, 2);
2115
2116 stream.send.retransmit(8, 2);
2117
2118 assert!(stream_send_ready(&stream));
2119 assert_eq!(stream.send.emit(&mut buf[..2]), Ok((2, false)));
2120 assert_eq!(stream.send.off_front(), 10);
2121 assert_eq!(&buf[..2], b"ld");
2122
2123 assert!(stream_send_ready(&stream));
2124 assert_eq!(stream.send.emit(&mut buf[..1]), Ok((1, false)));
2125 assert_eq!(stream.send.off_front(), 11);
2126 assert_eq!(&buf[..1], b"o");
2127
2128 assert!(stream_send_ready(&stream));
2129 assert_eq!(stream.send.emit(&mut buf[..5]), Ok((5, false)));
2130 assert_eq!(stream.send.off_front(), 16);
2131 assert_eq!(&buf[..5], b"llehd");
2132
2133 stream.send.retransmit(12, 2);
2134
2135 assert!(stream_send_ready(&stream));
2136 assert_eq!(stream.send.emit(&mut buf[..2]), Ok((2, false)));
2137 assert_eq!(stream.send.off_front(), 16);
2138 assert_eq!(&buf[..2], b"le");
2139
2140 assert!(stream_send_ready(&stream));
2141 assert_eq!(stream.send.emit(&mut buf[..5]), Ok((4, true)));
2142 assert_eq!(stream.send.off_front(), 20);
2143 assert_eq!(&buf[..4], b"lrow");
2144
2145 assert!(!stream.is_flushable());
2146
2147 assert!(!stream_send_ready(&stream));
2148 assert_eq!(stream.send.emit(&mut buf[..5]), Ok((0, true)));
2149 assert_eq!(stream.send.off_front(), 20);
2150
2151 stream.send.retransmit(7, 12);
2152
2153 assert!(stream_send_ready(&stream));
2154 assert_eq!(stream.send.emit(&mut buf[..5]), Ok((5, false)));
2155 assert_eq!(stream.send.off_front(), 12);
2156 assert_eq!(&buf[..5], b"rldol");
2157
2158 assert!(stream_send_ready(&stream));
2159 assert_eq!(stream.send.emit(&mut buf[..5]), Ok((5, false)));
2160 assert_eq!(stream.send.off_front(), 17);
2161 assert_eq!(&buf[..5], b"lehdl");
2162
2163 assert!(stream_send_ready(&stream));
2164 assert_eq!(stream.send.emit(&mut buf[..5]), Ok((2, false)));
2165 assert_eq!(stream.send.off_front(), 20);
2166 assert_eq!(&buf[..2], b"ro");
2167
2168 stream.send.ack_and_drop(12, 7);
2169
2170 stream.send.retransmit(7, 12);
2171
2172 assert!(stream_send_ready(&stream));
2173 assert_eq!(stream.send.emit(&mut buf[..5]), Ok((5, false)));
2174 assert_eq!(stream.send.off_front(), 12);
2175 assert_eq!(&buf[..5], b"rldol");
2176
2177 assert!(stream_send_ready(&stream));
2178 assert_eq!(stream.send.emit(&mut buf[..5]), Ok((5, false)));
2179 assert_eq!(stream.send.off_front(), 17);
2180 assert_eq!(&buf[..5], b"lehdl");
2181
2182 assert!(stream_send_ready(&stream));
2183 assert_eq!(stream.send.emit(&mut buf[..5]), Ok((2, false)));
2184 assert_eq!(stream.send.off_front(), 20);
2185 assert_eq!(&buf[..2], b"ro");
2186 }
2187
2188 #[test]
2189 fn send_buf_empty_fin_next() {
2190 let mut stream = <Stream>::new(0, 0, 20, true, 0, DEFAULT_STREAM_WINDOW);
2191
2192 assert!(!stream.send.empty_fin_next());
2193 assert_eq!(stream.send.write(b"hello", false), Ok(5));
2194
2195 let mut buf = [0; 5];
2196 assert_eq!(stream.send.emit(&mut buf), Ok((5, false)));
2197 assert!(!stream.send.empty_fin_next());
2198
2199 assert_eq!(stream.send.write(b"", true), Ok(0));
2200 assert!(stream.send.empty_fin_next());
2201
2202 let mut empty = [];
2203 assert_eq!(stream.send.emit(&mut empty), Ok((0, true)));
2204 }
2205
2206 #[test]
2207 fn rangebuf_split_off() {
2208 let mut buf = <RangeBuf>::from(b"helloworld", 5, true);
2209 assert_eq!(buf.start, 0);
2210 assert_eq!(buf.pos, 0);
2211 assert_eq!(buf.len, 10);
2212 assert_eq!(buf.off, 5);
2213 assert!(buf.fin);
2214
2215 assert_eq!(buf.len(), 10);
2216 assert_eq!(buf.off(), 5);
2217 assert!(buf.fin());
2218
2219 assert_eq!(&buf[..], b"helloworld");
2220
2221 buf.consume(5);
2223
2224 assert_eq!(buf.start, 0);
2225 assert_eq!(buf.pos, 5);
2226 assert_eq!(buf.len, 10);
2227 assert_eq!(buf.off, 5);
2228 assert!(buf.fin);
2229
2230 assert_eq!(buf.len(), 5);
2231 assert_eq!(buf.off(), 10);
2232 assert!(buf.fin());
2233
2234 assert_eq!(&buf[..], b"world");
2235
2236 let mut new_buf = buf.split_off(3);
2238
2239 assert_eq!(buf.start, 0);
2240 assert_eq!(buf.pos, 3);
2241 assert_eq!(buf.len, 3);
2242 assert_eq!(buf.off, 5);
2243 assert!(!buf.fin);
2244
2245 assert_eq!(buf.len(), 0);
2246 assert_eq!(buf.off(), 8);
2247 assert!(!buf.fin());
2248
2249 assert_eq!(&buf[..], b"");
2250
2251 assert_eq!(new_buf.start, 3);
2252 assert_eq!(new_buf.pos, 5);
2253 assert_eq!(new_buf.len, 7);
2254 assert_eq!(new_buf.off, 8);
2255 assert!(new_buf.fin);
2256
2257 assert_eq!(new_buf.len(), 5);
2258 assert_eq!(new_buf.off(), 10);
2259 assert!(new_buf.fin());
2260
2261 assert_eq!(&new_buf[..], b"world");
2262
2263 new_buf.consume(2);
2265
2266 assert_eq!(new_buf.start, 3);
2267 assert_eq!(new_buf.pos, 7);
2268 assert_eq!(new_buf.len, 7);
2269 assert_eq!(new_buf.off, 8);
2270 assert!(new_buf.fin);
2271
2272 assert_eq!(new_buf.len(), 3);
2273 assert_eq!(new_buf.off(), 12);
2274 assert!(new_buf.fin());
2275
2276 assert_eq!(&new_buf[..], b"rld");
2277
2278 let mut new_new_buf = new_buf.split_off(5);
2280
2281 assert_eq!(new_buf.start, 3);
2282 assert_eq!(new_buf.pos, 7);
2283 assert_eq!(new_buf.len, 5);
2284 assert_eq!(new_buf.off, 8);
2285 assert!(!new_buf.fin);
2286
2287 assert_eq!(new_buf.len(), 1);
2288 assert_eq!(new_buf.off(), 12);
2289 assert!(!new_buf.fin());
2290
2291 assert_eq!(&new_buf[..], b"r");
2292
2293 assert_eq!(new_new_buf.start, 8);
2294 assert_eq!(new_new_buf.pos, 8);
2295 assert_eq!(new_new_buf.len, 2);
2296 assert_eq!(new_new_buf.off, 13);
2297 assert!(new_new_buf.fin);
2298
2299 assert_eq!(new_new_buf.len(), 2);
2300 assert_eq!(new_new_buf.off(), 13);
2301 assert!(new_new_buf.fin());
2302
2303 assert_eq!(&new_new_buf[..], b"ld");
2304
2305 new_new_buf.consume(2);
2307
2308 assert_eq!(new_new_buf.start, 8);
2309 assert_eq!(new_new_buf.pos, 10);
2310 assert_eq!(new_new_buf.len, 2);
2311 assert_eq!(new_new_buf.off, 13);
2312 assert!(new_new_buf.fin);
2313
2314 assert_eq!(new_new_buf.len(), 0);
2315 assert_eq!(new_new_buf.off(), 15);
2316 assert!(new_new_buf.fin());
2317
2318 assert_eq!(&new_new_buf[..], b"");
2319 }
2320
2321 #[test]
2324 fn stream_limit_auto_open() {
2325 let local_tp = crate::TransportParams::default();
2326 let peer_tp = crate::TransportParams::default();
2327
2328 let mut streams = <StreamMap>::new(5, 5, 5);
2329
2330 let stream_id = 500;
2331 assert!(!is_local(stream_id, true), "stream id is peer initiated");
2332 assert!(is_bidi(stream_id), "stream id is bidirectional");
2333 assert_eq!(
2334 streams
2335 .get_or_create(stream_id, &local_tp, &peer_tp, false, true)
2336 .err(),
2337 Some(Error::StreamLimit),
2338 "stream limit should be exceeded"
2339 );
2340 }
2341
2342 #[test]
2345 fn stream_create_out_of_order() {
2346 let local_tp = crate::TransportParams::default();
2347 let peer_tp = crate::TransportParams::default();
2348
2349 let mut streams = <StreamMap>::new(5, 5, 5);
2350
2351 for stream_id in [8, 12, 4] {
2352 assert!(is_local(stream_id, false), "stream id is client initiated");
2353 assert!(is_bidi(stream_id), "stream id is bidirectional");
2354 assert!(streams
2355 .get_or_create(stream_id, &local_tp, &peer_tp, false, true)
2356 .is_ok());
2357 }
2358 }
2359
2360 #[test]
2362 fn stream_limit_edge() {
2363 let local_tp = crate::TransportParams::default();
2364 let peer_tp = crate::TransportParams::default();
2365
2366 let mut streams = <StreamMap>::new(3, 3, 3);
2367
2368 let stream_id = 8;
2370 assert!(streams
2371 .get_or_create(stream_id, &local_tp, &peer_tp, false, true)
2372 .is_ok());
2373
2374 let stream_id = 12;
2376 assert_eq!(
2377 streams
2378 .get_or_create(stream_id, &local_tp, &peer_tp, false, true)
2379 .err(),
2380 Some(Error::StreamLimit)
2381 );
2382 }
2383
2384 fn cycle_stream_priority(stream_id: u64, streams: &mut StreamMap) {
2385 let key = streams.get(stream_id).unwrap().priority_key.clone();
2386 streams.update_priority(&key.clone(), &key);
2387 }
2388
2389 #[test]
2390 fn writable_prioritized_default_priority() {
2391 let local_tp = crate::TransportParams::default();
2392 let peer_tp = crate::TransportParams {
2393 initial_max_stream_data_bidi_local: 100,
2394 initial_max_stream_data_uni: 100,
2395 ..Default::default()
2396 };
2397
2398 let mut streams = StreamMap::new(100, 100, 100);
2399
2400 for id in [0, 4, 8, 12] {
2401 assert!(streams
2402 .get_or_create(id, &local_tp, &peer_tp, false, true)
2403 .is_ok());
2404 }
2405
2406 let walk_1: Vec<u64> = streams.writable().collect();
2407 cycle_stream_priority(*walk_1.first().unwrap(), &mut streams);
2408 let walk_2: Vec<u64> = streams.writable().collect();
2409 cycle_stream_priority(*walk_2.first().unwrap(), &mut streams);
2410 let walk_3: Vec<u64> = streams.writable().collect();
2411 cycle_stream_priority(*walk_3.first().unwrap(), &mut streams);
2412 let walk_4: Vec<u64> = streams.writable().collect();
2413 cycle_stream_priority(*walk_4.first().unwrap(), &mut streams);
2414 let walk_5: Vec<u64> = streams.writable().collect();
2415
2416 assert_eq!(walk_1, vec![0, 4, 8, 12]);
2419 assert_eq!(walk_2, vec![4, 8, 12, 0]);
2420 assert_eq!(walk_3, vec![8, 12, 0, 4]);
2421 assert_eq!(walk_4, vec![12, 0, 4, 8,]);
2422 assert_eq!(walk_5, vec![0, 4, 8, 12]);
2423 }
2424
2425 #[test]
2426 fn writable_prioritized_insert_order() {
2427 let local_tp = crate::TransportParams::default();
2428 let peer_tp = crate::TransportParams {
2429 initial_max_stream_data_bidi_local: 100,
2430 initial_max_stream_data_uni: 100,
2431 ..Default::default()
2432 };
2433
2434 let mut streams = StreamMap::new(100, 100, 100);
2435
2436 for id in [12, 4, 8, 0] {
2439 assert!(streams
2440 .get_or_create(id, &local_tp, &peer_tp, false, true)
2441 .is_ok());
2442 }
2443
2444 let walk_1: Vec<u64> = streams.writable().collect();
2445 cycle_stream_priority(*walk_1.first().unwrap(), &mut streams);
2446 let walk_2: Vec<u64> = streams.writable().collect();
2447 cycle_stream_priority(*walk_2.first().unwrap(), &mut streams);
2448 let walk_3: Vec<u64> = streams.writable().collect();
2449 cycle_stream_priority(*walk_3.first().unwrap(), &mut streams);
2450 let walk_4: Vec<u64> = streams.writable().collect();
2451 cycle_stream_priority(*walk_4.first().unwrap(), &mut streams);
2452 let walk_5: Vec<u64> = streams.writable().collect();
2453 assert_eq!(walk_1, vec![12, 4, 8, 0]);
2454 assert_eq!(walk_2, vec![4, 8, 0, 12]);
2455 assert_eq!(walk_3, vec![8, 0, 12, 4,]);
2456 assert_eq!(walk_4, vec![0, 12, 4, 8]);
2457 assert_eq!(walk_5, vec![12, 4, 8, 0]);
2458 }
2459
2460 #[test]
2461 fn writable_prioritized_mixed_urgency() {
2462 let local_tp = crate::TransportParams::default();
2463 let peer_tp = crate::TransportParams {
2464 initial_max_stream_data_bidi_local: 100,
2465 initial_max_stream_data_uni: 100,
2466 ..Default::default()
2467 };
2468
2469 let mut streams = <StreamMap>::new(100, 100, 100);
2470
2471 let input = vec![
2474 (0, 100),
2475 (4, 90),
2476 (8, 80),
2477 (12, 70),
2478 (16, 60),
2479 (20, 50),
2480 (24, 40),
2481 (28, 30),
2482 (32, 20),
2483 (36, 10),
2484 (40, 0),
2485 ];
2486
2487 for (id, urgency) in input.clone() {
2488 let stream = streams
2491 .get_or_create(id, &local_tp, &peer_tp, false, true)
2492 .unwrap();
2493
2494 stream.urgency = urgency;
2495
2496 let new_priority_key = Arc::new(StreamPriorityKey {
2497 urgency: stream.urgency,
2498 incremental: stream.incremental,
2499 id,
2500 ..Default::default()
2501 });
2502
2503 let old_priority_key = std::mem::replace(
2504 &mut stream.priority_key,
2505 new_priority_key.clone(),
2506 );
2507
2508 streams.update_priority(&old_priority_key, &new_priority_key);
2509 }
2510
2511 let walk_1: Vec<u64> = streams.writable().collect();
2512 assert_eq!(walk_1, vec![40, 36, 32, 28, 24, 20, 16, 12, 8, 4, 0]);
2513
2514 for (id, urgency) in input {
2516 let stream = streams
2519 .get_or_create(id, &local_tp, &peer_tp, false, true)
2520 .unwrap();
2521
2522 stream.urgency = urgency;
2523
2524 let new_priority_key = Arc::new(StreamPriorityKey {
2525 urgency: stream.urgency,
2526 incremental: stream.incremental,
2527 id,
2528 ..Default::default()
2529 });
2530
2531 let old_priority_key = std::mem::replace(
2532 &mut stream.priority_key,
2533 new_priority_key.clone(),
2534 );
2535
2536 streams.update_priority(&old_priority_key, &new_priority_key);
2537 }
2538
2539 let walk_2: Vec<u64> = streams.writable().collect();
2540 assert_eq!(walk_2, vec![40, 36, 32, 28, 24, 20, 16, 12, 8, 4, 0]);
2541
2542 streams.collect(24, true);
2544
2545 let walk_3: Vec<u64> = streams.writable().collect();
2546 assert_eq!(walk_3, vec![40, 36, 32, 28, 20, 16, 12, 8, 4, 0]);
2547
2548 streams.collect(40, true);
2549 streams.collect(0, true);
2550
2551 let walk_4: Vec<u64> = streams.writable().collect();
2552 assert_eq!(walk_4, vec![36, 32, 28, 20, 16, 12, 8, 4]);
2553
2554 streams
2556 .get_or_create(44, &local_tp, &peer_tp, false, true)
2557 .unwrap();
2558
2559 let walk_5: Vec<u64> = streams.writable().collect();
2560 assert_eq!(walk_5, vec![36, 32, 28, 20, 16, 12, 8, 4, 44]);
2561 }
2562
2563 #[test]
2564 fn writable_prioritized_mixed_urgencies_incrementals() {
2565 let local_tp = crate::TransportParams::default();
2566 let peer_tp = crate::TransportParams {
2567 initial_max_stream_data_bidi_local: 100,
2568 initial_max_stream_data_uni: 100,
2569 ..Default::default()
2570 };
2571
2572 let mut streams = StreamMap::new(100, 100, 100);
2573
2574 let input = vec![
2576 (0, 100),
2577 (4, 20),
2578 (8, 100),
2579 (12, 20),
2580 (16, 90),
2581 (20, 25),
2582 (24, 90),
2583 (28, 30),
2584 (32, 80),
2585 (36, 20),
2586 (40, 0),
2587 ];
2588
2589 for (id, urgency) in input.clone() {
2590 let stream = streams
2593 .get_or_create(id, &local_tp, &peer_tp, false, true)
2594 .unwrap();
2595
2596 stream.urgency = urgency;
2597
2598 let new_priority_key = Arc::new(StreamPriorityKey {
2599 urgency: stream.urgency,
2600 incremental: stream.incremental,
2601 id,
2602 ..Default::default()
2603 });
2604
2605 let old_priority_key = std::mem::replace(
2606 &mut stream.priority_key,
2607 new_priority_key.clone(),
2608 );
2609
2610 streams.update_priority(&old_priority_key, &new_priority_key);
2611 }
2612
2613 let walk_1: Vec<u64> = streams.writable().collect();
2614 cycle_stream_priority(4, &mut streams);
2615 cycle_stream_priority(16, &mut streams);
2616 cycle_stream_priority(0, &mut streams);
2617 let walk_2: Vec<u64> = streams.writable().collect();
2618 cycle_stream_priority(12, &mut streams);
2619 cycle_stream_priority(24, &mut streams);
2620 cycle_stream_priority(8, &mut streams);
2621 let walk_3: Vec<u64> = streams.writable().collect();
2622 cycle_stream_priority(36, &mut streams);
2623 cycle_stream_priority(16, &mut streams);
2624 cycle_stream_priority(0, &mut streams);
2625 let walk_4: Vec<u64> = streams.writable().collect();
2626 cycle_stream_priority(4, &mut streams);
2627 cycle_stream_priority(24, &mut streams);
2628 cycle_stream_priority(8, &mut streams);
2629 let walk_5: Vec<u64> = streams.writable().collect();
2630 cycle_stream_priority(12, &mut streams);
2631 cycle_stream_priority(16, &mut streams);
2632 cycle_stream_priority(0, &mut streams);
2633 let walk_6: Vec<u64> = streams.writable().collect();
2634 cycle_stream_priority(36, &mut streams);
2635 cycle_stream_priority(24, &mut streams);
2636 cycle_stream_priority(8, &mut streams);
2637 let walk_7: Vec<u64> = streams.writable().collect();
2638 cycle_stream_priority(4, &mut streams);
2639 cycle_stream_priority(16, &mut streams);
2640 cycle_stream_priority(0, &mut streams);
2641 let walk_8: Vec<u64> = streams.writable().collect();
2642 cycle_stream_priority(12, &mut streams);
2643 cycle_stream_priority(24, &mut streams);
2644 cycle_stream_priority(8, &mut streams);
2645 let walk_9: Vec<u64> = streams.writable().collect();
2646 cycle_stream_priority(36, &mut streams);
2647 cycle_stream_priority(16, &mut streams);
2648 cycle_stream_priority(0, &mut streams);
2649
2650 assert_eq!(walk_1, vec![40, 4, 12, 36, 20, 28, 32, 16, 24, 0, 8]);
2651 assert_eq!(walk_2, vec![40, 12, 36, 4, 20, 28, 32, 24, 16, 8, 0]);
2652 assert_eq!(walk_3, vec![40, 36, 4, 12, 20, 28, 32, 16, 24, 0, 8]);
2653 assert_eq!(walk_4, vec![40, 4, 12, 36, 20, 28, 32, 24, 16, 8, 0]);
2654 assert_eq!(walk_5, vec![40, 12, 36, 4, 20, 28, 32, 16, 24, 0, 8]);
2655 assert_eq!(walk_6, vec![40, 36, 4, 12, 20, 28, 32, 24, 16, 8, 0]);
2656 assert_eq!(walk_7, vec![40, 4, 12, 36, 20, 28, 32, 16, 24, 0, 8]);
2657 assert_eq!(walk_8, vec![40, 12, 36, 4, 20, 28, 32, 24, 16, 8, 0]);
2658 assert_eq!(walk_9, vec![40, 36, 4, 12, 20, 28, 32, 16, 24, 0, 8]);
2659
2660 streams.collect(20, true);
2662
2663 let walk_10: Vec<u64> = streams.writable().collect();
2664 assert_eq!(walk_10, vec![40, 4, 12, 36, 28, 32, 24, 16, 8, 0]);
2665
2666 let stream = streams
2668 .get_or_create(44, &local_tp, &peer_tp, false, true)
2669 .unwrap();
2670
2671 stream.urgency = 20;
2672 stream.incremental = true;
2673
2674 let new_priority_key = Arc::new(StreamPriorityKey {
2675 urgency: stream.urgency,
2676 incremental: stream.incremental,
2677 id: 44,
2678 ..Default::default()
2679 });
2680
2681 let old_priority_key =
2682 std::mem::replace(&mut stream.priority_key, new_priority_key.clone());
2683
2684 streams.update_priority(&old_priority_key, &new_priority_key);
2685
2686 let walk_11: Vec<u64> = streams.writable().collect();
2687 assert_eq!(walk_11, vec![40, 4, 12, 36, 44, 28, 32, 24, 16, 8, 0]);
2688 }
2689
2690 #[test]
2691 fn priority_tree_dupes() {
2692 let mut prioritized_writable: RBTree<StreamWritablePriorityAdapter> =
2693 Default::default();
2694
2695 for id in [0, 4, 8, 12] {
2696 let s = Arc::new(StreamPriorityKey {
2697 urgency: 0,
2698 incremental: false,
2699 id,
2700 ..Default::default()
2701 });
2702
2703 prioritized_writable.insert(s);
2704 }
2705
2706 let walk_1: Vec<u64> =
2707 prioritized_writable.iter().map(|s| s.id).collect();
2708 assert_eq!(walk_1, vec![0, 4, 8, 12]);
2709
2710 for id in [0, 4, 8, 12] {
2713 let s = Arc::new(StreamPriorityKey {
2714 urgency: 0,
2715 incremental: false,
2716 id,
2717 ..Default::default()
2718 });
2719
2720 prioritized_writable.insert(s);
2721 }
2722
2723 let walk_2: Vec<u64> =
2724 prioritized_writable.iter().map(|s| s.id).collect();
2725 assert_eq!(walk_2, vec![0, 0, 4, 4, 8, 8, 12, 12]);
2726 }
2727
2728 #[test]
2729 fn retransmit_returns_zero_when_already_acked() {
2730 let mut stream = <Stream>::new(0, 15, 15, true, 0, 15);
2731
2732 assert_eq!(stream.send.write(b"hello", false), Ok(5));
2734 assert_eq!(stream.send.buffered_bytes(), 5);
2735
2736 let mut buf = [0; 10];
2737 let (written, _) = stream.send.emit(&mut buf).unwrap();
2738 assert_eq!(written, 5);
2739 assert_eq!(stream.send.buffered_bytes(), 0);
2740
2741 let retransmitted = stream.send.retransmit(0, 5);
2743 assert_eq!(retransmitted, 5);
2744 assert_eq!(stream.send.buffered_bytes(), 5);
2745
2746 stream.send.ack_and_drop(0, 5);
2748 assert_eq!(stream.send.buffered_bytes(), 0);
2749
2750 let retransmitted = stream.send.retransmit(0, 5);
2752 assert_eq!(retransmitted, 0);
2753 assert_eq!(stream.send.buffered_bytes(), 0);
2754 }
2755
2756 #[test]
2757 fn retransmit_returns_partial_when_some_acked() {
2758 let mut stream = <Stream>::new(0, 15, 15, true, 0, 15);
2759
2760 assert_eq!(stream.send.write(b"helloworld", false), Ok(10));
2762 assert_eq!(stream.send.buffered_bytes(), 10);
2763
2764 let mut buf = [0; 10];
2765 let (written, _) = stream.send.emit(&mut buf).unwrap();
2766 assert_eq!(written, 10);
2767 assert_eq!(stream.send.buffered_bytes(), 0);
2768
2769 let retransmitted = stream.send.retransmit(0, 10);
2771 assert_eq!(retransmitted, 10);
2772 assert_eq!(stream.send.buffered_bytes(), 10);
2773
2774 let dropped = stream.send.ack_and_drop(0, 5);
2776 assert_eq!(dropped, 5);
2777 assert_eq!(stream.send.buffered_bytes(), 5);
2778
2779 let retransmitted = stream.send.retransmit(0, 10);
2782 assert_eq!(retransmitted, 0); assert_eq!(stream.send.buffered_bytes(), 5);
2784 }
2785
2786 #[test]
2787 fn ack_and_drop_decrements_len_and_returns_dropped() {
2788 let mut stream = <Stream>::new(0, 15, 15, true, 0, 15);
2789
2790 assert_eq!(stream.send.write(b"hello", false), Ok(5));
2792 assert_eq!(stream.send.buffered_bytes(), 5);
2793
2794 let mut buf = [0; 10];
2796 let (written, _) = stream.send.emit(&mut buf).unwrap();
2797 assert_eq!(written, 5);
2798 assert_eq!(stream.send.buffered_bytes(), 0);
2799
2800 let retransmitted = stream.send.retransmit(0, 5);
2802 assert_eq!(retransmitted, 5);
2803 assert_eq!(stream.send.buffered_bytes(), 5);
2804
2805 let dropped = stream.send.ack_and_drop(0, 5);
2807 assert_eq!(dropped, 5);
2808 assert_eq!(stream.send.buffered_bytes(), 0);
2809 }
2810
2811 #[test]
2812 fn ack_and_drop_partial_buffer() {
2813 let mut stream = <Stream>::new(0, 30, 30, true, 0, 30);
2814
2815 assert_eq!(stream.send.write(b"hello", false), Ok(5));
2817 assert_eq!(stream.send.write(b"world", false), Ok(5));
2818 assert_eq!(stream.send.buffered_bytes(), 10);
2819
2820 let mut buf = [0; 10];
2821 let (written, _) = stream.send.emit(&mut buf).unwrap();
2822 assert_eq!(written, 10);
2823 assert_eq!(stream.send.buffered_bytes(), 0);
2824
2825 let retransmitted = stream.send.retransmit(0, 10);
2827 assert_eq!(retransmitted, 10);
2828 assert_eq!(stream.send.buffered_bytes(), 10);
2829
2830 let dropped = stream.send.ack_and_drop(0, 5);
2832 assert_eq!(dropped, 5);
2833 assert_eq!(stream.send.buffered_bytes(), 5);
2834
2835 let dropped = stream.send.ack_and_drop(5, 5);
2837 assert_eq!(dropped, 5);
2838 assert_eq!(stream.send.buffered_bytes(), 0);
2839 }
2840
2841 #[test]
2842 fn ack_and_drop_returns_zero_when_nothing_dropped() {
2843 let mut stream = <Stream>::new(0, 15, 15, true, 0, 15);
2844
2845 assert_eq!(stream.send.write(b"hello", false), Ok(5));
2847 let mut buf = [0; 10];
2848 let (written, _) = stream.send.emit(&mut buf).unwrap();
2849 assert_eq!(written, 5);
2850
2851 let dropped = stream.send.ack_and_drop(0, 5);
2854 assert_eq!(dropped, 0);
2855 assert_eq!(stream.send.buffered_bytes(), 0);
2856 }
2857
2858 #[test]
2859 fn cache_consistency_through_full_lifecycle() {
2860 let mut streams = <StreamMap>::new(5, 5, 15);
2864
2865 let local_params = crate::TransportParams {
2867 initial_max_data: 30,
2868 initial_max_stream_data_bidi_local: 15,
2869 initial_max_stream_data_bidi_remote: 15,
2870 initial_max_stream_data_uni: 10,
2871 initial_max_streams_bidi: 5,
2872 initial_max_streams_uni: 5,
2873 ..Default::default()
2874 };
2875 let peer_params = local_params.clone();
2876
2877 streams.update_peer_max_streams_bidi(5);
2879 streams.update_peer_max_streams_uni(5);
2880
2881 let stream_id = 0u64;
2882
2883 {
2885 let stream = streams
2886 .get_or_create(
2887 stream_id,
2888 &local_params,
2889 &peer_params,
2890 true,
2891 false,
2892 )
2893 .unwrap();
2894 assert_eq!(stream.send.write(b"hello", false), Ok(5));
2895 }
2896 streams.add_tx_buffered(5);
2897 assert_eq!(streams.get(stream_id).unwrap().send.buffered_bytes(), 5);
2898 assert_eq!(streams.tx_buffered(), 5);
2899 assert!(streams.tx_buffered_is_consistent());
2900
2901 let mut buf = [0; 10];
2903 let written = {
2904 let stream = streams.get_mut(stream_id).unwrap();
2905 let (written, _) = stream.send.emit(&mut buf).unwrap();
2906 written
2907 };
2908 assert_eq!(written, 5);
2909 streams.sub_tx_buffered(5);
2910 assert_eq!(streams.get(stream_id).unwrap().send.buffered_bytes(), 0);
2911 assert_eq!(streams.tx_buffered(), 0);
2912 assert!(streams.tx_buffered_is_consistent());
2913
2914 let retransmitted = {
2916 let stream = streams.get_mut(stream_id).unwrap();
2917 stream.send.retransmit(0, 5)
2918 };
2919 assert_eq!(retransmitted, 5);
2920 streams.add_tx_buffered(retransmitted);
2921 assert_eq!(streams.get(stream_id).unwrap().send.buffered_bytes(), 5);
2922 assert_eq!(streams.tx_buffered(), 5);
2923 assert!(streams.tx_buffered_is_consistent());
2924
2925 let dropped = {
2928 let stream = streams.get_mut(stream_id).unwrap();
2929 stream.send.ack_and_drop(0, 5)
2930 };
2931 assert_eq!(dropped, 5);
2932 streams.sub_tx_buffered(dropped);
2933 assert_eq!(streams.get(stream_id).unwrap().send.buffered_bytes(), 0);
2934 assert_eq!(streams.tx_buffered(), 0);
2935 assert!(streams.tx_buffered_is_consistent());
2936 }
2937
2938 #[test]
2939 fn send_buf_len_reflects_buffered_data() {
2940 let mut stream = <Stream>::new(0, 15, 15, true, 0, 15);
2941
2942 assert_eq!(stream.send.buffered_bytes(), 0);
2944
2945 assert_eq!(stream.send.write(b"hello", false), Ok(5));
2947 assert_eq!(stream.send.buffered_bytes(), 5);
2948
2949 let mut buf = [0; 10];
2951 let (written, _) = stream.send.emit(&mut buf).unwrap();
2952 assert_eq!(written, 5);
2953 assert_eq!(stream.send.buffered_bytes(), 0);
2954
2955 let retransmitted = stream.send.retransmit(0, 5);
2957 assert_eq!(retransmitted, 5);
2958 assert_eq!(stream.send.buffered_bytes(), 5);
2959
2960 let dropped = stream.send.ack_and_drop(0, 5);
2962 assert_eq!(dropped, 5);
2963 assert_eq!(stream.send.buffered_bytes(), 0);
2964 }
2965}
2966
2967mod recv_buf;
2968mod send_buf;