diff --git a/quic/core/quic_framer_test.cc b/quic/core/quic_framer_test.cc
index eae7e0e..a715d9b 100644
--- a/quic/core/quic_framer_test.cc
+++ b/quic/core/quic_framer_test.cc
@@ -2161,7 +2161,7 @@
     0x00, 0x00,
   };
 
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
     // type (short header, 4 byte packet number)
     0x43,
     // connection_id
@@ -2193,8 +2193,8 @@
   unsigned char* p = packet;
   size_t p_size = ABSL_ARRAYSIZE(packet);
   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
-    p = packet99;
-    p_size = ABSL_ARRAYSIZE(packet99);
+    p = packet_ietf;
+    p_size = ABSL_ARRAYSIZE(packet_ietf);
   } else if (framer_.version().HasIetfInvariantHeader()) {
     p = packet46;
     p_size = ABSL_ARRAYSIZE(packet46);
@@ -2282,7 +2282,7 @@
          'r',  'l',  'd',  '!'}},
   };
 
-  PacketFragments packet99 = {
+  PacketFragments packet_ietf = {
       // type (short header, 4 byte packet number)
       {"",
        {0x43}},
@@ -2315,7 +2315,7 @@
 
   PacketFragments& fragments =
       VersionHasIetfQuicFrames(framer_.transport_version())
-          ? packet99
+          ? packet_ietf
           : (framer_.version().HasIetfInvariantHeader() ? packet46 : packet);
   std::unique_ptr<QuicEncryptedPacket> encrypted(
       AssemblePacketFromFragments(fragments));
@@ -2605,7 +2605,7 @@
           'r',  'l',  'd',  '!'}},
   };
 
-  PacketFragments packet99 = {
+  PacketFragments packet_ietf = {
       // type (short header, 4 byte packet number)
       {"",
        {0x43}},
@@ -2638,7 +2638,7 @@
 
   PacketFragments& fragments =
       VersionHasIetfQuicFrames(framer_.transport_version())
-          ? packet99
+          ? packet_ietf
           : (framer_.version().HasIetfInvariantHeader() ? packet46 : packet);
   std::unique_ptr<QuicEncryptedPacket> encrypted(
       AssemblePacketFromFragments(fragments));
@@ -2724,7 +2724,7 @@
          'r',  'l',  'd',  '!'}},
   };
 
-  PacketFragments packet99 = {
+  PacketFragments packet_ietf = {
       // type (short header, 4 byte packet number)
       {"",
        {0x43}},
@@ -2757,7 +2757,7 @@
 
   PacketFragments& fragments =
       VersionHasIetfQuicFrames(framer_.transport_version())
-          ? packet99
+          ? packet_ietf
           : (framer_.version().HasIetfInvariantHeader() ? packet46 : packet);
   std::unique_ptr<QuicEncryptedPacket> encrypted(
       AssemblePacketFromFragments(fragments));
@@ -2902,7 +2902,7 @@
          'r',  'l',  'd',  '!'}},
   };
 
-  PacketFragments packet99 = {
+  PacketFragments packet_ietf = {
       // public flags (long header with packet type ZERO_RTT_PROTECTED and
       // 4-byte packet number)
       {"",
@@ -2956,7 +2956,7 @@
 
   PacketFragments& fragments =
       VersionHasIetfQuicFrames(framer_.transport_version())
-          ? packet99
+          ? packet_ietf
           : (framer_.version().HasLongHeaderLengths()
                  ? packet49
                  : (framer_.version().HasIetfInvariantHeader() ? packet46
@@ -3151,7 +3151,7 @@
        {0x00}}
   };
 
-  PacketFragments packet99 = {
+  PacketFragments packet_ietf = {
       // type (short packet, 4 byte packet number)
       {"",
        {0x43}},
@@ -3189,7 +3189,7 @@
 
   PacketFragments& fragments =
       VersionHasIetfQuicFrames(framer_.transport_version())
-          ? packet99
+          ? packet_ietf
           : (framer_.version().HasIetfInvariantHeader() ? packet46 : packet);
   std::unique_ptr<QuicEncryptedPacket> encrypted(
       AssemblePacketFromFragments(fragments));
@@ -3272,7 +3272,7 @@
        {0x00}}
   };
 
-  PacketFragments packet99 = {
+  PacketFragments packet_ietf = {
       // type (short header, 4 byte packet number)
       {"",
        {0x43}},
@@ -3302,7 +3302,7 @@
 
   PacketFragments& fragments =
       VersionHasIetfQuicFrames(framer_.transport_version())
-          ? packet99
+          ? packet_ietf
           : (framer_.version().HasIetfInvariantHeader() ? packet46 : packet);
   std::unique_ptr<QuicEncryptedPacket> encrypted(
       AssemblePacketFromFragments(fragments));
@@ -3322,7 +3322,7 @@
   }
   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
   // clang-format off
-  PacketFragments packet99 = {
+  PacketFragments packet_ietf = {
       // type (short header, 4 byte packet number)
       {"",
        {0x43}},
@@ -3362,12 +3362,12 @@
   // clang-format on
 
   std::unique_ptr<QuicEncryptedPacket> encrypted(
-      AssemblePacketFromFragments(packet99));
+      AssemblePacketFromFragments(packet_ietf));
   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
   EXPECT_EQ(
       framer_.detailed_error(),
       "Underflow with gap block length 30 previous ack block start is 30.");
-  CheckFramingBoundaries(packet99, QUIC_INVALID_ACK_DATA);
+  CheckFramingBoundaries(packet_ietf, QUIC_INVALID_ACK_DATA);
 }
 
 // This test checks that the ack frame processor correctly identifies
@@ -3382,7 +3382,7 @@
   }
   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
   // clang-format off
-  PacketFragments packet99 = {
+  PacketFragments packet_ietf = {
       // type (short header, 4 byte packet number)
       {"",
        {0x43}},
@@ -3420,11 +3420,11 @@
   // clang-format on
 
   std::unique_ptr<QuicEncryptedPacket> encrypted(
-      AssemblePacketFromFragments(packet99));
+      AssemblePacketFromFragments(packet_ietf));
   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
   EXPECT_EQ(framer_.detailed_error(),
             "Underflow with ack block length 31 latest ack block end is 25.");
-  CheckFramingBoundaries(packet99, QUIC_INVALID_ACK_DATA);
+  CheckFramingBoundaries(packet_ietf, QUIC_INVALID_ACK_DATA);
 }
 
 // Tests a variety of ack block wrap scenarios. For example, if the
@@ -3440,7 +3440,7 @@
   }
   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
   // clang-format off
-  PacketFragments packet99 = {
+  PacketFragments packet_ietf = {
       // type (short header, 4 byte packet number)
       {"",
        {0x43}},
@@ -3474,11 +3474,11 @@
   // clang-format on
 
   std::unique_ptr<QuicEncryptedPacket> encrypted(
-      AssemblePacketFromFragments(packet99));
+      AssemblePacketFromFragments(packet_ietf));
   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
   EXPECT_EQ(framer_.detailed_error(),
             "Underflow with gap block length 2 previous ack block start is 1.");
-  CheckFramingBoundaries(packet99, QUIC_INVALID_ACK_DATA);
+  CheckFramingBoundaries(packet_ietf, QUIC_INVALID_ACK_DATA);
 }
 
 // As AckBlockUnderflowGapWrap, but in this test, it's the ack
@@ -3492,7 +3492,7 @@
   }
   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
   // clang-format off
-  PacketFragments packet99 = {
+  PacketFragments packet_ietf = {
       // type (short header, 4 byte packet number)
       {"",
        {0x43}},
@@ -3526,11 +3526,11 @@
   // clang-format on
 
   std::unique_ptr<QuicEncryptedPacket> encrypted(
-      AssemblePacketFromFragments(packet99));
+      AssemblePacketFromFragments(packet_ietf));
   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
   EXPECT_EQ(framer_.detailed_error(),
             "Underflow with ack block length 10 latest ack block end is 1.");
-  CheckFramingBoundaries(packet99, QUIC_INVALID_ACK_DATA);
+  CheckFramingBoundaries(packet_ietf, QUIC_INVALID_ACK_DATA);
 }
 
 // An ack block that acks the entire range, 1...0x3fffffffffffffff
@@ -3543,7 +3543,7 @@
   }
   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
   // clang-format off
-  PacketFragments packet99 = {
+  PacketFragments packet_ietf = {
       // type (short header, 4 byte packet number)
       {"",
        {0x43}},
@@ -3574,7 +3574,7 @@
   // clang-format on
 
   std::unique_ptr<QuicEncryptedPacket> encrypted(
-      AssemblePacketFromFragments(packet99));
+      AssemblePacketFromFragments(packet_ietf));
   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
   EXPECT_EQ(1u, visitor_.ack_frames_.size());
   const QuicAckFrame& frame = *visitor_.ack_frames_[0];
@@ -3759,7 +3759,7 @@
        {0x00}}
   };
 
