blob: 67ab7a0550953cafbcc34111c9e5f4dc6c7d4ac4 [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
QUICHE team5be974e2020-12-29 18:35:24 -05008#include "quic/core/quic_stream_id_manager.h"
9#include "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
renjietangab9039a2020-03-30 14:53:19 -070033 // Called on |max_open_streams| outgoing streams can be created because of 1)
34 // config negotiated or 2) MAX_STREAMS received. Returns true if new
35 // streams can be created.
36 bool MaybeAllowNewOutgoingBidirectionalStreams(
renjietang52e13382019-12-16 15:58:04 -080037 QuicStreamCount max_open_streams);
renjietangab9039a2020-03-30 14:53:19 -070038 bool MaybeAllowNewOutgoingUnidirectionalStreams(
39 QuicStreamCount max_open_streams);
40
41 // Sets the limits to max_open_streams.
renjietang52e13382019-12-16 15:58:04 -080042 void SetMaxOpenIncomingBidirectionalStreams(QuicStreamCount max_open_streams);
43 void SetMaxOpenIncomingUnidirectionalStreams(
44 QuicStreamCount max_open_streams);
fkastenholz3c4eabf2019-04-22 07:49:59 -070045
QUICHE teama6ef0a62019-03-07 20:34:33 -050046 // Returns true if next outgoing bidirectional stream ID can be allocated.
fayang769172b2020-03-19 14:27:39 -070047 bool CanOpenNextOutgoingBidirectionalStream() const;
QUICHE teama6ef0a62019-03-07 20:34:33 -050048
49 // Returns true if next outgoing unidirectional stream ID can be allocated.
fayang769172b2020-03-19 14:27:39 -070050 bool CanOpenNextOutgoingUnidirectionalStream() const;
QUICHE teama6ef0a62019-03-07 20:34:33 -050051
52 // Returns the next outgoing bidirectional stream id.
53 QuicStreamId GetNextOutgoingBidirectionalStreamId();
54
55 // Returns the next outgoing unidirectional stream id.
56 QuicStreamId GetNextOutgoingUnidirectionalStreamId();
57
fkastenholzd3a1de92019-05-15 07:00:07 -070058 // Returns true if the incoming |id| is within the limit.
renjietang7133ea92020-04-01 12:49:36 -070059 bool MaybeIncreaseLargestPeerStreamId(QuicStreamId id,
60 std::string* error_details);
QUICHE teama6ef0a62019-03-07 20:34:33 -050061
62 // Called when |id| is released.
63 void OnStreamClosed(QuicStreamId id);
64
fkastenholz3c4eabf2019-04-22 07:49:59 -070065 // Called when a STREAMS_BLOCKED frame is received.
renjietang7133ea92020-04-01 12:49:36 -070066 bool OnStreamsBlockedFrame(const QuicStreamsBlockedFrame& frame,
67 std::string* error_details);
QUICHE teama6ef0a62019-03-07 20:34:33 -050068
QUICHE teama6ef0a62019-03-07 20:34:33 -050069 // Returns true if |id| is still available.
70 bool IsAvailableStream(QuicStreamId id) const;
71
renjietang52e13382019-12-16 15:58:04 -080072 QuicStreamCount GetMaxAllowdIncomingBidirectionalStreams() const;
QUICHE teama6ef0a62019-03-07 20:34:33 -050073
renjietang52e13382019-12-16 15:58:04 -080074 QuicStreamCount GetMaxAllowdIncomingUnidirectionalStreams() const;
QUICHE teama6ef0a62019-03-07 20:34:33 -050075
renjietang686ce582019-10-17 14:28:16 -070076 QuicStreamId GetLargestPeerCreatedStreamId(bool unidirectional) const;
77
QUICHE teama6ef0a62019-03-07 20:34:33 -050078 QuicStreamId next_outgoing_bidirectional_stream_id() const;
79 QuicStreamId next_outgoing_unidirectional_stream_id() const;
80
renjietang52e13382019-12-16 15:58:04 -080081 QuicStreamCount max_outgoing_bidirectional_streams() const;
82 QuicStreamCount max_outgoing_unidirectional_streams() const;
QUICHE teama6ef0a62019-03-07 20:34:33 -050083
ianswettd1414532019-09-18 20:12:59 -070084 QuicStreamCount max_incoming_bidirectional_streams() const;
85 QuicStreamCount max_incoming_unidirectional_streams() const;
QUICHE teama6ef0a62019-03-07 20:34:33 -050086
ianswettd1414532019-09-18 20:12:59 -070087 QuicStreamCount advertised_max_incoming_bidirectional_streams() const;
88 QuicStreamCount advertised_max_incoming_unidirectional_streams() const;
QUICHE teama6ef0a62019-03-07 20:34:33 -050089
renjietangfaf8b022020-06-08 20:06:44 -070090 QuicStreamCount outgoing_bidirectional_stream_count() const;
91 QuicStreamCount outgoing_unidirectional_stream_count() const;
92
QUICHE teama6ef0a62019-03-07 20:34:33 -050093 private:
94 friend class test::QuicSessionPeer;
fkastenholz3c4eabf2019-04-22 07:49:59 -070095 friend class test::UberQuicStreamIdManagerPeer;
QUICHE teama6ef0a62019-03-07 20:34:33 -050096
renjietangd262e252020-06-19 15:11:24 -070097 ParsedQuicVersion version_;
QUICHE teama6ef0a62019-03-07 20:34:33 -050098 // Manages stream IDs of bidirectional streams.
99 QuicStreamIdManager bidirectional_stream_id_manager_;
100
101 // Manages stream IDs of unidirectional streams.
102 QuicStreamIdManager unidirectional_stream_id_manager_;
103};
104
105} // namespace quic
106
107#endif // QUICHE_QUIC_CORE_UBER_QUIC_STREAM_ID_MANAGER_H_