blob: 51ea994fe953f6f6c38dca93d7314ab4cf26983d [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 {
11namespace {
12
13Perspective Reverse(Perspective perspective) {
14 return perspective == Perspective::IS_SERVER ? Perspective::IS_CLIENT
15 : Perspective::IS_SERVER;
16}
17
18} // namespace
19
20UberQuicStreamIdManager::UberQuicStreamIdManager(
21 QuicSession* session,
22 size_t max_open_outgoing_streams,
23 size_t max_open_incoming_streams)
24 : bidirectional_stream_id_manager_(
25 session,
26 QuicUtils::GetFirstBidirectionalStreamId(
27 session->connection()->transport_version(),
28 session->perspective()),
29 session->perspective() == Perspective::IS_SERVER
30 ? QuicUtils::GetCryptoStreamId(
31 session->connection()->transport_version())
32 : QuicUtils::GetInvalidStreamId(
33 session->connection()->transport_version()),
34 QuicUtils::GetFirstBidirectionalStreamId(
35 session->connection()->transport_version(),
36 Reverse(session->perspective())),
37 max_open_outgoing_streams,
38 max_open_incoming_streams),
39 unidirectional_stream_id_manager_(
40 session,
41 QuicUtils::GetFirstUnidirectionalStreamId(
42 session->connection()->transport_version(),
43 session->perspective()),
44 QuicUtils::GetInvalidStreamId(
45 session->connection()->transport_version()),
46 QuicUtils::GetFirstUnidirectionalStreamId(
47 session->connection()->transport_version(),
48 Reverse(session->perspective())),
49 max_open_outgoing_streams,
50 max_open_incoming_streams) {}
51
52void UberQuicStreamIdManager::RegisterStaticStream(QuicStreamId id) {
53 if (QuicUtils::IsBidirectionalStreamId(id)) {
54 bidirectional_stream_id_manager_.RegisterStaticStream(id);
55 return;
56 }
57 unidirectional_stream_id_manager_.RegisterStaticStream(id);
58}
59
60void UberQuicStreamIdManager::SetMaxOpenOutgoingStreams(size_t max_streams) {
61 bidirectional_stream_id_manager_.SetMaxOpenOutgoingStreams(max_streams);
62 unidirectional_stream_id_manager_.SetMaxOpenOutgoingStreams(max_streams);
63}
64
65void UberQuicStreamIdManager::SetMaxOpenIncomingStreams(size_t max_streams) {
66 bidirectional_stream_id_manager_.SetMaxOpenIncomingStreams(max_streams);
67 unidirectional_stream_id_manager_.SetMaxOpenIncomingStreams(max_streams);
68}
69
70bool UberQuicStreamIdManager::CanOpenNextOutgoingBidirectionalStream() {
71 return bidirectional_stream_id_manager_.CanOpenNextOutgoingStream();
72}
73
74bool UberQuicStreamIdManager::CanOpenNextOutgoingUnidirectionalStream() {
75 return unidirectional_stream_id_manager_.CanOpenNextOutgoingStream();
76}
77
78QuicStreamId UberQuicStreamIdManager::GetNextOutgoingBidirectionalStreamId() {
79 return bidirectional_stream_id_manager_.GetNextOutgoingStreamId();
80}
81
82QuicStreamId UberQuicStreamIdManager::GetNextOutgoingUnidirectionalStreamId() {
83 return unidirectional_stream_id_manager_.GetNextOutgoingStreamId();
84}
85
86bool UberQuicStreamIdManager::MaybeIncreaseLargestPeerStreamId(
87 QuicStreamId id) {
88 if (QuicUtils::IsBidirectionalStreamId(id)) {
89 return bidirectional_stream_id_manager_.MaybeIncreaseLargestPeerStreamId(
90 id);
91 }
92 return unidirectional_stream_id_manager_.MaybeIncreaseLargestPeerStreamId(id);
93}
94
95void UberQuicStreamIdManager::OnStreamClosed(QuicStreamId id) {
96 if (QuicUtils::IsBidirectionalStreamId(id)) {
97 bidirectional_stream_id_manager_.OnStreamClosed(id);
98 return;
99 }
100 unidirectional_stream_id_manager_.OnStreamClosed(id);
101}
102
103bool UberQuicStreamIdManager::OnMaxStreamIdFrame(
104 const QuicMaxStreamIdFrame& frame) {
105 if (QuicUtils::IsBidirectionalStreamId(frame.max_stream_id)) {
106 return bidirectional_stream_id_manager_.OnMaxStreamIdFrame(frame);
107 }
108 return unidirectional_stream_id_manager_.OnMaxStreamIdFrame(frame);
109}
110
111bool UberQuicStreamIdManager::OnStreamIdBlockedFrame(
112 const QuicStreamIdBlockedFrame& frame) {
113 if (QuicUtils::IsBidirectionalStreamId(frame.stream_id)) {
114 return bidirectional_stream_id_manager_.OnStreamIdBlockedFrame(frame);
115 }
116 return unidirectional_stream_id_manager_.OnStreamIdBlockedFrame(frame);
117}
118
119bool UberQuicStreamIdManager::IsIncomingStream(QuicStreamId id) const {
120 if (QuicUtils::IsBidirectionalStreamId(id)) {
121 return bidirectional_stream_id_manager_.IsIncomingStream(id);
122 }
123 return unidirectional_stream_id_manager_.IsIncomingStream(id);
124}
125
126bool UberQuicStreamIdManager::IsAvailableStream(QuicStreamId id) const {
127 if (QuicUtils::IsBidirectionalStreamId(id)) {
128 return bidirectional_stream_id_manager_.IsAvailableStream(id);
129 }
130 return unidirectional_stream_id_manager_.IsAvailableStream(id);
131}
132
133size_t UberQuicStreamIdManager::GetMaxAllowdIncomingBidirectionalStreams()
134 const {
135 return bidirectional_stream_id_manager_.max_allowed_incoming_streams();
136}
137
138size_t UberQuicStreamIdManager::GetMaxAllowdIncomingUnidirectionalStreams()
139 const {
140 return unidirectional_stream_id_manager_.max_allowed_incoming_streams();
141}
142
143void UberQuicStreamIdManager::SetLargestPeerCreatedStreamId(
144 QuicStreamId largest_peer_created_stream_id) {
145 if (QuicUtils::IsBidirectionalStreamId(largest_peer_created_stream_id)) {
146 bidirectional_stream_id_manager_.set_largest_peer_created_stream_id(
147 largest_peer_created_stream_id);
148 return;
149 }
150 unidirectional_stream_id_manager_.set_largest_peer_created_stream_id(
151 largest_peer_created_stream_id);
152}
153
154QuicStreamId UberQuicStreamIdManager::next_outgoing_bidirectional_stream_id()
155 const {
156 return bidirectional_stream_id_manager_.next_outgoing_stream_id();
157}
158
159QuicStreamId UberQuicStreamIdManager::next_outgoing_unidirectional_stream_id()
160 const {
161 return unidirectional_stream_id_manager_.next_outgoing_stream_id();
162}
163
164QuicStreamId
165UberQuicStreamIdManager::max_allowed_outgoing_bidirectional_stream_id() const {
166 return bidirectional_stream_id_manager_.max_allowed_outgoing_stream_id();
167}
168
169QuicStreamId
170UberQuicStreamIdManager::max_allowed_outgoing_unidirectional_stream_id() const {
171 return unidirectional_stream_id_manager_.max_allowed_outgoing_stream_id();
172}
173
174size_t UberQuicStreamIdManager::max_allowed_outgoing_bidirectional_streams()
175 const {
176 return bidirectional_stream_id_manager_.max_allowed_outgoing_streams();
177}
178
179size_t UberQuicStreamIdManager::max_allowed_outgoing_unidirectional_streams()
180 const {
181 return unidirectional_stream_id_manager_.max_allowed_outgoing_streams();
182}
183
184QuicStreamId
185UberQuicStreamIdManager::actual_max_allowed_incoming_bidirectional_stream_id()
186 const {
187 return bidirectional_stream_id_manager_
188 .actual_max_allowed_incoming_stream_id();
189}
190
191QuicStreamId
192UberQuicStreamIdManager::actual_max_allowed_incoming_unidirectional_stream_id()
193 const {
194 return unidirectional_stream_id_manager_
195 .actual_max_allowed_incoming_stream_id();
196}
197
198QuicStreamId UberQuicStreamIdManager::
199 advertised_max_allowed_incoming_bidirectional_stream_id() const {
200 return bidirectional_stream_id_manager_
201 .advertised_max_allowed_incoming_stream_id();
202}
203
204QuicStreamId UberQuicStreamIdManager::
205 advertised_max_allowed_incoming_unidirectional_stream_id() const {
206 return unidirectional_stream_id_manager_
207 .advertised_max_allowed_incoming_stream_id();
208}
209
210} // namespace quic