-  PacketFragments packet99 = {
+  PacketFragments packet_ietf = {
       // type (short header, 4 byte packet number)
       {"",
        {0x43}},
@@ -3789,7 +3789,7 @@
 
   PacketFragments& fragments =
       VersionHasIetfQuicFrames(framer_.transport_version())
-          ? packet99
+          ? packet_ietf
           : (framer_.version().HasIetfInvariantHeader() ? packet46 : packet);
   std::unique_ptr<QuicEncryptedPacket> encrypted(
       AssemblePacketFromFragments(fragments));
@@ -3951,7 +3951,7 @@
         { 0x32, 0x10 }},
   };
 
-  PacketFragments packet99 = {
+  PacketFragments packet_ietf = {
       // type (short header, 4 byte packet number)
       {"",
        { 0x43 }},
@@ -4010,7 +4010,7 @@
   // clang-format on
   PacketFragments& fragments =
       VersionHasIetfQuicFrames(framer_.transport_version())
-          ? packet99
+          ? packet_ietf
           : (framer_.version().HasIetfInvariantHeader() ? packet46 : packet);
 
   std::unique_ptr<QuicEncryptedPacket> encrypted(
@@ -4341,7 +4341,7 @@
        {0x00, 0x00, 0x00, 0x06}}
   };
 
-  PacketFragments packet99 = {
+  PacketFragments packet_ietf = {
       // type (short header, 4 byte packet number)
       {"",
        {0x43}},
@@ -4369,7 +4369,7 @@
 
   PacketFragments& fragments =
       VersionHasIetfQuicFrames(framer_.transport_version())
-          ? packet99
+          ? packet_ietf
           : (framer_.version().HasIetfInvariantHeader() ? packet46 : packet);
   std::unique_ptr<QuicEncryptedPacket> encrypted(
       AssemblePacketFromFragments(fragments));
@@ -4446,7 +4446,7 @@
       }
   };
 
-  PacketFragments packet99 = {
+  PacketFragments packet_ietf = {
       // type (short header, 4 byte packet number)
       {"",
        {0x43}},
@@ -4480,7 +4480,7 @@
 
   PacketFragments& fragments =
       VersionHasIetfQuicFrames(framer_.transport_version())
-          ? packet99
+          ? packet_ietf
           : (framer_.version().HasIetfInvariantHeader() ? packet46 : packet);
   std::unique_ptr<QuicEncryptedPacket> encrypted(
       AssemblePacketFromFragments(fragments));
@@ -4571,7 +4571,7 @@
       }
   };
 
-  PacketFragments packet99 = {
+  PacketFragments packet_ietf = {
       // type (short header, 4 byte packet number)
       {"",
        {0x43}},
@@ -4605,7 +4605,7 @@
 
   PacketFragments& fragments =
       VersionHasIetfQuicFrames(framer_.transport_version())
-          ? packet99
+          ? packet_ietf
           : (framer_.version().HasIetfInvariantHeader() ? packet46 : packet);
   std::unique_ptr<QuicEncryptedPacket> encrypted(
       AssemblePacketFromFragments(fragments));
@@ -4701,7 +4701,7 @@
     }
   };
 
-  PacketFragments packet99 = {
+  PacketFragments packet_ietf = {
     // type (short header, 4 byte packet number)
     {"",
      {0x43}},
@@ -4735,7 +4735,7 @@
 
   PacketFragments& fragments =
       VersionHasIetfQuicFrames(framer_.transport_version())
-          ? packet99
+          ? packet_ietf
           : (framer_.version().HasIetfInvariantHeader() ? packet46 : packet);
   std::unique_ptr<QuicEncryptedPacket> encrypted(
       AssemblePacketFromFragments(fragments));
@@ -4778,7 +4778,7 @@
   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
 
   // clang-format off
-  PacketFragments packet99 = {
+  PacketFragments packet_ietf = {
       // type (short header, 4 byte packet number)
       {"",
        {0x43}},
@@ -4808,7 +4808,7 @@
   // clang-format on
 
   std::unique_ptr<QuicEncryptedPacket> encrypted(
-      AssemblePacketFromFragments(packet99));
+      AssemblePacketFromFragments(packet_ietf));
   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
 
   EXPECT_THAT(framer_.error(), IsQuicNoError());
@@ -4827,7 +4827,7 @@
 
   ASSERT_EQ(0u, visitor_.ack_frames_.size());
 
-  CheckFramingBoundaries(packet99, QUIC_INVALID_CONNECTION_CLOSE_DATA);
+  CheckFramingBoundaries(packet_ietf, QUIC_INVALID_CONNECTION_CLOSE_DATA);
 }
 
 // Check that we can extract an error code from an application close.
@@ -4839,7 +4839,7 @@
   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
 
   // clang-format off
-  PacketFragments packet99 = {
+  PacketFragments packet_ietf = {
       // type (short header, 4 byte packet number)
       {"",
        {0x43}},
@@ -4870,7 +4870,7 @@
   // clang-format on
 
   std::unique_ptr<QuicEncryptedPacket> encrypted(
-      AssemblePacketFromFragments(packet99));
+      AssemblePacketFromFragments(packet_ietf));
   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
 
   EXPECT_THAT(framer_.error(), IsQuicNoError());
@@ -4889,7 +4889,7 @@
 
   ASSERT_EQ(0u, visitor_.ack_frames_.size());
 
-  CheckFramingBoundaries(packet99, QUIC_INVALID_CONNECTION_CLOSE_DATA);
+  CheckFramingBoundaries(packet_ietf, QUIC_INVALID_CONNECTION_CLOSE_DATA);
 }
 
 TEST_P(QuicFramerTest, GoAwayFrame) {
@@ -5153,7 +5153,7 @@
   }
   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
   // clang-format off
-  PacketFragments packet99 = {
+  PacketFragments packet_ietf = {
       // type (short header, 4 byte packet number)
       {"",
        {0x43}},
@@ -5174,7 +5174,7 @@
   // clang-format on
 
   std::unique_ptr<QuicEncryptedPacket> encrypted(
-      AssemblePacketFromFragments(packet99));
+      AssemblePacketFromFragments(packet_ietf));
   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
 
   EXPECT_THAT(framer_.error(), IsQuicNoError());
@@ -5187,7 +5187,7 @@
             visitor_.window_update_frame_.stream_id);
   EXPECT_EQ(kStreamOffset, visitor_.window_update_frame_.max_data);
 
-  CheckFramingBoundaries(packet99, QUIC_INVALID_MAX_DATA_FRAME_DATA);
+  CheckFramingBoundaries(packet_ietf, QUIC_INVALID_MAX_DATA_FRAME_DATA);
 }
 
 TEST_P(QuicFramerTest, MaxStreamDataFrame) {
@@ -5197,7 +5197,7 @@
   }
   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
   // clang-format off
-  PacketFragments packet99 = {
+  PacketFragments packet_ietf = {
       // type (short header, 4 byte packet number)
       {"",
        {0x43}},
@@ -5221,7 +5221,7 @@
   // clang-format on
 
   std::unique_ptr<QuicEncryptedPacket> encrypted(
-      AssemblePacketFromFragments(packet99));
+      AssemblePacketFromFragments(packet_ietf));
   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
 
   EXPECT_THAT(framer_.error(), IsQuicNoError());
@@ -5233,7 +5233,7 @@
   EXPECT_EQ(kStreamId, visitor_.window_update_frame_.stream_id);
   EXPECT_EQ(kStreamOffset, visitor_.window_update_frame_.max_data);
 
-  CheckFramingBoundaries(packet99, QUIC_INVALID_MAX_STREAM_DATA_FRAME_DATA);
+  CheckFramingBoundaries(packet_ietf, QUIC_INVALID_MAX_STREAM_DATA_FRAME_DATA);
 }
 
 TEST_P(QuicFramerTest, BlockedFrame) {
@@ -5275,7 +5275,7 @@
        {0x01, 0x02, 0x03, 0x04}},
   };
 
-  PacketFragments packet99 = {
+  PacketFragments packet_ietf = {
       // type (short header, 4 byte packet number)
       {"",
        {0x43}},
@@ -5299,7 +5299,7 @@
 
   PacketFragments& fragments =
       VersionHasIetfQuicFrames(framer_.transport_version())
-          ? packet99
+          ? packet_ietf
           : (framer_.version().HasIetfInvariantHeader() ? packet46 : packet);
   std::unique_ptr<QuicEncryptedPacket> encrypted(
       AssemblePacketFromFragments(fragments));
@@ -5352,7 +5352,7 @@
      0x07,
     };
 
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
      // type (short header, 4 byte packet number)
      0x43,
      // connection_id
@@ -5367,11 +5367,11 @@
 
   QuicEncryptedPacket encrypted(
       AsChars(VersionHasIetfQuicFrames(framer_.transport_version())
-                  ? packet99
+                  ? packet_ietf
                   : (framer_.version().HasIetfInvariantHeader() ? packet46
                                                                 : packet)),
       VersionHasIetfQuicFrames(framer_.transport_version())
-          ? ABSL_ARRAYSIZE(packet99)
+          ? ABSL_ARRAYSIZE(packet_ietf)
           : (framer_.version().HasIetfInvariantHeader()
                  ? ABSL_ARRAYSIZE(packet46)
                  : ABSL_ARRAYSIZE(packet)),
@@ -5498,7 +5498,7 @@
         {{},
          {'m', 'e', 's', 's', 'a', 'g', 'e', '2'}},
    };
-  PacketFragments packet99 = {
+  PacketFragments packet_ietf = {
        // type (short header, 4 byte packet number)
        {"",
         {0x43}},
@@ -5528,7 +5528,7 @@
 
   std::unique_ptr<QuicEncryptedPacket> encrypted;
   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
-    encrypted = AssemblePacketFromFragments(packet99);
+    encrypted = AssemblePacketFromFragments(packet_ietf);
   } else {
     encrypted = AssemblePacketFromFragments(packet46);
   }
@@ -5545,7 +5545,7 @@
   EXPECT_EQ(8u, visitor_.message_frames_[1]->message_length);
 
   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
-    CheckFramingBoundaries(packet99, QUIC_INVALID_MESSAGE_DATA);
+    CheckFramingBoundaries(packet_ietf, QUIC_INVALID_MESSAGE_DATA);
   } else {
     CheckFramingBoundaries(packet46, QUIC_INVALID_MESSAGE_DATA);
   }
@@ -6175,7 +6175,7 @@
     0x00, 0x00, 0x00, 0x00
   };
 
-  unsigned char packet99[kMaxOutgoingPacketSize] = {
+  unsigned char packet_ietf[kMaxOutgoingPacketSize] = {
     // type (short header, 4 byte packet number)
     0x43,
     // connection_id
@@ -6191,7 +6191,7 @@
 
   unsigned char* p = packet;
   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
-    p = packet99;
+    p = packet_ietf;
   } else if (framer_.version().HasIetfInvariantHeader()) {
     p = packet46;
   }
@@ -6280,7 +6280,7 @@
     0x00, 0x00,
   };
 
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
     // type (short header, 4 byte packet number)
     0x43,
     // connection_id
@@ -6314,8 +6314,8 @@
   unsigned char* p = packet;
   size_t p_size = ABSL_ARRAYSIZE(packet);
   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
-    p = packet99;
-    p_size = ABSL_ARRAYSIZE(packet99);
+    p = packet_ietf;
+    p_size = ABSL_ARRAYSIZE(packet_ietf);
   } else if (framer_.version().HasIetfInvariantHeader()) {
     p = packet46;
     p_size = ABSL_ARRAYSIZE(packet46);
@@ -6364,7 +6364,7 @@
     0x00, 0x00, 0x00, 0x00
   };
 
