Automated g4 rollback of changelist 250877268. *** Reason for rollback *** Cause QUIC b3m prober failure. *** Original change description *** gfe-relnote: Remove QUIC version 44. False deprecate gfe2_reloadable_flag_quic_enable_version_44. *** PiperOrigin-RevId: 251922108 Change-Id: I327bebe14171d8617bcf99c62be54156812000ec
diff --git a/quic/core/http/quic_spdy_client_session_test.cc b/quic/core/http/quic_spdy_client_session_test.cc index cb45340..847de2b 100644 --- a/quic/core/http/quic_spdy_client_session_test.cc +++ b/quic/core/http/quic_spdy_client_session_test.cc
@@ -498,7 +498,7 @@ QuicReceivedPacket valid_packet(buf, 2, QuicTime::Zero(), false); // Close connection shouldn't be called. EXPECT_CALL(*connection_, CloseConnection(_, _, _)).Times(0); - if (connection_->transport_version() >= QUIC_VERSION_46) { + if (connection_->transport_version() > QUIC_VERSION_44) { // Illegal fixed bit value. EXPECT_CALL(*connection_, OnError(_)).Times(1); }
diff --git a/quic/core/quic_buffered_packet_store_test.cc b/quic/core/quic_buffered_packet_store_test.cc index c465ac9..466dffb 100644 --- a/quic/core/quic_buffered_packet_store_test.cc +++ b/quic/core/quic_buffered_packet_store_test.cc
@@ -55,7 +55,7 @@ packet_time_(QuicTime::Zero() + QuicTime::Delta::FromMicroseconds(42)), packet_(packet_content_.data(), packet_content_.size(), packet_time_), invalid_version_(UnsupportedQuicVersion()), - valid_version_(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_46) {} + valid_version_(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_44) {} protected: QuicBufferedPacketStoreVisitor visitor_;
diff --git a/quic/core/quic_dispatcher_test.cc b/quic/core/quic_dispatcher_test.cc index 188707b..305d359 100644 --- a/quic/core/quic_dispatcher_test.cc +++ b/quic/core/quic_dispatcher_test.cc
@@ -874,9 +874,10 @@ } TEST_F(QuicDispatcherTest, SupportedTransportVersionsChangeInFlight) { - static_assert(QUIC_ARRAYSIZE(kSupportedTransportVersions) == 5u, + static_assert(QUIC_ARRAYSIZE(kSupportedTransportVersions) == 6u, "Supported versions out of sync"); SetQuicReloadableFlag(quic_disable_version_39, false); + SetQuicReloadableFlag(quic_enable_version_44, true); SetQuicReloadableFlag(quic_enable_version_46, true); SetQuicReloadableFlag(quic_enable_version_47, true); SetQuicReloadableFlag(quic_enable_version_99, true); @@ -995,6 +996,39 @@ SerializeCHLO(), CONNECTION_ID_PRESENT, PACKET_4BYTE_PACKET_NUMBER, 1); + // Turn off version 44. + SetQuicReloadableFlag(quic_enable_version_44, false); + connection_id = TestConnectionId(++conn_id); + EXPECT_CALL(*dispatcher_, CreateQuicSession(connection_id, client_address, + QuicStringPiece("hq"), _)) + .Times(0); + ProcessPacket(client_address, connection_id, true, + ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_44), + SerializeCHLO(), CONNECTION_ID_PRESENT, + PACKET_4BYTE_PACKET_NUMBER, 1); + + // Turn on version 44. + SetQuicReloadableFlag(quic_enable_version_44, true); + connection_id = TestConnectionId(++conn_id); + EXPECT_CALL(*dispatcher_, CreateQuicSession(connection_id, client_address, + QuicStringPiece("hq"), _)) + .WillOnce(testing::Return(CreateSession( + dispatcher_.get(), config_, connection_id, client_address, + &mock_helper_, &mock_alarm_factory_, &crypto_config_, + QuicDispatcherPeer::GetCache(dispatcher_.get()), &session1_))); + EXPECT_CALL(*reinterpret_cast<MockQuicConnection*>(session1_->connection()), + ProcessUdpPacket(_, _, _)) + .WillOnce(WithArg<2>( + Invoke([this, connection_id](const QuicEncryptedPacket& packet) { + ValidatePacket(connection_id, packet); + }))); + EXPECT_CALL(*dispatcher_, + ShouldCreateOrBufferPacketForConnection(connection_id, _)); + ProcessPacket(client_address, connection_id, true, + ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_44), + SerializeCHLO(), CONNECTION_ID_PRESENT, + PACKET_4BYTE_PACKET_NUMBER, 1); + // Turn off version 39. SetQuicReloadableFlag(quic_disable_version_39, true); connection_id = TestConnectionId(++conn_id);
diff --git a/quic/core/quic_framer.cc b/quic/core/quic_framer.cc index 43885ea..3267710 100644 --- a/quic/core/quic_framer.cc +++ b/quic/core/quic_framer.cc
@@ -194,12 +194,24 @@ } uint8_t PacketNumberLengthToOnWireValue( + QuicTransportVersion version, QuicPacketNumberLength packet_number_length) { - return packet_number_length - 1; + if (version > QUIC_VERSION_44) { + return packet_number_length - 1; + } + switch (packet_number_length) { + case PACKET_1BYTE_PACKET_NUMBER: + return 0; + case PACKET_2BYTE_PACKET_NUMBER: + return 1; + case PACKET_4BYTE_PACKET_NUMBER: + return 2; + default: + QUIC_BUG << "Invalid packet number length."; + return 0; + } } -// TODO(fayang): Remove |version| when deprecating -// quic_no_framer_object_in_dispatcher. bool GetShortHeaderPacketNumberLength( QuicTransportVersion version, uint8_t type, @@ -207,7 +219,7 @@ QuicPacketNumberLength* packet_number_length) { DCHECK(!(type & FLAGS_LONG_HEADER)); const bool two_bits_packet_number_length = - infer_packet_header_type_from_version ? version > 44 + infer_packet_header_type_from_version ? version > QUIC_VERSION_44 : (type & FLAGS_FIXED_BIT); if (two_bits_packet_number_length) { *packet_number_length = @@ -231,16 +243,17 @@ return true; } -uint8_t LongHeaderTypeToOnWireValue(QuicLongHeaderType type) { +uint8_t LongHeaderTypeToOnWireValue(QuicTransportVersion version, + QuicLongHeaderType type) { switch (type) { case INITIAL: - return 0; + return version > QUIC_VERSION_44 ? 0 : 0x7F; case ZERO_RTT_PROTECTED: - return 1 << 4; + return version > QUIC_VERSION_44 ? 1 << 4 : 0x7C; case HANDSHAKE: - return 2 << 4; + return version > QUIC_VERSION_44 ? 2 << 4 : 0x7D; case RETRY: - return 3 << 4; + return version > QUIC_VERSION_44 ? 3 << 4 : 0x7E; case VERSION_NEGOTIATION: return 0xF0; // Value does not matter default: @@ -249,13 +262,11 @@ } } -// TODO(fayang): Remove |version| when deprecating -// quic_no_framer_object_in_dispatcher. bool GetLongHeaderType(QuicTransportVersion version, uint8_t type, QuicLongHeaderType* long_header_type) { DCHECK((type & FLAGS_LONG_HEADER) && version != QUIC_VERSION_UNSUPPORTED); - if (version > 44) { + if (version > QUIC_VERSION_44) { switch ((type & 0x30) >> 4) { case 0: *long_header_type = INITIAL; @@ -299,12 +310,10 @@ return true; } -// TODO(fayang): Remove |version| when deprecating -// quic_no_framer_object_in_dispatcher. QuicPacketNumberLength GetLongHeaderPacketNumberLength( QuicTransportVersion version, uint8_t type) { - if (version > 44) { + if (version > QUIC_VERSION_44) { return static_cast<QuicPacketNumberLength>((type & 0x03) + 1); } return PACKET_4BYTE_PACKET_NUMBER; @@ -1355,7 +1364,8 @@ type |= FLAGS_FIXED_BIT; type |= FLAGS_SHORT_HEADER_RESERVED_1; type |= FLAGS_SHORT_HEADER_RESERVED_2; - type |= PacketNumberLengthToOnWireValue(PACKET_1BYTE_PACKET_NUMBER); + type |= PacketNumberLengthToOnWireValue(QUIC_VERSION_UNSUPPORTED, + PACKET_1BYTE_PACKET_NUMBER); // Append type byte. if (!writer.WriteUInt8(type)) { @@ -2120,15 +2130,34 @@ bool QuicFramer::AppendIetfHeaderTypeByte(const QuicPacketHeader& header, QuicDataWriter* writer) { uint8_t type = 0; + if (transport_version() > QUIC_VERSION_44) { + if (header.version_flag) { + type = static_cast<uint8_t>( + FLAGS_LONG_HEADER | FLAGS_FIXED_BIT | + LongHeaderTypeToOnWireValue(transport_version(), + header.long_packet_type) | + PacketNumberLengthToOnWireValue(transport_version(), + header.packet_number_length)); + } else { + type = static_cast<uint8_t>( + FLAGS_FIXED_BIT | + PacketNumberLengthToOnWireValue(transport_version(), + header.packet_number_length)); + } + return writer->WriteUInt8(type); + } + if (header.version_flag) { type = static_cast<uint8_t>( - FLAGS_LONG_HEADER | FLAGS_FIXED_BIT | - LongHeaderTypeToOnWireValue(header.long_packet_type) | - PacketNumberLengthToOnWireValue(header.packet_number_length)); + FLAGS_LONG_HEADER | LongHeaderTypeToOnWireValue( + transport_version(), header.long_packet_type)); + DCHECK_EQ(PACKET_4BYTE_PACKET_NUMBER, header.packet_number_length); } else { - type = static_cast<uint8_t>( - FLAGS_FIXED_BIT | - PacketNumberLengthToOnWireValue(header.packet_number_length)); + type |= FLAGS_SHORT_HEADER_RESERVED_1; + type |= FLAGS_SHORT_HEADER_RESERVED_2; + DCHECK_GE(PACKET_4BYTE_PACKET_NUMBER, header.packet_number_length); + type |= PacketNumberLengthToOnWireValue(transport_version(), + header.packet_number_length); } return writer->WriteUInt8(type); } @@ -2520,9 +2549,7 @@ } else { header->version = ParseQuicVersionLabel(version_label); if (header->version.transport_version != QUIC_VERSION_UNSUPPORTED) { - // TODO(fayang): remove version check when deprecating - // quic_no_framer_object_in_dispatcher. - if (header->version.transport_version > 44 && + if (header->version.transport_version > QUIC_VERSION_44 && !(type & FLAGS_FIXED_BIT)) { set_detailed_error("Fixed bit is 0 in long header."); return false; @@ -2569,10 +2596,8 @@ ? CONNECTION_ID_PRESENT : CONNECTION_ID_ABSENT; header->source_connection_id_included = CONNECTION_ID_ABSENT; - // TODO(fayang): remove version check when deprecating - // quic_no_framer_object_in_dispatcher. - if (infer_packet_header_type_from_version_ && transport_version() > 44 && - !(type & FLAGS_FIXED_BIT)) { + if (infer_packet_header_type_from_version_ && + transport_version() > QUIC_VERSION_44 && !(type & FLAGS_FIXED_BIT)) { set_detailed_error("Fixed bit is 0 in short header."); return false; } @@ -2757,7 +2782,7 @@ set_detailed_error("Unable to read frame type."); return RaiseError(QUIC_INVALID_FRAME_DATA); } - const uint8_t special_mask = transport_version() <= QUIC_VERSION_43 + const uint8_t special_mask = transport_version() <= QUIC_VERSION_44 ? kQuicFrameTypeBrokenMask : kQuicFrameTypeSpecialMask; if (frame_type & special_mask) { @@ -2876,7 +2901,7 @@ case STOP_WAITING_FRAME: { if (GetQuicReloadableFlag(quic_do_not_accept_stop_waiting) && - version_.transport_version > QUIC_VERSION_43) { + version_.transport_version >= QUIC_VERSION_44) { QUIC_RELOADABLE_FLAG_COUNT(quic_do_not_accept_stop_waiting); set_detailed_error("STOP WAITING not supported in version 44+."); return RaiseError(QUIC_INVALID_STOP_WAITING_DATA);
diff --git a/quic/core/quic_framer_test.cc b/quic/core/quic_framer_test.cc index 37ed301..c54f235 100644 --- a/quic/core/quic_framer_test.cc +++ b/quic/core/quic_framer_test.cc
@@ -825,6 +825,14 @@ // private flags 0x00, }; + unsigned char packet44[kMaxIncomingPacketSize + 1] = { + // type (short header 4 byte packet number) + 0x32, + // connection_id + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, + // packet number + 0x78, 0x56, 0x34, 0x12, + }; unsigned char packet46[kMaxIncomingPacketSize + 1] = { // type (short header 4 byte packet number) 0x43, @@ -836,9 +844,12 @@ // clang-format on unsigned char* p = packet; size_t p_size = QUIC_ARRAYSIZE(packet); - if (framer_.transport_version() > QUIC_VERSION_43) { + if (framer_.transport_version() > QUIC_VERSION_44) { p = packet46; p_size = QUIC_ARRAYSIZE(packet46); + } else if (framer_.transport_version() > QUIC_VERSION_43) { + p = packet44; + p_size = QUIC_ARRAYSIZE(packet44); } const size_t header_size = GetPacketHeaderSize( @@ -915,6 +926,23 @@ TEST_P(QuicFramerTest, LongPacketHeader) { // clang-format off + PacketFragments packet44 = { + // type (long header with packet type INITIAL) + {"Unable to read type.", + {0xFF}}, + // version tag + {"Unable to read protocol version.", + {QUIC_VERSION_BYTES}}, + // connection_id length + {"Unable to read ConnectionId length.", + {0x50}}, + // connection_id + {"Unable to read Destination ConnectionId.", + {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}}, + // packet number + {"Unable to read packet number.", + {0x12, 0x34, 0x56, 0x78}}, + }; PacketFragments packet46 = { // type (long header with packet type INITIAL) {"Unable to read type.", @@ -939,8 +967,10 @@ return; } + PacketFragments& fragments = + framer_.transport_version() > QUIC_VERSION_44 ? packet46 : packet44; std::unique_ptr<QuicEncryptedPacket> encrypted( - AssemblePacketFromFragments(packet46)); + AssemblePacketFromFragments(fragments)); EXPECT_FALSE(framer_.ProcessPacket(*encrypted)); EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); @@ -951,7 +981,9 @@ EXPECT_TRUE(visitor_.header_->version_flag); EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number); - CheckFramingBoundaries(packet46, QUIC_INVALID_PACKET_HEADER); + CheckFramingBoundaries( + framer_.transport_version() > QUIC_VERSION_44 ? packet46 : packet44, + QUIC_INVALID_PACKET_HEADER); PacketHeaderFormat format; bool version_flag; @@ -977,11 +1009,13 @@ } SetQuicRestartFlag(quic_do_not_override_connection_id, true); SetDecrypterLevel(ENCRYPTION_ZERO_RTT); + const unsigned char type_byte = + framer_.transport_version() == QUIC_VERSION_44 ? 0xFC : 0xD3; // clang-format off unsigned char packet[] = { // public flags (long header with packet type ZERO_RTT_PROTECTED and // 4-byte packet number) - 0xD3, + type_byte, // version QUIC_VERSION_BYTES, // connection ID lengths @@ -1101,6 +1135,16 @@ {0x12, 0x34, 0x56, 0x78}}, }; + PacketFragments packet44 = { + // type (short header, 4 byte packet number) + {"Unable to read type.", + {0x32}}, + // connection_id + // packet number + {"Unable to read packet number.", + {0x12, 0x34, 0x56, 0x78}}, + }; + PacketFragments packet46 = { // type (short header, 4 byte packet number) {"Unable to read type.", @@ -1125,7 +1169,10 @@ PacketFragments& fragments = framer_.version().HasHeaderProtection() ? packet_hp - : (framer_.transport_version() > QUIC_VERSION_43 ? packet46 : packet); + : framer_.transport_version() > QUIC_VERSION_44 + ? packet46 + : (framer_.transport_version() > QUIC_VERSION_43 ? packet44 + : packet); std::unique_ptr<QuicEncryptedPacket> encrypted( AssemblePacketFromFragments(fragments)); EXPECT_FALSE(framer_.ProcessPacket(*encrypted)); @@ -1162,6 +1209,24 @@ {0x12, 0x34, 0x56, 0x78}}, }; + PacketFragments packet44 = { + // type (long header with packet type ZERO_RTT_PROTECTED) + {"Unable to read type.", + {0xFC}}, + // version tag + {"Unable to read protocol version.", + {QUIC_VERSION_BYTES}}, + // connection_id length + {"Unable to read ConnectionId length.", + {0x50}}, + // connection_id + {"Unable to read Destination ConnectionId.", + {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}}, + // packet number + {"Unable to read packet number.", + {0x12, 0x34, 0x56, 0x78}}, + }; + PacketFragments packet46 = { // type (long header with packet type ZERO_RTT_PROTECTED and 4 bytes // packet number) @@ -1207,7 +1272,10 @@ PacketFragments& fragments = framer_.transport_version() == QUIC_VERSION_99 ? packet99 - : (framer_.transport_version() > QUIC_VERSION_43 ? packet46 : packet); + : framer_.transport_version() > QUIC_VERSION_44 + ? packet46 + : (framer_.transport_version() > QUIC_VERSION_43 ? packet44 + : packet); std::unique_ptr<QuicEncryptedPacket> encrypted( AssemblePacketFromFragments(fragments)); EXPECT_FALSE(framer_.ProcessPacket(*encrypted)); @@ -1240,6 +1308,18 @@ {0x12, 0x34, 0x56, 0x78}}, }; + PacketFragments packet44 = { + // type (short header, 4 byte packet number) + {"Unable to read type.", + {0x32}}, + // connection_id + {"Unable to read Destination ConnectionId.", + {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}}, + // packet number + {"Unable to read packet number.", + {0x12, 0x34, 0x56, 0x78}}, + }; + PacketFragments packet46 = { // type (short header, 4 byte packet number) {"Unable to read type.", @@ -1268,7 +1348,10 @@ PacketFragments& fragments = framer_.version().HasHeaderProtection() ? packet_hp - : (framer_.transport_version() > QUIC_VERSION_43 ? packet46 : packet); + : framer_.transport_version() > QUIC_VERSION_44 + ? packet46 + : (framer_.transport_version() > QUIC_VERSION_43 ? packet44 + : packet); std::unique_ptr<QuicEncryptedPacket> encrypted( AssemblePacketFromFragments(fragments)); EXPECT_FALSE(framer_.ProcessPacket(*encrypted)); @@ -1300,6 +1383,18 @@ {0x56, 0x78}}, }; + PacketFragments packet44 = { + // type (short header, 2 byte packet number) + {"Unable to read type.", + {0x31}}, + // connection_id + {"Unable to read Destination ConnectionId.", + {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}}, + // packet number + {"Unable to read packet number.", + {0x56, 0x78}}, + }; + PacketFragments packet46 = { // type (short header, 2 byte packet number) {"Unable to read type.", @@ -1330,7 +1425,10 @@ PacketFragments& fragments = framer_.version().HasHeaderProtection() ? packet_hp - : (framer_.transport_version() > QUIC_VERSION_43 ? packet46 : packet); + : (framer_.transport_version() > QUIC_VERSION_44 + ? packet46 + : (framer_.transport_version() > QUIC_VERSION_43 ? packet44 + : packet)); std::unique_ptr<QuicEncryptedPacket> encrypted( AssemblePacketFromFragments(fragments)); if (framer_.version().HasHeaderProtection()) { @@ -1368,6 +1466,18 @@ {0x78}}, }; + PacketFragments packet44 = { + // type (8 byte connection_id and 1 byte packet number) + {"Unable to read type.", + {0x30}}, + // connection_id + {"Unable to read Destination ConnectionId.", + {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}}, + // packet number + {"Unable to read packet number.", + {0x78}}, + }; + PacketFragments packet46 = { // type (8 byte connection_id and 1 byte packet number) {"Unable to read type.", @@ -1399,7 +1509,10 @@ PacketFragments& fragments = framer_.version().HasHeaderProtection() ? packet_hp - : (framer_.transport_version() > QUIC_VERSION_43 ? packet46 : packet); + : (framer_.transport_version() > QUIC_VERSION_44 + ? packet46 + : (framer_.transport_version() > QUIC_VERSION_43 ? packet44 + : packet)); std::unique_ptr<QuicEncryptedPacket> encrypted( AssemblePacketFromFragments(fragments)); if (framer_.version().HasHeaderProtection()) { @@ -1508,6 +1621,28 @@ 0x00, 0x00, 0x00, 0x00 }; + unsigned char packet44[] = { + // type: Long header with packet type ZERO_RTT_PROTECTED + 0xFC, + // version tag + QUIC_VERSION_BYTES, + // connection_id length + 0x05, + // connection_id + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, + // packet number + 0x12, 0x34, 0x56, 0x78, + // nonce + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + + // frame type (padding) + 0x00, + 0x00, 0x00, 0x00, 0x00 + }; + unsigned char packet46[] = { // type: Long header with packet type ZERO_RTT_PROTECTED and 1 byte packet // number. @@ -1566,9 +1701,12 @@ if (framer_.transport_version() == QUIC_VERSION_99) { p = packet99; p_size = QUIC_ARRAYSIZE(packet99); - } else if (framer_.transport_version() > QUIC_VERSION_43) { + } else if (framer_.transport_version() > QUIC_VERSION_44) { p = packet46; p_size = QUIC_ARRAYSIZE(packet46); + } else if (framer_.transport_version() > QUIC_VERSION_43) { + p = packet44; + p_size = QUIC_ARRAYSIZE(packet44); } QuicEncryptedPacket encrypted(AsChars(p), p_size, false); @@ -1599,7 +1737,24 @@ 0x00, 0x00, 0x00, 0x00 }; - unsigned char packet46[] = { + unsigned char packet44[] = { + // type (long header with packet type ZERO_RTT_PROTECTED) + 0xFC, + // version tag + 'Q', '0', '0', '0', + // connection_id length + 0x50, + // connection_id + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, + // packet number + 0x12, 0x34, 0x56, 0x78, + + // frame type (padding frame) + 0x00, + 0x00, 0x00, 0x00, 0x00 + }; + + unsigned char packet45[] = { // type (long header, ZERO_RTT_PROTECTED, 4-byte packet number) 0xD3, // version tag @@ -1619,9 +1774,12 @@ unsigned char* p = packet; size_t p_size = QUIC_ARRAYSIZE(packet); - if (framer_.transport_version() > QUIC_VERSION_43) { - p = packet46; - p_size = QUIC_ARRAYSIZE(packet46); + if (framer_.transport_version() > QUIC_VERSION_44) { + p = packet45; + p_size = QUIC_ARRAYSIZE(packet45); + } else if (framer_.transport_version() > QUIC_VERSION_43) { + p = packet44; + p_size = QUIC_ARRAYSIZE(packet44); } QuicEncryptedPacket encrypted(AsChars(p), p_size, false); EXPECT_TRUE(framer_.ProcessPacket(encrypted)); @@ -1663,6 +1821,33 @@ 0x00, 0x00, }; + unsigned char packet44[] = { + // type (short header, 4 byte packet number) + 0x32, + // connection_id + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, + // packet number + 0x12, 0x34, 0x56, 0x78, + + // paddings + 0x00, 0x00, + // frame type (stream frame with fin) + 0xFF, + // stream id + 0x01, 0x02, 0x03, 0x04, + // offset + 0x3A, 0x98, 0xFE, 0xDC, + 0x32, 0x10, 0x76, 0x54, + // data length + 0x00, 0x0c, + // data + 'h', 'e', 'l', 'l', + 'o', ' ', 'w', 'o', + 'r', 'l', 'd', '!', + // paddings + 0x00, 0x00, + }; + unsigned char packet46[] = { // type (short header, 4 byte packet number) 0x43, @@ -1724,9 +1909,12 @@ if (framer_.transport_version() == QUIC_VERSION_99) { p = packet99; p_size = QUIC_ARRAYSIZE(packet99); - } else if (framer_.transport_version() > QUIC_VERSION_43) { + } else if (framer_.transport_version() > QUIC_VERSION_44) { p = packet46; p_size = QUIC_ARRAYSIZE(packet46); + } else if (framer_.transport_version() > QUIC_VERSION_43) { + p = packet44; + p_size = QUIC_ARRAYSIZE(packet44); } QuicEncryptedPacket encrypted(AsChars(p), p_size, false); @@ -1781,6 +1969,36 @@ 'r', 'l', 'd', '!'}}, }; + PacketFragments packet44 = { + // type (short header, 4 byte packet number) + {"", + {0x32}}, + // connection_id + {"", + {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}}, + // packet number + {"", + {0x12, 0x34, 0x56, 0x78}}, + // frame type (stream frame with fin) + {"", + {0xFF}}, + // stream id + {"Unable to read stream_id.", + {0x01, 0x02, 0x03, 0x04}}, + // offset + {"Unable to read offset.", + {0x3A, 0x98, 0xFE, 0xDC, + 0x32, 0x10, 0x76, 0x54}}, + {"Unable to read frame data.", + { + // data length + 0x00, 0x0c, + // data + 'h', 'e', 'l', 'l', + 'o', ' ', 'w', 'o', + 'r', 'l', 'd', '!'}}, + }; + PacketFragments packet46 = { // type (short header, 4 byte packet number) {"", @@ -1845,7 +2063,10 @@ PacketFragments& fragments = framer_.transport_version() == QUIC_VERSION_99 ? packet99 - : (framer_.transport_version() > QUIC_VERSION_43 ? packet46 : packet); + : (framer_.transport_version() > QUIC_VERSION_44 + ? packet46 + : (framer_.transport_version() > QUIC_VERSION_43 ? packet44 + : packet)); std::unique_ptr<QuicEncryptedPacket> encrypted( AssemblePacketFromFragments(fragments)); EXPECT_TRUE(framer_.ProcessPacket(*encrypted)); @@ -1952,6 +2173,21 @@ 0x00, }; + unsigned char packet44[] = { + // type (long header, ZERO_RTT_PROTECTED, 4-byte packet number) + 0xFC, + // version tag + QUIC_VERSION_BYTES, + // connection_id length + 0x05, + // connection_id + 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, + // packet number + 0x12, 0x34, 0x56, 0x78, + // padding frame + 0x00, + }; + unsigned char packet46[] = { // type (long header, ZERO_RTT_PROTECTED, 4-byte packet number) 0xD3, @@ -1990,16 +2226,19 @@ if (framer_.transport_version() == QUIC_VERSION_99) { p = packet99; p_length = QUIC_ARRAYSIZE(packet99); - } else if (framer_.transport_version() > QUIC_VERSION_43) { + } else if (framer_.transport_version() >= QUIC_VERSION_46) { p = packet46; p_length = QUIC_ARRAYSIZE(packet46); + } else if (framer_.transport_version() >= QUIC_VERSION_44) { + p = packet44; + p_length = QUIC_ARRAYSIZE(packet44); } QuicEncryptedPacket encrypted(AsChars(p), p_length, false); EXPECT_FALSE(framer_.ProcessPacket(encrypted)); if (framer_.version().HasHeaderProtection()) { EXPECT_EQ(QUIC_DECRYPTION_FAILURE, framer_.error()); EXPECT_EQ("Unable to decrypt header protection.", framer_.detailed_error()); - } else if (framer_.transport_version() > QUIC_VERSION_43) { + } else if (framer_.transport_version() >= QUIC_VERSION_44) { // Cannot read diversification nonce. EXPECT_EQ(QUIC_INVALID_PACKET_HEADER, framer_.error()); EXPECT_EQ("Unable to read nonce.", framer_.detailed_error()); @@ -2100,6 +2339,36 @@ 'r', 'l', 'd', '!'}}, }; + PacketFragments packet44 = { + // type (short header, 4 byte packet number) + {"", + {0x32}}, + // connection_id + {"", + {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}}, + // packet number + {"", + {0x12, 0x34, 0x56, 0x78}}, + // frame type (stream frame with fin) + {"", + {0xFD}}, + // stream id + {"Unable to read stream_id.", + {0x03, 0x04}}, + // offset + {"Unable to read offset.", + {0x3A, 0x98, 0xFE, 0xDC, + 0x32, 0x10, 0x76, 0x54}}, + {"Unable to read frame data.", + { + // data length + 0x00, 0x0c, + // data + 'h', 'e', 'l', 'l', + 'o', ' ', 'w', 'o', + 'r', 'l', 'd', '!'}}, + }; + PacketFragments packet46 = { // type (short header, 4 byte packet number) {"", @@ -2164,7 +2433,10 @@ PacketFragments& fragments = framer_.transport_version() == QUIC_VERSION_99 ? packet99 - : (framer_.transport_version() > QUIC_VERSION_43 ? packet46 : packet); + : (framer_.transport_version() > QUIC_VERSION_44 + ? packet46 + : (framer_.transport_version() > QUIC_VERSION_43 ? packet44 + : packet)); std::unique_ptr<QuicEncryptedPacket> encrypted( AssemblePacketFromFragments(fragments)); EXPECT_TRUE(framer_.ProcessPacket(*encrypted)); @@ -2219,6 +2491,36 @@ 'r', 'l', 'd', '!'}}, }; + PacketFragments packet44 = { + // type (short header, 4 byte packet number) + {"", + {0x32}}, + // connection_id + {"", + {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}}, + // packet number + {"", + {0x12, 0x34, 0x56, 0x78}}, + // frame type (stream frame with fin) + {"", + {0xFC}}, + // stream id + {"Unable to read stream_id.", + {0x04}}, + // offset + {"Unable to read offset.", + {0x3A, 0x98, 0xFE, 0xDC, + 0x32, 0x10, 0x76, 0x54}}, + {"Unable to read frame data.", + { + // data length + 0x00, 0x0c, + // data + 'h', 'e', 'l', 'l', + 'o', ' ', 'w', 'o', + 'r', 'l', 'd', '!'}}, + }; + PacketFragments packet46 = { // type (short header, 4 byte packet number) {"", @@ -2283,7 +2585,10 @@ PacketFragments& fragments = framer_.transport_version() == QUIC_VERSION_99 ? packet99 - : (framer_.transport_version() > QUIC_VERSION_43 ? packet46 : packet); + : (framer_.transport_version() > QUIC_VERSION_44 + ? packet46 + : (framer_.transport_version() > QUIC_VERSION_43 ? packet44 + : packet)); std::unique_ptr<QuicEncryptedPacket> encrypted( AssemblePacketFromFragments(fragments)); EXPECT_TRUE(framer_.ProcessPacket(*encrypted)); @@ -2341,6 +2646,42 @@ 'r', 'l', 'd', '!'}}, }; + PacketFragments packet44 = { + // public flags (long header with packet type ZERO_RTT_PROTECTED) + {"", + {0xFC}}, + // version tag + {"", + {QUIC_VERSION_BYTES}}, + // connection_id length + {"", + {0x50}}, + // connection_id + {"", + {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}}, + // packet number + {"", + {0x12, 0x34, 0x56, 0x78}}, + // frame type (stream frame with fin) + {"", + {0xFE}}, + // stream id + {"Unable to read stream_id.", + {0x02, 0x03, 0x04}}, + // offset + {"Unable to read offset.", + {0x3A, 0x98, 0xFE, 0xDC, + 0x32, 0x10, 0x76, 0x54}}, + {"Unable to read frame data.", + { + // data length + 0x00, 0x0c, + // data + 'h', 'e', 'l', 'l', + 'o', ' ', 'w', 'o', + 'r', 'l', 'd', '!'}}, + }; + PacketFragments packet46 = { // public flags (long header with packet type ZERO_RTT_PROTECTED and // 4-byte packet number) @@ -2430,7 +2771,10 @@ PacketFragments& fragments = framer_.transport_version() == QUIC_VERSION_99 ? packet99 - : (framer_.transport_version() > QUIC_VERSION_43 ? packet46 : packet); + : (framer_.transport_version() > QUIC_VERSION_44 + ? packet46 + : (framer_.transport_version() > QUIC_VERSION_43 ? packet44 + : packet)); std::unique_ptr<QuicEncryptedPacket> encrypted( AssemblePacketFromFragments(fragments)); EXPECT_TRUE(framer_.ProcessPacket(*encrypted)); @@ -2484,6 +2828,29 @@ 'r', 'l', 'd', '!', }; + unsigned char packet44[] = { + // type (short header, 4 byte packet number) + 0x32, + // connection_id + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, + // packet number + 0x12, 0x34, 0x56, 0x78, + + // frame type (STREAM Frame with FIN, LEN, and OFFSET bits set) + 0x10 | 0x01 | 0x02 | 0x04, + // stream id + kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04, + // offset + kVarInt62EightBytes + 0x3A, 0x98, 0xFE, 0xDC, + 0x32, 0x10, 0x76, 0x54, + // data length + kVarInt62OneByte + 0x0c, + // data + 'h', 'e', 'l', 'l', + 'o', ' ', 'w', 'o', + 'r', 'l', 'd', '!', + }; + unsigned char packet46[] = { // type (short header, 4 byte packet number) 0x43, @@ -2509,12 +2876,14 @@ // clang-format on unsigned char* p = packet; - if (framer_.transport_version() > QUIC_VERSION_43) { + if (framer_.transport_version() > QUIC_VERSION_44) { p = packet46; + } else if (framer_.transport_version() > QUIC_VERSION_43) { + p = packet44; } QuicEncryptedPacket encrypted(AsChars(p), framer_.transport_version() > QUIC_VERSION_43 - ? QUIC_ARRAYSIZE(packet46) + ? QUIC_ARRAYSIZE(packet44) : QUIC_ARRAYSIZE(packet), false); EXPECT_TRUE(framer_.ProcessPacket(encrypted)); @@ -2540,6 +2909,15 @@ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, }; + unsigned char packet44[] = { + // type (short header, 1 byte packet number) + 0x30, + // connection_id + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, + // packet number + 0x01, + }; + unsigned char packet46[] = { // type (short header, 1 byte packet number) 0x40, @@ -2551,10 +2929,15 @@ // clang-format on QuicEncryptedPacket encrypted( - framer_.transport_version() > QUIC_VERSION_43 ? AsChars(packet46) - : AsChars(packet), - framer_.transport_version() > QUIC_VERSION_43 ? QUIC_ARRAYSIZE(packet46) - : QUIC_ARRAYSIZE(packet), + framer_.transport_version() > QUIC_VERSION_44 + ? AsChars(packet46) + : (framer_.transport_version() > QUIC_VERSION_43 ? AsChars(packet44) + : AsChars(packet)), + framer_.transport_version() > QUIC_VERSION_44 + ? QUIC_ARRAYSIZE(packet46) + : (framer_.transport_version() > QUIC_VERSION_43 + ? QUIC_ARRAYSIZE(packet44) + : QUIC_ARRAYSIZE(packet)), false); EXPECT_TRUE(framer_.ProcessPacket(encrypted)); @@ -2594,6 +2977,34 @@ {0x00}} }; + PacketFragments packet44 = { + // type (short packet, 4 byte packet number) + {"", + {0x32}}, + // connection_id + {"", + {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}}, + // packet number + {"", + {0x12, 0x34, 0x56, 0x78}}, + // frame type (ack frame) + // (one ack block, 2 byte largest observed, 2 byte block length) + {"", + {0x45}}, + // largest acked + {"Unable to read largest acked.", + {0x12, 0x34}}, + // Zero delta time. + {"Unable to read ack delay time.", + {0x00, 0x00}}, + // first ack block length. + {"Unable to read first ack block length.", + {0x12, 0x34}}, + // num timestamps. + {"Unable to read num received packets.", + {0x00}} + }; + PacketFragments packet46 = { // type (short packet, 4 byte packet number) {"", @@ -2661,7 +3072,10 @@ PacketFragments& fragments = framer_.transport_version() == QUIC_VERSION_99 ? packet99 - : (framer_.transport_version() > QUIC_VERSION_43 ? packet46 : packet); + : (framer_.transport_version() > QUIC_VERSION_44 + ? packet46 + : (framer_.transport_version() > QUIC_VERSION_43 ? packet44 + : packet)); std::unique_ptr<QuicEncryptedPacket> encrypted( AssemblePacketFromFragments(fragments)); EXPECT_TRUE(framer_.ProcessPacket(*encrypted)); @@ -2715,6 +3129,34 @@ {0x00}} }; + PacketFragments packet44 = { + // type (short header, 4 byte packet number) + {"", + {0x32}}, + // connection_id + {"", + {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}}, + // packet number + {"", + {0x12, 0x34, 0x56, 0x78}}, + // frame type (ack frame) + // (one ack block, 2 byte largest observed, 2 byte block length) + {"", + {0x45}}, + // largest acked + {"Unable to read largest acked.", + {0x12, 0x34}}, + // Zero delta time. + {"Unable to read ack delay time.", + {0x00, 0x00}}, + // first ack block length. + {"Unable to read first ack block length.", + {0x88, 0x88}}, + // num timestamps. + {"Underflow with first ack block length 34952 largest acked is 4660.", + {0x00}} + }; + PacketFragments packet46 = { // type (short header, 4 byte packet number) {"", @@ -2774,7 +3216,10 @@ PacketFragments& fragments = framer_.transport_version() == QUIC_VERSION_99 ? packet99 - : (framer_.transport_version() > QUIC_VERSION_43 ? packet46 : packet); + : (framer_.transport_version() > QUIC_VERSION_44 + ? packet46 + : (framer_.transport_version() > QUIC_VERSION_43 ? packet44 + : packet)); std::unique_ptr<QuicEncryptedPacket> encrypted( AssemblePacketFromFragments(fragments)); EXPECT_FALSE(framer_.ProcessPacket(*encrypted)); @@ -3102,6 +3547,44 @@ { 0x00 }}, }; + PacketFragments packet44 = { + // type (short header, 4 byte packet number) + {"", + { 0x32 }}, + // connection_id + {"", + { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }}, + // packet number + {"", + { 0x12, 0x34, 0x56, 0x78 }}, + + // frame type (ack frame) + // (more than one ack block, 2 byte largest observed, 2 byte block length) + {"", + { 0x65 }}, + // largest acked + {"Unable to read largest acked.", + { 0x12, 0x34 }}, + // Zero delta time. + {"Unable to read ack delay time.", + { 0x00, 0x00 }}, + // num ack blocks ranges. + {"Unable to read num of ack blocks.", + { 0x01 }}, + // first ack block length. + {"Unable to read first ack block length.", + { 0x00, 0x00 }}, + // gap to next block. + { "First block length is zero.", + { 0x01 }}, + // ack block length. + { "First block length is zero.", + { 0x0e, 0xaf }}, + // Number of timestamps. + { "First block length is zero.", + { 0x00 }}, + }; + PacketFragments packet46 = { // type (short header, 4 byte packet number) {"", @@ -3142,7 +3625,9 @@ // clang-format on PacketFragments& fragments = - framer_.transport_version() > QUIC_VERSION_43 ? packet46 : packet; + framer_.transport_version() > QUIC_VERSION_44 + ? packet46 + : (framer_.transport_version() > QUIC_VERSION_43 ? packet44 : packet); std::unique_ptr<QuicEncryptedPacket> encrypted( AssemblePacketFromFragments(fragments)); @@ -3192,6 +3677,34 @@ {0x00}} }; + PacketFragments packet44 = { + // type (short header, 4 byte packet number) + {"", + {0x32}}, + // connection_id + {"", + {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}}, + // packet number + {"", + {0x56, 0x78, 0x9A, 0xBC}}, + // frame type (ack frame) + // (one ack block, 4 byte largest observed, 2 byte block length) + {"", + {0x49}}, + // largest acked + {"Unable to read largest acked.", + {0x12, 0x34, 0x56, 0x78}}, + // Zero delta time. + {"Unable to read ack delay time.", + {0x00, 0x00}}, + // first ack block length. + {"Unable to read first ack block length.", + {0x12, 0x34}}, + // num timestamps. + {"Unable to read num received packets.", + {0x00}} + }; + PacketFragments packet46 = { // type (short header, 4 byte packet number) {"", @@ -3251,7 +3764,10 @@ PacketFragments& fragments = framer_.transport_version() == QUIC_VERSION_99 ? packet99 - : (framer_.transport_version() > QUIC_VERSION_43 ? packet46 : packet); + : (framer_.transport_version() > QUIC_VERSION_44 + ? packet46 + : (framer_.transport_version() > QUIC_VERSION_43 ? packet44 + : packet)); std::unique_ptr<QuicEncryptedPacket> encrypted( AssemblePacketFromFragments(fragments)); EXPECT_TRUE(framer_.ProcessPacket(*encrypted)); @@ -3344,6 +3860,74 @@ { 0x32, 0x10 }}, }; + PacketFragments packet44 = { + // type (short header, 4 byte packet number) + {"", + { 0x32 }}, + // connection_id + {"", + { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }}, + // packet number + {"", + { 0x12, 0x34, 0x56, 0x78 }}, + + // frame type (ack frame) + // (more than one ack block, 2 byte largest observed, 2 byte block length) + {"", + { 0x65 }}, + // largest acked + {"Unable to read largest acked.", + { 0x12, 0x34 }}, + // Zero delta time. + {"Unable to read ack delay time.", + { 0x00, 0x00 }}, + // num ack blocks ranges. + {"Unable to read num of ack blocks.", + { 0x04 }}, + // first ack block length. + {"Unable to read first ack block length.", + { 0x00, 0x01 }}, + // gap to next block. + { "Unable to read gap to next ack block.", + { 0x01 }}, + // ack block length. + { "Unable to ack block length.", + { 0x0e, 0xaf }}, + // gap to next block. + { "Unable to read gap to next ack block.", + { 0xff }}, + // ack block length. + { "Unable to ack block length.", + { 0x00, 0x00 }}, + // gap to next block. + { "Unable to read gap to next ack block.", + { 0x91 }}, + // ack block length. + { "Unable to ack block length.", + { 0x01, 0xea }}, + // gap to next block. + { "Unable to read gap to next ack block.", + { 0x05 }}, + // ack block length. + { "Unable to ack block length.", + { 0x00, 0x04 }}, + // Number of timestamps. + { "Unable to read num received packets.", + { 0x02 }}, + // Delta from largest observed. + { "Unable to read sequence delta in received packets.", + { 0x01 }}, + // Delta time. + { "Unable to read time delta in received packets.", + { 0x76, 0x54, 0x32, 0x10 }}, + // Delta from largest observed. + { "Unable to read sequence delta in received packets.", + { 0x02 }}, + // Delta time. + { "Unable to read incremental time delta in received packets.", + { 0x32, 0x10 }}, + }; + PacketFragments packet46 = { // type (short header, 4 byte packet number) {"", @@ -3472,7 +4056,10 @@ PacketFragments& fragments = framer_.transport_version() == QUIC_VERSION_99 ? packet99 - : (framer_.transport_version() > QUIC_VERSION_43 ? packet46 : packet); + : (framer_.transport_version() > QUIC_VERSION_44 + ? packet46 + : (framer_.transport_version() > QUIC_VERSION_43 ? packet44 + : packet)); std::unique_ptr<QuicEncryptedPacket> encrypted( AssemblePacketFromFragments(fragments)); @@ -3528,6 +4115,31 @@ 0x10, 0x32, 0x54, 0x76, }; + unsigned char packet44[] = { + // type (short header, 4 byte packet number) + 0x32, + // connection_id + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, + // packet number + 0x12, 0x34, 0x56, 0x78, + + // frame type (ack frame) + // (no ack blocks, 1 byte largest observed, 1 byte block length) + 0x40, + // largest acked + 0x01, + // Zero delta time. + 0x00, 0x00, + // first ack block length. + 0x01, + // num timestamps. + 0x01, + // Delta from largest observed. + 0x01, + // Delta time. + 0x10, 0x32, 0x54, 0x76, + }; + unsigned char packet46[] = { // type (short header, 4 byte packet number) 0x43, @@ -3557,8 +4169,10 @@ return; } QuicEncryptedPacket encrypted( - AsChars(framer_.transport_version() > QUIC_VERSION_43 ? packet46 - : packet), + AsChars(framer_.transport_version() > QUIC_VERSION_44 + ? packet46 + : (framer_.transport_version() > QUIC_VERSION_43 ? packet44 + : packet)), QUIC_ARRAYSIZE(packet), false); EXPECT_FALSE(framer_.ProcessPacket(encrypted)); EXPECT_TRUE(QuicTextUtils::StartsWith( @@ -3597,6 +4211,35 @@ 0x10, 0x32, }; + unsigned char packet44[] = { + // type (short header, 4 byte packet number) + 0x32, + // connection_id + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, + // packet number + 0x12, 0x34, 0x56, 0x78, + + // frame type (ack frame) + // (no ack blocks, 1 byte largest observed, 1 byte block length) + 0x40, + // largest acked + 0x03, + // Zero delta time. + 0x00, 0x00, + // first ack block length. + 0x03, + // num timestamps. + 0x02, + // Delta from largest observed. + 0x01, + // Delta time. + 0x10, 0x32, 0x54, 0x76, + // Delta from largest observed. + 0x03, + // Delta time. + 0x10, 0x32, + }; + unsigned char packet46[] = { // type (short header, 4 byte packet number) 0x43, @@ -3630,8 +4273,10 @@ return; } QuicEncryptedPacket encrypted( - AsChars(framer_.transport_version() > QUIC_VERSION_43 ? packet46 - : packet), + AsChars(framer_.transport_version() > QUIC_VERSION_44 + ? packet46 + : (framer_.transport_version() > QUIC_VERSION_43 ? packet44 + : packet)), QUIC_ARRAYSIZE(packet), false); EXPECT_FALSE(framer_.ProcessPacket(encrypted)); EXPECT_TRUE(QuicTextUtils::StartsWith( @@ -3662,6 +4307,24 @@ {0x00, 0x00, 0x00, 0x08}} }; + PacketFragments packet44 = { + // type (short header, 4 byte packet number) + {"", + {0x32}}, + // connection_id + {"", + {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}}, + // packet number + {"", + {0x12, 0x34, 0x56, 0x78}}, + // frame type (stop waiting frame) + {"", + {0x06}}, + // least packet number awaiting an ack, delta from packet number. + {"Unable to read least unacked delta.", + {0x00, 0x00, 0x00, 0x08}} + }; + PacketFragments packet46 = { // type (short header, 4 byte packet number) {"", @@ -3682,12 +4345,14 @@ // clang-format on PacketFragments& fragments = - framer_.transport_version() > QUIC_VERSION_43 ? packet46 : packet; + framer_.transport_version() > QUIC_VERSION_44 + ? packet46 + : (framer_.transport_version() > QUIC_VERSION_43 ? packet44 : packet); std::unique_ptr<QuicEncryptedPacket> encrypted( AssemblePacketFromFragments(fragments)); if (GetQuicReloadableFlag(quic_do_not_accept_stop_waiting) && - version_.transport_version > QUIC_VERSION_43) { + version_.transport_version >= QUIC_VERSION_44) { EXPECT_FALSE(framer_.ProcessPacket(*encrypted)); EXPECT_EQ(QUIC_INVALID_STOP_WAITING_DATA, framer_.error()); EXPECT_EQ("STOP WAITING not supported in version 44+.", @@ -3714,7 +4379,7 @@ TEST_P(QuicFramerTest, InvalidNewStopWaitingFrame) { if (version_.transport_version == QUIC_VERSION_99 || (GetQuicReloadableFlag(quic_do_not_accept_stop_waiting) && - version_.transport_version > QUIC_VERSION_43)) { + version_.transport_version >= QUIC_VERSION_44)) { return; } SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE); @@ -3733,6 +4398,19 @@ 0x9A, 0xA8, }; + unsigned char packet44[] = { + // type (short header, 4 byte packet number) + 0x32, + // connection_id + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, + // packet number + 0x12, 0x34, 0x56, 0x78, + // frame type (stop waiting frame) + 0x06, + // least packet number awaiting an ack, delta from packet number. + 0x57, 0x78, 0x9A, 0xA8, + }; + unsigned char packet46[] = { // type (short header, 4 byte packet number) 0x43, @@ -3748,9 +4426,11 @@ // clang-format on QuicEncryptedPacket encrypted( - AsChars(framer_.transport_version() > QUIC_VERSION_43 ? packet46 - : packet), - framer_.transport_version() > QUIC_VERSION_43 ? QUIC_ARRAYSIZE(packet46) + AsChars(framer_.transport_version() > QUIC_VERSION_44 + ? packet46 + : (framer_.transport_version() > QUIC_VERSION_43 ? packet44 + : packet)), + framer_.transport_version() > QUIC_VERSION_43 ? QUIC_ARRAYSIZE(packet44) : QUIC_ARRAYSIZE(packet), false); EXPECT_FALSE(framer_.ProcessPacket(encrypted)); @@ -3786,6 +4466,31 @@ {0x00, 0x00, 0x00, 0x01}} }; + PacketFragments packet44 = { + // type (short header, 4 byte packet number) + {"", + {0x32}}, + // connection_id + {"", + {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}}, + // packet number + {"", + {0x12, 0x34, 0x56, 0x78}}, + // frame type (rst stream frame) + {"", + {0x01}}, + // stream id + {"Unable to read stream_id.", + {0x01, 0x02, 0x03, 0x04}}, + // sent byte offset + {"Unable to read rst stream sent byte offset.", + {0x3A, 0x98, 0xFE, 0xDC, + 0x32, 0x10, 0x76, 0x54}}, + // error code + {"Unable to read rst stream error code.", + {0x00, 0x00, 0x00, 0x01}} + }; + PacketFragments packet46 = { // type (short header, 4 byte packet number) {"", @@ -3839,7 +4544,10 @@ PacketFragments& fragments = framer_.transport_version() == QUIC_VERSION_99 ? packet99 - : (framer_.transport_version() > QUIC_VERSION_43 ? packet46 : packet); + : (framer_.transport_version() > QUIC_VERSION_44 + ? packet46 + : (framer_.transport_version() > QUIC_VERSION_43 ? packet44 + : packet)); std::unique_ptr<QuicEncryptedPacket> encrypted( AssemblePacketFromFragments(fragments)); EXPECT_TRUE(framer_.ProcessPacket(*encrypted)); @@ -3887,6 +4595,34 @@ } }; + PacketFragments packet44 = { + // type (short header, 4 byte packet number) + {"", + {0x32}}, + // connection_id + {"", + {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}}, + // packet number + {"", + {0x12, 0x34, 0x56, 0x78}}, + // frame type (connection close frame) + {"", + {0x02}}, + // error code + {"Unable to read connection close error code.", + {0x00, 0x00, 0x00, 0x11}}, + {"Unable to read connection close error details.", + { + // error details length + 0x0, 0x0d, + // error details + 'b', 'e', 'c', 'a', + 'u', 's', 'e', ' ', + 'I', ' ', 'c', 'a', + 'n'} + } + }; + PacketFragments packet46 = { // type (short header, 4 byte packet number) {"", @@ -3949,7 +4685,10 @@ PacketFragments& fragments = framer_.transport_version() == QUIC_VERSION_99 ? packet99 - : (framer_.transport_version() > QUIC_VERSION_43 ? packet46 : packet); + : (framer_.transport_version() > QUIC_VERSION_44 + ? packet46 + : (framer_.transport_version() > QUIC_VERSION_43 ? packet44 + : packet)); std::unique_ptr<QuicEncryptedPacket> encrypted( AssemblePacketFromFragments(fragments)); EXPECT_TRUE(framer_.ProcessPacket(*encrypted)); @@ -4074,6 +4813,38 @@ } }; + PacketFragments packet44 = { + // type (short header, 4 byte packet number) + {"", + {0x32}}, + // connection_id + {"", + {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}}, + // packet number + {"", + {0x12, 0x34, 0x56, 0x78}}, + // frame type (go away frame) + {"", + {0x03}}, + // error code + {"Unable to read go away error code.", + {0x00, 0x00, 0x00, 0x09}}, + // stream id + {"Unable to read last good stream id.", + {0x01, 0x02, 0x03, 0x04}}, + // stream id + {"Unable to read goaway reason.", + { + // error details length + 0x0, 0x0d, + // error details + 'b', 'e', 'c', 'a', + 'u', 's', 'e', ' ', + 'I', ' ', 'c', 'a', + 'n'} + } + }; + PacketFragments packet46 = { // type (short header, 4 byte packet number) {"", @@ -4108,7 +4879,9 @@ // clang-format on PacketFragments& fragments = - framer_.transport_version() > QUIC_VERSION_43 ? packet46 : packet; + framer_.transport_version() > QUIC_VERSION_44 + ? packet46 + : (framer_.transport_version() > QUIC_VERSION_43 ? packet44 : packet); std::unique_ptr<QuicEncryptedPacket> encrypted( AssemblePacketFromFragments(fragments)); EXPECT_TRUE(framer_.ProcessPacket(*encrypted)); @@ -4156,6 +4929,28 @@ 0x32, 0x10, 0x76, 0x54}}, }; + PacketFragments packet44 = { + // type (short header, 4 byte packet number) + {"", + {0x32}}, + // connection_id + {"", + {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}}, + // packet number + {"", + {0x12, 0x34, 0x56, 0x78}}, + // frame type (window update frame) + {"", + {0x04}}, + // stream id + {"Unable to read stream_id.", + {0x01, 0x02, 0x03, 0x04}}, + // byte offset + {"Unable to read window byte_offset.", + {0x3A, 0x98, 0xFE, 0xDC, + 0x32, 0x10, 0x76, 0x54}}, + }; + PacketFragments packet46 = { // type (short header, 4 byte packet number) {"", @@ -4181,7 +4976,9 @@ // clang-format on PacketFragments& fragments = - framer_.transport_version() > QUIC_VERSION_43 ? packet46 : packet; + framer_.transport_version() > QUIC_VERSION_44 + ? packet46 + : (framer_.transport_version() > QUIC_VERSION_43 ? packet44 : packet); std::unique_ptr<QuicEncryptedPacket> encrypted( AssemblePacketFromFragments(fragments)); EXPECT_TRUE(framer_.ProcessPacket(*encrypted)); @@ -4309,6 +5106,24 @@ {0x01, 0x02, 0x03, 0x04}}, }; + PacketFragments packet44 = { + // type (short header, 4 byte packet number) + {"", + {0x32}}, + // connection_id + {"", + {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}}, + // packet number + {"", + {0x12, 0x34, 0x56, 0x78}}, + // frame type (blocked frame) + {"", + {0x05}}, + // stream id + {"Unable to read stream_id.", + {0x01, 0x02, 0x03, 0x04}}, + }; + PacketFragments packet46 = { // type (short header, 4 byte packet number) {"", @@ -4352,7 +5167,10 @@ PacketFragments& fragments = framer_.transport_version() == QUIC_VERSION_99 ? packet99 - : (framer_.transport_version() > QUIC_VERSION_43 ? packet46 : packet); + : (framer_.transport_version() > QUIC_VERSION_44 + ? packet46 + : (framer_.transport_version() > QUIC_VERSION_43 ? packet44 + : packet)); std::unique_ptr<QuicEncryptedPacket> encrypted( AssemblePacketFromFragments(fragments)); EXPECT_TRUE(framer_.ProcessPacket(*encrypted)); @@ -4392,6 +5210,18 @@ 0x07, }; + unsigned char packet44[] = { + // type (short header, 4 byte packet number) + 0x32, + // connection_id + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, + // packet number + 0x12, 0x34, 0x56, 0x78, + + // frame type + 0x07, + }; + unsigned char packet46[] = { // type (short header, 4 byte packet number) 0x43, @@ -4420,13 +5250,18 @@ QuicEncryptedPacket encrypted( AsChars(framer_.transport_version() == QUIC_VERSION_99 ? packet99 - : (framer_.transport_version() > QUIC_VERSION_43 ? packet46 - : packet)), + : (framer_.transport_version() > QUIC_VERSION_44 + ? packet46 + : framer_.transport_version() > QUIC_VERSION_43 + ? packet44 + : packet)), framer_.transport_version() == QUIC_VERSION_99 ? QUIC_ARRAYSIZE(packet99) - : (framer_.transport_version() > QUIC_VERSION_43 + : (framer_.transport_version() > QUIC_VERSION_44 ? QUIC_ARRAYSIZE(packet46) - : QUIC_ARRAYSIZE(packet)), + : framer_.transport_version() > QUIC_VERSION_43 + ? QUIC_ARRAYSIZE(packet44) + : QUIC_ARRAYSIZE(packet)), false); EXPECT_TRUE(framer_.ProcessPacket(encrypted)); @@ -4442,11 +5277,38 @@ } TEST_P(QuicFramerTest, MessageFrame) { - if (framer_.transport_version() <= QUIC_VERSION_43) { + if (framer_.transport_version() <= QUIC_VERSION_44) { return; } SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE); // clang-format off + PacketFragments packet45 = { + // type (short header, 4 byte packet number) + {"", + {0x32}}, + // connection_id + {"", + {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}}, + // packet number + {"", + {0x12, 0x34, 0x56, 0x78}}, + // message frame type. + {"", + { 0x21 }}, + // message length + {"Unable to read message length", + {0x07}}, + // message data + {"Unable to read message data", + {'m', 'e', 's', 's', 'a', 'g', 'e'}}, + // message frame no length. + {"", + { 0x20 }}, + // message data + {{}, + {'m', 'e', 's', 's', 'a', 'g', 'e', '2'}}, + }; + PacketFragments packet46 = { // type (short header, 4 byte packet number) {"", @@ -4475,8 +5337,8 @@ }; // clang-format on - std::unique_ptr<QuicEncryptedPacket> encrypted( - AssemblePacketFromFragments(packet46)); + std::unique_ptr<QuicEncryptedPacket> encrypted(AssemblePacketFromFragments( + framer_.transport_version() > QUIC_VERSION_44 ? packet46 : packet45)); EXPECT_TRUE(framer_.ProcessPacket(*encrypted)); EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); @@ -4489,7 +5351,9 @@ EXPECT_EQ(7u, visitor_.message_frames_[0]->message_length); EXPECT_EQ(8u, visitor_.message_frames_[1]->message_length); - CheckFramingBoundaries(packet46, QUIC_INVALID_MESSAGE_DATA); + CheckFramingBoundaries( + framer_.transport_version() > QUIC_VERSION_44 ? packet46 : packet45, + QUIC_INVALID_MESSAGE_DATA); } TEST_P(QuicFramerTest, PublicResetPacketV33) { @@ -4790,7 +5654,7 @@ 'Q', '2', '.', '0'}}, }; - PacketFragments ietf_packet = { + PacketFragments packet44 = { // type (long header) {"", {0x8F}}, @@ -4812,7 +5676,7 @@ QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT); PacketFragments& fragments = - framer_.transport_version() > QUIC_VERSION_43 ? ietf_packet : packet; + framer_.transport_version() > QUIC_VERSION_43 ? packet44 : packet; std::unique_ptr<QuicEncryptedPacket> encrypted( AssemblePacketFromFragments(fragments)); EXPECT_TRUE(framer_.ProcessPacket(*encrypted)); @@ -4834,7 +5698,7 @@ if (!GetQuicRestartFlag(quic_server_drop_version_negotiation)) { return; } - if (framer_.transport_version() <= QUIC_VERSION_43) { + if (framer_.transport_version() < QUIC_VERSION_44) { return; } @@ -4998,6 +5862,19 @@ 0x00, 0x00, 0x00, 0x00 }; + unsigned char packet44[kMaxOutgoingPacketSize] = { + // type (short header, 4 byte packet number) + 0x32, + // connection_id + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, + // packet number + 0x12, 0x34, 0x56, 0x78, + + // frame type (padding frame) + 0x00, + 0x00, 0x00, 0x00, 0x00 + }; + unsigned char packet46[kMaxOutgoingPacketSize] = { // type (short header, 4 byte packet number) 0x43, @@ -5028,8 +5905,10 @@ unsigned char* p = packet; if (framer_.transport_version() == QUIC_VERSION_99) { p = packet99; - } else if (framer_.transport_version() > QUIC_VERSION_43) { + } else if (framer_.transport_version() > QUIC_VERSION_44) { p = packet46; + } else if (framer_.transport_version() > QUIC_VERSION_43) { + p = packet44; } uint64_t header_size = GetPacketHeaderSize( @@ -5044,7 +5923,7 @@ test::CompareCharArraysWithHexError( "constructed packet", data->data(), data->length(), AsChars(p), - framer_.transport_version() > QUIC_VERSION_43 ? QUIC_ARRAYSIZE(packet46) + framer_.transport_version() > QUIC_VERSION_43 ? QUIC_ARRAYSIZE(packet44) : QUIC_ARRAYSIZE(packet)); } @@ -5089,6 +5968,33 @@ 0x00, 0x00, }; + unsigned char packet44[] = { + // type (short header, 4 byte packet number) + 0x32, + // connection_id + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, + // packet number + 0x12, 0x34, 0x56, 0x78, + + // paddings + 0x00, 0x00, + // frame type (stream frame with fin) + 0xFF, + // stream id + 0x01, 0x02, 0x03, 0x04, + // offset + 0x3A, 0x98, 0xFE, 0xDC, + 0x32, 0x10, 0x76, 0x54, + // data length + 0x00, 0x0c, + // data + 'h', 'e', 'l', 'l', + 'o', ' ', 'w', 'o', + 'r', 'l', 'd', '!', + // paddings + 0x00, 0x00, + }; + unsigned char packet46[] = { // type (short header, 4 byte packet number) 0x43, @@ -5152,9 +6058,12 @@ if (framer_.transport_version() == QUIC_VERSION_99) { p = packet99; p_size = QUIC_ARRAYSIZE(packet99); - } else if (framer_.transport_version() > QUIC_VERSION_43) { + } else if (framer_.transport_version() > QUIC_VERSION_44) { p = packet46; p_size = QUIC_ARRAYSIZE(packet46); + } else if (framer_.transport_version() > QUIC_VERSION_43) { + p = packet44; + p_size = QUIC_ARRAYSIZE(packet44); } QuicEncryptedPacket encrypted(AsChars(p), p_size, false); @@ -5187,6 +6096,19 @@ 0x00, 0x00, 0x00, 0x00 }; + unsigned char packet44[kMaxOutgoingPacketSize] = { + // type (short header, 4 byte packet number) + 0x32, + // connection_id + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, + // packet number + 0x12, 0x34, 0x56, 0x78, + + // frame type (padding frame) + 0x00, + 0x00, 0x00, 0x00, 0x00 + }; + unsigned char packet46[kMaxOutgoingPacketSize] = { // type (short header, 4 byte packet number) 0x43, @@ -5217,8 +6139,10 @@ unsigned char* p = packet; if (framer_.transport_version() == QUIC_VERSION_99) { p = packet99; - } else if (framer_.transport_version() > QUIC_VERSION_43) { + } else if (framer_.transport_version() > QUIC_VERSION_44) { p = packet46; + } else if (framer_.transport_version() > QUIC_VERSION_43) { + p = packet44; } uint64_t header_size = GetPacketHeaderSize( @@ -5233,7 +6157,7 @@ test::CompareCharArraysWithHexError( "constructed packet", data->data(), data->length(), AsChars(p), - framer_.transport_version() > QUIC_VERSION_43 ? QUIC_ARRAYSIZE(packet46) + framer_.transport_version() > QUIC_VERSION_43 ? QUIC_ARRAYSIZE(packet44) : QUIC_ARRAYSIZE(packet)); } @@ -5262,6 +6186,19 @@ 0x00, 0x00, 0x00, 0x00 }; + unsigned char packet44[kMaxOutgoingPacketSize] = { + // type (short header, 2 byte packet number) + 0x31, + // connection_id + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, + // packet number + 0x56, 0x78, + + // frame type (padding frame) + 0x00, + 0x00, 0x00, 0x00, 0x00 + }; + unsigned char packet46[kMaxOutgoingPacketSize] = { // type (short header, 2 byte packet number) 0x41, @@ -5292,8 +6229,10 @@ unsigned char* p = packet; if (framer_.transport_version() == QUIC_VERSION_99) { p = packet99; - } else if (framer_.transport_version() > QUIC_VERSION_43) { + } else if (framer_.transport_version() > QUIC_VERSION_44) { p = packet46; + } else if (framer_.transport_version() > QUIC_VERSION_43) { + p = packet44; } uint64_t header_size = GetPacketHeaderSize( @@ -5308,7 +6247,7 @@ test::CompareCharArraysWithHexError( "constructed packet", data->data(), data->length(), AsChars(p), - framer_.transport_version() > QUIC_VERSION_43 ? QUIC_ARRAYSIZE(packet46) + framer_.transport_version() > QUIC_VERSION_43 ? QUIC_ARRAYSIZE(packet44) : QUIC_ARRAYSIZE(packet)); } @@ -5337,6 +6276,19 @@ 0x00, 0x00, 0x00, 0x00 }; + unsigned char packet44[kMaxOutgoingPacketSize] = { + // type (short header, 1 byte packet number) + 0x30, + // connection_id + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, + // packet number + 0x78, + + // frame type (padding frame) + 0x00, + 0x00, 0x00, 0x00, 0x00 + }; + unsigned char packet46[kMaxOutgoingPacketSize] = { // type (short header, 1 byte packet number) 0x40, @@ -5367,8 +6319,10 @@ unsigned char* p = packet; if (framer_.transport_version() == QUIC_VERSION_99) { p = packet99; - } else if (framer_.transport_version() > QUIC_VERSION_43) { + } else if (framer_.transport_version() > QUIC_VERSION_44) { p = packet46; + } else if (framer_.transport_version() > QUIC_VERSION_43) { + p = packet44; } uint64_t header_size = GetPacketHeaderSize( @@ -5383,7 +6337,7 @@ test::CompareCharArraysWithHexError( "constructed packet", data->data(), data->length(), AsChars(p), - framer_.transport_version() > QUIC_VERSION_43 ? QUIC_ARRAYSIZE(packet46) + framer_.transport_version() > QUIC_VERSION_43 ? QUIC_ARRAYSIZE(packet44) : QUIC_ARRAYSIZE(packet)); } @@ -5425,6 +6379,27 @@ 'r', 'l', 'd', '!', }; + unsigned char packet44[] = { + // type (short header, 4 byte packet number) + 0x32, + // connection_id + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, + // packet number + 0x12, 0x34, 0x56, 0x78, + + // frame type (stream frame with fin and no length) + 0xDF, + // stream id + 0x01, 0x02, 0x03, 0x04, + // offset + 0x3A, 0x98, 0xFE, 0xDC, + 0x32, 0x10, 0x76, 0x54, + // data + 'h', 'e', 'l', 'l', + 'o', ' ', 'w', 'o', + 'r', 'l', 'd', '!', + }; + unsigned char packet46[] = { // type (short header, 4 byte packet number) 0x43, @@ -5476,9 +6451,12 @@ if (framer_.transport_version() == QUIC_VERSION_99) { p = packet99; p_size = QUIC_ARRAYSIZE(packet99); - } else if (framer_.transport_version() > QUIC_VERSION_43) { + } else if (framer_.transport_version() > QUIC_VERSION_44) { p = packet46; p_size = QUIC_ARRAYSIZE(packet46); + } else if (framer_.transport_version() > QUIC_VERSION_43) { + p = packet44; + p_size = QUIC_ARRAYSIZE(packet44); } test::CompareCharArraysWithHexError("constructed packet", data->data(), data->length(), AsChars(p), p_size); @@ -5522,6 +6500,28 @@ 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!', }; + unsigned char packet44[] = { + // type (long header with packet type ZERO_RTT_PROTECTED) + 0xFC, + // version tag + QUIC_VERSION_BYTES, + // connection_id length + 0x50, + // connection_id + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, + // packet number + 0x12, 0x34, 0x56, 0x78, + + // frame type (stream frame with fin and no length) + 0xDF, + // stream id + 0x01, 0x02, 0x03, 0x04, + // offset + 0x3A, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54, + // data + 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!', + }; + unsigned char packet46[] = { // type (long header with packet type ZERO_RTT_PROTECTED) 0xD3, @@ -5578,9 +6578,12 @@ if (framer_.transport_version() == QUIC_VERSION_99) { p = packet99; p_size = QUIC_ARRAYSIZE(packet99); - } else if (framer_.transport_version() > QUIC_VERSION_43) { + } else if (framer_.transport_version() > QUIC_VERSION_44) { p = packet46; p_size = QUIC_ARRAYSIZE(packet46); + } else if (framer_.transport_version() > QUIC_VERSION_43) { + p = packet44; + p_size = QUIC_ARRAYSIZE(packet44); } test::CompareCharArraysWithHexError("constructed packet", data->data(), data->length(), AsChars(p), p_size); @@ -5709,7 +6712,7 @@ if (GetQuicReloadableFlag(quic_send_version_negotiation_fixed_bit)) { type44 = 0xC0; } - unsigned char ietf_packet[] = { + unsigned char packet44[] = { // type (long header) type44, // version tag @@ -5725,8 +6728,8 @@ unsigned char* p = packet; size_t p_size = QUIC_ARRAYSIZE(packet); if (framer_.transport_version() > QUIC_VERSION_43) { - p = ietf_packet; - p_size = QUIC_ARRAYSIZE(ietf_packet); + p = packet44; + p_size = QUIC_ARRAYSIZE(packet44); } QuicConnectionId connection_id = FramerTestConnectionId(); @@ -5816,6 +6819,27 @@ 0x00, }; + unsigned char packet44[] = { + // type (short header, 4 byte packet number) + 0x32, + // connection_id + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, + // packet number + 0x12, 0x34, 0x56, 0x78, + + // frame type (ack frame) + // (no ack blocks, 2 byte largest observed, 2 byte block length) + 0x45, + // largest acked + 0x12, 0x34, + // Zero delta time. + 0x00, 0x00, + // first ack block length. + 0x12, 0x34, + // num timestamps. + 0x00, + }; + unsigned char packet46[] = { // type (short header, 4 byte packet number) 0x43, @@ -5862,9 +6886,12 @@ if (framer_.transport_version() == QUIC_VERSION_99) { p = packet99; p_size = QUIC_ARRAYSIZE(packet99); - } else if (framer_.transport_version() > QUIC_VERSION_43) { + } else if (framer_.transport_version() > QUIC_VERSION_44) { p = packet46; p_size = QUIC_ARRAYSIZE(packet46); + } else if (framer_.transport_version() > QUIC_VERSION_43) { + p = packet44; + p_size = QUIC_ARRAYSIZE(packet44); } std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); @@ -5908,6 +6935,27 @@ 0x00, }; + unsigned char packet44[] = { + // type (short header, 4 byte packet number) + 0x32, + // connection_id + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, + // packet number + 0x12, 0x34, 0x56, 0x78, + + // frame type (ack frame) + // (no ack blocks, 4 byte largest observed, 4 byte block length) + 0x4A, + // largest acked + 0x12, 0x34, 0x56, 0x78, + // Zero delta time. + 0x00, 0x00, + // first ack block length. + 0x12, 0x34, 0x56, 0x78, + // num timestamps. + 0x00, + }; + unsigned char packet46[] = { // type (short header, 4 byte packet number) 0x43, @@ -5955,9 +7003,12 @@ if (framer_.transport_version() == QUIC_VERSION_99) { p = packet99; p_size = QUIC_ARRAYSIZE(packet99); - } else if (framer_.transport_version() > QUIC_VERSION_43) { + } else if (framer_.transport_version() > QUIC_VERSION_44) { p = packet46; p_size = QUIC_ARRAYSIZE(packet46); + } else if (framer_.transport_version() > QUIC_VERSION_43) { + p = packet44; + p_size = QUIC_ARRAYSIZE(packet44); } std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); @@ -6024,6 +7075,45 @@ 0x00, }; + unsigned char packet44[] = { + // type (short header, 4 byte packet number) + 0x32, + // connection_id + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, + // packet number + 0x12, 0x34, 0x56, 0x78, + + // frame type (ack frame) + // (has ack blocks, 2 byte largest observed, 2 byte block length) + 0x65, + // largest acked + 0x12, 0x34, + // Zero delta time. + 0x00, 0x00, + // num ack blocks ranges. + 0x04, + // first ack block length. + 0x00, 0x01, + // gap to next block. + 0x01, + // ack block length. + 0x0e, 0xaf, + // gap to next block. + 0xff, + // ack block length. + 0x00, 0x00, + // gap to next block. + 0x91, + // ack block length. + 0x01, 0xea, + // gap to next block. + 0x05, + // ack block length. + 0x00, 0x04, + // num timestamps. + 0x00, + }; + unsigned char packet46[] = { // type (short header, 4 byte packet number) 0x43, @@ -6103,9 +7193,12 @@ if (framer_.transport_version() == QUIC_VERSION_99) { p = packet99; p_size = QUIC_ARRAYSIZE(packet99); - } else if (framer_.transport_version() > QUIC_VERSION_43) { + } else if (framer_.transport_version() > QUIC_VERSION_44) { p = packet46; p_size = QUIC_ARRAYSIZE(packet46); + } else if (framer_.transport_version() > QUIC_VERSION_43) { + p = packet44; + p_size = QUIC_ARRAYSIZE(packet44); } std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); @@ -6229,6 +7322,99 @@ 0x00, }; + unsigned char packet44[] = { + // type (short header, 4 byte packet number) + 0x32, + // connection_id + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, + // packet number + 0x12, 0x34, 0x56, 0x78, + // frame type (ack frame) + // (has ack blocks, 2 byte largest observed, 2 byte block length) + 0x65, + // largest acked + 0x12, 0x34, + // Zero delta time. + 0x00, 0x00, + // num ack blocks ranges. + 0xff, + // first ack block length. + 0x0f, 0xdd, + // 255 = 4 * 63 + 3 + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + // num timestamps. + 0x00, + }; + unsigned char packet46[] = { // type (short header, 4 byte packet number) 0x43, @@ -6412,9 +7598,12 @@ if (framer_.transport_version() == QUIC_VERSION_99) { p = packet99; p_size = QUIC_ARRAYSIZE(packet99); - } else if (framer_.transport_version() > QUIC_VERSION_43) { + } else if (framer_.transport_version() > QUIC_VERSION_44) { p = packet46; p_size = QUIC_ARRAYSIZE(packet46); + } else if (framer_.transport_version() > QUIC_VERSION_43) { + p = packet44; + p_size = QUIC_ARRAYSIZE(packet44); } std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); @@ -6502,6 +7691,25 @@ 0x05, 0x06, 0x07, 0x08, }; + unsigned char packet44[] = { + // type (short packet, 4 byte packet number) + 0x32, + // connection_id + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, + // packet number + 0x12, 0x34, 0x56, 0x78, + + // frame type (rst stream frame) + 0x01, + // stream id + 0x01, 0x02, 0x03, 0x04, + // sent byte offset + 0x08, 0x07, 0x06, 0x05, + 0x04, 0x03, 0x02, 0x01, + // error code + 0x05, 0x06, 0x07, 0x08, + }; + unsigned char packet46[] = { // type (short packet, 4 byte packet number) 0x43, @@ -6550,9 +7758,12 @@ if (framer_.transport_version() == QUIC_VERSION_99) { p = packet99; p_size = QUIC_ARRAYSIZE(packet99); - } else if (framer_.transport_version() > QUIC_VERSION_43) { + } else if (framer_.transport_version() > QUIC_VERSION_44) { p = packet46; p_size = QUIC_ARRAYSIZE(packet46); + } else if (framer_.transport_version() > QUIC_VERSION_43) { + p = packet44; + p_size = QUIC_ARRAYSIZE(packet44); } QuicEncryptedPacket encrypted(AsChars(p), p_size, false); @@ -6603,6 +7814,27 @@ 'n', }; + unsigned char packet44[] = { + // type (short header, 4 byte packet number) + 0x32, + // connection_id + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, + // packet number + 0x12, 0x34, 0x56, 0x78, + + // frame type (connection close frame) + 0x02, + // error code + 0x05, 0x06, 0x07, 0x08, + // error details length + 0x00, 0x0d, + // error details + 'b', 'e', 'c', 'a', + 'u', 's', 'e', ' ', + 'I', ' ', 'c', 'a', + 'n', + }; + unsigned char packet46[] = { // type (short header, 4 byte packet number) 0x43, @@ -6653,9 +7885,12 @@ if (framer_.transport_version() == QUIC_VERSION_99) { p = packet99; p_size = QUIC_ARRAYSIZE(packet99); - } else if (framer_.transport_version() > QUIC_VERSION_43) { + } else if (framer_.transport_version() > QUIC_VERSION_44) { p = packet46; p_size = QUIC_ARRAYSIZE(packet46); + } else if (framer_.transport_version() > QUIC_VERSION_43) { + p = packet44; + p_size = QUIC_ARRAYSIZE(packet44); } std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); @@ -6734,6 +7969,55 @@ 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', }; + unsigned char packet44[] = { + // type (short header, 4 byte packet number) + 0x32, + // connection_id + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, + // packet number + 0x12, 0x34, 0x56, 0x78, + + // frame type (connection close frame) + 0x02, + // error code + 0x05, 0x06, 0x07, 0x08, + // error details length + 0x01, 0x00, + // error details (truncated to 256 bytes) + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + }; + unsigned char packet46[] = { // type (short header, 4 byte packet number) 0x43, @@ -6840,9 +8124,12 @@ if (framer_.transport_version() == QUIC_VERSION_99) { p = packet99; p_size = QUIC_ARRAYSIZE(packet99); - } else if (framer_.transport_version() > QUIC_VERSION_43) { + } else if (framer_.transport_version() > QUIC_VERSION_44) { p = packet46; p_size = QUIC_ARRAYSIZE(packet46); + } else if (framer_.transport_version() > QUIC_VERSION_43) { + p = packet44; + p_size = QUIC_ARRAYSIZE(packet44); } std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); @@ -7024,6 +8311,29 @@ 'n', }; + unsigned char packet44[] = { + // type (short header, 4 byte packet number) + 0x32, + // connection_id + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, + // packet number + 0x12, 0x34, 0x56, 0x78, + + // frame type (go away frame) + 0x03, + // error code + 0x05, 0x06, 0x07, 0x08, + // stream id + 0x01, 0x02, 0x03, 0x04, + // error details length + 0x00, 0x0d, + // error details + 'b', 'e', 'c', 'a', + 'u', 's', 'e', ' ', + 'I', ' ', 'c', 'a', + 'n', + }; + unsigned char packet46[] = { // type (short header, 4 byte packet number) 0x43, @@ -7051,9 +8361,12 @@ unsigned char* p = packet; size_t p_size = QUIC_ARRAYSIZE(packet); - if (framer_.transport_version() > QUIC_VERSION_43) { + if (framer_.transport_version() > QUIC_VERSION_44) { p = packet46; p_size = QUIC_ARRAYSIZE(packet46); + } else if (framer_.transport_version() > QUIC_VERSION_43) { + p = packet44; + p_size = QUIC_ARRAYSIZE(packet44); } std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); @@ -7134,6 +8447,57 @@ 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', }; + unsigned char packet44[] = { + // type (short header, 4 byte packet number) + 0x32, + // connection_id + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, + // packet number + 0x12, 0x34, 0x56, 0x78, + + // frame type (go away frame) + 0x03, + // error code + 0x05, 0x06, 0x07, 0x08, + // stream id + 0x01, 0x02, 0x03, 0x04, + // error details length + 0x01, 0x00, + // error details (truncated to 256 bytes) + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + }; + unsigned char packet46[] = { // type (short header, 4 byte packet number) 0x43, @@ -7188,9 +8552,12 @@ unsigned char* p = packet; size_t p_size = QUIC_ARRAYSIZE(packet); - if (framer_.transport_version() > QUIC_VERSION_43) { + if (framer_.transport_version() > QUIC_VERSION_44) { p = packet46; p_size = QUIC_ARRAYSIZE(packet46); + } else if (framer_.transport_version() > QUIC_VERSION_43) { + p = packet44; + p_size = QUIC_ARRAYSIZE(packet44); } std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); @@ -7232,6 +8599,23 @@ 0x55, 0x66, 0x77, 0x88, }; + unsigned char packet44[] = { + // type (short header, 4 byte packet number) + 0x32, + // connection_id + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, + // packet number + 0x12, 0x34, 0x56, 0x78, + + // frame type (window update frame) + 0x04, + // stream id + 0x01, 0x02, 0x03, 0x04, + // byte offset + 0x11, 0x22, 0x33, 0x44, + 0x55, 0x66, 0x77, 0x88, + }; + unsigned char packet46[] = { // type (short header, 4 byte packet number) 0x43, @@ -7275,9 +8659,12 @@ if (framer_.transport_version() == QUIC_VERSION_99) { p = packet99; p_size = QUIC_ARRAYSIZE(packet99); - } else if (framer_.transport_version() > QUIC_VERSION_43) { + } else if (framer_.transport_version() > QUIC_VERSION_44) { p = packet46; p_size = QUIC_ARRAYSIZE(packet46); + } else if (framer_.transport_version() > QUIC_VERSION_43) { + p = packet44; + p_size = QUIC_ARRAYSIZE(packet44); } test::CompareCharArraysWithHexError("constructed packet", data->data(), @@ -7410,6 +8797,20 @@ 0x01, 0x02, 0x03, 0x04, }; + unsigned char packet44[] = { + // type (short packet, 4 byte packet number) + 0x32, + // connection_id + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, + // packet number + 0x12, 0x34, 0x56, 0x78, + + // frame type (blocked frame) + 0x05, + // stream id + 0x01, 0x02, 0x03, 0x04, + }; + unsigned char packet46[] = { // type (short packet, 4 byte packet number) 0x43, @@ -7447,9 +8848,12 @@ if (framer_.transport_version() == QUIC_VERSION_99) { p = packet99; p_size = QUIC_ARRAYSIZE(packet99); - } else if (framer_.transport_version() > QUIC_VERSION_43) { + } else if (framer_.transport_version() > QUIC_VERSION_44) { p = packet46; p_size = QUIC_ARRAYSIZE(packet46); + } else if (framer_.transport_version() > QUIC_VERSION_43) { + p = packet44; + p_size = QUIC_ARRAYSIZE(packet44); } test::CompareCharArraysWithHexError("constructed packet", data->data(), @@ -7479,6 +8883,18 @@ 0x07, }; + unsigned char packet44[] = { + // type (short header, 4 byte packet number) + 0x32, + // connection_id + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, + // packet number + 0x12, 0x34, 0x56, 0x78, + + // frame type + 0x07, + }; + unsigned char packet46[] = { // type (short header, 4 byte packet number) 0x43, @@ -7507,8 +8923,10 @@ unsigned char* p = packet; if (framer_.transport_version() == QUIC_VERSION_99) { p = packet99; - } else if (framer_.transport_version() > QUIC_VERSION_43) { + } else if (framer_.transport_version() > QUIC_VERSION_44) { p = packet46; + } else if (framer_.transport_version() > QUIC_VERSION_43) { + p = packet44; } std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); @@ -7516,12 +8934,12 @@ test::CompareCharArraysWithHexError( "constructed packet", data->data(), data->length(), AsChars(p), - framer_.transport_version() > QUIC_VERSION_43 ? QUIC_ARRAYSIZE(packet46) + framer_.transport_version() > QUIC_VERSION_43 ? QUIC_ARRAYSIZE(packet44) : QUIC_ARRAYSIZE(packet)); } TEST_P(QuicFramerTest, BuildMessagePacket) { - if (framer_.transport_version() <= QUIC_VERSION_43) { + if (framer_.transport_version() <= QUIC_VERSION_44) { return; } QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT); @@ -7537,6 +8955,26 @@ QuicFrames frames = {QuicFrame(&frame), QuicFrame(&frame2)}; // clang-format off + unsigned char packet45[] = { + // type (short header, 4 byte packet number) + 0x32, + // connection_id + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, + // packet number + 0x12, 0x34, 0x56, 0x78, + + // frame type (message frame) + 0x21, + // Length + 0x07, + // Message Data + 'm', 'e', 's', 's', 'a', 'g', 'e', + // frame type (message frame no length) + 0x20, + // Message Data + 'm', 'e', 's', 's', 'a', 'g', 'e', '2' + }; + unsigned char packet46[] = { // type (short header, 4 byte packet number) 0x43, @@ -7578,9 +9016,11 @@ }; // clang-format on - unsigned char* p = packet46; + unsigned char* p = packet45; if (framer_.transport_version() == QUIC_VERSION_99) { p = packet99; + } else if (framer_.transport_version() > QUIC_VERSION_44) { + p = packet46; } std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); @@ -7588,7 +9028,7 @@ test::CompareCharArraysWithHexError("constructed packet", data->data(), data->length(), AsChars(p), - QUIC_ARRAYSIZE(packet46)); + QUIC_ARRAYSIZE(packet45)); } // Test that the connectivity probing packet is serialized correctly as a @@ -7617,6 +9057,21 @@ 0x00, 0x00, 0x00, 0x00 }; + unsigned char packet44[] = { + // type (short header, 4 byte packet number) + 0x32, + // connection_id + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, + // packet number + 0x12, 0x34, 0x56, 0x78, + + // frame type + 0x07, + // frame type (padding frame) + 0x00, + 0x00, 0x00, 0x00, 0x00 + }; + unsigned char packet46[] = { // type (short header, 4 byte packet number) 0x43, @@ -7653,9 +9108,12 @@ if (framer_.transport_version() == QUIC_VERSION_99) { p = packet99; packet_size = QUIC_ARRAYSIZE(packet99); - } else if (framer_.transport_version() > QUIC_VERSION_43) { + } else if (framer_.transport_version() > QUIC_VERSION_44) { p = packet46; packet_size = QUIC_ARRAYSIZE(packet46); + } else if (framer_.transport_version() > QUIC_VERSION_43) { + p = packet44; + packet_size = QUIC_ARRAYSIZE(packet44); } std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]); @@ -7946,6 +9404,18 @@ 0x07, }; + unsigned char packet44[] = { + // type (short header, 4 byte packet number) + 0x32, + // connection_id + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, + // packet number + 0x12, 0x34, 0x56, 0x78, + + // frame type + 0x07, + }; + unsigned char packet46[] = { // type (short header, 4 byte packet number) 0x43, @@ -7977,13 +9447,15 @@ unsigned char* p = packet; if (framer_.transport_version() == QUIC_VERSION_99) { p = packet99; - } else if (framer_.transport_version() > QUIC_VERSION_43) { + } else if (framer_.transport_version() > QUIC_VERSION_44) { p = packet46; + } else if (framer_.transport_version() > QUIC_VERSION_43) { + p = packet44; } test::CompareCharArraysWithHexError( "constructed packet", data->data(), data->length(), AsChars(p), - framer_.transport_version() > QUIC_VERSION_43 ? QUIC_ARRAYSIZE(packet46) + framer_.transport_version() > QUIC_VERSION_43 ? QUIC_ARRAYSIZE(packet44) : QUIC_ARRAYSIZE(packet)); } @@ -8154,7 +9626,7 @@ TEST_P(QuicFramerTest, BuildIetfStatelessResetPacket) { // clang-format off - unsigned char packet[] = { + unsigned char packet44[] = { // type (short header, 1 byte packet number) 0x70, // random packet number @@ -8171,7 +9643,7 @@ ASSERT_TRUE(data != nullptr); // Skip packet number byte which is random in stateless reset packet. test::CompareCharArraysWithHexError("constructed packet", data->data(), 1, - AsChars(packet), 1); + AsChars(packet44), 1); const size_t random_bytes_length = data->length() - kPacketHeaderTypeSize - sizeof(kTestStatelessResetToken); EXPECT_EQ(kMinRandomBytesLengthInStatelessReset, random_bytes_length); @@ -8180,7 +9652,7 @@ "constructed packet", data->data() + data->length() - sizeof(kTestStatelessResetToken), sizeof(kTestStatelessResetToken), - AsChars(packet) + QUIC_ARRAYSIZE(packet) - + AsChars(packet44) + QUIC_ARRAYSIZE(packet44) - sizeof(kTestStatelessResetToken), sizeof(kTestStatelessResetToken)); } @@ -8203,6 +9675,21 @@ 'm', 'n', 'o', 'p', }; + unsigned char packet44[] = { + // type (short header, 4 byte packet number) + 0x32, + // connection_id + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, + // packet number + 0x12, 0x34, 0x56, 0x78, + + // redundancy + 'a', 'b', 'c', 'd', + 'e', 'f', 'g', 'h', + 'i', 'j', 'k', 'l', + 'm', 'n', 'o', 'p', + }; + unsigned char packet46[] = { // type (short header, 4 byte packet number) 0x43, @@ -8240,8 +9727,10 @@ if (framer_.transport_version() == QUIC_VERSION_99) { p = packet99; p_size = QUIC_ARRAYSIZE(packet99); - } else if (framer_.transport_version() > QUIC_VERSION_43) { + } else if (framer_.transport_version() > QUIC_VERSION_44) { p = packet46; + } else if (framer_.transport_version() > QUIC_VERSION_43) { + p = packet44; } std::unique_ptr<QuicPacket> raw(new QuicPacket( @@ -8278,6 +9767,25 @@ 'm', 'n', 'o', 'p', }; + unsigned char packet44[] = { + // type (long header with packet type ZERO_RTT_PROTECTED) + 0xFC, + // version tag + 'Q', '.', '1', '0', + // connection_id length + 0x50, + // connection_id + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, + // packet number + 0x12, 0x34, 0x56, 0x78, + + // redundancy + 'a', 'b', 'c', 'd', + 'e', 'f', 'g', 'h', + 'i', 'j', 'k', 'l', + 'm', 'n', 'o', 'p', + }; + unsigned char packet46[] = { // type (long header with packet type ZERO_RTT_PROTECTED) 0xD3, @@ -8323,9 +9831,12 @@ if (framer_.transport_version() == QUIC_VERSION_99) { p = packet99; p_size = QUIC_ARRAYSIZE(packet99); - } else if (framer_.transport_version() > QUIC_VERSION_43) { + } else if (framer_.transport_version() > QUIC_VERSION_44) { p = packet46; p_size = QUIC_ARRAYSIZE(packet46); + } else if (framer_.transport_version() > QUIC_VERSION_43) { + p = packet44; + p_size = QUIC_ARRAYSIZE(packet44); } std::unique_ptr<QuicPacket> raw(new QuicPacket( @@ -8508,6 +10019,43 @@ 0x9A, 0xBE, }; + unsigned char packet44[] = { + // type (short header, 4 byte packet number) + 0x32, + // connection_id + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, + // packet number + 0x12, 0x34, 0x56, 0x78, + + // frame type (stream frame with fin) + 0xFF, + // stream id + 0x01, 0x02, 0x03, 0x04, + // offset + 0x3A, 0x98, 0xFE, 0xDC, + 0x32, 0x10, 0x76, 0x54, + // data length + 0x00, 0x0c, + // data + 'h', 'e', 'l', 'l', + 'o', ' ', 'w', 'o', + 'r', 'l', 'd', '!', + + // frame type (ack frame) + 0x40, + // least packet number awaiting an ack + 0x12, 0x34, 0x56, 0x78, + 0x9A, 0xA0, + // largest observed packet number + 0x12, 0x34, 0x56, 0x78, + 0x9A, 0xBF, + // num missing packets + 0x01, + // missing packet + 0x12, 0x34, 0x56, 0x78, + 0x9A, 0xBE, + }; + unsigned char packet46[] = { // type (short header, 4 byte packet number) 0x43, @@ -8599,9 +10147,12 @@ if (framer_.transport_version() == QUIC_VERSION_99) { p = packet99; p_size = QUIC_ARRAYSIZE(packet99); - } else if (framer_.transport_version() > QUIC_VERSION_43) { + } else if (framer_.transport_version() > QUIC_VERSION_44) { p = packet46; p_size = QUIC_ARRAYSIZE(packet46); + } else if (framer_.transport_version() > QUIC_VERSION_43) { + p = packet44; + p_size = QUIC_ARRAYSIZE(packet44); } QuicEncryptedPacket encrypted(AsChars(p), p_size, false); EXPECT_TRUE(framer_.ProcessPacket(encrypted)); @@ -8764,6 +10315,27 @@ 'r', 'l', 'd', '!', }; + unsigned char packet44[] = { + // type (short header, 4 byte packet number) + 0x32, + // packet number + 0x12, 0x34, 0x56, 0x78, + + // frame type (stream frame with fin, length, and offset bits set) + 0x10 | 0x01 | 0x02 | 0x04, + // stream id + 0x01, 0x02, 0x03, 0x04, + // offset + 0x3A, 0x98, 0xFE, 0xDC, + 0x32, 0x10, 0x76, 0x54, + // data length + 0x00, 0x0c, + // data + 'h', 'e', 'l', 'l', + 'o', ' ', 'w', 'o', + 'r', 'l', 'd', '!', + }; + unsigned char packet46[] = { // type (short header, 4 byte packet number) 0x43, @@ -8810,12 +10382,14 @@ unsigned char* p = packet; if (framer_.transport_version() == QUIC_VERSION_99) { p = packet99; - } else if (framer_.transport_version() > QUIC_VERSION_43) { + } else if (framer_.transport_version() > QUIC_VERSION_44) { p = packet46; + } else if (framer_.transport_version() > QUIC_VERSION_43) { + p = packet44; } QuicFramerFuzzFunc(p, framer_.transport_version() > QUIC_VERSION_43 - ? QUIC_ARRAYSIZE(packet46) + ? QUIC_ARRAYSIZE(packet44) : QUIC_ARRAYSIZE(packet), framer_.version()); } @@ -11153,6 +12727,26 @@ 0x00 }; + unsigned char packet44[] = { + // type (short header, 4 byte packet number) + 0x32, + // connection_id + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, + // packet number + 0x12, 0x34, 0x56, 0x78, + + // frame type (ack frame) + 0x45, + // largest observed + 0x00, 0x00, + // Zero delta time. + 0x00, 0x00, + // first ack block length. + 0x00, 0x00, + // num timestamps. + 0x00 + }; + unsigned char packet46[] = { // type (short header, 4 byte packet number) 0x43, @@ -11199,9 +12793,11 @@ if (framer_.transport_version() == QUIC_VERSION_99) { p = packet99; p_size = QUIC_ARRAYSIZE(packet99); - } else if (framer_.transport_version() > QUIC_VERSION_43) { + } else if (framer_.transport_version() > QUIC_VERSION_44) { p = packet46; - p_size = QUIC_ARRAYSIZE(packet46); + } else if (framer_.transport_version() > QUIC_VERSION_43) { + p = packet44; + p_size = QUIC_ARRAYSIZE(packet44); } QuicEncryptedPacket encrypted(AsChars(p), p_size, false); @@ -11232,6 +12828,26 @@ 0x00 }; + unsigned char packet44[] = { + // type (short header, 4 byte packet number) + 0x32, + // connection_id + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, + // packet number + 0x12, 0x34, 0x56, 0x78, + + // frame type (ack frame) + 0x45, + // largest observed + 0x00, 0x02, + // Zero delta time. + 0x00, 0x00, + // first ack block length. + 0x00, 0x03, + // num timestamps. + 0x00 + }; + unsigned char packet46[] = { // type (short header, 4 byte packet number) 0x43, @@ -11278,9 +12894,12 @@ if (framer_.transport_version() == QUIC_VERSION_99) { p = packet99; p_size = QUIC_ARRAYSIZE(packet99); - } else if (framer_.transport_version() > QUIC_VERSION_43) { + } else if (framer_.transport_version() > QUIC_VERSION_44) { p = packet46; p_size = QUIC_ARRAYSIZE(packet46); + } else if (framer_.transport_version() > QUIC_VERSION_43) { + p = packet44; + p_size = QUIC_ARRAYSIZE(packet44); } QuicEncryptedPacket encrypted(AsChars(p), p_size, false); @@ -11322,6 +12941,36 @@ 0x00 }; + unsigned char packet44[] = { + // type (short header, 4 byte packet number) + 0x32, + // connection_id + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, + // packet number + 0x12, 0x34, 0x56, 0x78, + + // frame type (ack frame) + 0x60, + // largest observed + 0x0A, + // Zero delta time. + 0x00, 0x00, + // Num of ack blocks + 0x02, + // first ack block length. + 0x02, + // gap to next block + 0x01, + // ack block length + 0x01, + // gap to next block + 0x01, + // ack block length + 0x06, + // num timestamps. + 0x00 + }; + unsigned char packet46[] = { // type (short header, 4 byte packet number) 0x43, @@ -11386,9 +13035,12 @@ if (framer_.transport_version() == QUIC_VERSION_99) { p = packet99; p_size = QUIC_ARRAYSIZE(packet99); - } else if (framer_.transport_version() > QUIC_VERSION_43) { + } else if (framer_.transport_version() > QUIC_VERSION_44) { p = packet46; p_size = QUIC_ARRAYSIZE(packet46); + } else if (framer_.transport_version() > QUIC_VERSION_43) { + p = packet44; + p_size = QUIC_ARRAYSIZE(packet44); } QuicEncryptedPacket encrypted(AsChars(p), p_size, false); @@ -11696,7 +13348,7 @@ } TEST_P(QuicFramerTest, ClientReceivesInvalidVersion) { - if (framer_.transport_version() <= QUIC_VERSION_43) { + if (framer_.transport_version() < QUIC_VERSION_44) { return; } QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT); @@ -12027,7 +13679,7 @@ // clang-format on // clang-format off - PacketFragments packet46 = { + PacketFragments packet45 = { // public flags (IETF Retry packet, 0-length original destination CID) {"Unable to read type.", {0xf0}}, @@ -12041,7 +13693,7 @@ // clang-format on PacketFragments& fragments = - framer_.transport_version() > QUIC_VERSION_43 ? packet46 : packet; + framer_.transport_version() > QUIC_VERSION_44 ? packet45 : packet; std::unique_ptr<QuicEncryptedPacket> encrypted( AssemblePacketFromFragments(fragments)); @@ -12262,11 +13914,13 @@ } SetDecrypterLevel(ENCRYPTION_HANDSHAKE); QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT); + const unsigned char type_byte = + framer_.transport_version() == QUIC_VERSION_44 ? 0xFC : 0xE3; // clang-format off unsigned char packet[] = { // public flags (long header with packet type HANDSHAKE and // 4-byte packet number) - 0xE3, + type_byte, // version QUIC_VERSION_BYTES, // connection ID lengths @@ -12313,11 +13967,13 @@ } SetDecrypterLevel(ENCRYPTION_HANDSHAKE); QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_SERVER); + const unsigned char type_byte = + framer_.transport_version() == QUIC_VERSION_44 ? 0xFC : 0xE3; // clang-format off unsigned char packet[] = { // public flags (long header with packet type HANDSHAKE and // 4-byte packet number) - 0xE3, + type_byte, // version QUIC_VERSION_BYTES, // connection ID lengths
diff --git a/quic/core/quic_packets.cc b/quic/core/quic_packets.cc index 0e67689..a828dcb 100644 --- a/quic/core/quic_packets.cc +++ b/quic/core/quic_packets.cc
@@ -126,7 +126,9 @@ // Long header. return kPacketHeaderTypeSize + kConnectionIdLengthSize + destination_connection_id_length + source_connection_id_length + - packet_number_length + kQuicVersionSize + + (version > QUIC_VERSION_44 ? packet_number_length + : PACKET_4BYTE_PACKET_NUMBER) + + kQuicVersionSize + (include_diversification_nonce ? kDiversificationNonceSize : 0) + retry_token_length_length + retry_token_length + length_length; }
diff --git a/quic/core/quic_types.h b/quic/core/quic_types.h index 0b0fbca..66a90c1 100644 --- a/quic/core/quic_types.h +++ b/quic/core/quic_types.h
@@ -297,7 +297,7 @@ enum QuicPacketNumberLength : uint8_t { PACKET_1BYTE_PACKET_NUMBER = 1, PACKET_2BYTE_PACKET_NUMBER = 2, - PACKET_3BYTE_PACKET_NUMBER = 3, // Used in version >= QUIC_VERSION_46. + PACKET_3BYTE_PACKET_NUMBER = 3, // Used in version > QUIC_VERSION_44. PACKET_4BYTE_PACKET_NUMBER = 4, IETF_MAX_PACKET_NUMBER_LENGTH = 4, // TODO(rch): Remove this when we remove QUIC_VERSION_39.
diff --git a/quic/core/quic_version_manager.cc b/quic/core/quic_version_manager.cc index cde3664..a184314 100644 --- a/quic/core/quic_version_manager.cc +++ b/quic/core/quic_version_manager.cc
@@ -17,6 +17,7 @@ : enable_version_99_(GetQuicReloadableFlag(quic_enable_version_99)), enable_version_47_(GetQuicReloadableFlag(quic_enable_version_47)), enable_version_46_(GetQuicReloadableFlag(quic_enable_version_46)), + enable_version_44_(GetQuicReloadableFlag(quic_enable_version_44)), disable_version_39_(GetQuicReloadableFlag(quic_disable_version_39)), enable_tls_(GetQuicFlag(FLAGS_quic_supports_tls_handshake)), allowed_supported_versions_(std::move(supported_versions)) { @@ -40,11 +41,13 @@ if (enable_version_99_ != GetQuicReloadableFlag(quic_enable_version_99) || enable_version_47_ != GetQuicReloadableFlag(quic_enable_version_47) || enable_version_46_ != GetQuicReloadableFlag(quic_enable_version_46) || + enable_version_44_ != GetQuicReloadableFlag(quic_enable_version_44) || disable_version_39_ != GetQuicReloadableFlag(quic_disable_version_39) || enable_tls_ != GetQuicFlag(FLAGS_quic_supports_tls_handshake)) { enable_version_99_ = GetQuicReloadableFlag(quic_enable_version_99); enable_version_47_ = GetQuicReloadableFlag(quic_enable_version_47); enable_version_46_ = GetQuicReloadableFlag(quic_enable_version_46); + enable_version_44_ = GetQuicReloadableFlag(quic_enable_version_44); disable_version_39_ = GetQuicReloadableFlag(quic_disable_version_39); enable_tls_ = GetQuicFlag(FLAGS_quic_supports_tls_handshake); RefilterSupportedVersions();
diff --git a/quic/core/quic_version_manager.h b/quic/core/quic_version_manager.h index a865be6..f45b6da 100644 --- a/quic/core/quic_version_manager.h +++ b/quic/core/quic_version_manager.h
@@ -44,6 +44,8 @@ bool enable_version_47_; // quic_enable_version_46 flag bool enable_version_46_; + // quic_enable_version_44 flag + bool enable_version_44_; // quic_disable_version_39 flag bool disable_version_39_; // quic_supports_tls_handshake flag
diff --git a/quic/core/quic_version_manager_test.cc b/quic/core/quic_version_manager_test.cc index de5af3b..9a7b2a3 100644 --- a/quic/core/quic_version_manager_test.cc +++ b/quic/core/quic_version_manager_test.cc
@@ -16,11 +16,12 @@ class QuicVersionManagerTest : public QuicTest {}; TEST_F(QuicVersionManagerTest, QuicVersionManager) { - static_assert(QUIC_ARRAYSIZE(kSupportedTransportVersions) == 5u, + static_assert(QUIC_ARRAYSIZE(kSupportedTransportVersions) == 6u, "Supported versions out of sync"); SetQuicReloadableFlag(quic_enable_version_99, false); SetQuicReloadableFlag(quic_enable_version_47, false); SetQuicReloadableFlag(quic_enable_version_46, false); + SetQuicReloadableFlag(quic_enable_version_44, false); SetQuicReloadableFlag(quic_disable_version_39, true); QuicVersionManager manager(AllSupportedVersions()); @@ -34,20 +35,26 @@ EXPECT_EQ(QuicTransportVersionVector({QUIC_VERSION_43, QUIC_VERSION_39}), manager.GetSupportedTransportVersions()); - SetQuicReloadableFlag(quic_enable_version_46, true); + SetQuicReloadableFlag(quic_enable_version_44, true); EXPECT_EQ(QuicTransportVersionVector( - {QUIC_VERSION_46, QUIC_VERSION_43, QUIC_VERSION_39}), + {QUIC_VERSION_44, QUIC_VERSION_43, QUIC_VERSION_39}), + manager.GetSupportedTransportVersions()); + + SetQuicReloadableFlag(quic_enable_version_46, true); + EXPECT_EQ(QuicTransportVersionVector({QUIC_VERSION_46, QUIC_VERSION_44, + QUIC_VERSION_43, QUIC_VERSION_39}), manager.GetSupportedTransportVersions()); SetQuicReloadableFlag(quic_enable_version_47, true); EXPECT_EQ(QuicTransportVersionVector({QUIC_VERSION_47, QUIC_VERSION_46, - QUIC_VERSION_43, QUIC_VERSION_39}), + QUIC_VERSION_44, QUIC_VERSION_43, + QUIC_VERSION_39}), manager.GetSupportedTransportVersions()); SetQuicReloadableFlag(quic_enable_version_99, true); EXPECT_EQ(QuicTransportVersionVector({QUIC_VERSION_99, QUIC_VERSION_47, - QUIC_VERSION_46, QUIC_VERSION_43, - QUIC_VERSION_39}), + QUIC_VERSION_46, QUIC_VERSION_44, + QUIC_VERSION_43, QUIC_VERSION_39}), manager.GetSupportedTransportVersions()); // Ensure that all versions are now supported.
diff --git a/quic/core/quic_versions.cc b/quic/core/quic_versions.cc index d540def..d76b6be 100644 --- a/quic/core/quic_versions.cc +++ b/quic/core/quic_versions.cc
@@ -83,6 +83,8 @@ return MakeVersionLabel(proto, '0', '3', '9'); case QUIC_VERSION_43: return MakeVersionLabel(proto, '0', '4', '3'); + case QUIC_VERSION_44: + return MakeVersionLabel(proto, '0', '4', '4'); case QUIC_VERSION_46: return MakeVersionLabel(proto, '0', '4', '6'); case QUIC_VERSION_47: @@ -229,16 +231,23 @@ if (version.transport_version == QUIC_VERSION_99) { if (GetQuicReloadableFlag(quic_enable_version_99) && GetQuicReloadableFlag(quic_enable_version_47) && - GetQuicReloadableFlag(quic_enable_version_46)) { + GetQuicReloadableFlag(quic_enable_version_46) && + GetQuicReloadableFlag(quic_enable_version_44)) { filtered_versions.push_back(version); } } else if (version.transport_version == QUIC_VERSION_47) { if (GetQuicReloadableFlag(quic_enable_version_47) && - GetQuicReloadableFlag(quic_enable_version_46)) { + GetQuicReloadableFlag(quic_enable_version_46) && + GetQuicReloadableFlag(quic_enable_version_44)) { filtered_versions.push_back(version); } } else if (version.transport_version == QUIC_VERSION_46) { - if (GetQuicReloadableFlag(quic_enable_version_46)) { + if (GetQuicReloadableFlag(quic_enable_version_46) && + GetQuicReloadableFlag(quic_enable_version_44)) { + filtered_versions.push_back(version); + } + } else if (version.transport_version == QUIC_VERSION_44) { + if (GetQuicReloadableFlag(quic_enable_version_44)) { filtered_versions.push_back(version); } } else if (version.transport_version == QUIC_VERSION_39) { @@ -335,6 +344,7 @@ switch (transport_version) { RETURN_STRING_LITERAL(QUIC_VERSION_39); RETURN_STRING_LITERAL(QUIC_VERSION_43); + RETURN_STRING_LITERAL(QUIC_VERSION_44); RETURN_STRING_LITERAL(QUIC_VERSION_46); RETURN_STRING_LITERAL(QUIC_VERSION_47); RETURN_STRING_LITERAL(QUIC_VERSION_99); @@ -437,7 +447,7 @@ if (parsed_version.handshake_protocol == PROTOCOL_TLS1_3) { SetQuicFlag(FLAGS_quic_supports_tls_handshake, true); } - static_assert(QUIC_ARRAYSIZE(kSupportedTransportVersions) == 5u, + static_assert(QUIC_ARRAYSIZE(kSupportedTransportVersions) == 6u, "Supported versions out of sync"); if (parsed_version.transport_version >= QUIC_VERSION_99) { SetQuicReloadableFlag(quic_enable_version_99, true); @@ -448,6 +458,9 @@ if (parsed_version.transport_version >= QUIC_VERSION_46) { SetQuicReloadableFlag(quic_enable_version_46, true); } + if (parsed_version.transport_version >= QUIC_VERSION_44) { + SetQuicReloadableFlag(quic_enable_version_44, true); + } } #undef RETURN_STRING_LITERAL // undef for jumbo builds
diff --git a/quic/core/quic_versions.h b/quic/core/quic_versions.h index eff08d0..b33e084 100644 --- a/quic/core/quic_versions.h +++ b/quic/core/quic_versions.h
@@ -97,7 +97,7 @@ QUIC_VERSION_43 = 43, // PRIORITY frames are sent by client and accepted by // server. - // Version 44 added IETF header format. + QUIC_VERSION_44 = 44, // Use IETF header format. // Version 45 added MESSAGE frame. @@ -189,7 +189,7 @@ // See go/new-quic-version for more details on how to roll out new versions. static const QuicTransportVersion kSupportedTransportVersions[] = { QUIC_VERSION_99, QUIC_VERSION_47, QUIC_VERSION_46, - QUIC_VERSION_43, QUIC_VERSION_39, + QUIC_VERSION_44, QUIC_VERSION_43, QUIC_VERSION_39, }; // This vector contains all crypto handshake protocols that are supported. @@ -345,7 +345,7 @@ // Returns true if |transport_version| supports MESSAGE frames. QUIC_EXPORT_PRIVATE inline bool VersionSupportsMessageFrames( QuicTransportVersion transport_version) { - return transport_version > QUIC_VERSION_43; + return transport_version > QUIC_VERSION_44; } // Returns true if QuicSpdyStream encodes body using HTTP/3 specification and
diff --git a/quic/core/quic_versions_test.cc b/quic/core/quic_versions_test.cc index 0b719d5..ab79e3f 100644 --- a/quic/core/quic_versions_test.cc +++ b/quic/core/quic_versions_test.cc
@@ -116,6 +116,8 @@ ParseQuicVersionLabel(MakeVersionLabel('Q', '0', '3', '9'))); EXPECT_EQ(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_43), ParseQuicVersionLabel(MakeVersionLabel('Q', '0', '4', '3'))); + EXPECT_EQ(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_44), + ParseQuicVersionLabel(MakeVersionLabel('Q', '0', '4', '4'))); EXPECT_EQ(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_46), ParseQuicVersionLabel(MakeVersionLabel('Q', '0', '4', '6'))); EXPECT_EQ(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_47), @@ -126,6 +128,8 @@ ParseQuicVersionLabel(MakeVersionLabel('T', '0', '3', '9'))); EXPECT_EQ(ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_43), ParseQuicVersionLabel(MakeVersionLabel('T', '0', '4', '3'))); + EXPECT_EQ(ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_44), + ParseQuicVersionLabel(MakeVersionLabel('T', '0', '4', '4'))); EXPECT_EQ(ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_46), ParseQuicVersionLabel(MakeVersionLabel('T', '0', '4', '6'))); EXPECT_EQ(ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_47), @@ -137,6 +141,8 @@ ParseQuicVersionString("Q039")); EXPECT_EQ(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_43), ParseQuicVersionString("Q043")); + EXPECT_EQ(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_44), + ParseQuicVersionString("Q044")); EXPECT_EQ(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_46), ParseQuicVersionString("Q046")); EXPECT_EQ(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_47), @@ -152,6 +158,8 @@ ParseQuicVersionString("T039")); EXPECT_EQ(ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_43), ParseQuicVersionString("T043")); + EXPECT_EQ(ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_44), + ParseQuicVersionString("T044")); EXPECT_EQ(ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_46), ParseQuicVersionString("T046")); EXPECT_EQ(ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_47), @@ -165,6 +173,9 @@ EXPECT_EQ(MakeVersionLabel('Q', '0', '4', '3'), CreateQuicVersionLabel( ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_43))); + EXPECT_EQ(MakeVersionLabel('Q', '0', '4', '4'), + CreateQuicVersionLabel( + ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_44))); EXPECT_EQ(MakeVersionLabel('Q', '0', '4', '6'), CreateQuicVersionLabel( ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_46))); @@ -179,6 +190,9 @@ EXPECT_EQ(MakeVersionLabel('T', '0', '4', '3'), CreateQuicVersionLabel( ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_43))); + EXPECT_EQ(MakeVersionLabel('T', '0', '4', '4'), + CreateQuicVersionLabel( + ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_44))); EXPECT_EQ(MakeVersionLabel('T', '0', '4', '6'), CreateQuicVersionLabel( ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_46))); @@ -268,6 +282,7 @@ TEST_F(QuicVersionsTest, FilterSupportedTransportVersionsAllVersions) { QuicTransportVersionVector all_versions = AllSupportedTransportVersions(); SetQuicReloadableFlag(quic_disable_version_39, false); + SetQuicReloadableFlag(quic_enable_version_44, true); SetQuicReloadableFlag(quic_enable_version_46, true); SetQuicReloadableFlag(quic_enable_version_47, true); SetQuicReloadableFlag(quic_enable_version_99, true); @@ -276,8 +291,8 @@ parsed_versions.push_back(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, version)); } QuicTransportVersionVector expected_versions = { - QUIC_VERSION_99, QUIC_VERSION_47, QUIC_VERSION_46, QUIC_VERSION_43, - QUIC_VERSION_39}; + QUIC_VERSION_99, QUIC_VERSION_47, QUIC_VERSION_46, + QUIC_VERSION_44, QUIC_VERSION_43, QUIC_VERSION_39}; ParsedQuicVersionVector expected_parsed_versions; for (QuicTransportVersion version : expected_versions) { expected_parsed_versions.push_back( @@ -291,6 +306,7 @@ TEST_F(QuicVersionsTest, FilterSupportedTransportVersionsNo99) { QuicTransportVersionVector all_versions = AllSupportedTransportVersions(); SetQuicReloadableFlag(quic_disable_version_39, false); + SetQuicReloadableFlag(quic_enable_version_44, true); SetQuicReloadableFlag(quic_enable_version_46, true); SetQuicReloadableFlag(quic_enable_version_47, true); SetQuicReloadableFlag(quic_enable_version_99, false); @@ -299,7 +315,8 @@ parsed_versions.push_back(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, version)); } QuicTransportVersionVector expected_versions = { - QUIC_VERSION_47, QUIC_VERSION_46, QUIC_VERSION_43, QUIC_VERSION_39}; + QUIC_VERSION_47, QUIC_VERSION_46, QUIC_VERSION_44, QUIC_VERSION_43, + QUIC_VERSION_39}; ParsedQuicVersionVector expected_parsed_versions; for (QuicTransportVersion version : expected_versions) { expected_parsed_versions.push_back( @@ -313,6 +330,7 @@ TEST_F(QuicVersionsTest, FilterSupportedTransportVersionsNo47) { QuicTransportVersionVector all_versions = AllSupportedTransportVersions(); SetQuicReloadableFlag(quic_disable_version_39, false); + SetQuicReloadableFlag(quic_enable_version_44, true); SetQuicReloadableFlag(quic_enable_version_46, true); SetQuicReloadableFlag(quic_enable_version_47, false); SetQuicReloadableFlag(quic_enable_version_99, false); @@ -321,7 +339,7 @@ parsed_versions.push_back(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, version)); } QuicTransportVersionVector expected_versions = { - QUIC_VERSION_46, QUIC_VERSION_43, QUIC_VERSION_39}; + QUIC_VERSION_46, QUIC_VERSION_44, QUIC_VERSION_43, QUIC_VERSION_39}; ParsedQuicVersionVector expected_parsed_versions; for (QuicTransportVersion version : expected_versions) { expected_parsed_versions.push_back( @@ -335,6 +353,30 @@ TEST_F(QuicVersionsTest, FilterSupportedTransportVersionsNo46) { QuicTransportVersionVector all_versions = AllSupportedTransportVersions(); SetQuicReloadableFlag(quic_disable_version_39, false); + SetQuicReloadableFlag(quic_enable_version_44, true); + SetQuicReloadableFlag(quic_enable_version_46, false); + SetQuicReloadableFlag(quic_enable_version_47, false); + SetQuicReloadableFlag(quic_enable_version_99, false); + ParsedQuicVersionVector parsed_versions; + for (QuicTransportVersion version : all_versions) { + parsed_versions.push_back(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, version)); + } + QuicTransportVersionVector expected_versions = { + QUIC_VERSION_44, QUIC_VERSION_43, QUIC_VERSION_39}; + ParsedQuicVersionVector expected_parsed_versions; + for (QuicTransportVersion version : expected_versions) { + expected_parsed_versions.push_back( + ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, version)); + } + + ASSERT_EQ(expected_versions, FilterSupportedTransportVersions(all_versions)); + ASSERT_EQ(expected_parsed_versions, FilterSupportedVersions(parsed_versions)); +} + +TEST_F(QuicVersionsTest, FilterSupportedTransportVersionsNo44) { + QuicTransportVersionVector all_versions = AllSupportedTransportVersions(); + SetQuicReloadableFlag(quic_disable_version_39, false); + SetQuicReloadableFlag(quic_enable_version_44, false); SetQuicReloadableFlag(quic_enable_version_46, false); SetQuicReloadableFlag(quic_enable_version_47, false); SetQuicReloadableFlag(quic_enable_version_99, false); @@ -357,6 +399,7 @@ TEST_F(QuicVersionsTest, FilterSupportedTransportVersionsNo39) { QuicTransportVersionVector all_versions = AllSupportedTransportVersions(); SetQuicReloadableFlag(quic_disable_version_39, true); + SetQuicReloadableFlag(quic_enable_version_44, false); SetQuicReloadableFlag(quic_enable_version_46, false); SetQuicReloadableFlag(quic_enable_version_47, false); SetQuicReloadableFlag(quic_enable_version_99, false); @@ -414,10 +457,11 @@ // yet a typo was made in doing the #defines and it was caught // only in some test far removed from here... Better safe than sorry. TEST_F(QuicVersionsTest, CheckVersionNumbersForTypos) { - static_assert(QUIC_ARRAYSIZE(kSupportedTransportVersions) == 5u, + static_assert(QUIC_ARRAYSIZE(kSupportedTransportVersions) == 6u, "Supported versions out of sync"); EXPECT_EQ(QUIC_VERSION_39, 39); EXPECT_EQ(QUIC_VERSION_43, 43); + EXPECT_EQ(QUIC_VERSION_44, 44); EXPECT_EQ(QUIC_VERSION_46, 46); EXPECT_EQ(QUIC_VERSION_47, 47); EXPECT_EQ(QUIC_VERSION_99, 99); @@ -471,6 +515,7 @@ ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_99); SetQuicFlag(FLAGS_quic_supports_tls_handshake, false); SetQuicReloadableFlag(quic_disable_version_39, false); + SetQuicReloadableFlag(quic_enable_version_44, true); SetQuicReloadableFlag(quic_enable_version_46, true); SetQuicReloadableFlag(quic_enable_version_47, false); SetQuicReloadableFlag(quic_enable_version_99, false);