Deprecate gfe2_restart_flag_quic_platform_tos_sockopt and protect its changes with gfe2_restart_flag_quic_support_ect1.
quic_support_ect1 is blocked by a bug anyway, but this consolidates all the flags controlling send-side ECN behavior into one.
Protected by FLAGS_quic_restart_flag_quic_support_ect1.
PiperOrigin-RevId: 588522232
diff --git a/quiche/quic/core/batch_writer/quic_gso_batch_writer.cc b/quiche/quic/core/batch_writer/quic_gso_batch_writer.cc
index 14ef594..6f45894 100644
--- a/quiche/quic/core/batch_writer/quic_gso_batch_writer.cc
+++ b/quiche/quic/core/batch_writer/quic_gso_batch_writer.cc
@@ -146,8 +146,8 @@
if (release_time != 0) {
*hdr->GetNextCmsgData<uint64_t>(SOL_SOCKET, SO_TXTIME) = release_time;
}
- if (ecn_codepoint != ECN_NOT_ECT && GetQuicReloadableFlag(quic_send_ect1)) {
- QUIC_RELOADABLE_FLAG_COUNT_N(quic_send_ect1, 8, 8);
+ if (ecn_codepoint != ECN_NOT_ECT && GetQuicRestartFlag(quic_support_ect1)) {
+ QUIC_RESTART_FLAG_COUNT_N(quic_support_ect1, 8, 9);
if (self_address.IsIPv4()) {
*hdr->GetNextCmsgData<int>(IPPROTO_IP, IP_TOS) =
static_cast<int>(ecn_codepoint);
diff --git a/quiche/quic/core/batch_writer/quic_gso_batch_writer.h b/quiche/quic/core/batch_writer/quic_gso_batch_writer.h
index 4ca18e4..b409bf5 100644
--- a/quiche/quic/core/batch_writer/quic_gso_batch_writer.h
+++ b/quiche/quic/core/batch_writer/quic_gso_batch_writer.h
@@ -22,7 +22,7 @@
bool SupportsReleaseTime() const final { return supports_release_time_; }
bool SupportsEcn() const override {
- return GetQuicReloadableFlag(quic_send_ect1);
+ return GetQuicRestartFlag(quic_support_ect1);
}
CanBatchResult CanBatch(const char* buffer, size_t buf_len,
diff --git a/quiche/quic/core/http/end_to_end_test.cc b/quiche/quic/core/http/end_to_end_test.cc
index 7eafa6c..656252d 100644
--- a/quiche/quic/core/http/end_to_end_test.cc
+++ b/quiche/quic/core/http/end_to_end_test.cc
@@ -7210,7 +7210,7 @@
TEST_P(EndToEndTest, ServerReportsNotEct) {
// Client connects using not-ECT.
- SetQuicReloadableFlag(quic_send_ect1, true);
+ SetQuicRestartFlag(quic_support_ect1, true);
ASSERT_TRUE(Initialize());
QuicConnection* client_connection = GetClientConnection();
QuicConnectionPeer::DisableEcnCodepointValidation(client_connection);
@@ -7230,7 +7230,7 @@
TEST_P(EndToEndTest, ServerReportsEct0) {
// Client connects using not-ECT.
- SetQuicReloadableFlag(quic_send_ect1, true);
+ SetQuicRestartFlag(quic_support_ect1, true);
ASSERT_TRUE(Initialize());
QuicConnection* client_connection = GetClientConnection();
QuicConnectionPeer::DisableEcnCodepointValidation(client_connection);
@@ -7255,7 +7255,7 @@
TEST_P(EndToEndTest, ServerReportsEct1) {
// Client connects using not-ECT.
- SetQuicReloadableFlag(quic_send_ect1, true);
+ SetQuicRestartFlag(quic_support_ect1, true);
ASSERT_TRUE(Initialize());
QuicConnection* client_connection = GetClientConnection();
QuicConnectionPeer::DisableEcnCodepointValidation(client_connection);
@@ -7280,7 +7280,7 @@
TEST_P(EndToEndTest, ServerReportsCe) {
// Client connects using not-ECT.
- SetQuicReloadableFlag(quic_send_ect1, true);
+ SetQuicRestartFlag(quic_support_ect1, true);
ASSERT_TRUE(Initialize());
QuicConnection* client_connection = GetClientConnection();
QuicConnectionPeer::DisableEcnCodepointValidation(client_connection);
@@ -7304,7 +7304,7 @@
}
TEST_P(EndToEndTest, ClientReportsEct1) {
- SetQuicReloadableFlag(quic_send_ect1, true);
+ SetQuicRestartFlag(quic_support_ect1, true);
ASSERT_TRUE(Initialize());
// Wait for handshake to complete, so that we can manipulate the server
// connection without race conditions.
diff --git a/quiche/quic/core/quic_connection.cc b/quiche/quic/core/quic_connection.cc
index 9b061a4..4ada6eb 100644
--- a/quiche/quic/core/quic_connection.cc
+++ b/quiche/quic/core/quic_connection.cc
@@ -3958,18 +3958,18 @@
}
void QuicConnection::OnInFlightEcnPacketAcked() {
- QUIC_BUG_IF(quic_bug_518619343_01, !GetQuicReloadableFlag(quic_send_ect1))
+ QUIC_BUG_IF(quic_bug_518619343_01, !GetQuicRestartFlag(quic_support_ect1))
<< "Unexpected call to OnInFlightEcnPacketAcked()";
// Only packets on the default path are in-flight.
if (!default_path_.ecn_marked_packet_acked) {
QUIC_DVLOG(1) << ENDPOINT << "First ECT packet acked on active path.";
- QUIC_RELOADABLE_FLAG_COUNT_N(quic_send_ect1, 2, 8);
+ QUIC_RESTART_FLAG_COUNT_N(quic_support_ect1, 2, 9);
default_path_.ecn_marked_packet_acked = true;
}
}
void QuicConnection::OnInvalidEcnFeedback() {
- QUIC_BUG_IF(quic_bug_518619343_02, !GetQuicReloadableFlag(quic_send_ect1))
+ QUIC_BUG_IF(quic_bug_518619343_02, !GetQuicRestartFlag(quic_support_ect1))
<< "Unexpected call to OnInvalidEcnFeedback().";
if (disable_ecn_codepoint_validation_) {
// In some tests, senders may send ECN marks in patterns that are not
@@ -7362,10 +7362,10 @@
}
bool QuicConnection::set_ecn_codepoint(QuicEcnCodepoint ecn_codepoint) {
- if (!GetQuicReloadableFlag(quic_send_ect1)) {
+ if (!GetQuicRestartFlag(quic_support_ect1)) {
return false;
}
- QUIC_RELOADABLE_FLAG_COUNT_N(quic_send_ect1, 3, 8);
+ QUIC_RESTART_FLAG_COUNT_N(quic_support_ect1, 3, 9);
if (disable_ecn_codepoint_validation_ || ecn_codepoint == ECN_NOT_ECT) {
packet_writer_params_.ecn_codepoint = ecn_codepoint;
return true;
diff --git a/quiche/quic/core/quic_connection_test.cc b/quiche/quic/core/quic_connection_test.cc
index 80c93d3..71a60a4 100644
--- a/quiche/quic/core/quic_connection_test.cc
+++ b/quiche/quic/core/quic_connection_test.cc
@@ -17253,7 +17253,7 @@
}
TEST_P(QuicConnectionTest, EcnCodepointsRejected) {
- SetQuicReloadableFlag(quic_send_ect1, true);
+ SetQuicRestartFlag(quic_support_ect1, true);
for (QuicEcnCodepoint ecn : {ECN_NOT_ECT, ECN_ECT0, ECN_ECT1, ECN_CE}) {
if (ecn == ECN_ECT0) {
EXPECT_CALL(*send_algorithm_, EnableECT0()).WillOnce(Return(false));
@@ -17273,7 +17273,7 @@
}
TEST_P(QuicConnectionTest, EcnCodepointsAccepted) {
- SetQuicReloadableFlag(quic_send_ect1, true);
+ SetQuicRestartFlag(quic_support_ect1, true);
for (QuicEcnCodepoint ecn : {ECN_NOT_ECT, ECN_ECT0, ECN_ECT1, ECN_CE}) {
if (ecn == ECN_ECT0) {
EXPECT_CALL(*send_algorithm_, EnableECT0()).WillOnce(Return(true));
@@ -17297,7 +17297,7 @@
}
TEST_P(QuicConnectionTest, EcnCodepointsRejectedIfFlagIsFalse) {
- SetQuicReloadableFlag(quic_send_ect1, false);
+ SetQuicRestartFlag(quic_support_ect1, false);
for (QuicEcnCodepoint ecn : {ECN_NOT_ECT, ECN_ECT0, ECN_ECT1, ECN_CE}) {
EXPECT_FALSE(connection_.set_ecn_codepoint(ecn));
EXPECT_CALL(connection_, OnSerializedPacket(_));
@@ -17308,7 +17308,7 @@
}
TEST_P(QuicConnectionTest, EcnValidationDisabled) {
- SetQuicReloadableFlag(quic_send_ect1, true);
+ SetQuicRestartFlag(quic_support_ect1, true);
QuicConnectionPeer::DisableEcnCodepointValidation(&connection_);
for (QuicEcnCodepoint ecn : {ECN_NOT_ECT, ECN_ECT0, ECN_ECT1, ECN_CE}) {
EXPECT_TRUE(connection_.set_ecn_codepoint(ecn));
@@ -17320,7 +17320,7 @@
}
TEST_P(QuicConnectionTest, RtoDisablesEcnMarking) {
- SetQuicReloadableFlag(quic_send_ect1, true);
+ SetQuicRestartFlag(quic_support_ect1, true);
EXPECT_CALL(*send_algorithm_, EnableECT1()).WillOnce(Return(true));
EXPECT_TRUE(connection_.set_ecn_codepoint(ECN_ECT1));
QuicPacketCreatorPeer::SetPacketNumber(
@@ -17336,23 +17336,16 @@
}
TEST_P(QuicConnectionTest, RtoDoesntDisableEcnMarkingIfEcnAcked) {
- SetQuicReloadableFlag(quic_send_ect1, true);
+ SetQuicRestartFlag(quic_support_ect1, true);
EXPECT_CALL(*send_algorithm_, EnableECT1()).WillOnce(Return(true));
EXPECT_TRUE(connection_.set_ecn_codepoint(ECN_ECT1));
QuicPacketCreatorPeer::SetPacketNumber(
QuicConnectionPeer::GetPacketCreator(&connection_), 1);
- if (!GetQuicReloadableFlag(quic_send_ect1)) {
- EXPECT_QUIC_BUG(connection_.OnInFlightEcnPacketAcked(),
- "Unexpected call to OnInFlightEcnPacketAcked\\(\\)");
- return;
- } else {
- connection_.OnInFlightEcnPacketAcked();
- }
+ connection_.OnInFlightEcnPacketAcked();
SendPing();
// Because an ECN packet was acked, PTOs have no effect on ECN settings.
connection_.OnRetransmissionTimeout();
- QuicEcnCodepoint expected_codepoint =
- GetQuicReloadableFlag(quic_send_ect1) ? ECN_ECT1 : ECN_NOT_ECT;
+ QuicEcnCodepoint expected_codepoint = ECN_ECT1;
EXPECT_EQ(writer_->last_ecn_sent(), expected_codepoint);
EXPECT_EQ(connection_.ecn_codepoint(), expected_codepoint);
connection_.OnRetransmissionTimeout();
@@ -17361,22 +17354,16 @@
}
TEST_P(QuicConnectionTest, InvalidFeedbackCancelsEcn) {
- SetQuicReloadableFlag(quic_send_ect1, true);
+ SetQuicRestartFlag(quic_support_ect1, true);
EXPECT_CALL(*send_algorithm_, EnableECT1()).WillOnce(Return(true));
EXPECT_TRUE(connection_.set_ecn_codepoint(ECN_ECT1));
EXPECT_EQ(connection_.ecn_codepoint(), ECN_ECT1);
- if (!GetQuicReloadableFlag(quic_send_ect1)) {
- EXPECT_QUIC_BUG(connection_.OnInvalidEcnFeedback(),
- "Unexpected call to OnInvalidEcnFeedback\\(\\)\\.");
- return;
- } else {
- connection_.OnInvalidEcnFeedback();
- }
+ connection_.OnInvalidEcnFeedback();
EXPECT_EQ(connection_.ecn_codepoint(), ECN_NOT_ECT);
}
TEST_P(QuicConnectionTest, StateMatchesSentEcn) {
- SetQuicReloadableFlag(quic_send_ect1, true);
+ SetQuicRestartFlag(quic_support_ect1, true);
EXPECT_CALL(*send_algorithm_, EnableECT1()).WillOnce(Return(true));
EXPECT_TRUE(connection_.set_ecn_codepoint(ECN_ECT1));
SendPing();
@@ -17392,7 +17379,7 @@
if (!connection_.version().CanSendCoalescedPackets()) {
return;
}
- SetQuicReloadableFlag(quic_send_ect1, true);
+ SetQuicRestartFlag(quic_support_ect1, true);
EXPECT_CALL(*send_algorithm_, EnableECT1()).WillOnce(Return(true));
EXPECT_TRUE(connection_.set_ecn_codepoint(ECN_ECT1));
// All these steps are necessary to send an INITIAL ping and save it to be
@@ -17416,7 +17403,7 @@
}
TEST_P(QuicConnectionTest, BufferedPacketRetainsOldEcn) {
- SetQuicReloadableFlag(quic_send_ect1, true);
+ SetQuicRestartFlag(quic_support_ect1, true);
EXPECT_CALL(*send_algorithm_, EnableECT1()).WillOnce(Return(true));
EXPECT_TRUE(connection_.set_ecn_codepoint(ECN_ECT1));
writer_->SetWriteBlocked();
@@ -17430,7 +17417,7 @@
}
TEST_P(QuicConnectionTest, RejectEcnIfWriterDoesNotSupport) {
- SetQuicReloadableFlag(quic_send_ect1, true);
+ SetQuicRestartFlag(quic_support_ect1, true);
MockPacketWriter mock_writer;
QuicConnectionPeer::SetWriter(&connection_, &mock_writer, false);
EXPECT_CALL(mock_writer, SupportsEcn()).WillOnce(Return(false));
diff --git a/quiche/quic/core/quic_flags_list.h b/quiche/quic/core/quic_flags_list.h
index d2a4308..62afabc 100644
--- a/quiche/quic/core/quic_flags_list.h
+++ b/quiche/quic/core/quic_flags_list.h
@@ -101,14 +101,12 @@
QUIC_FLAG(quic_reloadable_flag_quic_conservative_cwnd_and_pacing_gains, false)
// If true, when TicketCrypter fails to encrypt a session ticket, quic::TlsServerHandshaker will send a placeholder ticket, instead of an empty one, to the client.
QUIC_FLAG(quic_reloadable_flag_quic_send_placeholder_ticket_when_encrypt_ticket_fails, true)
-// When true, check what sockopt is used to set the IP TOS byte on the platform.
-QUIC_FLAG(quic_restart_flag_quic_platform_tos_sockopt, false)
+// When true, allows sending of QUIC packets marked ECT(1). A different flag (TBD) will actually utilize this capability to send ECT(1).
+QUIC_FLAG(quic_restart_flag_quic_support_ect1, false)
// When true, defaults to BBR congestion control instead of Cubic.
QUIC_FLAG(quic_reloadable_flag_quic_default_to_bbr, false)
// When true, report received ECN markings to the peer. Replaces quic_receive_ecn2 to use correct codepoints.
QUIC_FLAG(quic_restart_flag_quic_receive_ecn3, true)
-// When true, sends QUIC packets marked ECT(1).
-QUIC_FLAG(quic_reloadable_flag_quic_send_ect1, false)
// When true, support RFC9369.
QUIC_FLAG(quic_reloadable_flag_quic_enable_version_rfcv2, false)
// When true, the BB2U copt causes BBR2 to wait two rounds with out draining the queue before exiting PROBE_UP and BB2S has the same effect in STARTUP.
diff --git a/quiche/quic/core/quic_sent_packet_manager.cc b/quiche/quic/core/quic_sent_packet_manager.cc
index 1a40e99..61490e9 100644
--- a/quiche/quic/core/quic_sent_packet_manager.cc
+++ b/quiche/quic/core/quic_sent_packet_manager.cc
@@ -369,7 +369,7 @@
// is necessary.
QuicPacketCount newly_acked_ect = 0, newly_acked_ce = 0;
if (ecn_counts.has_value()) {
- QUICHE_DCHECK(GetQuicReloadableFlag(quic_send_ect1));
+ QUICHE_DCHECK(GetQuicRestartFlag(quic_support_ect1));
newly_acked_ect = ecn_counts->ect1 - previous_counts.ect1;
if (newly_acked_ect == 0) {
newly_acked_ect = ecn_counts->ect0 - previous_counts.ect0;
@@ -1424,8 +1424,8 @@
}
// Validate ECN feedback.
std::optional<QuicEcnCounts> valid_ecn_counts;
- if (GetQuicReloadableFlag(quic_send_ect1)) {
- QUIC_RELOADABLE_FLAG_COUNT_N(quic_send_ect1, 1, 8);
+ if (GetQuicRestartFlag(quic_support_ect1)) {
+ QUIC_RESTART_FLAG_COUNT_N(quic_support_ect1, 1, 9);
if (IsEcnFeedbackValid(acked_packet_number_space, ecn_counts,
newly_acked_ect0, newly_acked_ect1)) {
valid_ecn_counts = ecn_counts;
diff --git a/quiche/quic/core/quic_sent_packet_manager_test.cc b/quiche/quic/core/quic_sent_packet_manager_test.cc
index 13caeba..5a0c4df 100644
--- a/quiche/quic/core/quic_sent_packet_manager_test.cc
+++ b/quiche/quic/core/quic_sent_packet_manager_test.cc
@@ -3195,7 +3195,7 @@
}
TEST_F(QuicSentPacketManagerTest, EcnCountsAreStored) {
- if (!GetQuicReloadableFlag(quic_send_ect1)) {
+ if (!GetQuicRestartFlag(quic_support_ect1)) {
return;
}
std::optional<QuicEcnCounts> ecn_counts1, ecn_counts2, ecn_counts3;
@@ -3231,7 +3231,7 @@
}
TEST_F(QuicSentPacketManagerTest, EcnCountsReceived) {
- if (!GetQuicReloadableFlag(quic_send_ect1)) {
+ if (!GetQuicRestartFlag(quic_support_ect1)) {
return;
}
// Basic ECN reporting test. The reported counts are equal to the total sent,
@@ -3258,7 +3258,7 @@
}
TEST_F(QuicSentPacketManagerTest, PeerDecrementsEcnCounts) {
- if (!GetQuicReloadableFlag(quic_send_ect1)) {
+ if (!GetQuicRestartFlag(quic_support_ect1)) {
return;
}
for (uint64_t i = 1; i <= 5; ++i) {
@@ -3300,7 +3300,7 @@
}
TEST_F(QuicSentPacketManagerTest, TooManyEcnCountsReported) {
- if (!GetQuicReloadableFlag(quic_send_ect1)) {
+ if (!GetQuicRestartFlag(quic_support_ect1)) {
return;
}
for (uint64_t i = 1; i <= 3; ++i) {
@@ -3328,7 +3328,7 @@
}
TEST_F(QuicSentPacketManagerTest, PeerReportsWrongCodepoint) {
- if (!GetQuicReloadableFlag(quic_send_ect1)) {
+ if (!GetQuicRestartFlag(quic_support_ect1)) {
return;
}
for (uint64_t i = 1; i <= 3; ++i) {
@@ -3356,7 +3356,7 @@
}
TEST_F(QuicSentPacketManagerTest, TooFewEcnCountsReported) {
- if (!GetQuicReloadableFlag(quic_send_ect1)) {
+ if (!GetQuicRestartFlag(quic_support_ect1)) {
return;
}
for (uint64_t i = 1; i <= 3; ++i) {
@@ -3384,7 +3384,7 @@
TEST_F(QuicSentPacketManagerTest,
EcnCountsNotValidatedIfLargestAckedUnchanged) {
- if (!GetQuicReloadableFlag(quic_send_ect1)) {
+ if (!GetQuicRestartFlag(quic_support_ect1)) {
return;
}
for (uint64_t i = 1; i <= 3; ++i) {
@@ -3427,7 +3427,7 @@
}
TEST_F(QuicSentPacketManagerTest, EcnAckedButNoMarksReported) {
- if (!GetQuicReloadableFlag(quic_send_ect1)) {
+ if (!GetQuicRestartFlag(quic_support_ect1)) {
return;
}
for (uint64_t i = 1; i <= 3; ++i) {
diff --git a/quiche/quic/core/quic_udp_socket_posix.inc b/quiche/quic/core/quic_udp_socket_posix.inc
index d6ec150..a54793a 100644
--- a/quiche/quic/core/quic_udp_socket_posix.inc
+++ b/quiche/quic/core/quic_udp_socket_posix.inc
@@ -523,8 +523,8 @@
int cmsg_type;
unsigned char value_buf[20];
socklen_t value_len = sizeof(value_buf);
- if (GetQuicRestartFlag(quic_platform_tos_sockopt)) {
- QUIC_RESTART_FLAG_COUNT(quic_platform_tos_sockopt);
+ if (GetQuicRestartFlag(quic_support_ect1)) {
+ QUIC_RESTART_FLAG_COUNT_N(quic_support_ect1, 9, 9);
if (GetEcnCmsgArgsPreserveDscp(
fd, packet_info.peer_address().host().address_family(),
packet_info.ecn_codepoint(), cmsg_type, value_buf,
diff --git a/quiche/quic/test_tools/quic_connection_peer.cc b/quiche/quic/test_tools/quic_connection_peer.cc
index 3daa619..31e992f 100644
--- a/quiche/quic/test_tools/quic_connection_peer.cc
+++ b/quiche/quic/test_tools/quic_connection_peer.cc
@@ -584,8 +584,8 @@
QuicConnection* connection) {
// disable_ecn_codepoint_validation_ doesn't work correctly if the flag
// isn't set; all tests that don't set the flag should hit this bug.
- QUIC_BUG_IF(quic_bug_518619343_03, !GetQuicReloadableFlag(quic_send_ect1))
- << "Test disables ECN validation without setting quic_send_ect1";
+ QUIC_BUG_IF(quic_bug_518619343_03, !GetQuicRestartFlag(quic_support_ect1))
+ << "Test disables ECN validation without setting quic_support_ect1";
connection->disable_ecn_codepoint_validation_ = true;
}