-  unsigned char packet99[kMaxOutgoingPacketSize] = {
+  unsigned char packet_ietf[kMaxOutgoingPacketSize] = {
     // type (short header, 4 byte packet number)
     0x43,
     // connection_id
@@ -6380,7 +6380,7 @@
 
   unsigned char* p = packet;
   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
-    p = packet99;
+    p = packet_ietf;
   } else if (framer_.version().HasIetfInvariantHeader()) {
     p = packet46;
   }
@@ -6439,7 +6439,7 @@
     0x00, 0x00, 0x00, 0x00
   };
 
-  unsigned char packet99[kMaxOutgoingPacketSize] = {
+  unsigned char packet_ietf[kMaxOutgoingPacketSize] = {
     // type (short header, 2 byte packet number)
     0x41,
     // connection_id
@@ -6455,7 +6455,7 @@
 
   unsigned char* p = packet;
   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
-    p = packet99;
+    p = packet_ietf;
   } else if (framer_.version().HasIetfInvariantHeader()) {
     p = packet46;
   }
@@ -6514,7 +6514,7 @@
     0x00, 0x00, 0x00, 0x00
   };
 
-  unsigned char packet99[kMaxOutgoingPacketSize] = {
+  unsigned char packet_ietf[kMaxOutgoingPacketSize] = {
     // type (short header, 1 byte packet number)
     0x40,
     // connection_id
@@ -6530,7 +6530,7 @@
 
   unsigned char* p = packet;
   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
-    p = packet99;
+    p = packet_ietf;
   } else if (framer_.version().HasIetfInvariantHeader()) {
     p = packet46;
   }
@@ -6610,7 +6610,7 @@
     'r',  'l',  'd',  '!',
   };
 
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
     // type (short header, 4 byte packet number)
     0x43,
     // connection_id
@@ -6638,8 +6638,8 @@
   unsigned char* p = packet;
   size_t p_size = ABSL_ARRAYSIZE(packet);
   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
-    p = packet99;
-    p_size = ABSL_ARRAYSIZE(packet99);
+    p = packet_ietf;
+    p_size = ABSL_ARRAYSIZE(packet_ietf);
   } else if (framer_.version().HasIetfInvariantHeader()) {
     p = packet46;
     p_size = ABSL_ARRAYSIZE(packet46);
@@ -6734,7 +6734,7 @@
       'h',  'e',  'l',  'l',  'o',  ' ',  'w',  'o',  'r', 'l', 'd', '!',
   };
 
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
       // type (long header with packet type ZERO_RTT_PROTECTED)
       0xD3,
       // version tag
@@ -6768,8 +6768,8 @@
   unsigned char* p = packet;
   size_t p_size = ABSL_ARRAYSIZE(packet);
   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
-    p = packet99;
-    p_size = ABSL_ARRAYSIZE(packet99);
+    p = packet_ietf;
+    p_size = ABSL_ARRAYSIZE(packet_ietf);
   } else if (framer_.version().HasLongHeaderLengths()) {
     p = packet49;
     p_size = ABSL_ARRAYSIZE(packet49);
@@ -6825,7 +6825,7 @@
     'r',  'l',  'd',  '!',
   };
 
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
     // type (short header, 4 byte packet number)
     0x43,
     // connection_id
@@ -6850,8 +6850,8 @@
   unsigned char* packet = packet48;
   size_t packet_size = ABSL_ARRAYSIZE(packet48);
   if (framer_.version().HasIetfQuicFrames()) {
-    packet = packet99;
-    packet_size = ABSL_ARRAYSIZE(packet99);
+    packet = packet_ietf;
+    packet_size = ABSL_ARRAYSIZE(packet_ietf);
   }
 
   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
@@ -6896,7 +6896,7 @@
         'r',  'l',  'd',  '!'}},
   };
 
-  PacketFragments packet99 = {
+  PacketFragments packet_ietf = {
       // type (short header, 4 byte packet number)
       {"",
        {0x43}},
@@ -6925,7 +6925,7 @@
   // clang-format on
 
   PacketFragments& fragments =
-      framer_.version().HasIetfQuicFrames() ? packet99 : packet48;
+      framer_.version().HasIetfQuicFrames() ? packet_ietf : packet48;
   std::unique_ptr<QuicEncryptedPacket> encrypted(
       AssemblePacketFromFragments(fragments));
   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
@@ -7100,7 +7100,7 @@
       0x00,
   };
 
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
       // type (short header, 4 byte packet number)
       0x43,
       // connection_id
@@ -7123,8 +7123,8 @@
   unsigned char* p = packet;
   size_t p_size = ABSL_ARRAYSIZE(packet);
   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
-    p = packet99;
-    p_size = ABSL_ARRAYSIZE(packet99);
+    p = packet_ietf;
+    p_size = ABSL_ARRAYSIZE(packet_ietf);
   } else if (framer_.version().HasIetfInvariantHeader()) {
     p = packet46;
     p_size = ABSL_ARRAYSIZE(packet46);
@@ -7193,7 +7193,7 @@
   };
 
 
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
       // type (short header, 4 byte packet number)
       0x43,
       // connection_id
@@ -7216,8 +7216,8 @@
   unsigned char* p = packet;
   size_t p_size = ABSL_ARRAYSIZE(packet);
   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
-    p = packet99;
-    p_size = ABSL_ARRAYSIZE(packet99);
+    p = packet_ietf;
+    p_size = ABSL_ARRAYSIZE(packet_ietf);
   } else if (framer_.version().HasIetfInvariantHeader()) {
     p = packet46;
     p_size = ABSL_ARRAYSIZE(packet46);
@@ -7326,7 +7326,7 @@
       0x00,
   };
 
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
       // type (short header, 4 byte packet number)
       0x43,
       // connection_id
@@ -7364,8 +7364,8 @@
   unsigned char* p = packet;
   size_t p_size = ABSL_ARRAYSIZE(packet);
   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
-    p = packet99;
-    p_size = ABSL_ARRAYSIZE(packet99);
+    p = packet_ietf;
+    p_size = ABSL_ARRAYSIZE(packet_ietf);
   } else if (framer_.version().HasIetfInvariantHeader()) {
     p = packet46;
     p_size = ABSL_ARRAYSIZE(packet46);
@@ -7585,7 +7585,7 @@
       0x00,
   };
 
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
       // type (short header, 4 byte packet number)
       0x43,
       // connection_id
@@ -7673,8 +7673,8 @@
   unsigned char* p = packet;
   size_t p_size = ABSL_ARRAYSIZE(packet);
   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
-    p = packet99;
-    p_size = ABSL_ARRAYSIZE(packet99);
+    p = packet_ietf;
+    p_size = ABSL_ARRAYSIZE(packet_ietf);
   } else if (framer_.version().HasIetfInvariantHeader()) {
     p = packet46;
     p_size = ABSL_ARRAYSIZE(packet46);
@@ -7784,7 +7784,7 @@
     0x05, 0x06, 0x07, 0x08,
   };
 
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
     // type (short packet, 4 byte packet number)
     0x43,
     // connection_id
