blob: 8278f2c84818399a1ac304a9c77a03b97d175c12 [file] [log] [blame]
// 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/quic/core/uber_quic_stream_id_manager.h"
#include "net/third_party/quic/core/quic_session.h"
#include "net/third_party/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