Deprecate gfe2_reloadable_flag_quic_let_connection_handle_pings.

PiperOrigin-RevId: 346323537
Change-Id: I086687b5f70028f9a773df6366b67f9248060281
diff --git a/quic/core/quic_connection.cc b/quic/core/quic_connection.cc
index 88810eb..c3c3fb2 100644
--- a/quic/core/quic_connection.cc
+++ b/quic/core/quic_connection.cc
@@ -367,8 +367,7 @@
                              &arena_,
                              alarm_factory_),
       encrypted_control_frames_(
-          GetQuicReloadableFlag(quic_encrypted_control_frames) &&
-          packet_creator_.let_connection_handle_pings()),
+          GetQuicReloadableFlag(quic_encrypted_control_frames)),
       use_encryption_level_context_(
           encrypted_control_frames_ &&
           GetQuicReloadableFlag(quic_use_encryption_level_context)),
@@ -3481,13 +3480,9 @@
       !visitor_->ShouldKeepConnectionAlive()) {
     return;
   }
-  if (packet_creator_.let_connection_handle_pings()) {
-    SendPingAtLevel(use_encryption_level_context_
-                        ? framer().GetEncryptionLevelToSendApplicationData()
-                        : encryption_level_);
-  } else {
-    visitor_->SendPing();
-  }
+  SendPingAtLevel(use_encryption_level_context_
+                      ? framer().GetEncryptionLevelToSendApplicationData()
+                      : encryption_level_);
 }
 
 void QuicConnection::SendAck() {
@@ -3583,19 +3578,15 @@
                     << "No packet gets sent when timer fires in mode "
                     << retransmission_mode << ", send PING";
     DCHECK_LT(0u, sent_packet_manager_.pending_timer_transmission_count());
-    if (packet_creator_.let_connection_handle_pings()) {
-      EncryptionLevel level = encryption_level_;
-      PacketNumberSpace packet_number_space = NUM_PACKET_NUMBER_SPACES;
-      if (SupportsMultiplePacketNumberSpaces() &&
-          sent_packet_manager_
-              .GetEarliestPacketSentTimeForPto(&packet_number_space)
-              .IsInitialized()) {
-        level = QuicUtils::GetEncryptionLevel(packet_number_space);
-      }
-      SendPingAtLevel(level);
-    } else {
-      visitor_->SendPing();
+    EncryptionLevel level = encryption_level_;
+    PacketNumberSpace packet_number_space = NUM_PACKET_NUMBER_SPACES;
+    if (SupportsMultiplePacketNumberSpaces() &&
+        sent_packet_manager_
+            .GetEarliestPacketSentTimeForPto(&packet_number_space)
+            .IsInitialized()) {
+      level = QuicUtils::GetEncryptionLevel(packet_number_space);
     }
+    SendPingAtLevel(level);
   }
   if (retransmission_mode == QuicSentPacketManager::PTO_MODE) {
     sent_packet_manager_.AdjustPendingTimerTransmissions();
@@ -5449,7 +5440,6 @@
 }
 
 void QuicConnection::SendPingAtLevel(EncryptionLevel level) {
-  DCHECK(packet_creator_.let_connection_handle_pings());
   ScopedEncryptionLevelContext context(this, level);
   SendControlFrame(QuicFrame(QuicPingFrame()));
 }
diff --git a/quic/core/quic_connection.h b/quic/core/quic_connection.h
index 13a3518..8dd0b0b 100644
--- a/quic/core/quic_connection.h
+++ b/quic/core/quic_connection.h
@@ -161,9 +161,6 @@
   // retransmittable frame needs to be added.
   virtual void OnAckNeedsRetransmittableFrame() = 0;
 
-  // Called when a ping needs to be sent.
-  virtual void SendPing() = 0;
-
   // Called when an AckFrequency frame need to be sent.
   virtual void SendAckFrequency(const QuicAckFrequencyFrame& frame) = 0;
 
diff --git a/quic/core/quic_connection_test.cc b/quic/core/quic_connection_test.cc
index bf3fe0a..941bd21 100644
--- a/quic/core/quic_connection_test.cc
+++ b/quic/core/quic_connection_test.cc
@@ -3960,11 +3960,6 @@
             connection_.GetPingAlarm()->deadline() - clock_.ApproximateNow());
 
   // Simulate firing of the retransmittable on wire and send a PING.
