blob: bc76be364d230659e53affab240e8f9b27c93543 [file] [log] [blame]
QUICHE teama6ef0a62019-03-07 20:34:33 -05001// 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 "net/third_party/quiche/src/quic/core/quic_stream_id_manager.h"
renjietang52e13382019-12-16 15:58:04 -08009#include "net/third_party/quiche/src/quic/core/quic_types.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050010
11namespace quic {
12
13namespace test {
14class QuicSessionPeer;
fkastenholz3c4eabf2019-04-22 07:49:59 -070015class UberQuicStreamIdManagerPeer;
QUICHE teama6ef0a62019-03-07 20:34:33 -050016} // namespace test
17
18class QuicSession;
19
20// This class comprises two QuicStreamIdManagers, which manage bidirectional and
21// unidirectional stream IDs, respectively.
22class QUIC_EXPORT_PRIVATE UberQuicStreamIdManager {
23 public:
fkastenholzd3a1de92019-05-15 07:00:07 -070024 UberQuicStreamIdManager(
rchd40f9032019-09-23 07:27:04 -070025 Perspective perspective,
26 ParsedQuicVersion version,
27 QuicStreamIdManager::DelegateInterface* delegate,
fkastenholzd3a1de92019-05-15 07:00:07 -070028 QuicStreamCount max_open_outgoing_bidirectional_streams,
29 QuicStreamCount max_open_outgoing_unidirectional_streams,
30 QuicStreamCount max_open_incoming_bidirectional_streams,
31 QuicStreamCount max_open_incoming_unidirectional_streams);
QUICHE teama6ef0a62019-03-07 20:34:33 -050032
renjietang216dc012019-08-27 11:28:27 -070033 // Sets the limits to max_open_streams.
renjietang52e13382019-12-16 15:58:04 -080034 void SetMaxOpenOutgoingBidirectionalStreams(QuicStreamCount max_open_streams);
35 void SetMaxOpenOutgoingUnidirectionalStreams(
36 QuicStreamCount max_open_streams);
37 void SetMaxOpenIncomingBidirectionalStreams(QuicStreamCount max_open_streams);
38 void SetMaxOpenIncomingUnidirectionalStreams(
39 QuicStreamCount max_open_streams);
fkastenholz3c4eabf2019-04-22 07:49:59 -070040
QUICHE teama6ef0a62019-03-07 20:34:33 -050041 // Returns true if next outgoing bidirectional stream ID can be allocated.
fayang769172b2020-03-19 14:27:39 -070042 bool CanOpenNextOutgoingBidirectionalStream() const;
QUICHE teama6ef0a62019-03-07 20:34:33 -050043
44 // Returns true if next outgoing unidirectional stream ID can be allocated.
fayang769172b2020-03-19 14:27:39 -070045 bool CanOpenNextOutgoingUnidirectionalStream() const;
QUICHE teama6ef0a62019-03-07 20:34:33 -050046
47 // Returns the next outgoing bidirectional stream id.
48 QuicStreamId GetNextOutgoingBidirectionalStreamId();
49
50 // Returns the next outgoing unidirectional stream id.
51 QuicStreamId GetNextOutgoingUnidirectionalStreamId();
52
fkastenholzd3a1de92019-05-15 07:00:07 -070053 // Returns true if the incoming |id| is within the limit.
QUICHE teama6ef0a62019-03-07 20:34:33 -050054 bool MaybeIncreaseLargestPeerStreamId(QuicStreamId id);
55
56 // Called when |id| is released.
57 void OnStreamClosed(QuicStreamId id);
58
fkastenholz3c4eabf2019-04-22 07:49:59 -070059 // Called when a MAX_STREAMS frame is received.
60 bool OnMaxStreamsFrame(const QuicMaxStreamsFrame& frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -050061
fkastenholz3c4eabf2019-04-22 07:49:59 -070062 // Called when a STREAMS_BLOCKED frame is received.
63 bool OnStreamsBlockedFrame(const QuicStreamsBlockedFrame& frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -050064
65 // Return true if |id| is peer initiated.
66 bool IsIncomingStream(QuicStreamId id) const;
67
68 // Returns true if |id| is still available.
69 bool IsAvailableStream(QuicStreamId id) const;
70
renjietang52e13382019-12-16 15:58:04 -080071 QuicStreamCount GetMaxAllowdIncomingBidirectionalStreams() const;
QUICHE teama6ef0a62019-03-07 20:34:33 -050072
renjietang52e13382019-12-16 15:58:04 -080073 QuicStreamCount GetMaxAllowdIncomingUnidirectionalStreams() const;
QUICHE teama6ef0a62019-03-07 20:34:33 -050074
renjietang686ce582019-10-17 14:28:16 -070075 QuicStreamId GetLargestPeerCreatedStreamId(bool unidirectional) const;
76
QUICHE teama6ef0a62019-03-07 20:34:33 -050077 QuicStreamId next_outgoing_bidirectional_stream_id() const;
78 QuicStreamId next_outgoing_unidirectional_stream_id() const;
79
renjietang52e13382019-12-16 15:58:04 -080080 QuicStreamCount max_outgoing_bidirectional_streams() const;
81 QuicStreamCount max_outgoing_unidirectional_streams() const;
QUICHE teama6ef0a62019-03-07 20:34:33 -050082
ianswettd1414532019-09-18 20:12:59 -070083 QuicStreamCount max_incoming_bidirectional_streams() const;
84 QuicStreamCount max_incoming_unidirectional_streams() const;
QUICHE teama6ef0a62019-03-07 20:34:33 -050085
ianswettd1414532019-09-18 20:12:59 -070086 QuicStreamCount advertised_max_incoming_bidirectional_streams() const;
87 QuicStreamCount advertised_max_incoming_unidirectional_streams() const;
QUICHE teama6ef0a62019-03-07 20:34:33 -050088
89 private:
90 friend class test::QuicSessionPeer;
fkastenholz3c4eabf2019-04-22 07:49:59 -070091 friend class test::UberQuicStreamIdManagerPeer;
QUICHE teama6ef0a62019-03-07 20:34:33 -050092
93 // Manages stream IDs of bidirectional streams.
94 QuicStreamIdManager bidirectional_stream_id_manager_;
95
96 // Manages stream IDs of unidirectional streams.
97 QuicStreamIdManager unidirectional_stream_id_manager_;
98};
99
100} // namespace quic
101
102#endif // QUICHE_QUIC_CORE_UBER_QUIC_STREAM_ID_MANAGER_H_