Fix LegacyQuicStreamIdManager when CRYPTO frames are used
gfe-relnote: LegacyQuicStreamIdManager refactor protected by QUIC_VERSION_99
PiperOrigin-RevId: 255327682
Change-Id: I561dbf10e61d8733188e67ad4f3becfd449d38f6
diff --git a/quic/core/legacy_quic_stream_id_manager.cc b/quic/core/legacy_quic_stream_id_manager.cc
index 447f16d..a7ec123 100644
--- a/quic/core/legacy_quic_stream_id_manager.cc
+++ b/quic/core/legacy_quic_stream_id_manager.cc
@@ -26,9 +26,8 @@
session->perspective() == Perspective::IS_SERVER
? (QuicVersionUsesCryptoFrames(
session->connection()->transport_version())
- ? QuicUtils::GetFirstBidirectionalStreamId(
- session->connection()->transport_version(),
- Perspective::IS_CLIENT)
+ ? QuicUtils::GetInvalidStreamId(
+ session->connection()->transport_version())
: QuicUtils::GetCryptoStreamId(
session->connection()->transport_version()))
: QuicUtils::GetInvalidStreamId(
@@ -83,6 +82,11 @@
// only alternately-numbered streams.
size_t additional_available_streams =
(stream_id - largest_peer_created_stream_id_) / 2 - 1;
+ if (largest_peer_created_stream_id_ ==
+ QuicUtils::GetInvalidStreamId(
+ session_->connection()->transport_version())) {
+ additional_available_streams = (stream_id + 1) / 2 - 1;
+ }
size_t new_num_available_streams =
GetNumAvailableStreams() + additional_available_streams;
if (new_num_available_streams > MaxAvailableStreams()) {
@@ -99,8 +103,15 @@
ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET);
return false;
}
- for (QuicStreamId id = largest_peer_created_stream_id_ + 2; id < stream_id;
- id += 2) {
+ QuicStreamId first_available_stream = largest_peer_created_stream_id_ + 2;
+ if (largest_peer_created_stream_id_ ==
+ QuicUtils::GetInvalidStreamId(
+ session_->connection()->transport_version())) {
+ first_available_stream = QuicUtils::GetFirstBidirectionalStreamId(
+ session_->connection()->transport_version(),
+ QuicUtils::InvertPerspective(session_->perspective()));
+ }
+ for (QuicStreamId id = first_available_stream; id < stream_id; id += 2) {
available_streams_.insert(id);
}
largest_peer_created_stream_id_ = stream_id;