-  if (!GetQuicReloadableFlag(quic_let_connection_handle_pings)) {
-    EXPECT_CALL(visitor_, SendPing()).WillOnce(Invoke([this]() {
-      SendPing();
-    }));
-  }
   clock_.AdvanceTime(retransmittable_on_wire_timeout);
   connection_.GetPingAlarm()->Fire();
 
@@ -3978,21 +3973,14 @@
       QuicTime::Delta::FromMilliseconds(kMinRetransmissionTimeMs);
   srtt = manager_->GetRttStats()->SmoothedOrInitialRtt();
 
-  if (GetQuicReloadableFlag(quic_let_connection_handle_pings)) {
-    // Arm RTO mode since there is only PING in flight.
-    expected_delay = manager_->GetPtoDelay();
-  } else {
-    // First TLP without unacked stream data will no longer use TLPR.
-    expected_delay = std::max(2 * srtt, 1.5 * srtt + 0.5 * min_rto_timeout);
-  }
+  // Arm RTO mode since there is only PING in flight.
+  expected_delay = manager_->GetPtoDelay();
   EXPECT_EQ(expected_delay,
             connection_.GetRetransmissionAlarm()->deadline() - clock_.Now());
 
   // Verify the path degrading delay = TLP delay + 1st RTO + 2nd RTO.
   // Add 1st RTO.
