xref: /aosp_15_r20/external/cronet/net/third_party/quiche/src/quiche/quic/core/uber_quic_stream_id_manager.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright (c) 2018 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef QUICHE_QUIC_CORE_UBER_QUIC_STREAM_ID_MANAGER_H_
6 #define QUICHE_QUIC_CORE_UBER_QUIC_STREAM_ID_MANAGER_H_
7 
8 #include "quiche/quic/core/quic_stream_id_manager.h"
9 #include "quiche/quic/core/quic_types.h"
10 
11 namespace quic {
12 
13 namespace test {
14 class QuicSessionPeer;
15 class UberQuicStreamIdManagerPeer;
16 }  // namespace test
17 
18 class QuicSession;
19 
20 // This class comprises two QuicStreamIdManagers, which manage bidirectional and
21 // unidirectional stream IDs, respectively.
22 class QUICHE_EXPORT UberQuicStreamIdManager {
23  public:
24   UberQuicStreamIdManager(
25       Perspective perspective, ParsedQuicVersion version,
26       QuicStreamIdManager::DelegateInterface* delegate,
27       QuicStreamCount max_open_outgoing_bidirectional_streams,
28       QuicStreamCount max_open_outgoing_unidirectional_streams,
29       QuicStreamCount max_open_incoming_bidirectional_streams,
30       QuicStreamCount max_open_incoming_unidirectional_streams);
31 
32   // Called on |max_open_streams| outgoing streams can be created because of 1)
33   // config negotiated or 2) MAX_STREAMS received. Returns true if new
34   // streams can be created.
35   bool MaybeAllowNewOutgoingBidirectionalStreams(
36       QuicStreamCount max_open_streams);
37   bool MaybeAllowNewOutgoingUnidirectionalStreams(
38       QuicStreamCount max_open_streams);
39 
40   // Sets the limits to max_open_streams.
41   void SetMaxOpenIncomingBidirectionalStreams(QuicStreamCount max_open_streams);
42   void SetMaxOpenIncomingUnidirectionalStreams(
43       QuicStreamCount max_open_streams);
44 
45   // Returns true if next outgoing bidirectional stream ID can be allocated.
46   bool CanOpenNextOutgoingBidirectionalStream() const;
47 
48   // Returns true if next outgoing unidirectional stream ID can be allocated.
49   bool CanOpenNextOutgoingUnidirectionalStream() const;
50 
51   // Returns the next outgoing bidirectional stream id.
52   QuicStreamId GetNextOutgoingBidirectionalStreamId();
53 
54   // Returns the next outgoing unidirectional stream id.
55   QuicStreamId GetNextOutgoingUnidirectionalStreamId();
56 
57   // Returns true if the incoming |id| is within the limit.
58   bool MaybeIncreaseLargestPeerStreamId(QuicStreamId id,
59                                         std::string* error_details);
60 
61   // Called when |id| is released.
62   void OnStreamClosed(QuicStreamId id);
63 
64   // Called when a STREAMS_BLOCKED frame is received.
65   bool OnStreamsBlockedFrame(const QuicStreamsBlockedFrame& frame,
66                              std::string* error_details);
67 
68   // Returns true if |id| is still available.
69   bool IsAvailableStream(QuicStreamId id) const;
70 
71   // Once called, the incoming max streams limit will never be increased.
72   void StopIncreasingIncomingMaxStreams();
73 
74   // Check whether the MAX_STREAMS window has opened up enough and, if so,
75   // generate and send a MAX_STREAMS frame.
76   void MaybeSendMaxStreamsFrame();
77 
78   QuicStreamCount GetMaxAllowdIncomingBidirectionalStreams() const;
79 
80   QuicStreamCount GetMaxAllowdIncomingUnidirectionalStreams() const;
81 
82   QuicStreamId GetLargestPeerCreatedStreamId(bool unidirectional) const;
83 
84   QuicStreamId next_outgoing_bidirectional_stream_id() const;
85   QuicStreamId next_outgoing_unidirectional_stream_id() const;
86 
87   QuicStreamCount max_outgoing_bidirectional_streams() const;
88   QuicStreamCount max_outgoing_unidirectional_streams() const;
89 
90   QuicStreamCount max_incoming_bidirectional_streams() const;
91   QuicStreamCount max_incoming_unidirectional_streams() const;
92 
93   QuicStreamCount advertised_max_incoming_bidirectional_streams() const;
94   QuicStreamCount advertised_max_incoming_unidirectional_streams() const;
95 
96   QuicStreamCount outgoing_bidirectional_stream_count() const;
97   QuicStreamCount outgoing_unidirectional_stream_count() const;
98 
99  private:
100   friend class test::QuicSessionPeer;
101   friend class test::UberQuicStreamIdManagerPeer;
102 
103   ParsedQuicVersion version_;
104   // Manages stream IDs of bidirectional streams.
105   QuicStreamIdManager bidirectional_stream_id_manager_;
106 
107   // Manages stream IDs of unidirectional streams.
108   QuicStreamIdManager unidirectional_stream_id_manager_;
109 };
110 
111 }  // namespace quic
112 
113 #endif  // QUICHE_QUIC_CORE_UBER_QUIC_STREAM_ID_MANAGER_H_
114