Add version guard to QuicUtil methods which are IETF QUIC only.
This includes some minor method parameter changes along the way.
No behavior change. not protected.
PiperOrigin-RevId: 317388565
Change-Id: Ia73f1028212a318d4640afa2fbdd0239e095e1f2
diff --git a/quic/core/http/quic_spdy_client_session.cc b/quic/core/http/quic_spdy_client_session.cc
index 7440edc..78b6a56 100644
--- a/quic/core/http/quic_spdy_client_session.cc
+++ b/quic/core/http/quic_spdy_client_session.cc
@@ -152,7 +152,7 @@
}
if (VersionHasIetfQuicFrames(transport_version()) &&
- QuicUtils::IsBidirectionalStreamId(id)) {
+ QuicUtils::IsBidirectionalStreamId(id, version())) {
connection()->CloseConnection(
QUIC_HTTP_SERVER_INITIATED_BIDIRECTIONAL_STREAM,
"Server created bidirectional stream.",
diff --git a/quic/core/http/quic_spdy_client_session_test.cc b/quic/core/http/quic_spdy_client_session_test.cc
index 6408667..d5481b5 100644
--- a/quic/core/http/quic_spdy_client_session_test.cc
+++ b/quic/core/http/quic_spdy_client_session_test.cc
@@ -98,6 +98,7 @@
client_session_cache_ = client_cache.get();
SetQuicReloadableFlag(quic_enable_tls_resumption, true);
SetQuicReloadableFlag(quic_enable_zero_rtt_for_tls, true);
+ SetQuicReloadableFlag(quic_fix_gquic_stream_type, true);
client_crypto_config_ = std::make_unique<QuicCryptoClientConfig>(
crypto_test_utils::ProofVerifierForTesting(), std::move(client_cache));
server_crypto_config_ = crypto_test_utils::CryptoServerConfigForTesting();
@@ -1179,8 +1180,6 @@
return;
}
- SetQuicReloadableFlag(quic_fix_gquic_stream_type, true);
-
CompleteFirstConnection();
// Create a second connection, but disable 0-RTT on the server.
diff --git a/quic/core/http/quic_spdy_session.cc b/quic/core/http/quic_spdy_session.cc
index e69a051..08f82c8 100644
--- a/quic/core/http/quic_spdy_session.cc
+++ b/quic/core/http/quic_spdy_session.cc
@@ -558,7 +558,7 @@
bool QuicSpdySession::OnPriorityUpdateForRequestStream(QuicStreamId stream_id,
int urgency) {
if (perspective() == Perspective::IS_CLIENT ||
- !QuicUtils::IsBidirectionalStreamId(stream_id) ||
+ !QuicUtils::IsBidirectionalStreamId(stream_id, version()) ||
!QuicUtils::IsClientInitiatedStreamId(transport_version(), stream_id)) {
return true;
}
@@ -657,7 +657,7 @@
void QuicSpdySession::OnHttp3GoAway(QuicStreamId stream_id) {
DCHECK_EQ(perspective(), Perspective::IS_CLIENT);
- if (!QuicUtils::IsBidirectionalStreamId(stream_id) ||
+ if (!QuicUtils::IsBidirectionalStreamId(stream_id, version()) ||
IsIncomingStream(stream_id)) {
CloseConnectionWithDetails(
QUIC_INVALID_STREAM_ID,
diff --git a/quic/core/http/quic_spdy_session_test.cc b/quic/core/http/quic_spdy_session_test.cc
index b391c06..b2bcaa3 100644
--- a/quic/core/http/quic_spdy_session_test.cc
+++ b/quic/core/http/quic_spdy_session_test.cc
@@ -251,9 +251,8 @@
} else {
TestStream* stream = new TestStream(
id, this,
- DetermineStreamType(id, connection()->transport_version(),
- perspective(), /*is_incoming=*/true,
- BIDIRECTIONAL));
+ DetermineStreamType(id, connection()->version(), perspective(),
+ /*is_incoming=*/true, BIDIRECTIONAL));
ActivateStream(QuicWrapUnique(stream));
return stream;
}
@@ -261,11 +260,10 @@
TestStream* CreateIncomingStream(PendingStream* pending) override {
QuicStreamId id = pending->id();
- TestStream* stream =
- new TestStream(pending, this,
- DetermineStreamType(
- id, connection()->transport_version(), perspective(),
- /*is_incoming=*/true, BIDIRECTIONAL));
+ TestStream* stream = new TestStream(
+ pending, this,
+ DetermineStreamType(id, connection()->version(), perspective(),
+ /*is_incoming=*/true, BIDIRECTIONAL));
ActivateStream(QuicWrapUnique(stream));
return stream;
}
diff --git a/quic/core/quic_session.cc b/quic/core/quic_session.cc
index fec3fe5..59e6cc8 100644
--- a/quic/core/quic_session.cc
+++ b/quic/core/quic_session.cc
@@ -184,8 +184,8 @@
if (UsesPendingStreams() &&
QuicUtils::GetStreamType(stream_id, perspective(),
- IsIncomingStream(stream_id)) ==
- READ_UNIDIRECTIONAL &&
+ IsIncomingStream(stream_id),
+ version()) == READ_UNIDIRECTIONAL &&
stream_map_.find(stream_id) == stream_map_.end()) {
PendingStreamOnStreamFrame(frame);
return;
@@ -232,8 +232,8 @@
// If stream_id is READ_UNIDIRECTIONAL, close the connection.
if (QuicUtils::GetStreamType(stream_id, perspective(),
- IsIncomingStream(stream_id)) ==
- READ_UNIDIRECTIONAL) {
+ IsIncomingStream(stream_id),
+ version()) == READ_UNIDIRECTIONAL) {
QUIC_DVLOG(1) << ENDPOINT
<< "Received STOP_SENDING for a read-only stream_id: "
<< stream_id << ".";
@@ -298,7 +298,7 @@
// Pending stream is currently read only. We can safely close the stream.
DCHECK_EQ(READ_UNIDIRECTIONAL,
QuicUtils::GetStreamType(pending->id(), perspective(),
- /*peer_initiated = */ true));
+ /*peer_initiated = */ true, version()));
ClosePendingStream(stream_id);
}
@@ -313,8 +313,8 @@
if (VersionHasIetfQuicFrames(transport_version()) &&
QuicUtils::GetStreamType(stream_id, perspective(),
- IsIncomingStream(stream_id)) ==
- WRITE_UNIDIRECTIONAL) {
+ IsIncomingStream(stream_id),
+ version()) == WRITE_UNIDIRECTIONAL) {
connection()->CloseConnection(
QUIC_INVALID_STREAM_ID, "Received RESET_STREAM for a write-only stream",
ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET);
@@ -327,8 +327,8 @@
if (UsesPendingStreams() &&
QuicUtils::GetStreamType(stream_id, perspective(),
- IsIncomingStream(stream_id)) ==
- READ_UNIDIRECTIONAL &&
+ IsIncomingStream(stream_id),
+ version()) == READ_UNIDIRECTIONAL &&
stream_map_.find(stream_id) == stream_map_.end()) {
PendingStreamOnRstStream(frame);
return;
@@ -467,8 +467,8 @@
if (VersionHasIetfQuicFrames(transport_version()) &&
QuicUtils::GetStreamType(stream_id, perspective(),
- IsIncomingStream(stream_id)) ==
- READ_UNIDIRECTIONAL) {
+ IsIncomingStream(stream_id),
+ version()) == READ_UNIDIRECTIONAL) {
connection()->CloseConnection(
QUIC_WINDOW_UPDATE_RECEIVED_ON_READ_UNIDIRECTIONAL_STREAM,
"WindowUpdateFrame received on READ_UNIDIRECTIONAL stream.",
@@ -782,8 +782,8 @@
QuicStreamOffset bytes_written) {
DCHECK(connection()->connected());
if (!VersionHasIetfQuicFrames(transport_version()) ||
- QuicUtils::GetStreamType(id, perspective(), IsIncomingStream(id)) !=
- READ_UNIDIRECTIONAL) {
+ QuicUtils::GetStreamType(id, perspective(), IsIncomingStream(id),
+ version()) != READ_UNIDIRECTIONAL) {
control_frame_manager_.WriteOrBufferRstStream(id, error, bytes_written);
}
}
@@ -792,8 +792,8 @@
QuicRstStreamErrorCode error) {
DCHECK(connection()->connected());
if (VersionHasIetfQuicFrames(transport_version()) &&
- QuicUtils::GetStreamType(id, perspective(), IsIncomingStream(id)) !=
- WRITE_UNIDIRECTIONAL) {
+ QuicUtils::GetStreamType(id, perspective(), IsIncomingStream(id),
+ version()) != WRITE_UNIDIRECTIONAL) {
control_frame_manager_.WriteOrBufferStopSending(error, id);
}
}
@@ -1332,7 +1332,7 @@
continue;
}
} else {
- if (QuicUtils::IsBidirectionalStreamId(id)) {
+ if (QuicUtils::IsBidirectionalStreamId(id, version())) {
continue;
}
}
@@ -1366,7 +1366,7 @@
continue;
}
} else {
- if (!QuicUtils::IsBidirectionalStreamId(id)) {
+ if (!QuicUtils::IsBidirectionalStreamId(id, version())) {
continue;
}
}
@@ -1400,7 +1400,7 @@
continue;
}
} else {
- if (!QuicUtils::IsBidirectionalStreamId(id)) {
+ if (!QuicUtils::IsBidirectionalStreamId(id, version())) {
continue;
}
}
diff --git a/quic/core/quic_session_test.cc b/quic/core/quic_session_test.cc
index c64dca3..12a4830 100644
--- a/quic/core/quic_session_test.cc
+++ b/quic/core/quic_session_test.cc
@@ -243,11 +243,10 @@
return nullptr;
}
- TestStream* stream =
- new TestStream(id, this,
- DetermineStreamType(
- id, connection()->transport_version(), perspective(),
- /*is_incoming=*/true, BIDIRECTIONAL));
+ TestStream* stream = new TestStream(
+ id, this,
+ DetermineStreamType(id, connection()->version(), perspective(),
+ /*is_incoming=*/true, BIDIRECTIONAL));
ActivateStream(QuicWrapUnique(stream));
++num_incoming_streams_created_;
return stream;
@@ -256,8 +255,7 @@
TestStream* CreateIncomingStream(PendingStream* pending) override {
QuicStreamId id = pending->id();
TestStream* stream = new TestStream(
- pending, DetermineStreamType(id, connection()->transport_version(),
- perspective(),
+ pending, DetermineStreamType(id, connection()->version(), perspective(),
/*is_incoming=*/true, BIDIRECTIONAL));
ActivateStream(QuicWrapUnique(stream));
++num_incoming_streams_created_;
@@ -438,15 +436,15 @@
void CloseStream(QuicStreamId id) {
if (VersionHasIetfQuicFrames(transport_version())) {
- if (QuicUtils::GetStreamType(id, session_.perspective(),
- session_.IsIncomingStream(id)) ==
- READ_UNIDIRECTIONAL) {
+ if (QuicUtils::GetStreamType(
+ id, session_.perspective(), session_.IsIncomingStream(id),
+ connection_->version()) == READ_UNIDIRECTIONAL) {
// Verify reset is not sent for READ_UNIDIRECTIONAL streams.
EXPECT_CALL(*connection_, SendControlFrame(_)).Times(0);
EXPECT_CALL(*connection_, OnStreamReset(_, _)).Times(0);
- } else if (QuicUtils::GetStreamType(id, session_.perspective(),
- session_.IsIncomingStream(id)) ==
- WRITE_UNIDIRECTIONAL) {
+ } else if (QuicUtils::GetStreamType(
+ id, session_.perspective(), session_.IsIncomingStream(id),
+ connection_->version()) == WRITE_UNIDIRECTIONAL) {
// Verify RESET_STREAM but not STOP_SENDING is sent for write-only
// stream.
EXPECT_CALL(*connection_, SendControlFrame(_))
diff --git a/quic/core/quic_stream.cc b/quic/core/quic_stream.cc
index 9903781..6318ac1 100644
--- a/quic/core/quic_stream.cc
+++ b/quic/core/quic_stream.cc
@@ -46,7 +46,7 @@
// Unidirectional streams (v99 only).
if (VersionHasIetfQuicFrames(version.transport_version) &&
- !QuicUtils::IsBidirectionalStreamId(stream_id)) {
+ !QuicUtils::IsBidirectionalStreamId(stream_id, version)) {
return session->config()
->GetInitialMaxStreamDataBytesUnidirectionalToSend();
}
@@ -74,7 +74,7 @@
// Unidirectional streams (v99 only).
if (VersionHasIetfQuicFrames(version.transport_version) &&
- !QuicUtils::IsBidirectionalStreamId(stream_id)) {
+ !QuicUtils::IsBidirectionalStreamId(stream_id, version)) {
if (session->config()
->HasReceivedInitialMaxStreamDataBytesUnidirectional()) {
return session->config()
@@ -359,7 +359,8 @@
type != CRYPTO
? QuicUtils::GetStreamType(id_,
session->perspective(),
- session->IsIncomingStream(id_))
+ session->IsIncomingStream(id_),
+ session->version())
: type),
perspective_(session->perspective()) {
if (type_ == WRITE_UNIDIRECTIONAL) {
diff --git a/quic/core/quic_stream_id_manager.cc b/quic/core/quic_stream_id_manager.cc
index 5cde890..528d955 100644
--- a/quic/core/quic_stream_id_manager.cc
+++ b/quic/core/quic_stream_id_manager.cc
@@ -121,7 +121,8 @@
}
void QuicStreamIdManager::OnStreamClosed(QuicStreamId stream_id) {
- DCHECK_NE(QuicUtils::IsBidirectionalStreamId(stream_id), unidirectional_);
+ DCHECK_NE(QuicUtils::IsBidirectionalStreamId(stream_id, version_),
+ unidirectional_);
if (QuicUtils::IsOutgoingStreamId(version_, stream_id, perspective_)) {
// Nothing to do for outgoing streams.
return;
@@ -159,7 +160,8 @@
const QuicStreamId stream_id,
std::string* error_details) {
// |stream_id| must be an incoming stream of the right directionality.
- DCHECK_NE(QuicUtils::IsBidirectionalStreamId(stream_id), unidirectional_);
+ DCHECK_NE(QuicUtils::IsBidirectionalStreamId(stream_id, version_),
+ unidirectional_);
DCHECK_NE(QuicUtils::IsServerInitiatedStreamId(version_.transport_version,
stream_id),
perspective_ == Perspective::IS_SERVER);
@@ -205,7 +207,7 @@
}
bool QuicStreamIdManager::IsAvailableStream(QuicStreamId id) const {
- DCHECK_NE(QuicUtils::IsBidirectionalStreamId(id), unidirectional_);
+ DCHECK_NE(QuicUtils::IsBidirectionalStreamId(id, version_), unidirectional_);
if (QuicUtils::IsOutgoingStreamId(version_, id, perspective_)) {
// Stream IDs under next_ougoing_stream_id_ are either open or previously
// open but now closed.
diff --git a/quic/core/quic_utils.cc b/quic/core/quic_utils.cc
index 72d422b..de43503 100644
--- a/quic/core/quic_utils.cc
+++ b/quic/core/quic_utils.cc
@@ -428,15 +428,21 @@
}
// static
-bool QuicUtils::IsBidirectionalStreamId(QuicStreamId id) {
+bool QuicUtils::IsBidirectionalStreamId(QuicStreamId id,
+ ParsedQuicVersion version) {
+ DCHECK(!GetQuicReloadableFlag(quic_fix_gquic_stream_type) ||
+ version.HasIetfQuicFrames());
return id % 4 < 2;
}
// static
StreamType QuicUtils::GetStreamType(QuicStreamId id,
Perspective perspective,
- bool peer_initiated) {
- if (IsBidirectionalStreamId(id)) {
+ bool peer_initiated,
+ ParsedQuicVersion version) {
+ DCHECK(!GetQuicReloadableFlag(quic_fix_gquic_stream_type) ||
+ version.HasIetfQuicFrames());
+ if (IsBidirectionalStreamId(id, version)) {
return BIDIRECTIONAL;
}
diff --git a/quic/core/quic_utils.h b/quic/core/quic_utils.h
index e470e6f..9e190e0 100644
--- a/quic/core/quic_utils.h
+++ b/quic/core/quic_utils.h
@@ -146,14 +146,16 @@
// Returns true if |id| is considered as bidirectional stream ID. Only used in
// v99.
- static bool IsBidirectionalStreamId(QuicStreamId id);
+ static bool IsBidirectionalStreamId(QuicStreamId id,
+ ParsedQuicVersion version);
// Returns stream type. Either |perspective| or |peer_initiated| would be
// enough together with |id|. This method enforces that the three parameters
// are consistent. Only used in v99.
static StreamType GetStreamType(QuicStreamId id,
Perspective perspective,
- bool peer_initiated);
+ bool peer_initiated,
+ ParsedQuicVersion version);
// Returns the delta between consecutive stream IDs of the same type.
static QuicStreamId StreamIdDelta(QuicTransportVersion version);
diff --git a/quic/core/uber_quic_stream_id_manager.cc b/quic/core/uber_quic_stream_id_manager.cc
index 64cbd58..2f33594 100644
--- a/quic/core/uber_quic_stream_id_manager.cc
+++ b/quic/core/uber_quic_stream_id_manager.cc
@@ -17,7 +17,8 @@
QuicStreamCount max_open_outgoing_unidirectional_streams,
QuicStreamCount max_open_incoming_bidirectional_streams,
QuicStreamCount max_open_incoming_unidirectional_streams)
- : bidirectional_stream_id_manager_(delegate,
+ : version_(version),
+ bidirectional_stream_id_manager_(delegate,
/*unidirectional=*/false,
perspective,
version,
@@ -69,7 +70,7 @@
bool UberQuicStreamIdManager::MaybeIncreaseLargestPeerStreamId(
QuicStreamId id,
std::string* error_details) {
- if (QuicUtils::IsBidirectionalStreamId(id)) {
+ if (QuicUtils::IsBidirectionalStreamId(id, version_)) {
return bidirectional_stream_id_manager_.MaybeIncreaseLargestPeerStreamId(
id, error_details);
}
@@ -78,7 +79,7 @@
}
void UberQuicStreamIdManager::OnStreamClosed(QuicStreamId id) {
- if (QuicUtils::IsBidirectionalStreamId(id)) {
+ if (QuicUtils::IsBidirectionalStreamId(id, version_)) {
bidirectional_stream_id_manager_.OnStreamClosed(id);
return;
}
@@ -97,7 +98,7 @@
}
bool UberQuicStreamIdManager::IsAvailableStream(QuicStreamId id) const {
- if (QuicUtils::IsBidirectionalStreamId(id)) {
+ if (QuicUtils::IsBidirectionalStreamId(id, version_)) {
return bidirectional_stream_id_manager_.IsAvailableStream(id);
}
return unidirectional_stream_id_manager_.IsAvailableStream(id);
diff --git a/quic/core/uber_quic_stream_id_manager.h b/quic/core/uber_quic_stream_id_manager.h
index aafe0b6..0e03b42 100644
--- a/quic/core/uber_quic_stream_id_manager.h
+++ b/quic/core/uber_quic_stream_id_manager.h
@@ -94,6 +94,7 @@
friend class test::QuicSessionPeer;
friend class test::UberQuicStreamIdManagerPeer;
+ ParsedQuicVersion version_;
// Manages stream IDs of bidirectional streams.
QuicStreamIdManager bidirectional_stream_id_manager_;
diff --git a/quic/quic_transport/quic_transport_stream.cc b/quic/quic_transport/quic_transport_stream.cc
index 401ae7e..0fb988a 100644
--- a/quic/quic_transport/quic_transport_stream.cc
+++ b/quic/quic_transport/quic_transport_stream.cc
@@ -23,7 +23,8 @@
/*is_static=*/false,
QuicUtils::GetStreamType(id,
session->connection()->perspective(),
- session->IsIncomingStream(id))),
+ session->IsIncomingStream(id),
+ session->version())),
session_interface_(session_interface) {}
size_t QuicTransportStream::Read(char* buffer, size_t buffer_size) {
diff --git a/quic/test_tools/quic_test_utils.cc b/quic/test_tools/quic_test_utils.cc
index 61d4ec6..ce2f7b8 100644
--- a/quic/test_tools/quic_test_utils.cc
+++ b/quic/test_tools/quic_test_utils.cc
@@ -1256,12 +1256,12 @@
}
StreamType DetermineStreamType(QuicStreamId id,
- QuicTransportVersion version,
+ ParsedQuicVersion version,
Perspective perspective,
bool is_incoming,
StreamType default_type) {
- return VersionHasIetfQuicFrames(version)
- ? QuicUtils::GetStreamType(id, perspective, is_incoming)
+ return version.HasIetfQuicFrames()
+ ? QuicUtils::GetStreamType(id, perspective, is_incoming, version)
: default_type;
}
diff --git a/quic/test_tools/quic_test_utils.h b/quic/test_tools/quic_test_utils.h
index c205b95..f4f2aeb 100644
--- a/quic/test_tools/quic_test_utils.h
+++ b/quic/test_tools/quic_test_utils.h
@@ -1620,7 +1620,7 @@
int n);
StreamType DetermineStreamType(QuicStreamId id,
- QuicTransportVersion version,
+ ParsedQuicVersion version,
Perspective perspective,
bool is_incoming,
StreamType default_type);
diff --git a/quic/tools/quic_simple_server_session.cc b/quic/tools/quic_simple_server_session.cc
index 595fda7..387b313 100644
--- a/quic/tools/quic_simple_server_session.cc
+++ b/quic/tools/quic_simple_server_session.cc
@@ -158,7 +158,7 @@
// index for it in promised_streams_ can be calculated.
QuicStreamId next_stream_id = next_outgoing_unidirectional_stream_id();
if (VersionHasIetfQuicFrames(transport_version())) {
- DCHECK(!QuicUtils::IsBidirectionalStreamId(frame.stream_id));
+ DCHECK(!QuicUtils::IsBidirectionalStreamId(frame.stream_id, version()));
}
DCHECK_GE(frame.stream_id, next_stream_id);
size_t index = (frame.stream_id - next_stream_id) /