-  if (GetQuicReloadableFlag(quic_let_connection_handle_pings)) {
-    expected_delay = std::max(2 * srtt, 1.5 * srtt + 0.5 * min_rto_timeout);
-  }
+  expected_delay = std::max(2 * srtt, 1.5 * srtt + 0.5 * min_rto_timeout);
   retransmission_delay =
       std::max(manager_->GetRttStats()->smoothed_rtt() +
                    4 * manager_->GetRttStats()->mean_deviation(),
@@ -4019,12 +4007,8 @@
 
   // Verify the retransmission delay.
   // First TLP without unacked stream data will no longer use TLPR.
-  if (GetQuicReloadableFlag(quic_let_connection_handle_pings)) {
-    // Arm RTO mode since there is only PING in flight.
-    expected_delay = manager_->GetPtoDelay();
-  } else {
-    expected_delay = std::max(2 * srtt, 1.5 * srtt + 0.5 * min_rto_timeout);
-  }
+  // Arm RTO mode since there is only PING in flight.
+  expected_delay = manager_->GetPtoDelay();
   expected_delay = expected_delay - QuicTime::Delta::FromMilliseconds(5);
   EXPECT_EQ(expected_delay,
             connection_.GetRetransmissionAlarm()->deadline() - clock_.Now());
@@ -4550,11 +4534,6 @@
 
   writer_->Reset();
   clock_.AdvanceTime(QuicTime::Delta::FromSeconds(15));
-  if (!GetQuicReloadableFlag(quic_let_connection_handle_pings)) {
-    EXPECT_CALL(visitor_, SendPing()).WillOnce(Invoke([this]() {
-      SendPing();
-    }));
-  }
   connection_.GetPingAlarm()->Fire();
   size_t padding_frame_count = writer_->padding_frames().size();
   EXPECT_EQ(padding_frame_count + 1u, writer_->frame_count());
@@ -4608,11 +4587,6 @@
 
   writer_->Reset();
   clock_.AdvanceTime(QuicTime::Delta::FromSeconds(10));
-  if (!GetQuicReloadableFlag(quic_let_connection_handle_pings)) {
-    EXPECT_CALL(visitor_, SendPing()).WillOnce(Invoke([this]() {
-      connection_.SendControlFrame(QuicFrame(QuicPingFrame(1)));
-    }));
-  }
   connection_.GetPingAlarm()->Fire();
   size_t padding_frame_count = writer_->padding_frames().size();
   EXPECT_EQ(padding_frame_count + 1u, writer_->frame_count());
@@ -7103,11 +7077,6 @@
 
   // Simulate firing the ping alarm and sending a PING.
   clock_.AdvanceTime(retransmittable_on_wire_timeout);
-  if (!GetQuicReloadableFlag(quic_let_connection_handle_pings)) {
-    EXPECT_CALL(visitor_, SendPing()).WillOnce(Invoke([this]() {
-      connection_.SendControlFrame(QuicFrame(QuicPingFrame(1)));
-    }));
-  }
   connection_.GetPingAlarm()->Fire();
 
   // Now there's a retransmittable packet (PING) on the wire, so the path
@@ -7829,11 +7798,6 @@
   EXPECT_EQ(prev_deadline, connection_.GetPingAlarm()->deadline());
 
   // Simulate the alarm firing and check that a PING is sent.
-  if (!GetQuicReloadableFlag(quic_let_connection_handle_pings)) {
-    EXPECT_CALL(visitor_, SendPing()).WillOnce(Invoke([this]() {
-      connection_.SendControlFrame(QuicFrame(QuicPingFrame(1)));
-    }));
-  }
   connection_.GetPingAlarm()->Fire();
   size_t padding_frame_count = writer_->padding_frames().size();
   if (GetParam().no_stop_waiting) {
@@ -7904,11 +7868,6 @@
 
   // Simulate the alarm firing and check that a PING is sent.
   writer_->Reset();
-  if (!GetQuicReloadableFlag(quic_let_connection_handle_pings)) {
-    EXPECT_CALL(visitor_, SendPing()).WillOnce(Invoke([this]() {
-      connection_.SendControlFrame(QuicFrame(QuicPingFrame(1)));
-    }));
-  }
   connection_.GetPingAlarm()->Fire();
   size_t padding_frame_count = writer_->padding_frames().size();
   if (GetParam().no_stop_waiting) {
@@ -7968,11 +7927,6 @@
               connection_.GetPingAlarm()->deadline() - clock_.ApproximateNow());
     // Simulate the alarm firing and check that a PING is sent.
     writer_->Reset();
-    if (!GetQuicReloadableFlag(quic_let_connection_handle_pings)) {
-      EXPECT_CALL(visitor_, SendPing()).WillOnce(Invoke([this]() {
-        SendPing();
-      }));
-    }
     clock_.AdvanceTime(initial_retransmittable_on_wire_timeout);
     connection_.GetPingAlarm()->Fire();
   }
@@ -7997,11 +7951,6 @@
 
     // Simulate the alarm firing and check that a PING is sent.
     writer_->Reset();
-    if (!GetQuicReloadableFlag(quic_let_connection_handle_pings)) {
-      EXPECT_CALL(visitor_, SendPing()).WillOnce(Invoke([this]() {
-        SendPing();
-      }));
-    }
     clock_.AdvanceTime(retransmittable_on_wire_timeout);
     connection_.GetPingAlarm()->Fire();
   }
@@ -8067,11 +8016,6 @@
 
   // Simulate the alarm firing and check that a PING is sent.
   writer_->Reset();
-  if (!GetQuicReloadableFlag(quic_let_connection_handle_pings)) {
-    EXPECT_CALL(visitor_, SendPing()).WillOnce(Invoke([this]() {
-      SendPing();
-    }));
-  }
   clock_.AdvanceTime(initial_retransmittable_on_wire_timeout);
   connection_.GetPingAlarm()->Fire();
 
@@ -8107,11 +8051,6 @@
               connection_.GetPingAlarm()->deadline() - clock_.ApproximateNow());
     // Simulate the alarm firing and check that a PING is sent.
     writer_->Reset();
-    if (!GetQuicReloadableFlag(quic_let_connection_handle_pings)) {
-      EXPECT_CALL(visitor_, SendPing()).WillOnce(Invoke([this]() {
-        SendPing();
-      }));
-    }
     clock_.AdvanceTime(initial_retransmittable_on_wire_timeout);
     connection_.GetPingAlarm()->Fire();
     // Advance 5ms to receive next packet.
@@ -8129,11 +8068,6 @@
             connection_.GetPingAlarm()->deadline() - clock_.ApproximateNow());
 
   writer_->Reset();