@@ -7811,8 +7811,8 @@
   unsigned char* p = packet;
   size_t p_size = ABSL_ARRAYSIZE(packet);
   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
-    p = packet99;
-    p_size = ABSL_ARRAYSIZE(packet99);
+    p = packet_ietf;
+    p_size = ABSL_ARRAYSIZE(packet_ietf);
   } else if (framer_.version().HasIetfInvariantHeader()) {
     p = packet46;
     p_size = ABSL_ARRAYSIZE(packet46);
@@ -7879,7 +7879,7 @@
     'n',
   };
 
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
     // type (short header, 4 byte packet number)
     0x43,
     // connection_id
@@ -7906,8 +7906,8 @@
   unsigned char* p = packet;
   size_t p_size = ABSL_ARRAYSIZE(packet);
   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
-    p = packet99;
-    p_size = ABSL_ARRAYSIZE(packet99);
+    p = packet_ietf;
+    p_size = ABSL_ARRAYSIZE(packet_ietf);
   } else if (framer_.version().HasIetfInvariantHeader()) {
     p = packet46;
     p_size = ABSL_ARRAYSIZE(packet46);
@@ -7983,7 +7983,7 @@
     'n',
   };
 
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
     // type (short header, 4 byte packet number)
     0x43,
     // connection_id
@@ -8012,8 +8012,8 @@
   unsigned char* p = packet;
   size_t p_size = ABSL_ARRAYSIZE(packet);
   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
-    p = packet99;
-    p_size = ABSL_ARRAYSIZE(packet99);
+    p = packet_ietf;
+    p_size = ABSL_ARRAYSIZE(packet_ietf);
   } else if (framer_.version().HasIetfInvariantHeader()) {
     p = packet46;
     p_size = ABSL_ARRAYSIZE(packet46);
@@ -8138,7 +8138,7 @@
     'A',  'A',  'A',  'A',  'A',  'A',  'A',  'A',
   };
 
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
     // type (short header, 4 byte packet number)
     0x43,
     // connection_id
@@ -8193,8 +8193,8 @@
   unsigned char* p = packet;
   size_t p_size = ABSL_ARRAYSIZE(packet);
   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
-    p = packet99;
-    p_size = ABSL_ARRAYSIZE(packet99);
+    p = packet_ietf;
+    p_size = ABSL_ARRAYSIZE(packet_ietf);
   } else if (framer_.version().HasIetfInvariantHeader()) {
     p = packet46;
     p_size = ABSL_ARRAYSIZE(packet46);
@@ -8228,7 +8228,7 @@
 
   // clang-format off
 
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
     // type (short header, 4 byte packet number)
     0x43,
     // connection_id
@@ -8254,8 +8254,8 @@
   ASSERT_TRUE(data != nullptr);
 
   quiche::test::CompareCharArraysWithHexError(
-      "constructed packet", data->data(), data->length(), AsChars(packet99),
-      ABSL_ARRAYSIZE(packet99));
+      "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
+      ABSL_ARRAYSIZE(packet_ietf));
 }
 
 TEST_P(QuicFramerTest, BuildTruncatedApplicationCloseFramePacket) {
@@ -8281,7 +8281,7 @@
   QuicFrames frames = {QuicFrame(&app_close_frame)};
 
   // clang-format off
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
     // type (short header, 4 byte packet number)
     0x43,
     // connection_id
@@ -8335,8 +8335,8 @@
   ASSERT_TRUE(data != nullptr);
 
   quiche::test::CompareCharArraysWithHexError(
-      "constructed packet", data->data(), data->length(), AsChars(packet99),
-      ABSL_ARRAYSIZE(packet99));
+      "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
+      ABSL_ARRAYSIZE(packet_ietf));
 }
 
 TEST_P(QuicFramerTest, BuildGoAwayPacket) {
@@ -8607,7 +8607,7 @@
     0x55, 0x66, 0x77, 0x88,
   };
 
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
     // type (short header, 4 byte packet number)
     0x43,
     // connection_id
@@ -8631,8 +8631,8 @@
   unsigned char* p = packet;
   size_t p_size = ABSL_ARRAYSIZE(packet);
   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
-    p = packet99;
-    p_size = ABSL_ARRAYSIZE(packet99);
+    p = packet_ietf;
+    p_size = ABSL_ARRAYSIZE(packet_ietf);
   } else if (framer_.version().HasIetfInvariantHeader()) {
     p = packet46;
     p_size = ABSL_ARRAYSIZE(packet46);
@@ -8661,7 +8661,7 @@
   QuicFrames frames = {QuicFrame(&window_update_frame)};
 
   // clang-format off
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
     // type (short header, 4 byte packet number)
     0x43,
     // connection_id
@@ -8683,8 +8683,8 @@
   ASSERT_TRUE(data != nullptr);
 
   quiche::test::CompareCharArraysWithHexError(
-      "constructed packet", data->data(), data->length(), AsChars(packet99),
-      ABSL_ARRAYSIZE(packet99));
+      "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
+      ABSL_ARRAYSIZE(packet_ietf));
 }
 
 TEST_P(QuicFramerTest, BuildMaxDataPacket) {
@@ -8707,7 +8707,7 @@
   QuicFrames frames = {QuicFrame(&window_update_frame)};
 
   // clang-format off
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
     // type (short header, 4 byte packet number)
     0x43,
     // connection_id
@@ -8727,8 +8727,8 @@
   ASSERT_TRUE(data != nullptr);
 
   quiche::test::CompareCharArraysWithHexError(
-      "constructed packet", data->data(), data->length(), AsChars(packet99),
-      ABSL_ARRAYSIZE(packet99));
+      "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
+      ABSL_ARRAYSIZE(packet_ietf));
 }
 
 TEST_P(QuicFramerTest, BuildBlockedPacket) {
@@ -8782,7 +8782,7 @@
     0x01, 0x02, 0x03, 0x04,
   };
 
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
     // type (short packet, 4 byte packet number)
     0x43,
     // connection_id
@@ -8803,8 +8803,8 @@
   unsigned char* p = packet;
   size_t p_size = ABSL_ARRAYSIZE(packet);
   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
-    p = packet99;
-    p_size = ABSL_ARRAYSIZE(packet99);
+    p = packet_ietf;
+    p_size = ABSL_ARRAYSIZE(packet_ietf);
   } else if (framer_.version().HasIetfInvariantHeader()) {
     p = packet46;
     p_size = ABSL_ARRAYSIZE(packet46);
@@ -8849,7 +8849,7 @@
     0x07,
   };
 
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
     // type (short header, 4 byte packet number)
     0x43,
     // connection_id
@@ -8864,7 +8864,7 @@
 
   unsigned char* p = packet;
   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
-    p = packet99;
+    p = packet_ietf;
   } else if (framer_.version().HasIetfInvariantHeader()) {
     p = packet46;
   }
@@ -8995,7 +8995,7 @@
     'm', 'e', 's', 's', 'a', 'g', 'e', '2'
   };
 
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
     // type (short header, 4 byte packet number)
     0x43,
     // connection_id
@@ -9018,7 +9018,7 @@
 
   unsigned char* p = packet46;
   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
-    p = packet99;
+    p = packet_ietf;
   }
 
   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
@@ -9065,7 +9065,7 @@
     0x07,
   };
 
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
     // type (short header, 4 byte packet number)
     0x43,
     // connection_id
@@ -9083,7 +9083,7 @@
 
   unsigned char* p = packet;
   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
-    p = packet99;
+    p = packet_ietf;
   } else if (framer_.version().HasIetfInvariantHeader()) {
     p = packet46;
   }
@@ -9748,7 +9748,7 @@
     0x9A, 0xBE,
   };
 
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
     // type (short header, 4 byte packet number)
     0x43,
     // connection_id
@@ -9800,8 +9800,8 @@
   unsigned char* p = packet;
   size_t p_size = ABSL_ARRAYSIZE(packet);
   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
