Adding comments and DCHECKS in the validation logic of configuring QuicStream's flow controller.
No behavior change. not protected.
PiperOrigin-RevId: 326348719
Change-Id: Id21245f96e7561e3d4ddd88e7bf132eb2ff49e40
diff --git a/quic/core/quic_stream.cc b/quic/core/quic_stream.cc
index c13c05c..5fd6358 100644
--- a/quic/core/quic_stream.cc
+++ b/quic/core/quic_stream.cc
@@ -939,31 +939,37 @@
return false;
}
- if (was_zero_rtt_rejected && new_offset < flow_controller_->bytes_sent()) {
- QUIC_BUG_IF(perspective_ == Perspective::IS_SERVER)
- << "Server streams' flow control should never be configured twice.";
- OnUnrecoverableError(
- QUIC_ZERO_RTT_UNRETRANSMITTABLE,
- quiche::QuicheStrCat(
- "Server rejected 0-RTT, aborting because new stream max data ",
- new_offset, " for stream ", id_,
- " is less than currently used: ", flow_controller_->bytes_sent()));
- return false;
- }
-
- if (session()->version().AllowsLowFlowControlLimits() &&
- new_offset < flow_controller_->send_window_offset()) {
- QUIC_BUG_IF(perspective_ == Perspective::IS_SERVER)
- << "Server streams' flow control should never be configured twice.";
- OnUnrecoverableError(
- was_zero_rtt_rejected ? QUIC_ZERO_RTT_REJECTION_LIMIT_REDUCED
- : QUIC_ZERO_RTT_RESUMPTION_LIMIT_REDUCED,
- quiche::QuicheStrCat(
- was_zero_rtt_rejected ? "Server rejected 0-RTT, aborting because "
- : "",
- "new stream max data ", new_offset, " decreases current limit: ",
- flow_controller_->send_window_offset()));
- return false;
+ // The validation code below is for QUIC with TLS only.
+ if (new_offset < flow_controller_->send_window_offset()) {
+ DCHECK(session()->version().UsesTls());
+ if (was_zero_rtt_rejected && new_offset < flow_controller_->bytes_sent()) {
+ // The client is given flow control window lower than what's written in
+ // 0-RTT. This QUIC implementation is unable to retransmit them.
+ QUIC_BUG_IF(perspective_ == Perspective::IS_SERVER)
+ << "Server streams' flow control should never be configured twice.";
+ OnUnrecoverableError(
+ QUIC_ZERO_RTT_UNRETRANSMITTABLE,
+ quiche::QuicheStrCat(
+ "Server rejected 0-RTT, aborting because new stream max data ",
+ new_offset, " for stream ", id_, " is less than currently used: ",
+ flow_controller_->bytes_sent()));
+ return false;
+ } else if (session()->version().AllowsLowFlowControlLimits()) {
+ // In IETF QUIC, if the client receives flow control limit lower than what
+ // was resumed from 0-RTT, depending on 0-RTT status, it's either the
+ // peer's fault or our implementation's fault.
+ QUIC_BUG_IF(perspective_ == Perspective::IS_SERVER)
+ << "Server streams' flow control should never be configured twice.";
+ OnUnrecoverableError(
+ was_zero_rtt_rejected ? QUIC_ZERO_RTT_REJECTION_LIMIT_REDUCED
+ : QUIC_ZERO_RTT_RESUMPTION_LIMIT_REDUCED,
+ quiche::QuicheStrCat(
+ was_zero_rtt_rejected ? "Server rejected 0-RTT, aborting because "
+ : "",
+ "new stream max data ", new_offset, " decreases current limit: ",
+ flow_controller_->send_window_offset()));
+ return false;
+ }
}
if (flow_controller_->UpdateSendWindowOffset(new_offset)) {