Allow changing max_packet_size from QuicConfig
gfe-relnote: add max_packet_size config, protected by disabled TLS flag
PiperOrigin-RevId: 279780722
Change-Id: I963c00a3023e83fc0c0a4fa6432a99b83cb97c18
diff --git a/quic/core/quic_config.cc b/quic/core/quic_config.cc
index a3840ec..135fb64 100644
--- a/quic/core/quic_config.cc
+++ b/quic/core/quic_config.cc
@@ -420,7 +420,8 @@
stateless_reset_token_(kSRST, PRESENCE_OPTIONAL),
max_incoming_unidirectional_streams_(kMIUS, PRESENCE_OPTIONAL),
max_ack_delay_ms_(kMAD, PRESENCE_OPTIONAL),
- ack_delay_exponent_(kADE, PRESENCE_OPTIONAL) {
+ ack_delay_exponent_(kADE, PRESENCE_OPTIONAL),
+ max_packet_size_(0, PRESENCE_OPTIONAL) {
SetDefaults();
}
@@ -579,6 +580,22 @@
return ack_delay_exponent_.GetReceivedValue();
}
+void QuicConfig::SetMaxPacketSizeToSend(uint32_t max_packet_size) {
+ max_packet_size_.SetSendValue(max_packet_size);
+}
+
+uint32_t QuicConfig::GetMaxPacketSizeToSend() const {
+ return max_packet_size_.GetSendValue();
+}
+
+bool QuicConfig::HasReceivedMaxPacketSize() const {
+ return max_packet_size_.HasReceivedValue();
+}
+
+uint32_t QuicConfig::ReceivedMaxPacketSize() const {
+ return max_packet_size_.GetReceivedValue();
+}
+
bool QuicConfig::HasSetBytesForConnectionIdToSend() const {
return bytes_for_connection_id_.HasSendValue();
}
@@ -806,6 +823,7 @@
SetMaxAckDelayToSendMs(kDefaultDelayedAckTimeMs);
SetSupportMaxHeaderListSize();
SetAckDelayExponentToSend(kDefaultAckDelayExponent);
+ SetMaxPacketSizeToSend(kMaxIncomingPacketSize);
}
void QuicConfig::ToHandshakeMessage(
@@ -921,7 +939,7 @@
sizeof(stateless_reset_token));
}
- params->max_packet_size.set_value(kMaxIncomingPacketSize);
+ params->max_packet_size.set_value(GetMaxPacketSizeToSend());
params->initial_max_data.set_value(
GetInitialSessionFlowControlWindowToSend());
// The max stream data bidirectional transport parameters can be either local
@@ -1008,10 +1026,13 @@
stateless_reset_token_.SetReceivedValue(stateless_reset_token);
}
- if (params.max_packet_size.value() < kMaxOutgoingPacketSize) {
- // TODO(dschinazi) act on this.
- QUIC_DLOG(ERROR) << "Ignoring peer's requested max packet size of "
- << params.max_packet_size.value();
+ if (params.max_packet_size.IsValid()) {
+ max_packet_size_.SetReceivedValue(params.max_packet_size.value());
+ if (ReceivedMaxPacketSize() < kMaxOutgoingPacketSize) {
+ // TODO(dschinazi) act on this.
+ QUIC_DLOG(ERROR) << "Ignoring peer's requested max packet size of "
+ << ReceivedMaxPacketSize();
+ }
}
initial_session_flow_control_window_bytes_.SetReceivedValue(
diff --git a/quic/core/quic_config.h b/quic/core/quic_config.h
index ecece2a..357344e 100644
--- a/quic/core/quic_config.h
+++ b/quic/core/quic_config.h
@@ -456,6 +456,12 @@
bool HasReceivedAckDelayExponent() const;
uint32_t ReceivedAckDelayExponent() const;
+ // IETF QUIC max_packet_size transport parameter.
+ void SetMaxPacketSizeToSend(uint32_t max_packet_size);
+ uint32_t GetMaxPacketSizeToSend() const;
+ bool HasReceivedMaxPacketSize() const;
+ uint32_t ReceivedMaxPacketSize() const;
+
bool negotiated() const;
void SetCreateSessionTagIndicators(QuicTagVector tags);
@@ -573,6 +579,9 @@
// to serialize frames and this node uses to deserialize them.
QuicFixedUint32 ack_delay_exponent_;
+ // max_packet_size IEFT QUIC transport parameter.
+ QuicFixedUint32 max_packet_size_;
+
// Custom transport parameters that can be sent and received in the TLS
// handshake.
TransportParameters::ParameterMap custom_transport_parameters_to_send_;
diff --git a/quic/core/quic_config_test.cc b/quic/core/quic_config_test.cc
index e0eb304..882516e 100644
--- a/quic/core/quic_config_test.cc
+++ b/quic/core/quic_config_test.cc
@@ -21,6 +21,8 @@
namespace test {
namespace {
+const uint32_t kMaxPacketSizeForTest = 1234;
+
class QuicConfigTest : public QuicTestWithParam<QuicTransportVersion> {
protected:
QuicConfig config_;
@@ -47,6 +49,8 @@
EXPECT_FALSE(
config_.HasReceivedInitialMaxStreamDataBytesOutgoingBidirectional());
EXPECT_FALSE(config_.HasReceivedInitialMaxStreamDataBytesUnidirectional());
+ EXPECT_EQ(kMaxIncomingPacketSize, config_.GetMaxPacketSizeToSend());
+ EXPECT_FALSE(config_.HasReceivedMaxPacketSize());
}
TEST_P(QuicConfigTest, AutoSetIetfFlowControl) {
@@ -391,6 +395,7 @@
3 * kMinimumFlowControlSendWindow);
config_.SetInitialMaxStreamDataBytesUnidirectionalToSend(
4 * kMinimumFlowControlSendWindow);
+ config_.SetMaxPacketSizeToSend(kMaxPacketSizeForTest);
TransportParameters params;
config_.FillTransportParameters(¶ms);
@@ -404,6 +409,8 @@
EXPECT_EQ(static_cast<uint64_t>(kMaximumIdleTimeoutSecs * 1000),
params.idle_timeout_milliseconds.value());
+
+ EXPECT_EQ(kMaxPacketSizeForTest, params.max_packet_size.value());
}
TEST_P(QuicConfigTest, ProcessTransportParametersServer) {
@@ -415,6 +422,7 @@
3 * kMinimumFlowControlSendWindow);
params.initial_max_stream_data_uni.set_value(4 *
kMinimumFlowControlSendWindow);
+ params.max_packet_size.set_value(kMaxPacketSizeForTest);
std::string error_details;
EXPECT_EQ(QUIC_NO_ERROR,
@@ -433,6 +441,9 @@
ASSERT_TRUE(config_.HasReceivedInitialMaxStreamDataBytesUnidirectional());
EXPECT_EQ(4 * kMinimumFlowControlSendWindow,
config_.ReceivedInitialMaxStreamDataBytesUnidirectional());
+
+ ASSERT_TRUE(config_.HasReceivedMaxPacketSize());
+ EXPECT_EQ(kMaxPacketSizeForTest, config_.ReceivedMaxPacketSize());
}
} // namespace