-    p = packet99;
-    p_size = ABSL_ARRAYSIZE(packet99);
+    p = packet_ietf;
+    p_size = ABSL_ARRAYSIZE(packet_ietf);
   } else if (framer_.version().HasIetfInvariantHeader()) {
     p = packet46;
     p_size = ABSL_ARRAYSIZE(packet46);
@@ -9917,7 +9917,7 @@
   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
 
   // clang-format off
-  PacketFragments packet99 = {
+  PacketFragments packet_ietf = {
       // type (short header, 4 byte packet number)
       {"",
        {0x43}},
@@ -9937,7 +9937,7 @@
   // clang-format on
 
   std::unique_ptr<QuicEncryptedPacket> encrypted(
-      AssemblePacketFromFragments(packet99));
+      AssemblePacketFromFragments(packet_ietf));
   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
 
   EXPECT_THAT(framer_.error(), IsQuicNoError());
@@ -9948,7 +9948,7 @@
 
   EXPECT_EQ(kStreamOffset, visitor_.blocked_frame_.offset);
 
-  CheckFramingBoundaries(packet99, QUIC_INVALID_BLOCKED_DATA);
+  CheckFramingBoundaries(packet_ietf, QUIC_INVALID_BLOCKED_DATA);
 }
 
 TEST_P(QuicFramerTest, BuildIetfBlockedPacket) {
@@ -9969,7 +9969,7 @@
   QuicFrames frames = {QuicFrame(&frame)};
 
   // clang-format off
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
     // type (short header, 4 byte packet number)
     0x43,
     // connection_id
@@ -9988,8 +9988,8 @@
   ASSERT_TRUE(data != nullptr);
 
   quiche::test::CompareCharArraysWithHexError(
-      "constructed packet", data->data(), data->length(), AsChars(packet99),
-      ABSL_ARRAYSIZE(packet99));
+      "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
+      ABSL_ARRAYSIZE(packet_ietf));
 }
 
 TEST_P(QuicFramerTest, IetfStreamBlockedFrame) {
@@ -10000,7 +10000,7 @@
   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
 
   // clang-format off
-  PacketFragments packet99 = {
+  PacketFragments packet_ietf = {
       // type (short header, 4 byte packet number)
       {"",
        {0x43}},
@@ -10022,7 +10022,7 @@
   // clang-format on
 
   std::unique_ptr<QuicEncryptedPacket> encrypted(
-      AssemblePacketFromFragments(packet99));
+      AssemblePacketFromFragments(packet_ietf));
   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
 
   EXPECT_THAT(framer_.error(), IsQuicNoError());
@@ -10034,7 +10034,7 @@
   EXPECT_EQ(kStreamId, visitor_.blocked_frame_.stream_id);
   EXPECT_EQ(kStreamOffset, visitor_.blocked_frame_.offset);
 
-  CheckFramingBoundaries(packet99, QUIC_INVALID_STREAM_BLOCKED_DATA);
+  CheckFramingBoundaries(packet_ietf, QUIC_INVALID_STREAM_BLOCKED_DATA);
 }
 
 TEST_P(QuicFramerTest, BuildIetfStreamBlockedPacket) {
@@ -10055,7 +10055,7 @@
   QuicFrames frames = {QuicFrame(&frame)};
 
   // clang-format off
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
     // type (short header, 4 byte packet number)
     0x43,
     // connection_id
@@ -10076,8 +10076,8 @@
   ASSERT_TRUE(data != nullptr);
 
   quiche::test::CompareCharArraysWithHexError(
-      "constructed packet", data->data(), data->length(), AsChars(packet99),
-      ABSL_ARRAYSIZE(packet99));
+      "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
+      ABSL_ARRAYSIZE(packet_ietf));
 }
 
 TEST_P(QuicFramerTest, BiDiMaxStreamsFrame) {
@@ -10088,7 +10088,7 @@
   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
 
   // clang-format off
-  PacketFragments packet99 = {
+  PacketFragments packet_ietf = {
       // type (short header, 4 byte packet number)
       {"",
        {0x43}},
@@ -10108,7 +10108,7 @@
   // clang-format on
 
   std::unique_ptr<QuicEncryptedPacket> encrypted(
-      AssemblePacketFromFragments(packet99));
+      AssemblePacketFromFragments(packet_ietf));
   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
 
   EXPECT_THAT(framer_.error(), IsQuicNoError());
@@ -10119,7 +10119,7 @@
 
   EXPECT_EQ(3u, visitor_.max_streams_frame_.stream_count);
   EXPECT_FALSE(visitor_.max_streams_frame_.unidirectional);
-  CheckFramingBoundaries(packet99, QUIC_MAX_STREAMS_DATA);
+  CheckFramingBoundaries(packet_ietf, QUIC_MAX_STREAMS_DATA);
 }
 
 TEST_P(QuicFramerTest, UniDiMaxStreamsFrame) {
@@ -10130,7 +10130,7 @@
   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
 
   // clang-format off
-  PacketFragments packet99 = {
+  PacketFragments packet_ietf = {
       // type (short header, 4 byte packet number)
       {"",
        {0x43}},
@@ -10148,7 +10148,7 @@
   // clang-format on
 
   std::unique_ptr<QuicEncryptedPacket> encrypted(
-      AssemblePacketFromFragments(packet99));
+      AssemblePacketFromFragments(packet_ietf));
   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
 
@@ -10160,7 +10160,7 @@
 
   EXPECT_EQ(3u, visitor_.max_streams_frame_.stream_count);
   EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
-  CheckFramingBoundaries(packet99, QUIC_MAX_STREAMS_DATA);
+  CheckFramingBoundaries(packet_ietf, QUIC_MAX_STREAMS_DATA);
 }
 
 TEST_P(QuicFramerTest, ServerUniDiMaxStreamsFrame) {
@@ -10171,7 +10171,7 @@
   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
 
   // clang-format off
-  PacketFragments packet99 = {
+  PacketFragments packet_ietf = {
       // type (short header, 4 byte packet number)
       {"",
        {0x43}},
@@ -10191,7 +10191,7 @@
   // clang-format on
 
   std::unique_ptr<QuicEncryptedPacket> encrypted(
-      AssemblePacketFromFragments(packet99));
+      AssemblePacketFromFragments(packet_ietf));
   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
 
   EXPECT_THAT(framer_.error(), IsQuicNoError());
@@ -10202,7 +10202,7 @@
 
   EXPECT_EQ(3u, visitor_.max_streams_frame_.stream_count);
   EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
-  CheckFramingBoundaries(packet99, QUIC_MAX_STREAMS_DATA);
+  CheckFramingBoundaries(packet_ietf, QUIC_MAX_STREAMS_DATA);
 }
 
 TEST_P(QuicFramerTest, ClientUniDiMaxStreamsFrame) {
@@ -10213,7 +10213,7 @@
   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
 
   // clang-format off
-  PacketFragments packet99 = {
+  PacketFragments packet_ietf = {
       // type (short header, 4 byte packet number)
       {"",
        {0x43}},
@@ -10231,7 +10231,7 @@
   // clang-format on
 
   std::unique_ptr<QuicEncryptedPacket> encrypted(
-      AssemblePacketFromFragments(packet99));
+      AssemblePacketFromFragments(packet_ietf));
   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
 
@@ -10243,7 +10243,7 @@
 
   EXPECT_EQ(3u, visitor_.max_streams_frame_.stream_count);
   EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
-  CheckFramingBoundaries(packet99, QUIC_MAX_STREAMS_DATA);
+  CheckFramingBoundaries(packet_ietf, QUIC_MAX_STREAMS_DATA);
 }
 
 // The following four tests ensure that the framer can deserialize a stream
@@ -10260,7 +10260,7 @@
   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
 
   // clang-format off
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
     // type (short header, 4 byte packet number)
     0x43,
     // connection_id
@@ -10277,8 +10277,8 @@
   };
   // clang-format on
 
-  QuicEncryptedPacket encrypted(AsChars(packet99), ABSL_ARRAYSIZE(packet99),
-                                false);
+  QuicEncryptedPacket encrypted(AsChars(packet_ietf),
+                                ABSL_ARRAYSIZE(packet_ietf), false);
   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
   EXPECT_THAT(framer_.error(), IsQuicNoError());
   ASSERT_TRUE(visitor_.header_.get());
@@ -10298,7 +10298,7 @@
   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
 
   // clang-format off
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
     // type (short header, 4 byte packet number)
     0x43,
     // Test runs in client mode, no connection id
@@ -10314,8 +10314,8 @@
   };
   // clang-format on
 
-  QuicEncryptedPacket encrypted(AsChars(packet99), ABSL_ARRAYSIZE(packet99),
-                                false);
+  QuicEncryptedPacket encrypted(AsChars(packet_ietf),
+                                ABSL_ARRAYSIZE(packet_ietf), false);
   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
 
@@ -10337,7 +10337,7 @@
   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
 
   // clang-format off
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
     // type (short header, 4 byte packet number)
     0x43,
     // connection_id
@@ -10354,8 +10354,8 @@
   };
   // clang-format on
 
-  QuicEncryptedPacket encrypted(AsChars(packet99), ABSL_ARRAYSIZE(packet99),
-                                false);
+  QuicEncryptedPacket encrypted(AsChars(packet_ietf),
+                                ABSL_ARRAYSIZE(packet_ietf), false);
   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
 
   EXPECT_THAT(framer_.error(), IsQuicNoError());
@@ -10376,7 +10376,7 @@
   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
 
   // clang-format off
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
     // type (short header, 4 byte packet number)
     0x43,
     // Test runs in client mode, no connection id
@@ -10392,8 +10392,8 @@
   };
   // clang-format on
 
-  QuicEncryptedPacket encrypted(AsChars(packet99), ABSL_ARRAYSIZE(packet99),
-                                false);
+  QuicEncryptedPacket encrypted(AsChars(packet_ietf),
+                                ABSL_ARRAYSIZE(packet_ietf), false);
   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
 
@@ -10416,7 +10416,7 @@
   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
 
   // clang-format off
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
     // type (short header, 4 byte packet number)
     0x43,
     // connection_id
@@ -10430,8 +10430,8 @@
   };
   // clang-format on
 
-  QuicEncryptedPacket encrypted(AsChars(packet99), ABSL_ARRAYSIZE(packet99),
-                                false);
+  QuicEncryptedPacket encrypted(AsChars(packet_ietf),
+                                ABSL_ARRAYSIZE(packet_ietf), false);
   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
 }
 
