Add srtt to TimeWaitConnectionInfo. Also add GFE_CODE_COUNT recording information when a packet is processed in time wait list. Logging only, not protected.

PiperOrigin-RevId: 325331048
Change-Id: I97d32d7687a3f25c4d9599c51e838b6f2caca38e
diff --git a/quic/core/quic_dispatcher.cc b/quic/core/quic_dispatcher.cc
index 2ba39e2..f171610 100644
--- a/quic/core/quic_dispatcher.cc
+++ b/quic/core/quic_dispatcher.cc
@@ -784,7 +784,8 @@
       it->first, action,
       TimeWaitConnectionInfo(
           VersionHasIetfInvariantHeader(connection->transport_version()),
-          connection->termination_packets()));
+          connection->termination_packets(),
+          connection->sent_packet_manager().GetRttStats()->smoothed_rtt()));
   session_map_.erase(it);
 }
 
diff --git a/quic/core/quic_time_wait_list_manager.cc b/quic/core/quic_time_wait_list_manager.cc
index 1a88048..575f079 100644
--- a/quic/core/quic_time_wait_list_manager.cc
+++ b/quic/core/quic_time_wait_list_manager.cc
@@ -50,7 +50,15 @@
 TimeWaitConnectionInfo::TimeWaitConnectionInfo(
     bool ietf_quic,
     std::vector<std::unique_ptr<QuicEncryptedPacket>>* termination_packets)
-    : ietf_quic(ietf_quic) {
+    : TimeWaitConnectionInfo(ietf_quic,
+                             termination_packets,
+                             QuicTime::Delta::Zero()) {}
+
+TimeWaitConnectionInfo::TimeWaitConnectionInfo(
+    bool ietf_quic,
+    std::vector<std::unique_ptr<QuicEncryptedPacket>>* termination_packets,
+    QuicTime::Delta srtt)
+    : ietf_quic(ietf_quic), srtt(srtt) {
   if (termination_packets != nullptr) {
     this->termination_packets.swap(*termination_packets);
   }
@@ -132,6 +140,13 @@
   // Increment the received packet count.
   ConnectionIdData* connection_data = &it->second;
   ++(connection_data->num_packets);
+  const QuicTime now = clock_->ApproximateNow();
+  QuicTime::Delta delta = QuicTime::Delta::Zero();
+  if (now > connection_data->time_added) {
+    delta = now - connection_data->time_added;
+  }
+  OnPacketReceivedForKnownConnection(connection_data->num_packets, delta,
+                                     connection_data->info.srtt);
 
   if (!ShouldSendResponse(connection_data->num_packets)) {
     QUIC_DLOG(INFO) << "Processing " << connection_id << " in time wait state: "
diff --git a/quic/core/quic_time_wait_list_manager.h b/quic/core/quic_time_wait_list_manager.h
index 429566b..cf6a7ff 100644
--- a/quic/core/quic_time_wait_list_manager.h
+++ b/quic/core/quic_time_wait_list_manager.h
@@ -32,6 +32,10 @@
   TimeWaitConnectionInfo(
       bool ietf_quic,
       std::vector<std::unique_ptr<QuicEncryptedPacket>>* termination_packets);
+  TimeWaitConnectionInfo(
+      bool ietf_quic,
+      std::vector<std::unique_ptr<QuicEncryptedPacket>>* termination_packets,
+      QuicTime::Delta srtt);
 
   TimeWaitConnectionInfo(const TimeWaitConnectionInfo& other) = delete;
   TimeWaitConnectionInfo(TimeWaitConnectionInfo&& other) = default;
@@ -40,6 +44,7 @@
 
   bool ietf_quic;
   std::vector<std::unique_ptr<QuicEncryptedPacket>> termination_packets;
+  QuicTime::Delta srtt;
 };
 
 // Maintains a list of all connection_ids that have been recently closed. A
@@ -240,6 +245,12 @@
   // false if the map is empty or the oldest connection has not expired.
   bool MaybeExpireOldestConnection(QuicTime expiration_time);
 
+  // Called when a packet is received for a connection in this time wait list.
+  virtual void OnPacketReceivedForKnownConnection(
+      int /*num_packets*/,
+      QuicTime::Delta /*delta*/,
+      QuicTime::Delta /*srtt*/) const {}
+
   std::unique_ptr<QuicEncryptedPacket> BuildIetfStatelessResetPacket(
       QuicConnectionId connection_id);