blob: 2f33594e042b05ef1e9552c0f146b6faffe8bef1 [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#include "net/third_party/quiche/src/quic/core/uber_quic_stream_id_manager.h"
6
7#include "net/third_party/quiche/src/quic/core/quic_session.h"
8#include "net/third_party/quiche/src/quic/core/quic_utils.h"
9
10namespace quic {
QUICHE teama6ef0a62019-03-07 20:34:33 -050011
12UberQuicStreamIdManager::UberQuicStreamIdManager(
rchd40f9032019-09-23 07:27:04 -070013 Perspective perspective,
14 ParsedQuicVersion version,
15 QuicStreamIdManager::DelegateInterface* delegate,
fkastenholzd3a1de92019-05-15 07:00:07 -070016 QuicStreamCount max_open_outgoing_bidirectional_streams,
17 QuicStreamCount max_open_outgoing_unidirectional_streams,
18 QuicStreamCount max_open_incoming_bidirectional_streams,
19 QuicStreamCount max_open_incoming_unidirectional_streams)
renjietangd262e252020-06-19 15:11:24 -070020 : version_(version),
21 bidirectional_stream_id_manager_(delegate,
fkastenholz3c4eabf2019-04-22 07:49:59 -070022 /*unidirectional=*/false,
rchd40f9032019-09-23 07:27:04 -070023 perspective,
renjietang40038f52020-04-08 11:30:31 -070024 version,
fkastenholzd3a1de92019-05-15 07:00:07 -070025 max_open_outgoing_bidirectional_streams,
26 max_open_incoming_bidirectional_streams),
27 unidirectional_stream_id_manager_(
rchd40f9032019-09-23 07:27:04 -070028 delegate,
fkastenholzd3a1de92019-05-15 07:00:07 -070029 /*unidirectional=*/true,
rchd40f9032019-09-23 07:27:04 -070030 perspective,
renjietang40038f52020-04-08 11:30:31 -070031 version,
fkastenholzd3a1de92019-05-15 07:00:07 -070032 max_open_outgoing_unidirectional_streams,
33 max_open_incoming_unidirectional_streams) {}
QUICHE teama6ef0a62019-03-07 20:34:33 -050034
renjietangab9039a2020-03-30 14:53:19 -070035bool UberQuicStreamIdManager::MaybeAllowNewOutgoingBidirectionalStreams(
renjietang52e13382019-12-16 15:58:04 -080036 QuicStreamCount max_open_streams) {
renjietangab9039a2020-03-30 14:53:19 -070037 return bidirectional_stream_id_manager_.MaybeAllowNewOutgoingStreams(
38 max_open_streams);
fkastenholzd3a1de92019-05-15 07:00:07 -070039}
renjietangab9039a2020-03-30 14:53:19 -070040bool UberQuicStreamIdManager::MaybeAllowNewOutgoingUnidirectionalStreams(
renjietang52e13382019-12-16 15:58:04 -080041 QuicStreamCount max_open_streams) {
renjietangab9039a2020-03-30 14:53:19 -070042 return unidirectional_stream_id_manager_.MaybeAllowNewOutgoingStreams(
43 max_open_streams);
fkastenholz3c4eabf2019-04-22 07:49:59 -070044}
fkastenholzd3a1de92019-05-15 07:00:07 -070045void UberQuicStreamIdManager::SetMaxOpenIncomingBidirectionalStreams(
renjietang52e13382019-12-16 15:58:04 -080046 QuicStreamCount max_open_streams) {
fkastenholz3c4eabf2019-04-22 07:49:59 -070047 bidirectional_stream_id_manager_.SetMaxOpenIncomingStreams(max_open_streams);
fkastenholzd3a1de92019-05-15 07:00:07 -070048}
49void UberQuicStreamIdManager::SetMaxOpenIncomingUnidirectionalStreams(
renjietang52e13382019-12-16 15:58:04 -080050 QuicStreamCount max_open_streams) {
fkastenholz3c4eabf2019-04-22 07:49:59 -070051 unidirectional_stream_id_manager_.SetMaxOpenIncomingStreams(max_open_streams);
QUICHE teama6ef0a62019-03-07 20:34:33 -050052}
53
fayang769172b2020-03-19 14:27:39 -070054bool UberQuicStreamIdManager::CanOpenNextOutgoingBidirectionalStream() const {
QUICHE teama6ef0a62019-03-07 20:34:33 -050055 return bidirectional_stream_id_manager_.CanOpenNextOutgoingStream();
56}
57
fayang769172b2020-03-19 14:27:39 -070058bool UberQuicStreamIdManager::CanOpenNextOutgoingUnidirectionalStream() const {
QUICHE teama6ef0a62019-03-07 20:34:33 -050059 return unidirectional_stream_id_manager_.CanOpenNextOutgoingStream();
60}
61
62QuicStreamId UberQuicStreamIdManager::GetNextOutgoingBidirectionalStreamId() {
63 return bidirectional_stream_id_manager_.GetNextOutgoingStreamId();
64}
65
66QuicStreamId UberQuicStreamIdManager::GetNextOutgoingUnidirectionalStreamId() {
67 return unidirectional_stream_id_manager_.GetNextOutgoingStreamId();
68}
69
70bool UberQuicStreamIdManager::MaybeIncreaseLargestPeerStreamId(
renjietang7133ea92020-04-01 12:49:36 -070071 QuicStreamId id,
72 std::string* error_details) {
renjietangd262e252020-06-19 15:11:24 -070073 if (QuicUtils::IsBidirectionalStreamId(id, version_)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050074 return bidirectional_stream_id_manager_.MaybeIncreaseLargestPeerStreamId(
renjietang7133ea92020-04-01 12:49:36 -070075 id, error_details);
QUICHE teama6ef0a62019-03-07 20:34:33 -050076 }
renjietang7133ea92020-04-01 12:49:36 -070077 return unidirectional_stream_id_manager_.MaybeIncreaseLargestPeerStreamId(
78 id, error_details);
QUICHE teama6ef0a62019-03-07 20:34:33 -050079}
80
81void UberQuicStreamIdManager::OnStreamClosed(QuicStreamId id) {
renjietangd262e252020-06-19 15:11:24 -070082 if (QuicUtils::IsBidirectionalStreamId(id, version_)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050083 bidirectional_stream_id_manager_.OnStreamClosed(id);
84 return;
85 }
86 unidirectional_stream_id_manager_.OnStreamClosed(id);
87}
88
fkastenholz3c4eabf2019-04-22 07:49:59 -070089bool UberQuicStreamIdManager::OnStreamsBlockedFrame(
renjietang7133ea92020-04-01 12:49:36 -070090 const QuicStreamsBlockedFrame& frame,
91 std::string* error_details) {
fkastenholz3c4eabf2019-04-22 07:49:59 -070092 if (frame.unidirectional) {
renjietang7133ea92020-04-01 12:49:36 -070093 return unidirectional_stream_id_manager_.OnStreamsBlockedFrame(
94 frame, error_details);
QUICHE teama6ef0a62019-03-07 20:34:33 -050095 }
renjietang7133ea92020-04-01 12:49:36 -070096 return bidirectional_stream_id_manager_.OnStreamsBlockedFrame(frame,
97 error_details);
QUICHE teama6ef0a62019-03-07 20:34:33 -050098}
99
QUICHE teama6ef0a62019-03-07 20:34:33 -0500100bool UberQuicStreamIdManager::IsAvailableStream(QuicStreamId id) const {
renjietangd262e252020-06-19 15:11:24 -0700101 if (QuicUtils::IsBidirectionalStreamId(id, version_)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500102 return bidirectional_stream_id_manager_.IsAvailableStream(id);
103 }
104 return unidirectional_stream_id_manager_.IsAvailableStream(id);
105}
106
renjietang52e13382019-12-16 15:58:04 -0800107QuicStreamCount
108UberQuicStreamIdManager::GetMaxAllowdIncomingBidirectionalStreams() const {
fkastenholz3c4eabf2019-04-22 07:49:59 -0700109 return bidirectional_stream_id_manager_.incoming_initial_max_open_streams();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500110}
111
renjietang52e13382019-12-16 15:58:04 -0800112QuicStreamCount
113UberQuicStreamIdManager::GetMaxAllowdIncomingUnidirectionalStreams() const {
fkastenholz3c4eabf2019-04-22 07:49:59 -0700114 return unidirectional_stream_id_manager_.incoming_initial_max_open_streams();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500115}
116
renjietang686ce582019-10-17 14:28:16 -0700117QuicStreamId UberQuicStreamIdManager::GetLargestPeerCreatedStreamId(
118 bool unidirectional) const {
119 if (unidirectional) {
120 return unidirectional_stream_id_manager_.largest_peer_created_stream_id();
121 }
122 return bidirectional_stream_id_manager_.largest_peer_created_stream_id();
123}
124
QUICHE teama6ef0a62019-03-07 20:34:33 -0500125QuicStreamId UberQuicStreamIdManager::next_outgoing_bidirectional_stream_id()
126 const {
127 return bidirectional_stream_id_manager_.next_outgoing_stream_id();
128}
129
130QuicStreamId UberQuicStreamIdManager::next_outgoing_unidirectional_stream_id()
131 const {
132 return unidirectional_stream_id_manager_.next_outgoing_stream_id();
133}
134
renjietang52e13382019-12-16 15:58:04 -0800135QuicStreamCount UberQuicStreamIdManager::max_outgoing_bidirectional_streams()
136 const {
fkastenholz3c4eabf2019-04-22 07:49:59 -0700137 return bidirectional_stream_id_manager_.outgoing_max_streams();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500138}
139
renjietang52e13382019-12-16 15:58:04 -0800140QuicStreamCount UberQuicStreamIdManager::max_outgoing_unidirectional_streams()
141 const {
fkastenholz3c4eabf2019-04-22 07:49:59 -0700142 return unidirectional_stream_id_manager_.outgoing_max_streams();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500143}
144
ianswettd1414532019-09-18 20:12:59 -0700145QuicStreamCount UberQuicStreamIdManager::max_incoming_bidirectional_streams()
QUICHE teama6ef0a62019-03-07 20:34:33 -0500146 const {
fkastenholz3c4eabf2019-04-22 07:49:59 -0700147 return bidirectional_stream_id_manager_.incoming_actual_max_streams();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500148}
149
ianswettd1414532019-09-18 20:12:59 -0700150QuicStreamCount UberQuicStreamIdManager::max_incoming_unidirectional_streams()
QUICHE teama6ef0a62019-03-07 20:34:33 -0500151 const {
fkastenholz3c4eabf2019-04-22 07:49:59 -0700152 return unidirectional_stream_id_manager_.incoming_actual_max_streams();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500153}
154
fkastenholz3c4eabf2019-04-22 07:49:59 -0700155QuicStreamCount
ianswettd1414532019-09-18 20:12:59 -0700156UberQuicStreamIdManager::advertised_max_incoming_bidirectional_streams() const {
fkastenholz3c4eabf2019-04-22 07:49:59 -0700157 return bidirectional_stream_id_manager_.incoming_advertised_max_streams();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500158}
159
ianswettd1414532019-09-18 20:12:59 -0700160QuicStreamCount
161UberQuicStreamIdManager::advertised_max_incoming_unidirectional_streams()
162 const {
fkastenholz3c4eabf2019-04-22 07:49:59 -0700163 return unidirectional_stream_id_manager_.incoming_advertised_max_streams();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500164}
165
renjietangfaf8b022020-06-08 20:06:44 -0700166QuicStreamCount UberQuicStreamIdManager::outgoing_bidirectional_stream_count()
167 const {
168 return bidirectional_stream_id_manager_.outgoing_stream_count();
169}
170
171QuicStreamCount UberQuicStreamIdManager::outgoing_unidirectional_stream_count()
172 const {
173 return unidirectional_stream_id_manager_.outgoing_stream_count();
174}
175
QUICHE teama6ef0a62019-03-07 20:34:33 -0500176} // namespace quic