@@ -10443,7 +10443,7 @@
   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
 
   // clang-format off
-  PacketFragments packet99 = {
+  PacketFragments packet_ietf = {
       // type (short header, 4 byte packet number)
       {"",
        {0x43}},
@@ -10463,7 +10463,7 @@
   // clang-format on
 
   std::unique_ptr<QuicEncryptedPacket> encrypted(
-      AssemblePacketFromFragments(packet99));
+      AssemblePacketFromFragments(packet_ietf));
   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
 
   EXPECT_THAT(framer_.error(), IsQuicNoError());
@@ -10475,7 +10475,7 @@
   EXPECT_EQ(0u, visitor_.max_streams_frame_.stream_count);
   EXPECT_TRUE(visitor_.max_streams_frame_.unidirectional);
 
-  CheckFramingBoundaries(packet99, QUIC_MAX_STREAMS_DATA);
+  CheckFramingBoundaries(packet_ietf, QUIC_MAX_STREAMS_DATA);
 }
 
 TEST_P(QuicFramerTest, BiDiStreamsBlockedFrame) {
@@ -10486,7 +10486,7 @@
   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
 
   // clang-format off
-  PacketFragments packet99 = {
+  PacketFragments packet_ietf = {
       // type (short header, 4 byte packet number)
       {"",
        {0x43}},
@@ -10507,7 +10507,7 @@
   // clang-format on
 
   std::unique_ptr<QuicEncryptedPacket> encrypted(
-      AssemblePacketFromFragments(packet99));
+      AssemblePacketFromFragments(packet_ietf));
   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
 
   EXPECT_THAT(framer_.error(), IsQuicNoError());
@@ -10519,7 +10519,7 @@
   EXPECT_EQ(3u, visitor_.streams_blocked_frame_.stream_count);
   EXPECT_FALSE(visitor_.streams_blocked_frame_.unidirectional);
 
-  CheckFramingBoundaries(packet99, QUIC_STREAMS_BLOCKED_DATA);
+  CheckFramingBoundaries(packet_ietf, QUIC_STREAMS_BLOCKED_DATA);
 }
 
 TEST_P(QuicFramerTest, UniDiStreamsBlockedFrame) {
@@ -10530,7 +10530,7 @@
   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
 
   // clang-format off
-  PacketFragments packet99 = {
+  PacketFragments packet_ietf = {
       // type (short header, 4 byte packet number)
       {"",
        {0x43}},
@@ -10551,7 +10551,7 @@
   // clang-format on
 
   std::unique_ptr<QuicEncryptedPacket> encrypted(
-      AssemblePacketFromFragments(packet99));
+      AssemblePacketFromFragments(packet_ietf));
   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
 
   EXPECT_THAT(framer_.error(), IsQuicNoError());
@@ -10562,7 +10562,7 @@
 
   EXPECT_EQ(3u, visitor_.streams_blocked_frame_.stream_count);
   EXPECT_TRUE(visitor_.streams_blocked_frame_.unidirectional);
-  CheckFramingBoundaries(packet99, QUIC_STREAMS_BLOCKED_DATA);
+  CheckFramingBoundaries(packet_ietf, QUIC_STREAMS_BLOCKED_DATA);
 }
 
 TEST_P(QuicFramerTest, ClientUniDiStreamsBlockedFrame) {
@@ -10573,7 +10573,7 @@
   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
 
   // clang-format off
-  PacketFragments packet99 = {
+  PacketFragments packet_ietf = {
       // type (short header, 4 byte packet number)
       {"",
        {0x43}},
@@ -10592,7 +10592,7 @@
   // clang-format on
 
   std::unique_ptr<QuicEncryptedPacket> encrypted(
-      AssemblePacketFromFragments(packet99));
+      AssemblePacketFromFragments(packet_ietf));
   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
 
@@ -10604,7 +10604,7 @@
 
   EXPECT_EQ(3u, visitor_.streams_blocked_frame_.stream_count);
   EXPECT_TRUE(visitor_.streams_blocked_frame_.unidirectional);
-  CheckFramingBoundaries(packet99, QUIC_STREAMS_BLOCKED_DATA);
+  CheckFramingBoundaries(packet_ietf, QUIC_STREAMS_BLOCKED_DATA);
 }
 
 // Check that when we get a STREAMS_BLOCKED frame that specifies too large
@@ -10619,7 +10619,7 @@
   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
 
   // clang-format off
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
     // type (short header, 4 byte packet number)
     0x43,
     // Test runs in client mode, no connection id
@@ -10635,8 +10635,8 @@
   };
   // clang-format on
 
-  QuicEncryptedPacket encrypted(AsChars(packet99), ABSL_ARRAYSIZE(packet99),
-                                false);
+  QuicEncryptedPacket encrypted(AsChars(packet_ietf),
+                                ABSL_ARRAYSIZE(packet_ietf), false);
   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
   EXPECT_FALSE(framer_.ProcessPacket(encrypted));
 
@@ -10655,7 +10655,7 @@
   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
 
   // clang-format off
-  PacketFragments packet99 = {
+  PacketFragments packet_ietf = {
       // type (short header, 4 byte packet number)
       {"",
        {0x43}},
@@ -10676,7 +10676,7 @@
   // clang-format on
 
   std::unique_ptr<QuicEncryptedPacket> encrypted(
-      AssemblePacketFromFragments(packet99));
+      AssemblePacketFromFragments(packet_ietf));
   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
 
   EXPECT_THAT(framer_.error(), IsQuicNoError());
@@ -10688,7 +10688,7 @@
   EXPECT_EQ(0u, visitor_.streams_blocked_frame_.stream_count);
   EXPECT_TRUE(visitor_.streams_blocked_frame_.unidirectional);
 
-  CheckFramingBoundaries(packet99, QUIC_STREAMS_BLOCKED_DATA);
+  CheckFramingBoundaries(packet_ietf, QUIC_STREAMS_BLOCKED_DATA);
 }
 
 TEST_P(QuicFramerTest, BuildBiDiStreamsBlockedPacket) {
@@ -10710,7 +10710,7 @@
   QuicFrames frames = {QuicFrame(frame)};
 
   // clang-format off
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
     // type (short header, 4 byte packet number)
     0x43,
     // connection_id
@@ -10729,8 +10729,8 @@
   ASSERT_TRUE(data != nullptr);
 
   quiche::test::CompareCharArraysWithHexError(
-      "constructed packet", data->data(), data->length(), AsChars(packet99),
-      ABSL_ARRAYSIZE(packet99));
+      "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
+      ABSL_ARRAYSIZE(packet_ietf));
 }
 
 TEST_P(QuicFramerTest, BuildUniStreamsBlockedPacket) {
@@ -10752,7 +10752,7 @@
   QuicFrames frames = {QuicFrame(frame)};
 
   // clang-format off
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
     // type (short header, 4 byte packet number)
     0x43,
     // connection_id
@@ -10771,8 +10771,8 @@
   ASSERT_TRUE(data != nullptr);
 
   quiche::test::CompareCharArraysWithHexError(
-      "constructed packet", data->data(), data->length(), AsChars(packet99),
-      ABSL_ARRAYSIZE(packet99));
+      "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
+      ABSL_ARRAYSIZE(packet_ietf));
 }
 
 TEST_P(QuicFramerTest, BuildBiDiMaxStreamsPacket) {
@@ -10794,7 +10794,7 @@
   QuicFrames frames = {QuicFrame(frame)};
 
   // clang-format off
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
     // type (short header, 4 byte packet number)
     0x43,
     // connection_id
@@ -10813,8 +10813,8 @@
   ASSERT_TRUE(data != nullptr);
 
   quiche::test::CompareCharArraysWithHexError(
-      "constructed packet", data->data(), data->length(), AsChars(packet99),
-      ABSL_ARRAYSIZE(packet99));
+      "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
+      ABSL_ARRAYSIZE(packet_ietf));
 }
 
 TEST_P(QuicFramerTest, BuildUniDiMaxStreamsPacket) {
@@ -10839,7 +10839,7 @@
   QuicFrames frames = {QuicFrame(frame)};
 
   // clang-format off
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
     // type (short header, 4 byte packet number)
     0x43,
     // connection_id
@@ -10858,8 +10858,8 @@
   ASSERT_TRUE(data != nullptr);
 
   quiche::test::CompareCharArraysWithHexError(
-      "constructed packet", data->data(), data->length(), AsChars(packet99),
-      ABSL_ARRAYSIZE(packet99));
+      "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
+      ABSL_ARRAYSIZE(packet_ietf));
 }
 
 TEST_P(QuicFramerTest, NewConnectionIdFrame) {
@@ -10869,7 +10869,7 @@
   }
   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
   // clang-format off
