Add a stable enum for QuicFrameType for logging purpose.

PiperOrigin-RevId: 327220665
Change-Id: I633bedcf4b71f5c90291f2b8b7bb7e1808e564cd
diff --git a/quic/core/quic_unacked_packet_map.cc b/quic/core/quic_unacked_packet_map.cc
index e6328a7..dd70f82 100644
--- a/quic/core/quic_unacked_packet_map.cc
+++ b/quic/core/quic_unacked_packet_map.cc
@@ -22,6 +22,90 @@
       "This function assumes QuicPacketLength is an unsigned integer type.");
   return std::numeric_limits<QuicPacketLength>::max() - lhs < rhs;
 }
+
+enum QuicFrameTypeBitfield : uint32_t {
+  kInvalidFrameBitfield = 0,
+  kPaddingFrameBitfield = 1,
+  kRstStreamFrameBitfield = 1 << 1,
+  kConnectionCloseFrameBitfield = 1 << 2,
+  kGoawayFrameBitfield = 1 << 3,
+  kWindowUpdateFrameBitfield = 1 << 4,
+  kBlockedFrameBitfield = 1 << 5,
+  kStopWaitingFrameBitfield = 1 << 6,
+  kPingFrameBitfield = 1 << 7,
+  kCryptoFrameBitfield = 1 << 8,
+  kHandshakeDoneFrameBitfield = 1 << 9,
+  kStreamFrameBitfield = 1 << 10,
+  kAckFrameBitfield = 1 << 11,
+  kMtuDiscoveryFrameBitfield = 1 << 12,
+  kNewConnectionIdFrameBitfield = 1 << 13,
+  kMaxStreamsFrameBitfield = 1 << 14,
+  kStreamsBlockedFrameBitfield = 1 << 15,
+  kPathResponseFrameBitfield = 1 << 16,
+  kPathChallengeFrameBitfield = 1 << 17,
+  kStopSendingFrameBitfield = 1 << 18,
+  kMessageFrameBitfield = 1 << 19,
+  kNewTokenFrameBitfield = 1 << 20,
+  kRetireConnectionIdFrameBitfield = 1 << 21,
+  kAckFrequencyFrameBitfield = 1 << 22,
+};
+
+QuicFrameTypeBitfield GetFrameTypeBitfield(QuicFrameType type) {
+  switch (type) {
+    case PADDING_FRAME:
+      return kPaddingFrameBitfield;
+    case RST_STREAM_FRAME:
+      return kRstStreamFrameBitfield;
+    case CONNECTION_CLOSE_FRAME:
+      return kConnectionCloseFrameBitfield;
+    case GOAWAY_FRAME:
+      return kGoawayFrameBitfield;
+    case WINDOW_UPDATE_FRAME:
+      return kWindowUpdateFrameBitfield;
+    case BLOCKED_FRAME:
+      return kBlockedFrameBitfield;
+    case STOP_WAITING_FRAME:
+      return kStopWaitingFrameBitfield;
+    case PING_FRAME:
+      return kPingFrameBitfield;
+    case CRYPTO_FRAME:
+      return kCryptoFrameBitfield;
+    case HANDSHAKE_DONE_FRAME:
+      return kHandshakeDoneFrameBitfield;
+    case STREAM_FRAME:
+      return kStreamFrameBitfield;
+    case ACK_FRAME:
+      return kAckFrameBitfield;
+    case MTU_DISCOVERY_FRAME:
+      return kMtuDiscoveryFrameBitfield;
+    case NEW_CONNECTION_ID_FRAME:
+      return kNewConnectionIdFrameBitfield;
+    case MAX_STREAMS_FRAME:
+      return kMaxStreamsFrameBitfield;
+    case STREAMS_BLOCKED_FRAME:
+      return kStreamsBlockedFrameBitfield;
+    case PATH_RESPONSE_FRAME:
+      return kPathResponseFrameBitfield;
+    case PATH_CHALLENGE_FRAME:
+      return kPathChallengeFrameBitfield;
+    case STOP_SENDING_FRAME:
+      return kStopSendingFrameBitfield;
+    case MESSAGE_FRAME:
+      return kMessageFrameBitfield;
+    case NEW_TOKEN_FRAME:
+      return kNewTokenFrameBitfield;
+    case RETIRE_CONNECTION_ID_FRAME:
+      return kRetireConnectionIdFrameBitfield;
+    case ACK_FREQUENCY_FRAME:
+      return kAckFrequencyFrameBitfield;
+    case NUM_FRAME_TYPES:
+      QUIC_BUG << "Unexpected frame type";
+      return kInvalidFrameBitfield;
+  }
+  QUIC_BUG << "Unexpected frame type";
+  return kInvalidFrameBitfield;
+}
+
 }  // namespace
 
 QuicUnackedPacketMap::QuicUnackedPacketMap(Perspective perspective)
@@ -529,19 +613,19 @@
   supports_multiple_packet_number_spaces_ = true;
 }
 
-uint32_t QuicUnackedPacketMap::GetLastPacketContent() const {
+int32_t QuicUnackedPacketMap::GetLastPacketContent() const {
   if (empty()) {
-    // Use max uint32_t to distinguish with packets with no retransmittable
-    // frames nor acks.
-    return std::numeric_limits<uint32_t>::max();
+    // Use -1 to distinguish with packets with no retransmittable frames nor
+    // acks.
+    return -1;
   }
-  uint32_t content = 0;
+  int32_t content = 0;
   const QuicTransmissionInfo& last_packet = unacked_packets_.back();
   for (const auto& frame : last_packet.retransmittable_frames) {
-    content |= (1 << frame.type);
+    content |= GetFrameTypeBitfield(frame.type);
   }
   if (last_packet.largest_acked.IsInitialized()) {
-    content |= (1 << ACK_FRAME);
+    content |= GetFrameTypeBitfield(ACK_FRAME);
   }
   return content;
 }
diff --git a/quic/core/quic_unacked_packet_map.h b/quic/core/quic_unacked_packet_map.h
index 61b2ea8..9f67e2b 100644
--- a/quic/core/quic_unacked_packet_map.h
+++ b/quic/core/quic_unacked_packet_map.h
@@ -232,7 +232,7 @@
   // unacked_packets_. For example, if the packet contains STREAM_FRAME, content
   // & (1 << STREAM_FRAME) would be set. Returns max uint32_t if
   // unacked_packets_ is empty.
-  uint32_t GetLastPacketContent() const;
+  int32_t GetLastPacketContent() const;
 
   Perspective perspective() const { return perspective_; }