-  if (!GetQuicReloadableFlag(quic_let_connection_handle_pings)) {
-    EXPECT_CALL(visitor_, SendPing()).WillOnce(Invoke([this]() {
-      SendPing();
-    }));
-  }
   clock_.AdvanceTime(2 * initial_retransmittable_on_wire_timeout);
   connection_.GetPingAlarm()->Fire();
 
@@ -8202,11 +8136,6 @@
               connection_.GetPingAlarm()->deadline() - clock_.ApproximateNow());
     // Simulate the alarm firing and check that a PING is sent.
     writer_->Reset();
-    if (!GetQuicReloadableFlag(quic_let_connection_handle_pings)) {
-      EXPECT_CALL(visitor_, SendPing()).WillOnce(Invoke([this]() {
-        SendPing();
-      }));
-    }
     clock_.AdvanceTime(initial_retransmittable_on_wire_timeout);
     connection_.GetPingAlarm()->Fire();
   }
@@ -9141,11 +9070,6 @@
 
   // RTO fires, verify a PING packet gets sent because there is no data to send.
   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, QuicPacketNumber(3), _, _));
-  if (!GetQuicReloadableFlag(quic_let_connection_handle_pings)) {
-    EXPECT_CALL(visitor_, SendPing()).WillOnce(Invoke([this]() {
-      SendPing();
-    }));
-  }
   clock_.AdvanceTime(retransmission_time - clock_.Now());
   connection_.GetRetransmissionAlarm()->Fire();
   EXPECT_EQ(1u, connection_.GetStats().tlp_count);
@@ -9365,11 +9289,6 @@
                                ? QuicPacketNumber(2)
                                : QuicPacketNumber(3),
                            _, _));
-  if (!GetQuicReloadableFlag(quic_let_connection_handle_pings)) {
-    EXPECT_CALL(visitor_, SendPing()).WillOnce(Invoke([this]() {
-      SendPing();
-    }));
-  }
   connection_.GetRetransmissionAlarm()->Fire();
   EXPECT_EQ(1u, connection_.GetStats().pto_count);
   EXPECT_EQ(1u, connection_.GetStats().crypto_retransmit_count);
@@ -9666,11 +9585,6 @@
   // Fires TLP, verify a PING gets sent because packet 3 is marked
   // RTO_RETRANSMITTED.
   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, QuicPacketNumber(70), _, _));
-  if (!GetQuicReloadableFlag(quic_let_connection_handle_pings)) {
-    EXPECT_CALL(visitor_, SendPing()).WillOnce(Invoke([this]() {
-      SendPing();
-    }));
-  }
   connection_.GetRetransmissionAlarm()->Fire();
 }
 
@@ -10240,11 +10154,6 @@
   // PTO fires, verify a PING packet gets sent because there is no data to
   // send.
   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, QuicPacketNumber(3), _, _));
-  if (!GetQuicReloadableFlag(quic_let_connection_handle_pings)) {
-    EXPECT_CALL(visitor_, SendPing()).WillOnce(Invoke([this]() {
-      SendPing();
-    }));
-  }
   connection_.GetRetransmissionAlarm()->Fire();
   EXPECT_EQ(1u, connection_.GetStats().pto_count);
   EXPECT_EQ(0u, connection_.GetStats().crypto_retransmit_count);
@@ -11008,11 +10917,7 @@
   EXPECT_CALL(visitor_, ShouldKeepConnectionAlive())
       .WillRepeatedly(Return(false));
   // Verify PING does not get sent.
-  if (GetQuicReloadableFlag(quic_let_connection_handle_pings)) {
-    EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(0);
-  } else {
-    EXPECT_CALL(visitor_, SendPing()).Times(0);
-  }
+  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(0);
   connection_.GetPingAlarm()->Fire();
 }
 
@@ -11865,11 +11770,6 @@
   EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet());
 
   // Fire retransmission alarm.
-  if (!GetQuicReloadableFlag(quic_let_connection_handle_pings)) {
-    EXPECT_CALL(visitor_, SendPing()).WillOnce(Invoke([this]() {
-      SendPing();
-    }));
-  }
   connection_.GetRetransmissionAlarm()->Fire();
 
   QuicFrames frames1;