-  PacketFragments packet99 = {
+  PacketFragments packet_ietf = {
       // type (short header, 4 byte packet number)
       {"",
        {0x43}},
@@ -10898,7 +10898,7 @@
   // clang-format on
 
   std::unique_ptr<QuicEncryptedPacket> encrypted(
-      AssemblePacketFromFragments(packet99));
+      AssemblePacketFromFragments(packet_ietf));
   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
 
   EXPECT_THAT(framer_.error(), IsQuicNoError());
@@ -10918,7 +10918,7 @@
 
   ASSERT_EQ(0u, visitor_.ack_frames_.size());
 
-  CheckFramingBoundaries(packet99, QUIC_INVALID_NEW_CONNECTION_ID_DATA);
+  CheckFramingBoundaries(packet_ietf, QUIC_INVALID_NEW_CONNECTION_ID_DATA);
 }
 
 TEST_P(QuicFramerTest, NewConnectionIdFrameVariableLength) {
@@ -10928,7 +10928,7 @@
   }
   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
   // clang-format off
-  PacketFragments packet99 = {
+  PacketFragments packet_ietf = {
       // type (short header, 4 byte packet number)
       {"",
        {0x43}},
@@ -10957,7 +10957,7 @@
   // clang-format on
 
   std::unique_ptr<QuicEncryptedPacket> encrypted(
-      AssemblePacketFromFragments(packet99));
+      AssemblePacketFromFragments(packet_ietf));
   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
 
   EXPECT_THAT(framer_.error(), IsQuicNoError());
@@ -10977,7 +10977,7 @@
 
   ASSERT_EQ(0u, visitor_.ack_frames_.size());
 
-  CheckFramingBoundaries(packet99, QUIC_INVALID_NEW_CONNECTION_ID_DATA);
+  CheckFramingBoundaries(packet_ietf, QUIC_INVALID_NEW_CONNECTION_ID_DATA);
 }
 
 // Verifies that parsing a NEW_CONNECTION_ID frame with a length above the
@@ -10989,7 +10989,7 @@
   }
   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
   // clang-format off
-  PacketFragments packet99 = {
+  PacketFragments packet_ietf = {
       // type (short header, 4 byte packet number)
       {"",
        {0x43}},
@@ -11025,7 +11025,7 @@
   // clang-format on
 
   std::unique_ptr<QuicEncryptedPacket> encrypted(
-      AssemblePacketFromFragments(packet99));
+      AssemblePacketFromFragments(packet_ietf));
   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
   EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_NEW_CONNECTION_ID_DATA));
   EXPECT_EQ("Invalid new connection ID length for version.",
@@ -11041,7 +11041,7 @@
   }
   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
   // clang-format off
-  PacketFragments packet99 = {
+  PacketFragments packet_ietf = {
       // type (short header, 4 byte packet number)
       {"",
        {0x43}},
@@ -11070,7 +11070,7 @@
   // clang-format on
 
   std::unique_ptr<QuicEncryptedPacket> encrypted(
-      AssemblePacketFromFragments(packet99));
+      AssemblePacketFromFragments(packet_ietf));
   EXPECT_FALSE(framer_.ProcessPacket(*encrypted));
   EXPECT_THAT(framer_.error(), IsError(QUIC_INVALID_NEW_CONNECTION_ID_DATA));
   EXPECT_EQ("Retire_prior_to > sequence_number.", framer_.detailed_error());
@@ -11099,7 +11099,7 @@
   QuicFrames frames = {QuicFrame(&frame)};
 
   // clang-format off
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
     // type (short header, 4 byte packet number)
     0x43,
     // connection_id
@@ -11127,8 +11127,8 @@
   ASSERT_TRUE(data != nullptr);
 
   quiche::test::CompareCharArraysWithHexError(
-      "constructed packet", data->data(), data->length(), AsChars(packet99),
-      ABSL_ARRAYSIZE(packet99));
+      "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
+      ABSL_ARRAYSIZE(packet_ietf));
 }
 
 TEST_P(QuicFramerTest, NewTokenFrame) {
@@ -11234,7 +11234,7 @@
   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
 
   // clang-format off
-  PacketFragments packet99 = {
+  PacketFragments packet_ietf = {
       // type (short header, 4 byte packet number)
       {"",
        {0x43}},
@@ -11256,7 +11256,7 @@
   // clang-format on
 
   std::unique_ptr<QuicEncryptedPacket> encrypted(
-      AssemblePacketFromFragments(packet99));
+      AssemblePacketFromFragments(packet_ietf));
   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
 
   EXPECT_THAT(framer_.error(), IsQuicNoError());
@@ -11271,7 +11271,7 @@
   EXPECT_EQ(static_cast<uint64_t>(0x7654),
             visitor_.stop_sending_frame_.ietf_error_code);
 
-  CheckFramingBoundaries(packet99, QUIC_INVALID_STOP_SENDING_FRAME_DATA);
+  CheckFramingBoundaries(packet_ietf, QUIC_INVALID_STOP_SENDING_FRAME_DATA);
 }
 
 TEST_P(QuicFramerTest, BuildIetfStopSendingPacket) {
@@ -11294,7 +11294,7 @@
   QuicFrames frames = {QuicFrame(&frame)};
 
   // clang-format off
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
     // type (short header, 4 byte packet number)
     0x43,
     // connection_id
@@ -11315,8 +11315,8 @@
   ASSERT_TRUE(data != nullptr);
 
   quiche::test::CompareCharArraysWithHexError(
-      "constructed packet", data->data(), data->length(), AsChars(packet99),
-      ABSL_ARRAYSIZE(packet99));
+      "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
+      ABSL_ARRAYSIZE(packet_ietf));
 }
 
 TEST_P(QuicFramerTest, IetfPathChallengeFrame) {
@@ -11327,7 +11327,7 @@
   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
 
   // clang-format off
-  PacketFragments packet99 = {
+  PacketFragments packet_ietf = {
       // type (short header, 4 byte packet number)
       {"",
        {0x43}},
@@ -11347,7 +11347,7 @@
   // clang-format on
 
   std::unique_ptr<QuicEncryptedPacket> encrypted(
-      AssemblePacketFromFragments(packet99));
+      AssemblePacketFromFragments(packet_ietf));
   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
 
   EXPECT_THAT(framer_.error(), IsQuicNoError());
@@ -11359,7 +11359,7 @@
   EXPECT_EQ(QuicPathFrameBuffer({{0, 1, 2, 3, 4, 5, 6, 7}}),
             visitor_.path_challenge_frame_.data_buffer);
 
-  CheckFramingBoundaries(packet99, QUIC_INVALID_PATH_CHALLENGE_DATA);
+  CheckFramingBoundaries(packet_ietf, QUIC_INVALID_PATH_CHALLENGE_DATA);
 }
 
 TEST_P(QuicFramerTest, BuildIetfPathChallengePacket) {
@@ -11379,7 +11379,7 @@
   QuicFrames frames = {QuicFrame(&frame)};
 
   // clang-format off
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
     // type (short header, 4 byte packet number)
     0x43,
     // connection_id
@@ -11398,8 +11398,8 @@
   ASSERT_TRUE(data != nullptr);
 
   quiche::test::CompareCharArraysWithHexError(
-      "constructed packet", data->data(), data->length(), AsChars(packet99),
-      ABSL_ARRAYSIZE(packet99));
+      "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
+      ABSL_ARRAYSIZE(packet_ietf));
 }
 
 TEST_P(QuicFramerTest, IetfPathResponseFrame) {
@@ -11410,7 +11410,7 @@
   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
 
   // clang-format off
-  PacketFragments packet99 = {
+  PacketFragments packet_ietf = {
       // type (short header, 4 byte packet number)
       {"",
        {0x43}},
@@ -11430,7 +11430,7 @@
   // clang-format on
 
   std::unique_ptr<QuicEncryptedPacket> encrypted(
-      AssemblePacketFromFragments(packet99));
+      AssemblePacketFromFragments(packet_ietf));
   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
 
   EXPECT_THAT(framer_.error(), IsQuicNoError());
@@ -11442,7 +11442,7 @@
   EXPECT_EQ(QuicPathFrameBuffer({{0, 1, 2, 3, 4, 5, 6, 7}}),
             visitor_.path_response_frame_.data_buffer);
 
-  CheckFramingBoundaries(packet99, QUIC_INVALID_PATH_RESPONSE_DATA);
+  CheckFramingBoundaries(packet_ietf, QUIC_INVALID_PATH_RESPONSE_DATA);
 }
 
 TEST_P(QuicFramerTest, BuildIetfPathResponsePacket) {
@@ -11462,7 +11462,7 @@
   QuicFrames frames = {QuicFrame(&frame)};
 
   // clang-format off
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
     // type (short header, 4 byte packet number)
     0x43,
     // connection_id
@@ -11481,8 +11481,8 @@
   ASSERT_TRUE(data != nullptr);
 
   quiche::test::CompareCharArraysWithHexError(
-      "constructed packet", data->data(), data->length(), AsChars(packet99),
-      ABSL_ARRAYSIZE(packet99));
+      "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
+      ABSL_ARRAYSIZE(packet_ietf));
 }
 
 TEST_P(QuicFramerTest, GetRetransmittableControlFrameSize) {
@@ -12212,7 +12212,7 @@
   }
   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
   // clang-format off
