Skip to main content

quiche/stream/
mod.rs

1// Copyright (C) 2018-2019, Cloudflare, Inc.
2// All rights reserved.
3//
4// Redistribution and use in source and binary forms, with or without
5// modification, are permitted provided that the following conditions are
6// met:
7//
8//     * Redistributions of source code must retain the above copyright notice,
9//       this list of conditions and the following disclaimer.
10//
11//     * Redistributions in binary form must reproduce the above copyright
12//       notice, this list of conditions and the following disclaimer in the
13//       documentation and/or other materials provided with the distribution.
14//
15// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
16// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
17// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
19// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
23// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
27use 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::BufFactory;
44use crate::Error;
45use crate::Result;
46
47const DEFAULT_URGENCY: u8 = 127;
48
49/// The maximum size of the receiver stream flow control window.
50pub const MAX_STREAM_WINDOW: u64 = 16 * 1024 * 1024;
51
52/// A simple no-op hasher for Stream IDs.
53///
54/// The QUIC protocol and quiche library guarantees stream ID uniqueness, so
55/// we can save effort by avoiding using a more complicated algorithm.
56#[derive(Default)]
57pub struct StreamIdHasher {
58    id: u64,
59}
60
61/// Return value type of `RecvBuf::reset()`
62#[derive(Debug, PartialEq, Clone, Copy)]
63pub struct RecvBufResetReturn {
64    /// Returns the difference between the previous max_data offset
65    /// received and the final size reported by the reset
66    pub max_data_delta: u64,
67
68    /// The amount of flow control credit that should be returned to the
69    /// connection level flow control.
70    pub consumed_flowcontrol: u64,
71}
72
73impl RecvBufResetReturn {
74    pub fn zero() -> Self {
75        Self {
76            max_data_delta: 0,
77            consumed_flowcontrol: 0,
78        }
79    }
80}
81
82/// Action to perform when reading from a stream's receive buffer.
83pub enum RecvAction<T: bytes::BufMut> {
84    /// Emit data by copying it into the provided buffer.
85    Emit { out: T },
86    /// Discard up to the specified number of bytes without copying.
87    Discard { len: usize },
88}
89
90impl std::hash::Hasher for StreamIdHasher {
91    #[inline]
92    fn finish(&self) -> u64 {
93        self.id
94    }
95
96    #[inline]
97    fn write_u64(&mut self, id: u64) {
98        self.id = id;
99    }
100
101    #[inline]
102    fn write(&mut self, _: &[u8]) {
103        // We need a default write() for the trait but stream IDs will always
104        // be a u64 so we just delegate to write_u64.
105        unimplemented!()
106    }
107}
108
109type BuildStreamIdHasher = std::hash::BuildHasherDefault<StreamIdHasher>;
110
111pub type StreamIdHashMap<V> = HashMap<u64, V, BuildStreamIdHasher>;
112pub type StreamIdHashSet = HashSet<u64, BuildStreamIdHasher>;
113
114/// Keeps track of QUIC streams and enforces stream limits.
115#[derive(Default)]
116pub struct StreamMap<F: BufFactory = DefaultBufFactory> {
117    /// Map of streams indexed by stream ID.
118    streams: StreamIdHashMap<Stream<F>>,
119
120    /// Set of streams that were completed and garbage collected.
121    ///
122    /// Instead of keeping the full stream state forever, we collect completed
123    /// streams to save memory, but we still need to keep track of previously
124    /// created streams, to prevent peers from re-creating them.
125    collected: StreamIdHashSet,
126
127    /// Peer's maximum bidirectional stream count limit.
128    peer_max_streams_bidi: u64,
129
130    /// Peer's maximum unidirectional stream count limit.
131    peer_max_streams_uni: u64,
132
133    /// The total number of bidirectional streams opened by the peer.
134    peer_opened_streams_bidi: u64,
135
136    /// The total number of unidirectional streams opened by the peer.
137    peer_opened_streams_uni: u64,
138
139    /// Local maximum bidirectional stream count limit.
140    local_max_streams_bidi: u64,
141    local_max_streams_bidi_next: u64,
142
143    /// Initial maximum bidirectional stream count.
144    initial_max_streams_bidi: u64,
145
146    /// Local maximum unidirectional stream count limit.
147    local_max_streams_uni: u64,
148    local_max_streams_uni_next: u64,
149
150    /// Initial maximum unidirectional stream count.
151    initial_max_streams_uni: u64,
152
153    /// The total number of bidirectional streams opened by the local endpoint.
154    local_opened_streams_bidi: u64,
155
156    /// The total number of unidirectional streams opened by the local endpoint.
157    local_opened_streams_uni: u64,
158
159    /// Queue of stream IDs corresponding to streams that have buffered data
160    /// ready to be sent to the peer. This also implies that the stream has
161    /// enough flow control credits to send at least some of that data.
162    flushable: RBTree<StreamFlushablePriorityAdapter>,
163
164    /// Set of stream IDs corresponding to streams that have outstanding data
165    /// to read. This is used to generate a `StreamIter` of streams without
166    /// having to iterate over the full list of streams.
167    pub readable: RBTree<StreamReadablePriorityAdapter>,
168
169    /// Set of stream IDs corresponding to streams that have enough flow control
170    /// capacity to be written to, and is not finished. This is used to generate
171    /// a `StreamIter` of streams without having to iterate over the full list
172    /// of streams.
173    pub writable: RBTree<StreamWritablePriorityAdapter>,
174
175    /// Set of stream IDs corresponding to streams that are almost out of flow
176    /// control credit and need to send MAX_STREAM_DATA. This is used to
177    /// generate a `StreamIter` of streams without having to iterate over the
178    /// full list of streams.
179    almost_full: StreamIdHashSet,
180
181    /// Set of stream IDs corresponding to streams that are blocked. The value
182    /// of the map elements represents the offset of the stream at which the
183    /// blocking occurred.
184    blocked: StreamIdHashMap<u64>,
185
186    /// Set of stream IDs corresponding to streams that are reset. The value
187    /// of the map elements is a tuple of the error code and final size values
188    /// to include in the RESET_STREAM frame.
189    reset: StreamIdHashMap<(u64, u64)>,
190
191    /// Set of stream IDs corresponding to streams that are shutdown on the
192    /// receive side, and need to send a STOP_SENDING frame. The value of the
193    /// map elements is the error code to include in the STOP_SENDING frame.
194    stopped: StreamIdHashMap<u64>,
195
196    /// The maximum size of a stream window.
197    max_stream_window: u64,
198
199    /// Total number of bytes in send buffers across all streams.
200    tx_buffered: usize,
201}
202
203impl<F: BufFactory> StreamMap<F> {
204    pub fn new(
205        max_streams_bidi: u64, max_streams_uni: u64, max_stream_window: u64,
206    ) -> Self {
207        StreamMap {
208            local_max_streams_bidi: max_streams_bidi,
209            local_max_streams_bidi_next: max_streams_bidi,
210            initial_max_streams_bidi: max_streams_bidi,
211
212            local_max_streams_uni: max_streams_uni,
213            local_max_streams_uni_next: max_streams_uni,
214            initial_max_streams_uni: max_streams_uni,
215
216            max_stream_window,
217
218            ..StreamMap::default()
219        }
220    }
221
222    /// Returns the stream with the given ID if it exists.
223    pub fn get(&self, id: u64) -> Option<&Stream<F>> {
224        self.streams.get(&id)
225    }
226
227    /// Returns the mutable stream with the given ID if it exists.
228    pub fn get_mut(&mut self, id: u64) -> Option<&mut Stream<F>> {
229        self.streams.get_mut(&id)
230    }
231
232    /// Returns the mutable stream with the given ID if it exists, or creates
233    /// a new one otherwise.
234    ///
235    /// The `local` parameter indicates whether the stream's creation was
236    /// requested by the local application rather than the peer, and is
237    /// used to validate the requested stream ID, and to select the initial
238    /// flow control values from the local and remote transport parameters
239    /// (also passed as arguments).
240    ///
241    /// This also takes care of enforcing both local and the peer's stream
242    /// count limits. If one of these limits is violated, the `StreamLimit`
243    /// error is returned.
244    pub(crate) fn get_or_create(
245        &mut self, id: u64, local_params: &crate::TransportParams,
246        peer_params: &crate::TransportParams, local: bool, is_server: bool,
247    ) -> Result<&mut Stream<F>> {
248        let (stream, is_new_and_writable) = match self.streams.entry(id) {
249            hash_map::Entry::Vacant(v) => {
250                // Stream has already been closed and garbage collected.
251                if self.collected.contains(&id) {
252                    return Err(Error::Done);
253                }
254
255                if local != is_local(id, is_server) {
256                    return Err(Error::InvalidStreamState(id));
257                }
258
259                let (max_rx_data, max_tx_data) = match (local, is_bidi(id)) {
260                    // Locally-initiated bidirectional stream.
261                    (true, true) => (
262                        local_params.initial_max_stream_data_bidi_local,
263                        peer_params.initial_max_stream_data_bidi_remote,
264                    ),
265
266                    // Locally-initiated unidirectional stream.
267                    (true, false) => (0, peer_params.initial_max_stream_data_uni),
268
269                    // Remotely-initiated bidirectional stream.
270                    (false, true) => (
271                        local_params.initial_max_stream_data_bidi_remote,
272                        peer_params.initial_max_stream_data_bidi_local,
273                    ),
274
275                    // Remotely-initiated unidirectional stream.
276                    (false, false) =>
277                        (local_params.initial_max_stream_data_uni, 0),
278                };
279
280                // The two least significant bits from a stream id identify the
281                // type of stream. Truncate those bits to get the sequence for
282                // that stream type.
283                let stream_sequence = id >> 2;
284
285                // Enforce stream count limits.
286                match (is_local(id, is_server), is_bidi(id)) {
287                    (true, true) => {
288                        let n = cmp::max(
289                            self.local_opened_streams_bidi,
290                            stream_sequence + 1,
291                        );
292
293                        if n > self.peer_max_streams_bidi {
294                            return Err(Error::StreamLimit);
295                        }
296
297                        self.local_opened_streams_bidi = n;
298                    },
299
300                    (true, false) => {
301                        let n = cmp::max(
302                            self.local_opened_streams_uni,
303                            stream_sequence + 1,
304                        );
305
306                        if n > self.peer_max_streams_uni {
307                            return Err(Error::StreamLimit);
308                        }
309
310                        self.local_opened_streams_uni = n;
311                    },
312
313                    (false, true) => {
314                        let n = cmp::max(
315                            self.peer_opened_streams_bidi,
316                            stream_sequence + 1,
317                        );
318
319                        if n > self.local_max_streams_bidi {
320                            return Err(Error::StreamLimit);
321                        }
322
323                        self.peer_opened_streams_bidi = n;
324                    },
325
326                    (false, false) => {
327                        let n = cmp::max(
328                            self.peer_opened_streams_uni,
329                            stream_sequence + 1,
330                        );
331
332                        if n > self.local_max_streams_uni {
333                            return Err(Error::StreamLimit);
334                        }
335
336                        self.peer_opened_streams_uni = n;
337                    },
338                };
339
340                let initial_window = max_rx_data;
341                let s = Stream::new(
342                    id,
343                    max_rx_data,
344                    max_tx_data,
345                    local,
346                    initial_window,
347                    self.max_stream_window,
348                );
349
350                let is_writable = s.is_writable();
351
352                (v.insert(s), is_writable)
353            },
354
355            hash_map::Entry::Occupied(v) => (v.into_mut(), false),
356        };
357
358        // Newly created stream might already be writable due to initial flow
359        // control limits.
360        if is_new_and_writable {
361            self.writable.insert(Arc::clone(&stream.priority_key));
362        }
363
364        Ok(stream)
365    }
366
367    /// Adds the stream ID to the readable streams set.
368    ///
369    /// If the stream was already in the list, this does nothing.
370    pub fn insert_readable(&mut self, priority_key: &Arc<StreamPriorityKey>) {
371        if !priority_key.readable.is_linked() {
372            self.readable.insert(Arc::clone(priority_key));
373        }
374    }
375
376    /// Removes the stream ID from the readable streams set.
377    pub fn remove_readable(&mut self, priority_key: &Arc<StreamPriorityKey>) {
378        if !priority_key.readable.is_linked() {
379            return;
380        }
381
382        let mut c = {
383            let ptr = Arc::as_ptr(priority_key);
384            unsafe { self.readable.cursor_mut_from_ptr(ptr) }
385        };
386
387        c.remove();
388    }
389
390    /// Adds the stream ID to the writable streams set.
391    ///
392    /// This should also be called anytime a new stream is created, in addition
393    /// to when an existing stream becomes writable.
394    ///
395    /// If the stream was already in the list, this does nothing.
396    pub fn insert_writable(&mut self, priority_key: &Arc<StreamPriorityKey>) {
397        if !priority_key.writable.is_linked() {
398            self.writable.insert(Arc::clone(priority_key));
399        }
400    }
401
402    /// Removes the stream ID from the writable streams set.
403    ///
404    /// This should also be called anytime an existing stream stops being
405    /// writable.
406    pub fn remove_writable(&mut self, priority_key: &Arc<StreamPriorityKey>) {
407        if !priority_key.writable.is_linked() {
408            return;
409        }
410
411        let mut c = {
412            let ptr = Arc::as_ptr(priority_key);
413            unsafe { self.writable.cursor_mut_from_ptr(ptr) }
414        };
415
416        c.remove();
417    }
418
419    /// Adds the stream ID to the flushable streams set.
420    ///
421    /// If the stream was already in the list, this does nothing.
422    pub fn insert_flushable(&mut self, priority_key: &Arc<StreamPriorityKey>) {
423        if !priority_key.flushable.is_linked() {
424            self.flushable.insert(Arc::clone(priority_key));
425        }
426    }
427
428    /// Removes the stream ID from the flushable streams set.
429    pub fn remove_flushable(&mut self, priority_key: &Arc<StreamPriorityKey>) {
430        if !priority_key.flushable.is_linked() {
431            return;
432        }
433
434        let mut c = {
435            let ptr = Arc::as_ptr(priority_key);
436            unsafe { self.flushable.cursor_mut_from_ptr(ptr) }
437        };
438
439        c.remove();
440    }
441
442    pub fn peek_flushable(&self) -> Option<Arc<StreamPriorityKey>> {
443        self.flushable.front().clone_pointer()
444    }
445
446    /// Updates the priorities of a stream.
447    pub fn update_priority(
448        &mut self, old: &Arc<StreamPriorityKey>, new: &Arc<StreamPriorityKey>,
449    ) {
450        if old.readable.is_linked() {
451            self.remove_readable(old);
452            self.readable.insert(Arc::clone(new));
453        }
454
455        if old.writable.is_linked() {
456            self.remove_writable(old);
457            self.writable.insert(Arc::clone(new));
458        }
459
460        if old.flushable.is_linked() {
461            self.remove_flushable(old);
462            self.flushable.insert(Arc::clone(new));
463        }
464    }
465
466    /// Adds the stream ID to the almost full streams set.
467    ///
468    /// If the stream was already in the list, this does nothing.
469    pub fn insert_almost_full(&mut self, stream_id: u64) {
470        self.almost_full.insert(stream_id);
471    }
472
473    /// Removes the stream ID from the almost full streams set.
474    pub fn remove_almost_full(&mut self, stream_id: u64) {
475        self.almost_full.remove(&stream_id);
476    }
477
478    /// Adds the stream ID to the blocked streams set with the
479    /// given offset value.
480    ///
481    /// If the stream was already in the list, this does nothing.
482    pub fn insert_blocked(&mut self, stream_id: u64, off: u64) {
483        self.blocked.insert(stream_id, off);
484    }
485
486    /// Removes the stream ID from the blocked streams set.
487    pub fn remove_blocked(&mut self, stream_id: u64) {
488        self.blocked.remove(&stream_id);
489    }
490
491    /// Adds the stream ID to the reset streams set with the
492    /// given error code and final size values.
493    ///
494    /// If the stream was already in the list, this does nothing.
495    pub fn insert_reset(
496        &mut self, stream_id: u64, error_code: u64, final_size: u64,
497    ) {
498        self.reset.insert(stream_id, (error_code, final_size));
499    }
500
501    /// Removes the stream ID from the reset streams set.
502    pub fn remove_reset(&mut self, stream_id: u64) {
503        self.reset.remove(&stream_id);
504    }
505
506    /// Adds the stream ID to the stopped streams set with the
507    /// given error code.
508    ///
509    /// If the stream was already in the list, this does nothing.
510    pub fn insert_stopped(&mut self, stream_id: u64, error_code: u64) {
511        self.stopped.insert(stream_id, error_code);
512    }
513
514    /// Removes the stream ID from the stopped streams set.
515    pub fn remove_stopped(&mut self, stream_id: u64) {
516        self.stopped.remove(&stream_id);
517    }
518
519    /// Updates the peer's maximum bidirectional stream count limit.
520    pub fn update_peer_max_streams_bidi(&mut self, v: u64) {
521        self.peer_max_streams_bidi = cmp::max(self.peer_max_streams_bidi, v);
522    }
523
524    /// Updates the peer's maximum unidirectional stream count limit.
525    pub fn update_peer_max_streams_uni(&mut self, v: u64) {
526        self.peer_max_streams_uni = cmp::max(self.peer_max_streams_uni, v);
527    }
528
529    /// Commits the new max_streams_bidi limit.
530    pub fn update_max_streams_bidi(&mut self) {
531        self.local_max_streams_bidi = self.local_max_streams_bidi_next;
532    }
533
534    /// Sets the max_streams_bidi limit to the given value.
535    pub fn set_max_streams_bidi(&mut self, max: u64) {
536        self.local_max_streams_bidi = max;
537        self.local_max_streams_bidi_next = max;
538        self.initial_max_streams_bidi = max;
539    }
540
541    /// Returns the current max_streams_bidi limit.
542    pub fn max_streams_bidi(&self) -> u64 {
543        self.local_max_streams_bidi
544    }
545
546    /// Returns the new max_streams_bidi limit.
547    pub fn max_streams_bidi_next(&mut self) -> u64 {
548        self.local_max_streams_bidi_next
549    }
550
551    /// Commits the new max_streams_uni limit.
552    pub fn update_max_streams_uni(&mut self) {
553        self.local_max_streams_uni = self.local_max_streams_uni_next;
554    }
555
556    /// Returns the new max_streams_uni limit.
557    pub fn max_streams_uni_next(&mut self) -> u64 {
558        self.local_max_streams_uni_next
559    }
560
561    /// Returns the peer's current maximum bidirectional stream count limit.
562    pub fn peer_max_streams_bidi(&self) -> u64 {
563        self.peer_max_streams_bidi
564    }
565
566    /// Returns the number of bidirectional streams that can be created
567    /// before the peer's stream count limit is reached.
568    pub fn peer_streams_left_bidi(&self) -> u64 {
569        self.peer_max_streams_bidi - self.local_opened_streams_bidi
570    }
571
572    /// Returns the peer's current maximum unidirectional stream count limit.
573    pub fn peer_max_streams_uni(&self) -> u64 {
574        self.peer_max_streams_uni
575    }
576
577    /// Returns the number of unidirectional streams that can be created
578    /// before the peer's stream count limit is reached.
579    pub fn peer_streams_left_uni(&self) -> u64 {
580        self.peer_max_streams_uni - self.local_opened_streams_uni
581    }
582
583    /// Drops completed stream.
584    ///
585    /// This should only be called when Stream::is_complete() returns true for
586    /// the given stream.
587    pub fn collect(&mut self, stream_id: u64, local: bool) {
588        if !local {
589            // If the stream was created by the peer, give back a max streams
590            // credit.
591            if is_bidi(stream_id) {
592                self.local_max_streams_bidi_next =
593                    self.local_max_streams_bidi_next.saturating_add(1);
594            } else {
595                self.local_max_streams_uni_next =
596                    self.local_max_streams_uni_next.saturating_add(1);
597            }
598        }
599
600        let s = self.streams.remove(&stream_id).unwrap();
601
602        self.remove_readable(&s.priority_key);
603
604        self.remove_writable(&s.priority_key);
605
606        self.remove_flushable(&s.priority_key);
607
608        self.collected.insert(stream_id);
609    }
610
611    /// Creates an iterator over streams that have outstanding data to read.
612    pub fn readable(&self) -> StreamIter {
613        StreamIter {
614            streams: self.readable.iter().map(|s| s.id).collect(),
615            index: 0,
616        }
617    }
618
619    /// Creates an iterator over streams that can be written to.
620    pub fn writable(&self) -> StreamIter {
621        StreamIter {
622            streams: self.writable.iter().map(|s| s.id).collect(),
623            index: 0,
624        }
625    }
626
627    /// Creates an iterator over streams that need to send MAX_STREAM_DATA.
628    pub fn almost_full(&self) -> StreamIter {
629        StreamIter::from(&self.almost_full)
630    }
631
632    /// Creates an iterator over streams that need to send STREAM_DATA_BLOCKED.
633    pub fn blocked(&self) -> hash_map::Iter<'_, u64, u64> {
634        self.blocked.iter()
635    }
636
637    /// Creates an iterator over streams that need to send RESET_STREAM.
638    pub fn reset(&self) -> hash_map::Iter<'_, u64, (u64, u64)> {
639        self.reset.iter()
640    }
641
642    /// Creates an iterator over streams that need to send STOP_SENDING.
643    pub fn stopped(&self) -> hash_map::Iter<'_, u64, u64> {
644        self.stopped.iter()
645    }
646
647    /// Returns true if the stream has been collected.
648    pub fn is_collected(&self, stream_id: u64) -> bool {
649        self.collected.contains(&stream_id)
650    }
651
652    /// Returns true if there are any streams that have data to write.
653    pub fn has_flushable(&self) -> bool {
654        !self.flushable.is_empty()
655    }
656
657    /// Returns true if there are any streams that have data to read.
658    pub fn has_readable(&self) -> bool {
659        !self.readable.is_empty()
660    }
661
662    /// Returns true if there are any streams that need to update the local
663    /// flow control limit.
664    pub fn has_almost_full(&self) -> bool {
665        !self.almost_full.is_empty()
666    }
667
668    /// Returns true if there are any streams that are blocked.
669    pub fn has_blocked(&self) -> bool {
670        !self.blocked.is_empty()
671    }
672
673    /// Returns true if there are any streams that are reset.
674    pub fn has_reset(&self) -> bool {
675        !self.reset.is_empty()
676    }
677
678    /// Returns true if there are any streams that need to send STOP_SENDING.
679    pub fn has_stopped(&self) -> bool {
680        !self.stopped.is_empty()
681    }
682
683    /// Returns true if the max bidirectional streams count needs to be updated
684    /// by sending a MAX_STREAMS frame to the peer.
685    ///
686    /// This only sends MAX_STREAMS when available capacity is at or below 50%
687    /// of the initial maximum streams target.
688    pub fn should_update_max_streams_bidi(&self) -> bool {
689        let available = self
690            .local_max_streams_bidi
691            .saturating_sub(self.peer_opened_streams_bidi);
692        self.local_max_streams_bidi_next != self.local_max_streams_bidi &&
693            available <= self.initial_max_streams_bidi / 2
694    }
695
696    /// Returns true if the max unidirectional streams count needs to be updated
697    /// by sending a MAX_STREAMS frame to the peer.
698    ///
699    /// This only send MAX_STREAMS when available capacity is at or below 50% of
700    /// the initial maximum streams target.
701    pub fn should_update_max_streams_uni(&self) -> bool {
702        let available = self
703            .local_max_streams_uni
704            .saturating_sub(self.peer_opened_streams_uni);
705        self.local_max_streams_uni_next != self.local_max_streams_uni &&
706            available <= self.initial_max_streams_uni / 2
707    }
708
709    /// Returns the number of active streams in the map.
710    #[cfg(test)]
711    pub fn len(&self) -> usize {
712        self.streams.len()
713    }
714
715    /// Returns the total number of bytes buffered across all streams.
716    pub(crate) fn tx_buffered(&self) -> usize {
717        self.tx_buffered
718    }
719
720    /// Computes the actual number of bytes in send buffers by summing across
721    /// all streams. This is used for debugging to verify that tx_buffered
722    /// is accurate.
723    fn tx_buffered_actual(&self) -> usize {
724        self.streams
725            .values()
726            .map(|s| s.send.buffered_bytes() as usize)
727            .sum()
728    }
729
730    /// Checks if the stored tx_buffered matches the actual value.
731    /// Returns true if they match, false otherwise.
732    pub(crate) fn tx_buffered_is_consistent(&self) -> bool {
733        self.tx_buffered == self.tx_buffered_actual()
734    }
735
736    /// Updates the tx_buffered value by adding the delta.
737    pub(crate) fn add_tx_buffered(&mut self, delta: usize) {
738        self.tx_buffered += delta;
739
740        #[cfg(debug_assertions)]
741        self.debug_check_tx_buffered_consistency();
742    }
743
744    /// Updates the tx_buffered value by subtracting the delta.
745    pub(crate) fn sub_tx_buffered(&mut self, delta: usize) {
746        debug_assert!(self.tx_buffered >= delta);
747        self.tx_buffered = self.tx_buffered.saturating_sub(delta);
748
749        #[cfg(debug_assertions)]
750        self.debug_check_tx_buffered_consistency();
751    }
752
753    /// Verifies that the stored tx_buffered value matches the actual bytes in
754    /// send buffers across all streams. Enabled in debug builds to catch
755    /// inconsistencies early.
756    #[cfg(debug_assertions)]
757    pub(crate) fn debug_check_tx_buffered_consistency(&self) {
758        if !self.tx_buffered_is_consistent() {
759            let buffered_per_stream = self
760                .streams
761                .iter()
762                .map(|(id, s)| (*id, s.send.buffered_bytes()))
763                .collect::<Vec<_>>();
764
765            let actual = self.tx_buffered_actual();
766            let stored = self.tx_buffered;
767            panic!(
768                "tx_buffered mismatch: stored={}, actual={}, diff={}, buffered_per_stream={:?}",
769                stored,
770                actual,
771                stored as i64 - actual as i64,
772                buffered_per_stream
773            );
774        }
775    }
776}
777
778/// A QUIC stream.
779pub struct Stream<F: BufFactory = DefaultBufFactory> {
780    /// Receive-side stream buffer.
781    pub recv: recv_buf::RecvBuf,
782
783    /// Send-side stream buffer.
784    pub send: send_buf::SendBuf<F>,
785
786    pub send_lowat: usize,
787
788    /// Whether the stream is bidirectional.
789    pub bidi: bool,
790
791    /// Whether the stream was created by the local endpoint.
792    pub local: bool,
793
794    /// The stream's urgency (lower is better). Default is `DEFAULT_URGENCY`.
795    pub urgency: u8,
796
797    /// Whether the stream can be flushed incrementally. Default is `true`.
798    pub incremental: bool,
799
800    pub priority_key: Arc<StreamPriorityKey>,
801}
802
803impl<F: BufFactory> Stream<F> {
804    /// Creates a new stream with the given flow control limits.
805    pub fn new(
806        id: u64, max_rx_data: u64, max_tx_data: u64, local: bool,
807        initial_window: u64, max_window: u64,
808    ) -> Self {
809        let priority_key = Arc::new(StreamPriorityKey {
810            id,
811            ..Default::default()
812        });
813
814        Stream {
815            recv: recv_buf::RecvBuf::new(max_rx_data, initial_window, max_window),
816            send: send_buf::SendBuf::new(max_tx_data),
817            send_lowat: 1,
818            bidi: is_bidi(id),
819            local,
820            urgency: priority_key.urgency,
821            incremental: priority_key.incremental,
822            priority_key,
823        }
824    }
825
826    /// Returns true if the stream has data to read.
827    pub fn is_readable(&self) -> bool {
828        self.recv.ready()
829    }
830
831    /// Returns true if the stream has enough flow control capacity to be
832    /// written to, and is not finished.
833    pub fn is_writable(&self) -> bool {
834        !self.send.is_shutdown() &&
835            !self.send.is_fin() &&
836            (self.send.off_back() + self.send_lowat as u64) <
837                self.send.max_off()
838    }
839
840    /// Returns true if the stream has data to send and is allowed to send at
841    /// least some of it.
842    pub fn is_flushable(&self) -> bool {
843        let off_front = self.send.off_front();
844
845        !self.send.is_empty() &&
846            off_front < self.send.off_back() &&
847            off_front < self.send.max_off()
848    }
849
850    /// Returns true if the stream is complete.
851    ///
852    /// For bidirectional streams this happens when both the receive and send
853    /// sides are complete. That is when all incoming data has been read by the
854    /// application, and when all outgoing data has been acked by the peer.
855    ///
856    /// For unidirectional streams this happens when either the receive or send
857    /// side is complete, depending on whether the stream was created locally
858    /// or not.
859    pub fn is_complete(&self) -> bool {
860        match (self.bidi, self.local) {
861            // For bidirectional streams we need to check both receive and send
862            // sides for completion.
863            (true, _) => self.recv.is_fin() && self.send.is_complete(),
864
865            // For unidirectional streams generated locally, we only need to
866            // check the send side for completion.
867            (false, true) => self.send.is_complete(),
868
869            // For unidirectional streams generated by the peer, we only need
870            // to check the receive side for completion.
871            (false, false) => self.recv.is_fin(),
872        }
873    }
874}
875
876/// Returns true if the stream was created locally.
877pub fn is_local(stream_id: u64, is_server: bool) -> bool {
878    (stream_id & 0x1) == (is_server as u64)
879}
880
881/// Returns true if the stream is bidirectional.
882pub fn is_bidi(stream_id: u64) -> bool {
883    (stream_id & 0x2) == 0
884}
885
886#[derive(Clone, Debug)]
887pub struct StreamPriorityKey {
888    pub urgency: u8,
889    pub incremental: bool,
890    pub id: u64,
891
892    pub readable: RBTreeAtomicLink,
893    pub writable: RBTreeAtomicLink,
894    pub flushable: RBTreeAtomicLink,
895}
896
897impl Default for StreamPriorityKey {
898    fn default() -> Self {
899        Self {
900            urgency: DEFAULT_URGENCY,
901            incremental: true,
902            id: Default::default(),
903            readable: Default::default(),
904            writable: Default::default(),
905            flushable: Default::default(),
906        }
907    }
908}
909
910impl PartialEq for StreamPriorityKey {
911    fn eq(&self, other: &Self) -> bool {
912        self.id == other.id
913    }
914}
915
916impl Eq for StreamPriorityKey {}
917
918impl PartialOrd for StreamPriorityKey {
919    fn partial_cmp(&self, other: &Self) -> Option<cmp::Ordering> {
920        Some(self.cmp(other))
921    }
922}
923
924impl Ord for StreamPriorityKey {
925    fn cmp(&self, other: &Self) -> cmp::Ordering {
926        // Ignore priority if ID matches.
927        if self.id == other.id {
928            return cmp::Ordering::Equal;
929        }
930
931        // First, order by urgency...
932        if self.urgency != other.urgency {
933            return self.urgency.cmp(&other.urgency);
934        }
935
936        // ...when the urgency is the same, and both are not incremental, order
937        // by stream ID...
938        if !self.incremental && !other.incremental {
939            return self.id.cmp(&other.id);
940        }
941
942        // ...non-incremental takes priority over incremental...
943        if self.incremental && !other.incremental {
944            return cmp::Ordering::Greater;
945        }
946        if !self.incremental && other.incremental {
947            return cmp::Ordering::Less;
948        }
949
950        // ...finally, when both are incremental, `other` takes precedence (so
951        // `self` is always sorted after other same-urgency incremental
952        // entries).
953        cmp::Ordering::Greater
954    }
955}
956
957intrusive_adapter!(pub StreamWritablePriorityAdapter = Arc<StreamPriorityKey>: StreamPriorityKey { writable: RBTreeAtomicLink });
958
959impl KeyAdapter<'_> for StreamWritablePriorityAdapter {
960    type Key = StreamPriorityKey;
961
962    fn get_key(&self, s: &StreamPriorityKey) -> Self::Key {
963        s.clone()
964    }
965}
966
967intrusive_adapter!(pub StreamReadablePriorityAdapter = Arc<StreamPriorityKey>: StreamPriorityKey { readable: RBTreeAtomicLink });
968
969impl KeyAdapter<'_> for StreamReadablePriorityAdapter {
970    type Key = StreamPriorityKey;
971
972    fn get_key(&self, s: &StreamPriorityKey) -> Self::Key {
973        s.clone()
974    }
975}
976
977intrusive_adapter!(pub StreamFlushablePriorityAdapter = Arc<StreamPriorityKey>: StreamPriorityKey { flushable: RBTreeAtomicLink });
978
979impl KeyAdapter<'_> for StreamFlushablePriorityAdapter {
980    type Key = StreamPriorityKey;
981
982    fn get_key(&self, s: &StreamPriorityKey) -> Self::Key {
983        s.clone()
984    }
985}
986
987/// An iterator over QUIC streams.
988#[derive(Default)]
989pub struct StreamIter {
990    streams: SmallVec<[u64; 8]>,
991    index: usize,
992}
993
994impl StreamIter {
995    #[inline]
996    fn from(streams: &StreamIdHashSet) -> Self {
997        StreamIter {
998            streams: streams.iter().copied().collect(),
999            index: 0,
1000        }
1001    }
1002}
1003
1004impl Iterator for StreamIter {
1005    type Item = u64;
1006
1007    #[inline]
1008    fn next(&mut self) -> Option<Self::Item> {
1009        let v = self.streams.get(self.index)?;
1010        self.index += 1;
1011        Some(*v)
1012    }
1013}
1014
1015impl ExactSizeIterator for StreamIter {
1016    #[inline]
1017    fn len(&self) -> usize {
1018        self.streams.len() - self.index
1019    }
1020}
1021
1022#[cfg(test)]
1023mod tests {
1024    use crate::range_buf::RangeBuf;
1025
1026    use super::*;
1027
1028    /// The default size of the receiver stream flow control window.
1029    const DEFAULT_STREAM_WINDOW: u64 = 32 * 1024;
1030
1031    #[test]
1032    fn recv_flow_control() {
1033        let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1034        assert!(!stream.recv.almost_full());
1035
1036        let mut buf = [0; 32];
1037
1038        let first = RangeBuf::from(b"hello", 0, false);
1039        let second = RangeBuf::from(b"world", 5, false);
1040        let third = RangeBuf::from(b"something", 10, false);
1041
1042        assert_eq!(stream.recv.write(second), Ok(()));
1043        assert_eq!(stream.recv.write(first), Ok(()));
1044        assert!(!stream.recv.almost_full());
1045
1046        assert_eq!(stream.recv.write(third), Err(Error::FlowControl));
1047
1048        let (len, fin) = stream.recv.emit(&mut buf).unwrap();
1049        assert_eq!(&buf[..len], b"helloworld");
1050        assert!(!fin);
1051
1052        assert!(stream.recv.almost_full());
1053
1054        stream.recv.update_max_data(std::time::Instant::now());
1055        assert_eq!(stream.recv.max_data_next(), 25);
1056        assert!(!stream.recv.almost_full());
1057
1058        let third = RangeBuf::from(b"something", 10, false);
1059        assert_eq!(stream.recv.write(third), Ok(()));
1060    }
1061
1062    #[test]
1063    fn recv_past_fin() {
1064        let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1065        assert!(!stream.recv.almost_full());
1066
1067        let first = RangeBuf::from(b"hello", 0, true);
1068        let second = RangeBuf::from(b"world", 5, false);
1069
1070        assert_eq!(stream.recv.write(first), Ok(()));
1071        assert_eq!(stream.recv.write(second), Err(Error::FinalSize));
1072    }
1073
1074    #[test]
1075    fn recv_fin_dup() {
1076        let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1077        assert!(!stream.recv.almost_full());
1078
1079        let first = RangeBuf::from(b"hello", 0, true);
1080        let second = RangeBuf::from(b"hello", 0, true);
1081
1082        assert_eq!(stream.recv.write(first), Ok(()));
1083        assert_eq!(stream.recv.write(second), Ok(()));
1084
1085        let mut buf = [0; 32];
1086
1087        let (len, fin) = stream.recv.emit(&mut buf).unwrap();
1088        assert_eq!(&buf[..len], b"hello");
1089        assert!(fin);
1090    }
1091
1092    #[test]
1093    fn recv_fin_change() {
1094        let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1095        assert!(!stream.recv.almost_full());
1096
1097        let first = RangeBuf::from(b"hello", 0, true);
1098        let second = RangeBuf::from(b"world", 5, true);
1099
1100        assert_eq!(stream.recv.write(second), Ok(()));
1101        assert_eq!(stream.recv.write(first), Err(Error::FinalSize));
1102    }
1103
1104    #[test]
1105    fn recv_fin_lower_than_received() {
1106        let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1107        assert!(!stream.recv.almost_full());
1108
1109        let first = RangeBuf::from(b"hello", 0, true);
1110        let second = RangeBuf::from(b"world", 5, false);
1111
1112        assert_eq!(stream.recv.write(second), Ok(()));
1113        assert_eq!(stream.recv.write(first), Err(Error::FinalSize));
1114    }
1115
1116    #[test]
1117    fn recv_fin_flow_control() {
1118        let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1119        assert!(!stream.recv.almost_full());
1120
1121        let mut buf = [0; 32];
1122
1123        let first = RangeBuf::from(b"hello", 0, false);
1124        let second = RangeBuf::from(b"world", 5, true);
1125
1126        assert_eq!(stream.recv.write(first), Ok(()));
1127        assert_eq!(stream.recv.write(second), Ok(()));
1128
1129        let (len, fin) = stream.recv.emit(&mut buf).unwrap();
1130        assert_eq!(&buf[..len], b"helloworld");
1131        assert!(fin);
1132
1133        assert!(!stream.recv.almost_full());
1134    }
1135
1136    #[test]
1137    fn recv_fin_reset_mismatch() {
1138        let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1139        assert!(!stream.recv.almost_full());
1140
1141        let first = RangeBuf::from(b"hello", 0, true);
1142
1143        assert_eq!(stream.recv.write(first), Ok(()));
1144        assert_eq!(stream.recv.reset(0, 10), Err(Error::FinalSize));
1145    }
1146
1147    #[test]
1148    fn recv_reset_with_gap() {
1149        let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1150        assert!(!stream.recv.almost_full());
1151
1152        let first = RangeBuf::from(b"hello", 0, false);
1153
1154        assert_eq!(stream.recv.write(first), Ok(()));
1155        // Read one byte.
1156        assert_eq!(stream.recv.emit(&mut [0; 1]), Ok((1, false)));
1157        // Reset with a final size > than max previously received
1158        assert_eq!(
1159            stream.recv.reset(0, 10),
1160            Ok(RecvBufResetReturn {
1161                max_data_delta: 5,
1162                // consumed_flowcontrol is 9, since we already read 1 byte
1163                consumed_flowcontrol: 9
1164            })
1165        );
1166        assert_eq!(stream.recv.reset(0, 10), Ok(RecvBufResetReturn::zero()));
1167    }
1168
1169    #[test]
1170    fn recv_reset_dup() {
1171        let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1172        assert!(!stream.recv.almost_full());
1173
1174        let first = RangeBuf::from(b"hello", 0, false);
1175
1176        assert_eq!(stream.recv.write(first), Ok(()));
1177        assert_eq!(
1178            stream.recv.reset(0, 5),
1179            Ok(RecvBufResetReturn {
1180                max_data_delta: 0,
1181                consumed_flowcontrol: 5
1182            })
1183        );
1184        assert_eq!(stream.recv.reset(0, 5), Ok(RecvBufResetReturn::zero()));
1185    }
1186
1187    #[test]
1188    fn recv_reset_change() {
1189        let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1190        assert!(!stream.recv.almost_full());
1191
1192        let first = RangeBuf::from(b"hello", 0, false);
1193
1194        assert_eq!(stream.recv.write(first), Ok(()));
1195        assert_eq!(
1196            stream.recv.reset(0, 5),
1197            Ok(RecvBufResetReturn {
1198                max_data_delta: 0,
1199                consumed_flowcontrol: 5
1200            })
1201        );
1202        assert_eq!(stream.recv.reset(0, 10), Err(Error::FinalSize));
1203    }
1204
1205    #[test]
1206    fn recv_reset_lower_than_received() {
1207        let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1208        assert!(!stream.recv.almost_full());
1209
1210        let first = RangeBuf::from(b"hello", 0, false);
1211
1212        assert_eq!(stream.recv.write(first), Ok(()));
1213        assert_eq!(stream.recv.reset(0, 4), Err(Error::FinalSize));
1214    }
1215
1216    #[test]
1217    fn send_flow_control() {
1218        let mut buf = [0; 25];
1219
1220        let mut stream = <Stream>::new(0, 0, 15, true, 0, DEFAULT_STREAM_WINDOW);
1221
1222        let first = b"hello";
1223        let second = b"world";
1224        let third = b"something";
1225
1226        assert!(stream.send.write(first, false).is_ok());
1227        assert!(stream.send.write(second, false).is_ok());
1228        assert!(stream.send.write(third, false).is_ok());
1229
1230        assert_eq!(stream.send.off_front(), 0);
1231
1232        let (written, fin) = stream.send.emit(&mut buf[..25]).unwrap();
1233        assert_eq!(written, 15);
1234        assert!(!fin);
1235        assert_eq!(&buf[..written], b"helloworldsomet");
1236
1237        assert_eq!(stream.send.off_front(), 15);
1238
1239        let (written, fin) = stream.send.emit(&mut buf[..25]).unwrap();
1240        assert_eq!(written, 0);
1241        assert!(!fin);
1242        assert_eq!(&buf[..written], b"");
1243
1244        stream.send.retransmit(0, 15);
1245
1246        assert_eq!(stream.send.off_front(), 0);
1247
1248        let (written, fin) = stream.send.emit(&mut buf[..10]).unwrap();
1249        assert_eq!(written, 10);
1250        assert!(!fin);
1251        assert_eq!(&buf[..written], b"helloworld");
1252
1253        assert_eq!(stream.send.off_front(), 10);
1254
1255        let (written, fin) = stream.send.emit(&mut buf[..10]).unwrap();
1256        assert_eq!(written, 5);
1257        assert!(!fin);
1258        assert_eq!(&buf[..written], b"somet");
1259    }
1260
1261    #[test]
1262    fn send_past_fin() {
1263        let mut stream = <Stream>::new(0, 0, 15, true, 0, DEFAULT_STREAM_WINDOW);
1264
1265        let first = b"hello";
1266        let second = b"world";
1267        let third = b"third";
1268
1269        assert_eq!(stream.send.write(first, false), Ok(5));
1270
1271        assert_eq!(stream.send.write(second, true), Ok(5));
1272        assert!(stream.send.is_fin());
1273
1274        assert_eq!(stream.send.write(third, false), Err(Error::FinalSize));
1275    }
1276
1277    #[test]
1278    fn send_fin_dup() {
1279        let mut stream = <Stream>::new(0, 0, 15, true, 0, DEFAULT_STREAM_WINDOW);
1280
1281        assert_eq!(stream.send.write(b"hello", true), Ok(5));
1282        assert!(stream.send.is_fin());
1283
1284        assert_eq!(stream.send.write(b"", true), Ok(0));
1285        assert!(stream.send.is_fin());
1286    }
1287
1288    #[test]
1289    fn send_undo_fin() {
1290        let mut stream = <Stream>::new(0, 0, 15, true, 0, DEFAULT_STREAM_WINDOW);
1291
1292        assert_eq!(stream.send.write(b"hello", true), Ok(5));
1293        assert!(stream.send.is_fin());
1294
1295        assert_eq!(
1296            stream.send.write(b"helloworld", true),
1297            Err(Error::FinalSize)
1298        );
1299    }
1300
1301    #[test]
1302    fn send_fin_max_data_match() {
1303        let mut buf = [0; 15];
1304
1305        let mut stream = <Stream>::new(0, 0, 15, true, 0, DEFAULT_STREAM_WINDOW);
1306
1307        let slice = b"hellohellohello";
1308
1309        assert!(stream.send.write(slice, true).is_ok());
1310
1311        let (written, fin) = stream.send.emit(&mut buf[..15]).unwrap();
1312        assert_eq!(written, 15);
1313        assert!(fin);
1314        assert_eq!(&buf[..written], slice);
1315    }
1316
1317    #[test]
1318    fn send_fin_zero_length() {
1319        let mut buf = [0; 5];
1320
1321        let mut stream = <Stream>::new(0, 0, 15, true, 0, DEFAULT_STREAM_WINDOW);
1322
1323        assert_eq!(stream.send.write(b"hello", false), Ok(5));
1324        assert_eq!(stream.send.write(b"", true), Ok(0));
1325        assert!(stream.send.is_fin());
1326
1327        let (written, fin) = stream.send.emit(&mut buf[..5]).unwrap();
1328        assert_eq!(written, 5);
1329        assert!(fin);
1330        assert_eq!(&buf[..written], b"hello");
1331    }
1332
1333    #[test]
1334    fn send_ack() {
1335        let mut buf = [0; 5];
1336
1337        let mut stream = <Stream>::new(0, 0, 15, true, 0, DEFAULT_STREAM_WINDOW);
1338
1339        assert_eq!(stream.send.write(b"hello", false), Ok(5));
1340        assert_eq!(stream.send.write(b"world", false), Ok(5));
1341        assert_eq!(stream.send.write(b"", true), Ok(0));
1342        assert!(stream.send.is_fin());
1343
1344        assert_eq!(stream.send.off_front(), 0);
1345
1346        let (written, fin) = stream.send.emit(&mut buf[..5]).unwrap();
1347        assert_eq!(written, 5);
1348        assert!(!fin);
1349        assert_eq!(&buf[..written], b"hello");
1350
1351        stream.send.ack_and_drop(0, 5);
1352
1353        stream.send.retransmit(0, 5);
1354
1355        assert_eq!(stream.send.off_front(), 5);
1356
1357        let (written, fin) = stream.send.emit(&mut buf[..5]).unwrap();
1358        assert_eq!(written, 5);
1359        assert!(fin);
1360        assert_eq!(&buf[..written], b"world");
1361    }
1362
1363    #[test]
1364    fn send_ack_reordering() {
1365        let mut buf = [0; 5];
1366
1367        let mut stream = <Stream>::new(0, 0, 15, true, 0, DEFAULT_STREAM_WINDOW);
1368
1369        assert_eq!(stream.send.write(b"hello", false), Ok(5));
1370        assert_eq!(stream.send.write(b"world", false), Ok(5));
1371        assert_eq!(stream.send.write(b"", true), Ok(0));
1372        assert!(stream.send.is_fin());
1373
1374        assert_eq!(stream.send.off_front(), 0);
1375
1376        let (written, fin) = stream.send.emit(&mut buf[..5]).unwrap();
1377        assert_eq!(written, 5);
1378        assert!(!fin);
1379        assert_eq!(&buf[..written], b"hello");
1380
1381        assert_eq!(stream.send.off_front(), 5);
1382
1383        let (written, fin) = stream.send.emit(&mut buf[..1]).unwrap();
1384        assert_eq!(written, 1);
1385        assert!(!fin);
1386        assert_eq!(&buf[..written], b"w");
1387
1388        stream.send.ack_and_drop(5, 1);
1389        stream.send.ack_and_drop(0, 5);
1390
1391        stream.send.retransmit(0, 5);
1392        stream.send.retransmit(5, 1);
1393
1394        assert_eq!(stream.send.off_front(), 6);
1395
1396        let (written, fin) = stream.send.emit(&mut buf[..5]).unwrap();
1397        assert_eq!(written, 4);
1398        assert!(fin);
1399        assert_eq!(&buf[..written], b"orld");
1400    }
1401
1402    #[test]
1403    fn recv_data_below_off() {
1404        let mut stream = <Stream>::new(0, 15, 0, true, 15, DEFAULT_STREAM_WINDOW);
1405
1406        let first = RangeBuf::from(b"hello", 0, false);
1407
1408        assert_eq!(stream.recv.write(first), Ok(()));
1409
1410        let mut buf = [0; 10];
1411
1412        let (len, fin) = stream.recv.emit(&mut buf).unwrap();
1413        assert_eq!(&buf[..len], b"hello");
1414        assert!(!fin);
1415
1416        let first = RangeBuf::from(b"elloworld", 1, true);
1417        assert_eq!(stream.recv.write(first), Ok(()));
1418
1419        let (len, fin) = stream.recv.emit(&mut buf).unwrap();
1420        assert_eq!(&buf[..len], b"world");
1421        assert!(fin);
1422    }
1423
1424    #[test]
1425    fn stream_complete() {
1426        let mut stream =
1427            <Stream>::new(0, 30, 30, true, 30, DEFAULT_STREAM_WINDOW);
1428
1429        assert_eq!(stream.send.write(b"hello", false), Ok(5));
1430        assert_eq!(stream.send.write(b"world", false), Ok(5));
1431
1432        assert!(!stream.send.is_complete());
1433        assert!(!stream.send.is_fin());
1434
1435        assert_eq!(stream.send.write(b"", true), Ok(0));
1436
1437        assert!(!stream.send.is_complete());
1438        assert!(stream.send.is_fin());
1439
1440        let buf = RangeBuf::from(b"hello", 0, true);
1441        assert!(stream.recv.write(buf).is_ok());
1442        assert!(!stream.recv.is_fin());
1443
1444        stream.send.ack(6, 4);
1445        assert!(!stream.send.is_complete());
1446
1447        let mut buf = [0; 2];
1448        assert_eq!(stream.recv.emit(&mut buf), Ok((2, false)));
1449        assert!(!stream.recv.is_fin());
1450
1451        stream.send.ack(1, 5);
1452        assert!(!stream.send.is_complete());
1453
1454        stream.send.ack(0, 1);
1455        assert!(stream.send.is_complete());
1456
1457        assert!(!stream.is_complete());
1458
1459        let mut buf = [0; 3];
1460        assert_eq!(stream.recv.emit(&mut buf), Ok((3, true)));
1461        assert!(stream.recv.is_fin());
1462
1463        assert!(stream.is_complete());
1464    }
1465
1466    #[test]
1467    fn send_fin_zero_length_output() {
1468        let mut buf = [0; 5];
1469
1470        let mut stream = <Stream>::new(0, 0, 15, true, 0, DEFAULT_STREAM_WINDOW);
1471
1472        assert_eq!(stream.send.write(b"hello", false), Ok(5));
1473        assert_eq!(stream.send.off_front(), 0);
1474        assert!(!stream.send.is_fin());
1475
1476        let (written, fin) = stream.send.emit(&mut buf).unwrap();
1477        assert_eq!(written, 5);
1478        assert!(!fin);
1479        assert_eq!(&buf[..written], b"hello");
1480
1481        assert_eq!(stream.send.write(b"", true), Ok(0));
1482        assert!(stream.send.is_fin());
1483        assert_eq!(stream.send.off_front(), 5);
1484
1485        let (written, fin) = stream.send.emit(&mut buf).unwrap();
1486        assert_eq!(written, 0);
1487        assert!(fin);
1488        assert_eq!(&buf[..written], b"");
1489    }
1490
1491    fn stream_send_ready(stream: &Stream) -> bool {
1492        !stream.send.is_empty() &&
1493            stream.send.off_front() < stream.send.off_back()
1494    }
1495
1496    #[test]
1497    fn send_emit() {
1498        let mut buf = [0; 5];
1499
1500        let mut stream = <Stream>::new(0, 0, 20, true, 0, DEFAULT_STREAM_WINDOW);
1501
1502        assert_eq!(stream.send.write(b"hello", false), Ok(5));
1503        assert_eq!(stream.send.write(b"world", false), Ok(5));
1504        assert_eq!(stream.send.write(b"olleh", false), Ok(5));
1505        assert_eq!(stream.send.write(b"dlrow", true), Ok(5));
1506        assert_eq!(stream.send.off_front(), 0);
1507        assert_eq!(stream.send.bufs_count(), 4);
1508
1509        assert!(stream.is_flushable());
1510
1511        assert!(stream_send_ready(&stream));
1512        assert_eq!(stream.send.emit(&mut buf[..4]), Ok((4, false)));
1513        assert_eq!(stream.send.off_front(), 4);
1514        assert_eq!(&buf[..4], b"hell");
1515
1516        assert!(stream_send_ready(&stream));
1517        assert_eq!(stream.send.emit(&mut buf[..4]), Ok((4, false)));
1518        assert_eq!(stream.send.off_front(), 8);
1519        assert_eq!(&buf[..4], b"owor");
1520
1521        assert!(stream_send_ready(&stream));
1522        assert_eq!(stream.send.emit(&mut buf[..2]), Ok((2, false)));
1523        assert_eq!(stream.send.off_front(), 10);
1524        assert_eq!(&buf[..2], b"ld");
1525
1526        assert!(stream_send_ready(&stream));
1527        assert_eq!(stream.send.emit(&mut buf[..1]), Ok((1, false)));
1528        assert_eq!(stream.send.off_front(), 11);
1529        assert_eq!(&buf[..1], b"o");
1530
1531        assert!(stream_send_ready(&stream));
1532        assert_eq!(stream.send.emit(&mut buf[..5]), Ok((5, false)));
1533        assert_eq!(stream.send.off_front(), 16);
1534        assert_eq!(&buf[..5], b"llehd");
1535
1536        assert!(stream_send_ready(&stream));
1537        assert_eq!(stream.send.emit(&mut buf[..5]), Ok((4, true)));
1538        assert_eq!(stream.send.off_front(), 20);
1539        assert_eq!(&buf[..4], b"lrow");
1540
1541        assert!(!stream.is_flushable());
1542
1543        assert!(!stream_send_ready(&stream));
1544        assert_eq!(stream.send.emit(&mut buf[..5]), Ok((0, true)));
1545        assert_eq!(stream.send.off_front(), 20);
1546    }
1547
1548    #[test]
1549    fn send_emit_ack() {
1550        let mut buf = [0; 5];
1551
1552        let mut stream = <Stream>::new(0, 0, 20, true, 0, DEFAULT_STREAM_WINDOW);
1553
1554        assert_eq!(stream.send.write(b"hello", false), Ok(5));
1555        assert_eq!(stream.send.write(b"world", false), Ok(5));
1556        assert_eq!(stream.send.write(b"olleh", false), Ok(5));
1557        assert_eq!(stream.send.write(b"dlrow", true), Ok(5));
1558        assert_eq!(stream.send.off_front(), 0);
1559        assert_eq!(stream.send.bufs_count(), 4);
1560
1561        assert!(stream.is_flushable());
1562
1563        assert!(stream_send_ready(&stream));
1564        assert_eq!(stream.send.emit(&mut buf[..4]), Ok((4, false)));
1565        assert_eq!(stream.send.off_front(), 4);
1566        assert_eq!(&buf[..4], b"hell");
1567
1568        assert!(stream_send_ready(&stream));
1569        assert_eq!(stream.send.emit(&mut buf[..4]), Ok((4, false)));
1570        assert_eq!(stream.send.off_front(), 8);
1571        assert_eq!(&buf[..4], b"owor");
1572
1573        stream.send.ack_and_drop(0, 5);
1574        assert_eq!(stream.send.bufs_count(), 3);
1575
1576        assert!(stream_send_ready(&stream));
1577        assert_eq!(stream.send.emit(&mut buf[..2]), Ok((2, false)));
1578        assert_eq!(stream.send.off_front(), 10);
1579        assert_eq!(&buf[..2], b"ld");
1580
1581        stream.send.ack_and_drop(7, 5);
1582        assert_eq!(stream.send.bufs_count(), 3);
1583
1584        assert!(stream_send_ready(&stream));
1585        assert_eq!(stream.send.emit(&mut buf[..1]), Ok((1, false)));
1586        assert_eq!(stream.send.off_front(), 11);
1587        assert_eq!(&buf[..1], b"o");
1588
1589        assert!(stream_send_ready(&stream));
1590        assert_eq!(stream.send.emit(&mut buf[..5]), Ok((5, false)));
1591        assert_eq!(stream.send.off_front(), 16);
1592        assert_eq!(&buf[..5], b"llehd");
1593
1594        stream.send.ack_and_drop(5, 7);
1595        assert_eq!(stream.send.bufs_count(), 2);
1596
1597        assert!(stream_send_ready(&stream));
1598        assert_eq!(stream.send.emit(&mut buf[..5]), Ok((4, true)));
1599        assert_eq!(stream.send.off_front(), 20);
1600        assert_eq!(&buf[..4], b"lrow");
1601
1602        assert!(!stream.is_flushable());
1603
1604        assert!(!stream_send_ready(&stream));
1605        assert_eq!(stream.send.emit(&mut buf[..5]), Ok((0, true)));
1606        assert_eq!(stream.send.off_front(), 20);
1607
1608        stream.send.ack_and_drop(22, 4);
1609        assert_eq!(stream.send.bufs_count(), 2);
1610
1611        stream.send.ack_and_drop(20, 1);
1612        assert_eq!(stream.send.bufs_count(), 2);
1613    }
1614
1615    #[test]
1616    fn send_emit_retransmit() {
1617        let mut buf = [0; 5];
1618
1619        let mut stream = <Stream>::new(
1620            0,
1621            0,
1622            20,
1623            true,
1624            DEFAULT_STREAM_WINDOW,
1625            DEFAULT_STREAM_WINDOW,
1626        );
1627
1628        assert_eq!(stream.send.write(b"hello", false), Ok(5));
1629        assert_eq!(stream.send.write(b"world", false), Ok(5));
1630        assert_eq!(stream.send.write(b"olleh", false), Ok(5));
1631        assert_eq!(stream.send.write(b"dlrow", true), Ok(5));
1632        assert_eq!(stream.send.off_front(), 0);
1633        assert_eq!(stream.send.bufs_count(), 4);
1634
1635        assert!(stream.is_flushable());
1636
1637        assert!(stream_send_ready(&stream));
1638        assert_eq!(stream.send.emit(&mut buf[..4]), Ok((4, false)));
1639        assert_eq!(stream.send.off_front(), 4);
1640        assert_eq!(&buf[..4], b"hell");
1641
1642        assert!(stream_send_ready(&stream));
1643        assert_eq!(stream.send.emit(&mut buf[..4]), Ok((4, false)));
1644        assert_eq!(stream.send.off_front(), 8);
1645        assert_eq!(&buf[..4], b"owor");
1646
1647        stream.send.retransmit(3, 3);
1648        assert_eq!(stream.send.off_front(), 3);
1649
1650        assert!(stream_send_ready(&stream));
1651        assert_eq!(stream.send.emit(&mut buf[..3]), Ok((3, false)));
1652        assert_eq!(stream.send.off_front(), 8);
1653        assert_eq!(&buf[..3], b"low");
1654
1655        assert!(stream_send_ready(&stream));
1656        assert_eq!(stream.send.emit(&mut buf[..2]), Ok((2, false)));
1657        assert_eq!(stream.send.off_front(), 10);
1658        assert_eq!(&buf[..2], b"ld");
1659
1660        stream.send.ack_and_drop(7, 2);
1661
1662        stream.send.retransmit(8, 2);
1663
1664        assert!(stream_send_ready(&stream));
1665        assert_eq!(stream.send.emit(&mut buf[..2]), Ok((2, false)));
1666        assert_eq!(stream.send.off_front(), 10);
1667        assert_eq!(&buf[..2], b"ld");
1668
1669        assert!(stream_send_ready(&stream));
1670        assert_eq!(stream.send.emit(&mut buf[..1]), Ok((1, false)));
1671        assert_eq!(stream.send.off_front(), 11);
1672        assert_eq!(&buf[..1], b"o");
1673
1674        assert!(stream_send_ready(&stream));
1675        assert_eq!(stream.send.emit(&mut buf[..5]), Ok((5, false)));
1676        assert_eq!(stream.send.off_front(), 16);
1677        assert_eq!(&buf[..5], b"llehd");
1678
1679        stream.send.retransmit(12, 2);
1680
1681        assert!(stream_send_ready(&stream));
1682        assert_eq!(stream.send.emit(&mut buf[..2]), Ok((2, false)));
1683        assert_eq!(stream.send.off_front(), 16);
1684        assert_eq!(&buf[..2], b"le");
1685
1686        assert!(stream_send_ready(&stream));
1687        assert_eq!(stream.send.emit(&mut buf[..5]), Ok((4, true)));
1688        assert_eq!(stream.send.off_front(), 20);
1689        assert_eq!(&buf[..4], b"lrow");
1690
1691        assert!(!stream.is_flushable());
1692
1693        assert!(!stream_send_ready(&stream));
1694        assert_eq!(stream.send.emit(&mut buf[..5]), Ok((0, true)));
1695        assert_eq!(stream.send.off_front(), 20);
1696
1697        stream.send.retransmit(7, 12);
1698
1699        assert!(stream_send_ready(&stream));
1700        assert_eq!(stream.send.emit(&mut buf[..5]), Ok((5, false)));
1701        assert_eq!(stream.send.off_front(), 12);
1702        assert_eq!(&buf[..5], b"rldol");
1703
1704        assert!(stream_send_ready(&stream));
1705        assert_eq!(stream.send.emit(&mut buf[..5]), Ok((5, false)));
1706        assert_eq!(stream.send.off_front(), 17);
1707        assert_eq!(&buf[..5], b"lehdl");
1708
1709        assert!(stream_send_ready(&stream));
1710        assert_eq!(stream.send.emit(&mut buf[..5]), Ok((2, false)));
1711        assert_eq!(stream.send.off_front(), 20);
1712        assert_eq!(&buf[..2], b"ro");
1713
1714        stream.send.ack_and_drop(12, 7);
1715
1716        stream.send.retransmit(7, 12);
1717
1718        assert!(stream_send_ready(&stream));
1719        assert_eq!(stream.send.emit(&mut buf[..5]), Ok((5, false)));
1720        assert_eq!(stream.send.off_front(), 12);
1721        assert_eq!(&buf[..5], b"rldol");
1722
1723        assert!(stream_send_ready(&stream));
1724        assert_eq!(stream.send.emit(&mut buf[..5]), Ok((5, false)));
1725        assert_eq!(stream.send.off_front(), 17);
1726        assert_eq!(&buf[..5], b"lehdl");
1727
1728        assert!(stream_send_ready(&stream));
1729        assert_eq!(stream.send.emit(&mut buf[..5]), Ok((2, false)));
1730        assert_eq!(stream.send.off_front(), 20);
1731        assert_eq!(&buf[..2], b"ro");
1732    }
1733
1734    #[test]
1735    fn rangebuf_split_off() {
1736        let mut buf = <RangeBuf>::from(b"helloworld", 5, true);
1737        assert_eq!(buf.start, 0);
1738        assert_eq!(buf.pos, 0);
1739        assert_eq!(buf.len, 10);
1740        assert_eq!(buf.off, 5);
1741        assert!(buf.fin);
1742
1743        assert_eq!(buf.len(), 10);
1744        assert_eq!(buf.off(), 5);
1745        assert!(buf.fin());
1746
1747        assert_eq!(&buf[..], b"helloworld");
1748
1749        // Advance buffer.
1750        buf.consume(5);
1751
1752        assert_eq!(buf.start, 0);
1753        assert_eq!(buf.pos, 5);
1754        assert_eq!(buf.len, 10);
1755        assert_eq!(buf.off, 5);
1756        assert!(buf.fin);
1757
1758        assert_eq!(buf.len(), 5);
1759        assert_eq!(buf.off(), 10);
1760        assert!(buf.fin());
1761
1762        assert_eq!(&buf[..], b"world");
1763
1764        // Split buffer before position.
1765        let mut new_buf = buf.split_off(3);
1766
1767        assert_eq!(buf.start, 0);
1768        assert_eq!(buf.pos, 3);
1769        assert_eq!(buf.len, 3);
1770        assert_eq!(buf.off, 5);
1771        assert!(!buf.fin);
1772
1773        assert_eq!(buf.len(), 0);
1774        assert_eq!(buf.off(), 8);
1775        assert!(!buf.fin());
1776
1777        assert_eq!(&buf[..], b"");
1778
1779        assert_eq!(new_buf.start, 3);
1780        assert_eq!(new_buf.pos, 5);
1781        assert_eq!(new_buf.len, 7);
1782        assert_eq!(new_buf.off, 8);
1783        assert!(new_buf.fin);
1784
1785        assert_eq!(new_buf.len(), 5);
1786        assert_eq!(new_buf.off(), 10);
1787        assert!(new_buf.fin());
1788
1789        assert_eq!(&new_buf[..], b"world");
1790
1791        // Advance buffer.
1792        new_buf.consume(2);
1793
1794        assert_eq!(new_buf.start, 3);
1795        assert_eq!(new_buf.pos, 7);
1796        assert_eq!(new_buf.len, 7);
1797        assert_eq!(new_buf.off, 8);
1798        assert!(new_buf.fin);
1799
1800        assert_eq!(new_buf.len(), 3);
1801        assert_eq!(new_buf.off(), 12);
1802        assert!(new_buf.fin());
1803
1804        assert_eq!(&new_buf[..], b"rld");
1805
1806        // Split buffer after position.
1807        let mut new_new_buf = new_buf.split_off(5);
1808
1809        assert_eq!(new_buf.start, 3);
1810        assert_eq!(new_buf.pos, 7);
1811        assert_eq!(new_buf.len, 5);
1812        assert_eq!(new_buf.off, 8);
1813        assert!(!new_buf.fin);
1814
1815        assert_eq!(new_buf.len(), 1);
1816        assert_eq!(new_buf.off(), 12);
1817        assert!(!new_buf.fin());
1818
1819        assert_eq!(&new_buf[..], b"r");
1820
1821        assert_eq!(new_new_buf.start, 8);
1822        assert_eq!(new_new_buf.pos, 8);
1823        assert_eq!(new_new_buf.len, 2);
1824        assert_eq!(new_new_buf.off, 13);
1825        assert!(new_new_buf.fin);
1826
1827        assert_eq!(new_new_buf.len(), 2);
1828        assert_eq!(new_new_buf.off(), 13);
1829        assert!(new_new_buf.fin());
1830
1831        assert_eq!(&new_new_buf[..], b"ld");
1832
1833        // Advance buffer.
1834        new_new_buf.consume(2);
1835
1836        assert_eq!(new_new_buf.start, 8);
1837        assert_eq!(new_new_buf.pos, 10);
1838        assert_eq!(new_new_buf.len, 2);
1839        assert_eq!(new_new_buf.off, 13);
1840        assert!(new_new_buf.fin);
1841
1842        assert_eq!(new_new_buf.len(), 0);
1843        assert_eq!(new_new_buf.off(), 15);
1844        assert!(new_new_buf.fin());
1845
1846        assert_eq!(&new_new_buf[..], b"");
1847    }
1848
1849    /// RFC9000 2.1: A stream ID that is used out of order results in all
1850    /// streams of that type with lower-numbered stream IDs also being opened.
1851    #[test]
1852    fn stream_limit_auto_open() {
1853        let local_tp = crate::TransportParams::default();
1854        let peer_tp = crate::TransportParams::default();
1855
1856        let mut streams = <StreamMap>::new(5, 5, 5);
1857
1858        let stream_id = 500;
1859        assert!(!is_local(stream_id, true), "stream id is peer initiated");
1860        assert!(is_bidi(stream_id), "stream id is bidirectional");
1861        assert_eq!(
1862            streams
1863                .get_or_create(stream_id, &local_tp, &peer_tp, false, true)
1864                .err(),
1865            Some(Error::StreamLimit),
1866            "stream limit should be exceeded"
1867        );
1868    }
1869
1870    /// Stream limit should be satisfied regardless of what order we open
1871    /// streams
1872    #[test]
1873    fn stream_create_out_of_order() {
1874        let local_tp = crate::TransportParams::default();
1875        let peer_tp = crate::TransportParams::default();
1876
1877        let mut streams = <StreamMap>::new(5, 5, 5);
1878
1879        for stream_id in [8, 12, 4] {
1880            assert!(is_local(stream_id, false), "stream id is client initiated");
1881            assert!(is_bidi(stream_id), "stream id is bidirectional");
1882            assert!(streams
1883                .get_or_create(stream_id, &local_tp, &peer_tp, false, true)
1884                .is_ok());
1885        }
1886    }
1887
1888    /// Check stream limit boundary cases
1889    #[test]
1890    fn stream_limit_edge() {
1891        let local_tp = crate::TransportParams::default();
1892        let peer_tp = crate::TransportParams::default();
1893
1894        let mut streams = <StreamMap>::new(3, 3, 3);
1895
1896        // Highest permitted
1897        let stream_id = 8;
1898        assert!(streams
1899            .get_or_create(stream_id, &local_tp, &peer_tp, false, true)
1900            .is_ok());
1901
1902        // One more than highest permitted
1903        let stream_id = 12;
1904        assert_eq!(
1905            streams
1906                .get_or_create(stream_id, &local_tp, &peer_tp, false, true)
1907                .err(),
1908            Some(Error::StreamLimit)
1909        );
1910    }
1911
1912    fn cycle_stream_priority(stream_id: u64, streams: &mut StreamMap) {
1913        let key = streams.get(stream_id).unwrap().priority_key.clone();
1914        streams.update_priority(&key.clone(), &key);
1915    }
1916
1917    #[test]
1918    fn writable_prioritized_default_priority() {
1919        let local_tp = crate::TransportParams::default();
1920        let peer_tp = crate::TransportParams {
1921            initial_max_stream_data_bidi_local: 100,
1922            initial_max_stream_data_uni: 100,
1923            ..Default::default()
1924        };
1925
1926        let mut streams = StreamMap::new(100, 100, 100);
1927
1928        for id in [0, 4, 8, 12] {
1929            assert!(streams
1930                .get_or_create(id, &local_tp, &peer_tp, false, true)
1931                .is_ok());
1932        }
1933
1934        let walk_1: Vec<u64> = streams.writable().collect();
1935        cycle_stream_priority(*walk_1.first().unwrap(), &mut streams);
1936        let walk_2: Vec<u64> = streams.writable().collect();
1937        cycle_stream_priority(*walk_2.first().unwrap(), &mut streams);
1938        let walk_3: Vec<u64> = streams.writable().collect();
1939        cycle_stream_priority(*walk_3.first().unwrap(), &mut streams);
1940        let walk_4: Vec<u64> = streams.writable().collect();
1941        cycle_stream_priority(*walk_4.first().unwrap(), &mut streams);
1942        let walk_5: Vec<u64> = streams.writable().collect();
1943
1944        // All streams are non-incremental and same urgency by default. Multiple
1945        // visits shuffle their order.
1946        assert_eq!(walk_1, vec![0, 4, 8, 12]);
1947        assert_eq!(walk_2, vec![4, 8, 12, 0]);
1948        assert_eq!(walk_3, vec![8, 12, 0, 4]);
1949        assert_eq!(walk_4, vec![12, 0, 4, 8,]);
1950        assert_eq!(walk_5, vec![0, 4, 8, 12]);
1951    }
1952
1953    #[test]
1954    fn writable_prioritized_insert_order() {
1955        let local_tp = crate::TransportParams::default();
1956        let peer_tp = crate::TransportParams {
1957            initial_max_stream_data_bidi_local: 100,
1958            initial_max_stream_data_uni: 100,
1959            ..Default::default()
1960        };
1961
1962        let mut streams = StreamMap::new(100, 100, 100);
1963
1964        // Inserting same-urgency incremental streams in a "random" order yields
1965        // same order to start with.
1966        for id in [12, 4, 8, 0] {
1967            assert!(streams
1968                .get_or_create(id, &local_tp, &peer_tp, false, true)
1969                .is_ok());
1970        }
1971
1972        let walk_1: Vec<u64> = streams.writable().collect();
1973        cycle_stream_priority(*walk_1.first().unwrap(), &mut streams);
1974        let walk_2: Vec<u64> = streams.writable().collect();
1975        cycle_stream_priority(*walk_2.first().unwrap(), &mut streams);
1976        let walk_3: Vec<u64> = streams.writable().collect();
1977        cycle_stream_priority(*walk_3.first().unwrap(), &mut streams);
1978        let walk_4: Vec<u64> = streams.writable().collect();
1979        cycle_stream_priority(*walk_4.first().unwrap(), &mut streams);
1980        let walk_5: Vec<u64> = streams.writable().collect();
1981        assert_eq!(walk_1, vec![12, 4, 8, 0]);
1982        assert_eq!(walk_2, vec![4, 8, 0, 12]);
1983        assert_eq!(walk_3, vec![8, 0, 12, 4,]);
1984        assert_eq!(walk_4, vec![0, 12, 4, 8]);
1985        assert_eq!(walk_5, vec![12, 4, 8, 0]);
1986    }
1987
1988    #[test]
1989    fn writable_prioritized_mixed_urgency() {
1990        let local_tp = crate::TransportParams::default();
1991        let peer_tp = crate::TransportParams {
1992            initial_max_stream_data_bidi_local: 100,
1993            initial_max_stream_data_uni: 100,
1994            ..Default::default()
1995        };
1996
1997        let mut streams = <StreamMap>::new(100, 100, 100);
1998
1999        // Streams where the urgency descends (becomes more important). No stream
2000        // shares an urgency.
2001        let input = vec![
2002            (0, 100),
2003            (4, 90),
2004            (8, 80),
2005            (12, 70),
2006            (16, 60),
2007            (20, 50),
2008            (24, 40),
2009            (28, 30),
2010            (32, 20),
2011            (36, 10),
2012            (40, 0),
2013        ];
2014
2015        for (id, urgency) in input.clone() {
2016            // this duplicates some code from stream_priority in order to access
2017            // streams and the collection they're in
2018            let stream = streams
2019                .get_or_create(id, &local_tp, &peer_tp, false, true)
2020                .unwrap();
2021
2022            stream.urgency = urgency;
2023
2024            let new_priority_key = Arc::new(StreamPriorityKey {
2025                urgency: stream.urgency,
2026                incremental: stream.incremental,
2027                id,
2028                ..Default::default()
2029            });
2030
2031            let old_priority_key = std::mem::replace(
2032                &mut stream.priority_key,
2033                new_priority_key.clone(),
2034            );
2035
2036            streams.update_priority(&old_priority_key, &new_priority_key);
2037        }
2038
2039        let walk_1: Vec<u64> = streams.writable().collect();
2040        assert_eq!(walk_1, vec![40, 36, 32, 28, 24, 20, 16, 12, 8, 4, 0]);
2041
2042        // Re-applying priority to a stream does not cause duplication.
2043        for (id, urgency) in input {
2044            // this duplicates some code from stream_priority in order to access
2045            // streams and the collection they're in
2046            let stream = streams
2047                .get_or_create(id, &local_tp, &peer_tp, false, true)
2048                .unwrap();
2049
2050            stream.urgency = urgency;
2051
2052            let new_priority_key = Arc::new(StreamPriorityKey {
2053                urgency: stream.urgency,
2054                incremental: stream.incremental,
2055                id,
2056                ..Default::default()
2057            });
2058
2059            let old_priority_key = std::mem::replace(
2060                &mut stream.priority_key,
2061                new_priority_key.clone(),
2062            );
2063
2064            streams.update_priority(&old_priority_key, &new_priority_key);
2065        }
2066
2067        let walk_2: Vec<u64> = streams.writable().collect();
2068        assert_eq!(walk_2, vec![40, 36, 32, 28, 24, 20, 16, 12, 8, 4, 0]);
2069
2070        // Removing streams doesn't break expected ordering.
2071        streams.collect(24, true);
2072
2073        let walk_3: Vec<u64> = streams.writable().collect();
2074        assert_eq!(walk_3, vec![40, 36, 32, 28, 20, 16, 12, 8, 4, 0]);
2075
2076        streams.collect(40, true);
2077        streams.collect(0, true);
2078
2079        let walk_4: Vec<u64> = streams.writable().collect();
2080        assert_eq!(walk_4, vec![36, 32, 28, 20, 16, 12, 8, 4]);
2081
2082        // Adding streams doesn't break expected ordering.
2083        streams
2084            .get_or_create(44, &local_tp, &peer_tp, false, true)
2085            .unwrap();
2086
2087        let walk_5: Vec<u64> = streams.writable().collect();
2088        assert_eq!(walk_5, vec![36, 32, 28, 20, 16, 12, 8, 4, 44]);
2089    }
2090
2091    #[test]
2092    fn writable_prioritized_mixed_urgencies_incrementals() {
2093        let local_tp = crate::TransportParams::default();
2094        let peer_tp = crate::TransportParams {
2095            initial_max_stream_data_bidi_local: 100,
2096            initial_max_stream_data_uni: 100,
2097            ..Default::default()
2098        };
2099
2100        let mut streams = StreamMap::new(100, 100, 100);
2101
2102        // Streams that share some urgency level
2103        let input = vec![
2104            (0, 100),
2105            (4, 20),
2106            (8, 100),
2107            (12, 20),
2108            (16, 90),
2109            (20, 25),
2110            (24, 90),
2111            (28, 30),
2112            (32, 80),
2113            (36, 20),
2114            (40, 0),
2115        ];
2116
2117        for (id, urgency) in input.clone() {
2118            // this duplicates some code from stream_priority in order to access
2119            // streams and the collection they're in
2120            let stream = streams
2121                .get_or_create(id, &local_tp, &peer_tp, false, true)
2122                .unwrap();
2123
2124            stream.urgency = urgency;
2125
2126            let new_priority_key = Arc::new(StreamPriorityKey {
2127                urgency: stream.urgency,
2128                incremental: stream.incremental,
2129                id,
2130                ..Default::default()
2131            });
2132
2133            let old_priority_key = std::mem::replace(
2134                &mut stream.priority_key,
2135                new_priority_key.clone(),
2136            );
2137
2138            streams.update_priority(&old_priority_key, &new_priority_key);
2139        }
2140
2141        let walk_1: Vec<u64> = streams.writable().collect();
2142        cycle_stream_priority(4, &mut streams);
2143        cycle_stream_priority(16, &mut streams);
2144        cycle_stream_priority(0, &mut streams);
2145        let walk_2: Vec<u64> = streams.writable().collect();
2146        cycle_stream_priority(12, &mut streams);
2147        cycle_stream_priority(24, &mut streams);
2148        cycle_stream_priority(8, &mut streams);
2149        let walk_3: Vec<u64> = streams.writable().collect();
2150        cycle_stream_priority(36, &mut streams);
2151        cycle_stream_priority(16, &mut streams);
2152        cycle_stream_priority(0, &mut streams);
2153        let walk_4: Vec<u64> = streams.writable().collect();
2154        cycle_stream_priority(4, &mut streams);
2155        cycle_stream_priority(24, &mut streams);
2156        cycle_stream_priority(8, &mut streams);
2157        let walk_5: Vec<u64> = streams.writable().collect();
2158        cycle_stream_priority(12, &mut streams);
2159        cycle_stream_priority(16, &mut streams);
2160        cycle_stream_priority(0, &mut streams);
2161        let walk_6: Vec<u64> = streams.writable().collect();
2162        cycle_stream_priority(36, &mut streams);
2163        cycle_stream_priority(24, &mut streams);
2164        cycle_stream_priority(8, &mut streams);
2165        let walk_7: Vec<u64> = streams.writable().collect();
2166        cycle_stream_priority(4, &mut streams);
2167        cycle_stream_priority(16, &mut streams);
2168        cycle_stream_priority(0, &mut streams);
2169        let walk_8: Vec<u64> = streams.writable().collect();
2170        cycle_stream_priority(12, &mut streams);
2171        cycle_stream_priority(24, &mut streams);
2172        cycle_stream_priority(8, &mut streams);
2173        let walk_9: Vec<u64> = streams.writable().collect();
2174        cycle_stream_priority(36, &mut streams);
2175        cycle_stream_priority(16, &mut streams);
2176        cycle_stream_priority(0, &mut streams);
2177
2178        assert_eq!(walk_1, vec![40, 4, 12, 36, 20, 28, 32, 16, 24, 0, 8]);
2179        assert_eq!(walk_2, vec![40, 12, 36, 4, 20, 28, 32, 24, 16, 8, 0]);
2180        assert_eq!(walk_3, vec![40, 36, 4, 12, 20, 28, 32, 16, 24, 0, 8]);
2181        assert_eq!(walk_4, vec![40, 4, 12, 36, 20, 28, 32, 24, 16, 8, 0]);
2182        assert_eq!(walk_5, vec![40, 12, 36, 4, 20, 28, 32, 16, 24, 0, 8]);
2183        assert_eq!(walk_6, vec![40, 36, 4, 12, 20, 28, 32, 24, 16, 8, 0]);
2184        assert_eq!(walk_7, vec![40, 4, 12, 36, 20, 28, 32, 16, 24, 0, 8]);
2185        assert_eq!(walk_8, vec![40, 12, 36, 4, 20, 28, 32, 24, 16, 8, 0]);
2186        assert_eq!(walk_9, vec![40, 36, 4, 12, 20, 28, 32, 16, 24, 0, 8]);
2187
2188        // Removing streams doesn't break expected ordering.
2189        streams.collect(20, true);
2190
2191        let walk_10: Vec<u64> = streams.writable().collect();
2192        assert_eq!(walk_10, vec![40, 4, 12, 36, 28, 32, 24, 16, 8, 0]);
2193
2194        // Adding streams doesn't break expected ordering.
2195        let stream = streams
2196            .get_or_create(44, &local_tp, &peer_tp, false, true)
2197            .unwrap();
2198
2199        stream.urgency = 20;
2200        stream.incremental = true;
2201
2202        let new_priority_key = Arc::new(StreamPriorityKey {
2203            urgency: stream.urgency,
2204            incremental: stream.incremental,
2205            id: 44,
2206            ..Default::default()
2207        });
2208
2209        let old_priority_key =
2210            std::mem::replace(&mut stream.priority_key, new_priority_key.clone());
2211
2212        streams.update_priority(&old_priority_key, &new_priority_key);
2213
2214        let walk_11: Vec<u64> = streams.writable().collect();
2215        assert_eq!(walk_11, vec![40, 4, 12, 36, 44, 28, 32, 24, 16, 8, 0]);
2216    }
2217
2218    #[test]
2219    fn priority_tree_dupes() {
2220        let mut prioritized_writable: RBTree<StreamWritablePriorityAdapter> =
2221            Default::default();
2222
2223        for id in [0, 4, 8, 12] {
2224            let s = Arc::new(StreamPriorityKey {
2225                urgency: 0,
2226                incremental: false,
2227                id,
2228                ..Default::default()
2229            });
2230
2231            prioritized_writable.insert(s);
2232        }
2233
2234        let walk_1: Vec<u64> =
2235            prioritized_writable.iter().map(|s| s.id).collect();
2236        assert_eq!(walk_1, vec![0, 4, 8, 12]);
2237
2238        // Default keys could cause duplicate entries, this is normally protected
2239        // against via StreamMap.
2240        for id in [0, 4, 8, 12] {
2241            let s = Arc::new(StreamPriorityKey {
2242                urgency: 0,
2243                incremental: false,
2244                id,
2245                ..Default::default()
2246            });
2247
2248            prioritized_writable.insert(s);
2249        }
2250
2251        let walk_2: Vec<u64> =
2252            prioritized_writable.iter().map(|s| s.id).collect();
2253        assert_eq!(walk_2, vec![0, 0, 4, 4, 8, 8, 12, 12]);
2254    }
2255
2256    #[test]
2257    fn retransmit_returns_zero_when_already_acked() {
2258        let mut stream = <Stream>::new(0, 15, 15, true, 0, 15);
2259
2260        // Write and emit some data.
2261        assert_eq!(stream.send.write(b"hello", false), Ok(5));
2262        assert_eq!(stream.send.buffered_bytes(), 5);
2263
2264        let mut buf = [0; 10];
2265        let (written, _) = stream.send.emit(&mut buf).unwrap();
2266        assert_eq!(written, 5);
2267        assert_eq!(stream.send.buffered_bytes(), 0);
2268
2269        // Mark data for retransmission.
2270        let retransmitted = stream.send.retransmit(0, 5);
2271        assert_eq!(retransmitted, 5);
2272        assert_eq!(stream.send.buffered_bytes(), 5);
2273
2274        // Ack the data.
2275        stream.send.ack_and_drop(0, 5);
2276        assert_eq!(stream.send.buffered_bytes(), 0);
2277
2278        // Try to retransmit again - should return 0 since data is acked.
2279        let retransmitted = stream.send.retransmit(0, 5);
2280        assert_eq!(retransmitted, 0);
2281        assert_eq!(stream.send.buffered_bytes(), 0);
2282    }
2283
2284    #[test]
2285    fn retransmit_returns_partial_when_some_acked() {
2286        let mut stream = <Stream>::new(0, 15, 15, true, 0, 15);
2287
2288        // Write and emit 10 bytes.
2289        assert_eq!(stream.send.write(b"helloworld", false), Ok(10));
2290        assert_eq!(stream.send.buffered_bytes(), 10);
2291
2292        let mut buf = [0; 10];
2293        let (written, _) = stream.send.emit(&mut buf).unwrap();
2294        assert_eq!(written, 10);
2295        assert_eq!(stream.send.buffered_bytes(), 0);
2296
2297        // Mark all data for retransmission.
2298        let retransmitted = stream.send.retransmit(0, 10);
2299        assert_eq!(retransmitted, 10);
2300        assert_eq!(stream.send.buffered_bytes(), 10);
2301
2302        // Ack first 5 bytes and drop them.
2303        let dropped = stream.send.ack_and_drop(0, 5);
2304        assert_eq!(dropped, 5);
2305        assert_eq!(stream.send.buffered_bytes(), 5);
2306
2307        // Try to retransmit all 10 bytes - should return 5 since first 5 are
2308        // acked.
2309        let retransmitted = stream.send.retransmit(0, 10);
2310        assert_eq!(retransmitted, 0); // Already marked, so no change
2311        assert_eq!(stream.send.buffered_bytes(), 5);
2312    }
2313
2314    #[test]
2315    fn ack_and_drop_decrements_len_and_returns_dropped() {
2316        let mut stream = <Stream>::new(0, 15, 15, true, 0, 15);
2317
2318        // Write some data.
2319        assert_eq!(stream.send.write(b"hello", false), Ok(5));
2320        assert_eq!(stream.send.buffered_bytes(), 5);
2321
2322        // Emit it.
2323        let mut buf = [0; 10];
2324        let (written, _) = stream.send.emit(&mut buf).unwrap();
2325        assert_eq!(written, 5);
2326        assert_eq!(stream.send.buffered_bytes(), 0);
2327
2328        // Mark for retransmission.
2329        let retransmitted = stream.send.retransmit(0, 5);
2330        assert_eq!(retransmitted, 5);
2331        assert_eq!(stream.send.buffered_bytes(), 5);
2332
2333        // Ack and drop - should decrement len and return dropped amount.
2334        let dropped = stream.send.ack_and_drop(0, 5);
2335        assert_eq!(dropped, 5);
2336        assert_eq!(stream.send.buffered_bytes(), 0);
2337    }
2338
2339    #[test]
2340    fn ack_and_drop_partial_buffer() {
2341        let mut stream = <Stream>::new(0, 30, 30, true, 0, 30);
2342
2343        // Write and emit two chunks.
2344        assert_eq!(stream.send.write(b"hello", false), Ok(5));
2345        assert_eq!(stream.send.write(b"world", false), Ok(5));
2346        assert_eq!(stream.send.buffered_bytes(), 10);
2347
2348        let mut buf = [0; 10];
2349        let (written, _) = stream.send.emit(&mut buf).unwrap();
2350        assert_eq!(written, 10);
2351        assert_eq!(stream.send.buffered_bytes(), 0);
2352
2353        // Mark both chunks for retransmission.
2354        let retransmitted = stream.send.retransmit(0, 10);
2355        assert_eq!(retransmitted, 10);
2356        assert_eq!(stream.send.buffered_bytes(), 10);
2357
2358        // Ack and drop only first chunk.
2359        let dropped = stream.send.ack_and_drop(0, 5);
2360        assert_eq!(dropped, 5);
2361        assert_eq!(stream.send.buffered_bytes(), 5);
2362
2363        // Ack and drop second chunk.
2364        let dropped = stream.send.ack_and_drop(5, 5);
2365        assert_eq!(dropped, 5);
2366        assert_eq!(stream.send.buffered_bytes(), 0);
2367    }
2368
2369    #[test]
2370    fn ack_and_drop_returns_zero_when_nothing_dropped() {
2371        let mut stream = <Stream>::new(0, 15, 15, true, 0, 15);
2372
2373        // Write and emit data.
2374        assert_eq!(stream.send.write(b"hello", false), Ok(5));
2375        let mut buf = [0; 10];
2376        let (written, _) = stream.send.emit(&mut buf).unwrap();
2377        assert_eq!(written, 5);
2378
2379        // Ack data that's already been fully emitted and not retransmitted.
2380        // Nothing should be dropped since there's no buffered data.
2381        let dropped = stream.send.ack_and_drop(0, 5);
2382        assert_eq!(dropped, 0);
2383        assert_eq!(stream.send.buffered_bytes(), 0);
2384    }
2385
2386    #[test]
2387    fn cache_consistency_through_full_lifecycle() {
2388        // This test verifies that StreamMap.tx_buffered stays in sync with
2389        // actual buffered data through a full lifecycle: write → emit →
2390        // retransmit → ack.
2391        let mut streams = <StreamMap>::new(5, 5, 15);
2392
2393        // Create a stream using low-level StreamMap interface.
2394        let local_params = crate::TransportParams {
2395            initial_max_data: 30,
2396            initial_max_stream_data_bidi_local: 15,
2397            initial_max_stream_data_bidi_remote: 15,
2398            initial_max_stream_data_uni: 10,
2399            initial_max_streams_bidi: 5,
2400            initial_max_streams_uni: 5,
2401            ..Default::default()
2402        };
2403        let peer_params = local_params.clone();
2404
2405        // Update peer stream limits to allow locally-initiated streams.
2406        streams.update_peer_max_streams_bidi(5);
2407        streams.update_peer_max_streams_uni(5);
2408
2409        let stream_id = 0u64;
2410
2411        // Write data: both stream.send.buffered_bytes() and tx_buffered increase.
2412        {
2413            let stream = streams
2414                .get_or_create(
2415                    stream_id,
2416                    &local_params,
2417                    &peer_params,
2418                    true,
2419                    false,
2420                )
2421                .unwrap();
2422            assert_eq!(stream.send.write(b"hello", false), Ok(5));
2423        }
2424        streams.add_tx_buffered(5);
2425        assert_eq!(streams.get(stream_id).unwrap().send.buffered_bytes(), 5);
2426        assert_eq!(streams.tx_buffered(), 5);
2427        assert!(streams.tx_buffered_is_consistent());
2428
2429        // Emit data: both stream.send.buffered_bytes() and tx_buffered decrease.
2430        let mut buf = [0; 10];
2431        let written = {
2432            let stream = streams.get_mut(stream_id).unwrap();
2433            let (written, _) = stream.send.emit(&mut buf).unwrap();
2434            written
2435        };
2436        assert_eq!(written, 5);
2437        streams.sub_tx_buffered(5);
2438        assert_eq!(streams.get(stream_id).unwrap().send.buffered_bytes(), 0);
2439        assert_eq!(streams.tx_buffered(), 0);
2440        assert!(streams.tx_buffered_is_consistent());
2441
2442        // Retransmit: both stream.send.buffered_bytes() and tx_buffered increase
2443        // by actual amount retransmitted.
2444        let retransmitted = {
2445            let stream = streams.get_mut(stream_id).unwrap();
2446            stream.send.retransmit(0, 5)
2447        };
2448        assert_eq!(retransmitted, 5);
2449        streams.add_tx_buffered(retransmitted);
2450        assert_eq!(streams.get(stream_id).unwrap().send.buffered_bytes(), 5);
2451        assert_eq!(streams.tx_buffered(), 5);
2452        assert!(streams.tx_buffered_is_consistent());
2453
2454        // Ack and drop: both stream.send.buffered_bytes() and tx_buffered
2455        // decrease by actual amount dropped.
2456        let dropped = {
2457            let stream = streams.get_mut(stream_id).unwrap();
2458            stream.send.ack_and_drop(0, 5)
2459        };
2460        assert_eq!(dropped, 5);
2461        streams.sub_tx_buffered(dropped);
2462        assert_eq!(streams.get(stream_id).unwrap().send.buffered_bytes(), 0);
2463        assert_eq!(streams.tx_buffered(), 0);
2464        assert!(streams.tx_buffered_is_consistent());
2465    }
2466
2467    #[test]
2468    fn send_buf_len_reflects_buffered_data() {
2469        let mut stream = <Stream>::new(0, 15, 15, true, 0, 15);
2470
2471        // Initially empty.
2472        assert_eq!(stream.send.buffered_bytes(), 0);
2473
2474        // After write.
2475        assert_eq!(stream.send.write(b"hello", false), Ok(5));
2476        assert_eq!(stream.send.buffered_bytes(), 5);
2477
2478        // After emit.
2479        let mut buf = [0; 10];
2480        let (written, _) = stream.send.emit(&mut buf).unwrap();
2481        assert_eq!(written, 5);
2482        assert_eq!(stream.send.buffered_bytes(), 0);
2483
2484        // After retransmit.
2485        let retransmitted = stream.send.retransmit(0, 5);
2486        assert_eq!(retransmitted, 5);
2487        assert_eq!(stream.send.buffered_bytes(), 5);
2488
2489        // After ack_and_drop.
2490        let dropped = stream.send.ack_and_drop(0, 5);
2491        assert_eq!(dropped, 5);
2492        assert_eq!(stream.send.buffered_bytes(), 0);
2493    }
2494}
2495
2496mod recv_buf;
2497mod send_buf;