diff --git a/quic/core/quic_control_frame_manager.cc b/quic/core/quic_control_frame_manager.cc
index 6a64cb6..3940b9c 100644
--- a/quic/core/quic_control_frame_manager.cc
+++ b/quic/core/quic_control_frame_manager.cc
@@ -137,27 +137,6 @@
       QuicFrame(new QuicNewTokenFrame(++last_control_frame_id_, token)));
 }
 
-void QuicControlFrameManager::WritePing() {
-  QUIC_DVLOG(1) << "Writing PING_FRAME";
-  if (HasBufferedFrames()) {
-    // Do not send ping if there is buffered frames.
-    QUIC_LOG(WARNING)
-        << "Try to send PING when there is buffered control frames.";
-    return;
-  }
-  control_frames_.emplace_back(
-      QuicFrame(QuicPingFrame(++last_control_frame_id_)));
-  if (control_frames_.size() > kMaxNumControlFrames) {
-    delegate_->OnControlFrameManagerError(
-        QUIC_TOO_MANY_BUFFERED_CONTROL_FRAMES,
-        absl::StrCat("More than ", kMaxNumControlFrames,
-                     "buffered control frames, least_unacked: ", least_unacked_,
-                     ", least_unsent_: ", least_unsent_));
-    return;
-  }
-  WriteBufferedFrames();
-}
-
 void QuicControlFrameManager::OnControlFrameSent(const QuicFrame& frame) {
   QuicControlFrameId id = GetControlFrameId(frame);
   if (id == kInvalidControlFrameId) {
diff --git a/quic/core/quic_control_frame_manager.h b/quic/core/quic_control_frame_manager.h
index f5bc0b6..1cc0c57 100644
--- a/quic/core/quic_control_frame_manager.h
+++ b/quic/core/quic_control_frame_manager.h
@@ -93,9 +93,6 @@
   // immediately.
   void WriteOrBufferNewToken(absl::string_view token);
 
-  // Sends a PING_FRAME. Do not send PING if there is buffered frames.
-  void WritePing();
-
   // Called when |frame| gets acked. Returns true if |frame| gets acked for the
   // first time, return false otherwise.
   bool OnControlFrameAcked(const QuicFrame& frame);
diff --git a/quic/core/quic_control_frame_manager_test.cc b/quic/core/quic_control_frame_manager_test.cc
index 68658bb..bad8a665 100644
--- a/quic/core/quic_control_frame_manager_test.cc
+++ b/quic/core/quic_control_frame_manager_test.cc
@@ -72,7 +72,6 @@
     manager_->WriteOrBufferBlocked(kTestStreamId);
     manager_->WriteOrBufferStopSending(kTestStopSendingCode, kTestStreamId);
     number_of_frames_ = 5u;
-    ping_frame_id_ = 6u;
     EXPECT_EQ(number_of_frames_,
               QuicControlFrameManagerPeer::QueueSize(manager_.get()));
     EXPECT_TRUE(manager_->IsControlFrameOutstanding(QuicFrame(&rst_stream_)));
@@ -81,8 +80,6 @@
         manager_->IsControlFrameOutstanding(QuicFrame(&window_update_)));
     EXPECT_TRUE(manager_->IsControlFrameOutstanding(QuicFrame(&blocked_)));
     EXPECT_TRUE(manager_->IsControlFrameOutstanding(QuicFrame(&stop_sending_)));
-    EXPECT_FALSE(manager_->IsControlFrameOutstanding(
-        QuicFrame(QuicPingFrame(ping_frame_id_))));
 
     EXPECT_FALSE(manager_->HasPendingRetransmission());
     EXPECT_TRUE(manager_->WillingToWrite());
@@ -101,7 +98,6 @@
   std::unique_ptr<QuicControlFrameManager> manager_;
   QuicFrame frame_;
   size_t number_of_frames_;
-  int ping_frame_id_;
 };
 
 TEST_F(QuicControlFrameManagerTest, OnControlFrameAcked) {
@@ -119,8 +115,6 @@
   EXPECT_TRUE(manager_->IsControlFrameOutstanding(QuicFrame(&blocked_)));
   EXPECT_TRUE(manager_->IsControlFrameOutstanding(QuicFrame(&stop_sending_)));
 
-  EXPECT_FALSE(manager_->IsControlFrameOutstanding(
-      QuicFrame(QuicPingFrame(ping_frame_id_))));
   EXPECT_TRUE(manager_->OnControlFrameAcked(QuicFrame(&window_update_)));
   EXPECT_FALSE(manager_->IsControlFrameOutstanding(QuicFrame(&window_update_)));
   EXPECT_EQ(number_of_frames_,
@@ -146,7 +140,6 @@
   EXPECT_CALL(*session_, WriteControlFrame(_, _))
       .WillRepeatedly(Invoke(&ClearControlFrameWithTransmissionType));
   manager_->OnCanWrite();
-  manager_->WritePing();
   EXPECT_FALSE(manager_->WillingToWrite());
 }
 
@@ -179,10 +172,9 @@
 
   // Send control frames 4, 5, and 6.
   EXPECT_CALL(*session_, WriteControlFrame(_, _))
-      .Times(number_of_frames_ - 2u)
+      .Times(number_of_frames_ - 3u)
       .WillRepeatedly(Invoke(&ClearControlFrameWithTransmissionType));
   manager_->OnCanWrite();
-  manager_->WritePing();
   EXPECT_FALSE(manager_->WillingToWrite());
 }
 