-  PacketFragments packet99 = {
+  PacketFragments packet_ietf = {
       // type (short header, 4 byte packet number)
       {"",
        {0x43}},
@@ -12232,7 +12232,7 @@
   // clang-format on
 
   std::unique_ptr<QuicEncryptedPacket> encrypted(
-      AssemblePacketFromFragments(packet99));
+      AssemblePacketFromFragments(packet_ietf));
   EXPECT_TRUE(framer_.ProcessPacket(*encrypted));
 
   EXPECT_THAT(framer_.error(), IsQuicNoError());
@@ -12247,7 +12247,7 @@
 
   ASSERT_EQ(0u, visitor_.ack_frames_.size());
 
-  CheckFramingBoundaries(packet99, QUIC_INVALID_RETIRE_CONNECTION_ID_DATA);
+  CheckFramingBoundaries(packet_ietf, QUIC_INVALID_RETIRE_CONNECTION_ID_DATA);
 }
 
 TEST_P(QuicFramerTest, BuildRetireConnectionIdFramePacket) {
@@ -12268,7 +12268,7 @@
   QuicFrames frames = {QuicFrame(&frame)};
 
   // clang-format off
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
     // type (short header, 4 byte packet number)
     0x43,
     // connection_id
@@ -12287,8 +12287,8 @@
   ASSERT_TRUE(data != nullptr);
 
   quiche::test::CompareCharArraysWithHexError(
-      "constructed packet", data->data(), data->length(), AsChars(packet99),
-      ABSL_ARRAYSIZE(packet99));
+      "constructed packet", data->data(), data->length(), AsChars(packet_ietf),
+      ABSL_ARRAYSIZE(packet_ietf));
 }
 
 TEST_P(QuicFramerTest, AckFrameWithInvalidLargestObserved) {
@@ -12334,7 +12334,7 @@
     0x00
   };
 
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
     // type (short header, 4 byte packet number)
     0x43,
     // connection_id
@@ -12358,8 +12358,8 @@
   unsigned char* p = packet;
   size_t p_size = ABSL_ARRAYSIZE(packet);
   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
-    p = packet99;
-    p_size = ABSL_ARRAYSIZE(packet99);
+    p = packet_ietf;
+    p_size = ABSL_ARRAYSIZE(packet_ietf);
   } else if (framer_.version().HasIetfInvariantHeader()) {
     p = packet46;
   }
@@ -12412,7 +12412,7 @@
     0x00
   };
 
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
     // type (short header, 4 byte packet number)
     0x43,
     // connection_id
@@ -12436,8 +12436,8 @@
   unsigned char* p = packet;
   size_t p_size = ABSL_ARRAYSIZE(packet);
   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
-    p = packet99;
-    p_size = ABSL_ARRAYSIZE(packet99);
+    p = packet_ietf;
+    p_size = ABSL_ARRAYSIZE(packet_ietf);
   } else if (framer_.version().HasIetfInvariantHeader()) {
     p = packet46;
     p_size = ABSL_ARRAYSIZE(packet46);
@@ -12512,7 +12512,7 @@
     0x00
   };
 
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
     // type (short header, 4 byte packet number)
     0x43,
     // connection_id
@@ -12544,8 +12544,8 @@
   unsigned char* p = packet;
   size_t p_size = ABSL_ARRAYSIZE(packet);
   if (VersionHasIetfQuicFrames(framer_.transport_version())) {
-    p = packet99;
-    p_size = ABSL_ARRAYSIZE(packet99);
+    p = packet_ietf;
+    p_size = ABSL_ARRAYSIZE(packet_ietf);
   } else if (framer_.version().HasIetfInvariantHeader()) {
     p = packet46;
     p_size = ABSL_ARRAYSIZE(packet46);
@@ -12626,7 +12626,7 @@
       'O',  '_',  'W',  'O',
       'R',  'L',  'D',  '?',
   };
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
     // first coalesced packet
       // public flags (long header with packet type ZERO_RTT_PROTECTED and
       // 4-byte packet number)
@@ -12691,8 +12691,8 @@
   unsigned char* p = packet;
   size_t p_length = ABSL_ARRAYSIZE(packet);
   if (framer_.version().HasIetfQuicFrames()) {
-    p = packet99;
-    p_length = ABSL_ARRAYSIZE(packet99);
+    p = packet_ietf;
+    p_length = ABSL_ARRAYSIZE(packet_ietf);
   }
 
   QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
@@ -12768,7 +12768,7 @@
     0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00,
   };
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
     // first coalesced packet
       // public flags (long header with packet type ZERO_RTT_PROTECTED and
       // 4-byte packet number)
@@ -12810,8 +12810,8 @@
   unsigned char* p = packet;
   size_t p_length = ABSL_ARRAYSIZE(packet);
   if (framer_.version().HasIetfQuicFrames()) {
-    p = packet99;
-    p_length = ABSL_ARRAYSIZE(packet99);
+    p = packet_ietf;
+    p_length = ABSL_ARRAYSIZE(packet_ietf);
   }
 
   QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
@@ -12896,7 +12896,7 @@
       'O',  '_',  'W',  'O',
       'R',  'L',  'D',  '?',
   };
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
     // first coalesced packet
       // public flags (long header with packet type ZERO_RTT_PROTECTED and
       // 4-byte packet number)
@@ -12961,8 +12961,8 @@
   unsigned char* p = packet;
   size_t p_length = ABSL_ARRAYSIZE(packet);
   if (framer_.version().HasIetfQuicFrames()) {
-    p = packet99;
-    p_length = ABSL_ARRAYSIZE(packet99);
+    p = packet_ietf;
+    p_length = ABSL_ARRAYSIZE(packet_ietf);
   }
 
   QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
@@ -13268,7 +13268,7 @@
       'O',  '_',  'W',  'O',
       'R',  'L',  'D',  '?',
   };
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
     // first coalesced packet
       // public flags (long header with packet type HANDSHAKE and
       // 4-byte packet number)
@@ -13334,8 +13334,8 @@
   unsigned char* p = packet;
   size_t p_length = ABSL_ARRAYSIZE(packet);
   if (framer_.version().HasIetfQuicFrames()) {
-    p = packet99;
-    p_length = ABSL_ARRAYSIZE(packet99);
+    p = packet_ietf;
+    p_length = ABSL_ARRAYSIZE(packet_ietf);
   }
 
   QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
@@ -13436,7 +13436,7 @@
       'O',  '_',  'W',  'O',
       'R',  'L',  'D',  '?',
   };
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
     // first coalesced packet
       // public flags (long header with packet type ZERO_RTT_PROTECTED and
       // 4-byte packet number)
@@ -13501,8 +13501,8 @@
   unsigned char* p = packet;
   size_t p_length = ABSL_ARRAYSIZE(packet);
   if (framer_.version().HasIetfQuicFrames()) {
-    p = packet99;
-    p_length = ABSL_ARRAYSIZE(packet99);
+    p = packet_ietf;
+    p_length = ABSL_ARRAYSIZE(packet_ietf);
   }
 
   QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
@@ -13565,7 +13565,7 @@
       0xD3,
       // version would be here but we cut off the invalid coalesced header.
   };
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
     // first coalesced packet
       // public flags (long header with packet type ZERO_RTT_PROTECTED and
       // 4-byte packet number)
@@ -13606,8 +13606,8 @@
   unsigned char* p = packet;
   size_t p_length = ABSL_ARRAYSIZE(packet);
   if (framer_.version().HasIetfQuicFrames()) {
-    p = packet99;
-    p_length = ABSL_ARRAYSIZE(packet99);
+    p = packet_ietf;
+    p_length = ABSL_ARRAYSIZE(packet_ietf);
   }
 
   QuicEncryptedPacket encrypted(AsChars(p), p_length, false);
@@ -13799,7 +13799,7 @@
        // padding frame
        0x00,
    };
-  unsigned char long_header_packet99[] = {
+  unsigned char long_header_packet_ietf[] = {
        // public flags (long header with packet type ZERO_RTT_PROTECTED and
        // 4-byte packet number)
        0xD3,
@@ -13834,8 +13834,8 @@
                             ABSL_ARRAYSIZE(long_header_packet), false)));
   } else {
     EXPECT_TRUE(framer_.ProcessPacket(
-        QuicEncryptedPacket(AsChars(long_header_packet99),
-                            ABSL_ARRAYSIZE(long_header_packet99), false)));
+        QuicEncryptedPacket(AsChars(long_header_packet_ietf),
+                            ABSL_ARRAYSIZE(long_header_packet_ietf), false)));
   }
 
   EXPECT_THAT(framer_.error(), IsQuicNoError());
@@ -14623,7 +14623,7 @@
   }
   SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE);
   // clang-format off
-  unsigned char packet99[] = {
+  unsigned char packet_ietf[] = {
     // type (short header, 4 byte packet number)
     0x43,
     // connection_id
@@ -14644,8 +14644,8 @@
   };
   // clang-format on
 
-  framer_.ProcessPacket(
-      QuicEncryptedPacket(AsChars(packet99), ABSL_ARRAYSIZE(packet99), false));
+  framer_.ProcessPacket(QuicEncryptedPacket(
+      AsChars(packet_ietf), ABSL_ARRAYSIZE(packet_ietf), false));
   ASSERT_EQ(1u, visitor_.ack_frames_.size());
   // Verify ack_delay_time is set correctly.
   EXPECT_EQ(QuicTime::Delta::Infinite(),
