gfe-relnote: Honor IETF QUIC initial flow control limits when using TLS. Protected by disabled --gfe2_reloadable_flag_quic_supports_tls_handshake
PiperOrigin-RevId: 268605601
Change-Id: If7e0d3e59a30197d4bc9c681b988bd7251074395
diff --git a/quic/core/quic_stream.cc b/quic/core/quic_stream.cc
index 91ba580..43b8db8 100644
--- a/quic/core/quic_stream.cc
+++ b/quic/core/quic_stream.cc
@@ -24,13 +24,68 @@
namespace {
-size_t GetInitialStreamFlowControlWindowToSend(QuicSession* session) {
- return session->config()->GetInitialStreamFlowControlWindowToSend();
+size_t GetInitialStreamFlowControlWindowToSend(QuicSession* session,
+ QuicStreamId stream_id) {
+ ParsedQuicVersion version = session->connection()->version();
+ if (version.handshake_protocol != PROTOCOL_TLS1_3) {
+ return session->config()->GetInitialStreamFlowControlWindowToSend();
+ }
+
+ // Unidirectional streams (v99 only).
+ if (VersionHasIetfQuicFrames(version.transport_version) &&
+ !QuicUtils::IsBidirectionalStreamId(stream_id)) {
+ return session->config()
+ ->GetInitialMaxStreamDataBytesUnidirectionalToSend();
+ }
+
+ if (session->perspective() == Perspective::IS_SERVER &&
+ QuicUtils::IsServerInitiatedStreamId(version.transport_version,
+ stream_id)) {
+ return session->config()
+ ->GetInitialMaxStreamDataBytesOutgoingBidirectionalToSend();
+ }
+
+ return session->config()
+ ->GetInitialMaxStreamDataBytesIncomingBidirectionalToSend();
}
-size_t GetReceivedFlowControlWindow(QuicSession* session) {
- if (session->config()->HasReceivedInitialStreamFlowControlWindowBytes()) {
- return session->config()->ReceivedInitialStreamFlowControlWindowBytes();
+size_t GetReceivedFlowControlWindow(QuicSession* session,
+ QuicStreamId stream_id) {
+ ParsedQuicVersion version = session->connection()->version();
+ if (version.handshake_protocol != PROTOCOL_TLS1_3) {
+ if (session->config()->HasReceivedInitialStreamFlowControlWindowBytes()) {
+ return session->config()->ReceivedInitialStreamFlowControlWindowBytes();
+ }
+
+ return kDefaultFlowControlSendWindow;
+ }
+
+ // Unidirectional streams (v99 only).
+ if (VersionHasIetfQuicFrames(version.transport_version) &&
+ !QuicUtils::IsBidirectionalStreamId(stream_id)) {
+ if (session->config()
+ ->HasReceivedInitialMaxStreamDataBytesUnidirectional()) {
+ return session->config()
+ ->ReceivedInitialMaxStreamDataBytesUnidirectional();
+ }
+ return kDefaultFlowControlSendWindow;
+ }
+
+ if (session->perspective() == Perspective::IS_SERVER &&
+ QuicUtils::IsServerInitiatedStreamId(version.transport_version,
+ stream_id)) {
+ if (session->config()
+ ->HasReceivedInitialMaxStreamDataBytesIncomingBidirectional()) {
+ return session->config()
+ ->ReceivedInitialMaxStreamDataBytesIncomingBidirectional();
+ }
+ return kDefaultFlowControlSendWindow;
+ }
+
+ if (session->config()
+ ->HasReceivedInitialMaxStreamDataBytesOutgoingBidirectional()) {
+ return session->config()
+ ->ReceivedInitialMaxStreamDataBytesOutgoingBidirectional();
}
return kDefaultFlowControlSendWindow;
@@ -50,8 +105,8 @@
flow_controller_(session,
id,
/*is_connection_flow_controller*/ false,
- GetReceivedFlowControlWindow(session),
- GetInitialStreamFlowControlWindowToSend(session),
+ GetReceivedFlowControlWindow(session, id),
+ GetInitialStreamFlowControlWindowToSend(session, id),
kStreamReceiveWindowLimit,
session_->flow_controller()->auto_tune_receive_window(),
session_->flow_controller()),
@@ -206,8 +261,8 @@
return QuicFlowController(
session, id,
/*is_connection_flow_controller*/ false,
- GetReceivedFlowControlWindow(session),
- GetInitialStreamFlowControlWindowToSend(session),
+ GetReceivedFlowControlWindow(session, id),
+ GetInitialStreamFlowControlWindowToSend(session, id),
kStreamReceiveWindowLimit,
session->flow_controller()->auto_tune_receive_window(),
session->flow_controller());