@@ -214,28 +206,6 @@
                                                 PTO_RETRANSMISSION));
 }
 
-TEST_F(QuicControlFrameManagerTest, DonotSendPingWithBufferedFrames) {
-  Initialize();
-  InSequence s;
-  EXPECT_CALL(*session_, WriteControlFrame(_, _))
-      .WillOnce(Invoke(&ClearControlFrameWithTransmissionType));
-  EXPECT_CALL(*session_, WriteControlFrame(_, _)).WillOnce(Return(false));
-  // Send control frame 1.
-  manager_->OnCanWrite();
-  EXPECT_FALSE(manager_->HasPendingRetransmission());
-  EXPECT_TRUE(manager_->WillingToWrite());
-
-  // Send PING when there is buffered frames.
-  manager_->WritePing();
-  // Verify only the buffered frames are sent.
-  EXPECT_CALL(*session_, WriteControlFrame(_, _))
-      .Times(number_of_frames_ - 1)
-      .WillRepeatedly(Invoke(&ClearControlFrameWithTransmissionType));
-  manager_->OnCanWrite();
-  EXPECT_FALSE(manager_->HasPendingRetransmission());
-  EXPECT_FALSE(manager_->WillingToWrite());
-}
-
 TEST_F(QuicControlFrameManagerTest, SendAndAckAckFrequencyFrame) {
   Initialize();
   InSequence s;
diff --git a/quic/core/quic_flags_list.h b/quic/core/quic_flags_list.h
index f3a9a4b..908aa12 100644
--- a/quic/core/quic_flags_list.h
+++ b/quic/core/quic_flags_list.h
@@ -40,7 +40,6 @@
 QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_fix_willing_and_able_to_write2, true)
 QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_goaway_with_max_stream_id, false)
 QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_granular_qpack_error_codes, true)
-QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_let_connection_handle_pings, true)
 QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_new_priority_update_frame, true)
 QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_pass_path_response_to_validator, false)
 QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_require_handshake_confirmation, false)
