Project import generated by Copybara.
PiperOrigin-RevId: 237361882
Change-Id: I109a68f44db867b20f8c6a7732b0ce657133e52a
diff --git a/quic/core/uber_quic_stream_id_manager.cc b/quic/core/uber_quic_stream_id_manager.cc
new file mode 100644
index 0000000..51ea994
--- /dev/null
+++ b/quic/core/uber_quic_stream_id_manager.cc
@@ -0,0 +1,210 @@
+// Copyright (c) 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "net/third_party/quiche/src/quic/core/uber_quic_stream_id_manager.h"
+
+#include "net/third_party/quiche/src/quic/core/quic_session.h"
+#include "net/third_party/quiche/src/quic/core/quic_utils.h"
+
+namespace quic {
+namespace {
+
+Perspective Reverse(Perspective perspective) {
+ return perspective == Perspective::IS_SERVER ? Perspective::IS_CLIENT
+ : Perspective::IS_SERVER;
+}
+
+} // namespace
+
+UberQuicStreamIdManager::UberQuicStreamIdManager(
+ QuicSession* session,
+ size_t max_open_outgoing_streams,
+ size_t max_open_incoming_streams)
+ : bidirectional_stream_id_manager_(
+ session,
+ QuicUtils::GetFirstBidirectionalStreamId(
+ session->connection()->transport_version(),
+ session->perspective()),
+ session->perspective() == Perspective::IS_SERVER
+ ? QuicUtils::GetCryptoStreamId(
+ session->connection()->transport_version())
+ : QuicUtils::GetInvalidStreamId(
+ session->connection()->transport_version()),
+ QuicUtils::GetFirstBidirectionalStreamId(
+ session->connection()->transport_version(),
+ Reverse(session->perspective())),
+ max_open_outgoing_streams,
+ max_open_incoming_streams),
+ unidirectional_stream_id_manager_(
+ session,
+ QuicUtils::GetFirstUnidirectionalStreamId(
+ session->connection()->transport_version(),
+ session->perspective()),
+ QuicUtils::GetInvalidStreamId(
+ session->connection()->transport_version()),
+ QuicUtils::GetFirstUnidirectionalStreamId(
+ session->connection()->transport_version(),
+ Reverse(session->perspective())),
+ max_open_outgoing_streams,
+ max_open_incoming_streams) {}
+
+void UberQuicStreamIdManager::RegisterStaticStream(QuicStreamId id) {
+ if (QuicUtils::IsBidirectionalStreamId(id)) {
+ bidirectional_stream_id_manager_.RegisterStaticStream(id);
+ return;
+ }
+ unidirectional_stream_id_manager_.RegisterStaticStream(id);
+}
+
+void UberQuicStreamIdManager::SetMaxOpenOutgoingStreams(size_t max_streams) {
+ bidirectional_stream_id_manager_.SetMaxOpenOutgoingStreams(max_streams);
+ unidirectional_stream_id_manager_.SetMaxOpenOutgoingStreams(max_streams);
+}
+
+void UberQuicStreamIdManager::SetMaxOpenIncomingStreams(size_t max_streams) {
+ bidirectional_stream_id_manager_.SetMaxOpenIncomingStreams(max_streams);
+ unidirectional_stream_id_manager_.SetMaxOpenIncomingStreams(max_streams);
+}
+
+bool UberQuicStreamIdManager::CanOpenNextOutgoingBidirectionalStream() {
+ return bidirectional_stream_id_manager_.CanOpenNextOutgoingStream();
+}
+
+bool UberQuicStreamIdManager::CanOpenNextOutgoingUnidirectionalStream() {
+ return unidirectional_stream_id_manager_.CanOpenNextOutgoingStream();
+}
+
+QuicStreamId UberQuicStreamIdManager::GetNextOutgoingBidirectionalStreamId() {
+ return bidirectional_stream_id_manager_.GetNextOutgoingStreamId();
+}
+
+QuicStreamId UberQuicStreamIdManager::GetNextOutgoingUnidirectionalStreamId() {
+ return unidirectional_stream_id_manager_.GetNextOutgoingStreamId();
+}
+
+bool UberQuicStreamIdManager::MaybeIncreaseLargestPeerStreamId(
+ QuicStreamId id) {
+ if (QuicUtils::IsBidirectionalStreamId(id)) {
+ return bidirectional_stream_id_manager_.MaybeIncreaseLargestPeerStreamId(
+ id);
+ }
+ return unidirectional_stream_id_manager_.MaybeIncreaseLargestPeerStreamId(id);
+}
+
+void UberQuicStreamIdManager::OnStreamClosed(QuicStreamId id) {
+ if (QuicUtils::IsBidirectionalStreamId(id)) {
+ bidirectional_stream_id_manager_.OnStreamClosed(id);
+ return;
+ }
+ unidirectional_stream_id_manager_.OnStreamClosed(id);
+}
+
+bool UberQuicStreamIdManager::OnMaxStreamIdFrame(
+ const QuicMaxStreamIdFrame& frame) {
+ if (QuicUtils::IsBidirectionalStreamId(frame.max_stream_id)) {
+ return bidirectional_stream_id_manager_.OnMaxStreamIdFrame(frame);
+ }
+ return unidirectional_stream_id_manager_.OnMaxStreamIdFrame(frame);
+}
+
+bool UberQuicStreamIdManager::OnStreamIdBlockedFrame(
+ const QuicStreamIdBlockedFrame& frame) {
+ if (QuicUtils::IsBidirectionalStreamId(frame.stream_id)) {
+ return bidirectional_stream_id_manager_.OnStreamIdBlockedFrame(frame);
+ }
+ return unidirectional_stream_id_manager_.OnStreamIdBlockedFrame(frame);
+}
+
+bool UberQuicStreamIdManager::IsIncomingStream(QuicStreamId id) const {
+ if (QuicUtils::IsBidirectionalStreamId(id)) {
+ return bidirectional_stream_id_manager_.IsIncomingStream(id);
+ }
+ return unidirectional_stream_id_manager_.IsIncomingStream(id);
+}
+
+bool UberQuicStreamIdManager::IsAvailableStream(QuicStreamId id) const {
+ if (QuicUtils::IsBidirectionalStreamId(id)) {
+ return bidirectional_stream_id_manager_.IsAvailableStream(id);
+ }
+ return unidirectional_stream_id_manager_.IsAvailableStream(id);
+}
+
+size_t UberQuicStreamIdManager::GetMaxAllowdIncomingBidirectionalStreams()
+ const {
+ return bidirectional_stream_id_manager_.max_allowed_incoming_streams();
+}
+
+size_t UberQuicStreamIdManager::GetMaxAllowdIncomingUnidirectionalStreams()
+ const {
+ return unidirectional_stream_id_manager_.max_allowed_incoming_streams();
+}
+
+void UberQuicStreamIdManager::SetLargestPeerCreatedStreamId(
+ QuicStreamId largest_peer_created_stream_id) {
+ if (QuicUtils::IsBidirectionalStreamId(largest_peer_created_stream_id)) {
+ bidirectional_stream_id_manager_.set_largest_peer_created_stream_id(
+ largest_peer_created_stream_id);
+ return;
+ }
+ unidirectional_stream_id_manager_.set_largest_peer_created_stream_id(
+ largest_peer_created_stream_id);
+}
+
+QuicStreamId UberQuicStreamIdManager::next_outgoing_bidirectional_stream_id()
+ const {
+ return bidirectional_stream_id_manager_.next_outgoing_stream_id();
+}
+
+QuicStreamId UberQuicStreamIdManager::next_outgoing_unidirectional_stream_id()
+ const {
+ return unidirectional_stream_id_manager_.next_outgoing_stream_id();
+}
+
+QuicStreamId
+UberQuicStreamIdManager::max_allowed_outgoing_bidirectional_stream_id() const {
+ return bidirectional_stream_id_manager_.max_allowed_outgoing_stream_id();
+}
+
+QuicStreamId
+UberQuicStreamIdManager::max_allowed_outgoing_unidirectional_stream_id() const {
+ return unidirectional_stream_id_manager_.max_allowed_outgoing_stream_id();
+}
+
+size_t UberQuicStreamIdManager::max_allowed_outgoing_bidirectional_streams()
+ const {
+ return bidirectional_stream_id_manager_.max_allowed_outgoing_streams();
+}
+
+size_t UberQuicStreamIdManager::max_allowed_outgoing_unidirectional_streams()
+ const {
+ return unidirectional_stream_id_manager_.max_allowed_outgoing_streams();
+}
+
+QuicStreamId
+UberQuicStreamIdManager::actual_max_allowed_incoming_bidirectional_stream_id()
+ const {
+ return bidirectional_stream_id_manager_
+ .actual_max_allowed_incoming_stream_id();
+}
+
+QuicStreamId
+UberQuicStreamIdManager::actual_max_allowed_incoming_unidirectional_stream_id()
+ const {
+ return unidirectional_stream_id_manager_
+ .actual_max_allowed_incoming_stream_id();
+}
+
+QuicStreamId UberQuicStreamIdManager::
+ advertised_max_allowed_incoming_bidirectional_stream_id() const {
+ return bidirectional_stream_id_manager_
+ .advertised_max_allowed_incoming_stream_id();
+}
+
+QuicStreamId UberQuicStreamIdManager::
+ advertised_max_allowed_incoming_unidirectional_stream_id() const {
+ return unidirectional_stream_id_manager_
+ .advertised_max_allowed_incoming_stream_id();
+}
+
+} // namespace quic