diff --git a/quic/core/quic_packet_creator.cc b/quic/core/quic_packet_creator.cc
index 08ac9c7..858a403 100644
--- a/quic/core/quic_packet_creator.cc
+++ b/quic/core/quic_packet_creator.cc
@@ -134,9 +134,6 @@
       fully_pad_crypto_handshake_packets_(true),
       latched_hard_max_packet_length_(0),
       max_datagram_frame_size_(0) {
-  if (let_connection_handle_pings_) {
-    QUIC_RELOADABLE_FLAG_COUNT(quic_let_connection_handle_pings);
-  }
   SetMaxPacketLength(kDefaultMaxPacketSize);
   if (!framer_->version().UsesTls()) {
     // QUIC+TLS negotiates the maximum datagram frame size via the
@@ -1191,7 +1188,7 @@
 bool QuicPacketCreator::ConsumeRetransmittableControlFrame(
     const QuicFrame& frame) {
   QUIC_BUG_IF(IsControlFrame(frame.type) && !GetControlFrameId(frame) &&
-              (!let_connection_handle_pings_ || frame.type != PING_FRAME))
+              frame.type != PING_FRAME)
       << "Adding a control frame with no control frame id: " << frame;
   DCHECK(QuicUtils::IsRetransmittableFrame(frame.type)) << frame;
   MaybeBundleAckOpportunistically();
diff --git a/quic/core/quic_packet_creator.h b/quic/core/quic_packet_creator.h
index 2605740..842837c 100644
--- a/quic/core/quic_packet_creator.h
+++ b/quic/core/quic_packet_creator.h
@@ -471,10 +471,6 @@
   // Return true if retry_token_ is not empty.
   bool HasRetryToken() const;
 
-  bool let_connection_handle_pings() const {
-    return let_connection_handle_pings_;
-  }
-
  private:
   friend class test::QuicPacketCreatorPeer;
 
@@ -673,9 +669,6 @@
   // accept. There is no limit for QUIC_CRYPTO connections, but QUIC+TLS
   // negotiates this during the handshake.
   QuicByteCount max_datagram_frame_size_;
-
-  const bool let_connection_handle_pings_ =
-      GetQuicReloadableFlag(quic_let_connection_handle_pings);
 };
 
 }  // namespace quic
diff --git a/quic/core/quic_session.cc b/quic/core/quic_session.cc
index b0fdb3c..73370d3 100644
--- a/quic/core/quic_session.cc
+++ b/quic/core/quic_session.cc
@@ -2091,10 +2091,6 @@
   flow_controller_.SendWindowUpdate();
 }
 
-void QuicSession::SendPing() {
-  control_frame_manager_.WritePing();
-}
-
 void QuicSession::SendAckFrequency(const QuicAckFrequencyFrame& frame) {
   control_frame_manager_.WriteOrBufferAckFrequency(frame);
 }
diff --git a/quic/core/quic_session.h b/quic/core/quic_session.h
index 8e572d3..d849743 100644
--- a/quic/core/quic_session.h
+++ b/quic/core/quic_session.h
@@ -134,7 +134,6 @@
   void OnConnectionMigration(AddressChangeType /*type*/) override {}
   // Adds a connection level WINDOW_UPDATE frame.
   void OnAckNeedsRetransmittableFrame() override;
-  void SendPing() override;
   void SendAckFrequency(const QuicAckFrequencyFrame& frame) override;
   bool WillingAndAbleToWrite() const override;
   std::string GetStreamsInfoForLogging() const override;
diff --git a/quic/test_tools/quic_test_utils.h b/quic/test_tools/quic_test_utils.h
index 825b669..6fbcc17 100644
--- a/quic/test_tools/quic_test_utils.h
+++ b/quic/test_tools/quic_test_utils.h
@@ -567,7 +567,6 @@
                bool is_connectivity_probe),
               (override));
   MOCK_METHOD(void, OnAckNeedsRetransmittableFrame, (), (override));
-  MOCK_METHOD(void, SendPing, (), (override));
   MOCK_METHOD(void,
               SendAckFrequency,
               (const QuicAckFrequencyFrame& frame),
diff --git a/quic/test_tools/simulator/quic_endpoint.h b/quic/test_tools/simulator/quic_endpoint.h
index 4485025..fd2fa06 100644
--- a/quic/test_tools/simulator/quic_endpoint.h
+++ b/quic/test_tools/simulator/quic_endpoint.h
@@ -80,7 +80,6 @@
   void OnPathDegrading() override {}
   void OnForwardProgressMadeAfterPathDegrading() override {}
   void OnAckNeedsRetransmittableFrame() override {}
-  void SendPing() override {}
   void SendAckFrequency(const QuicAckFrequencyFrame& /*frame*/) override {}
   bool AllowSelfAddressChange() const override;
   HandshakeState GetHandshakeState() const override;