Use VarInt encoding for IETF QUIC Reset Stream error code Update IETF QUIC Rese Stream frame to use VarInt encoding, per Version 22 the IETF spec. gfe-relnote: N/A for IETF Quic/V99 only. PiperOrigin-RevId: 258411235 Change-Id: Ia51a2033ae45a5ee638bc4aaf24c2b4a072d25a4
diff --git a/quic/core/frames/quic_rst_stream_frame.h b/quic/core/frames/quic_rst_stream_frame.h index 0957614..9a9ed56 100644 --- a/quic/core/frames/quic_rst_stream_frame.h +++ b/quic/core/frames/quic_rst_stream_frame.h
@@ -39,6 +39,7 @@ QuicRstStreamErrorCode error_code; // In IETF QUIC the code is up to the app on top of quic, so is // more general than QuicRstStreamErrorCode allows. + // TODO(fkastenholz): Upgrade to uint64_t uint16_t ietf_error_code; };
diff --git a/quic/core/quic_framer.cc b/quic/core/quic_framer.cc index ffed8cc..1280f2e 100644 --- a/quic/core/quic_framer.cc +++ b/quic/core/quic_framer.cc
@@ -556,7 +556,8 @@ if (VersionHasIetfQuicFrames(version)) { return QuicDataWriter::GetVarInt62Len(frame.stream_id) + QuicDataWriter::GetVarInt62Len(frame.byte_offset) + - kQuicFrameTypeSize + kQuicIetfQuicErrorCodeSize; + kQuicFrameTypeSize + + QuicDataWriter::GetVarInt62Len(frame.ietf_error_code); } return kQuicFrameTypeSize + kQuicMaxStreamIdSize + kQuicMaxStreamOffsetSize + kQuicErrorCodeSize; @@ -5812,7 +5813,7 @@ set_detailed_error("Writing reset-stream stream id failed."); return false; } - if (!writer->WriteUInt16(frame.ietf_error_code)) { + if (!writer->WriteVarInt62(static_cast<uint64_t>(frame.ietf_error_code))) { set_detailed_error("Writing reset-stream error code failed."); return false; } @@ -5833,10 +5834,18 @@ return false; } - if (!reader->ReadUInt16(&frame->ietf_error_code)) { + uint64_t error_code; + if (!reader->ReadVarInt62(&error_code)) { set_detailed_error("Unable to read rst stream error code."); return false; } + if (error_code > 0xffff) { + frame->ietf_error_code = 0xffff; + QUIC_DLOG(ERROR) << "Reset stream error code (" << error_code + << ") > 0xffff"; + } else { + frame->ietf_error_code = static_cast<uint16_t>(error_code); + } if (!reader->ReadVarInt62(&frame->byte_offset)) { set_detailed_error("Unable to read rst stream sent byte offset.");
diff --git a/quic/core/quic_framer_test.cc b/quic/core/quic_framer_test.cc index 95b9187..690e911 100644 --- a/quic/core/quic_framer_test.cc +++ b/quic/core/quic_framer_test.cc
@@ -4544,7 +4544,7 @@ {kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04}}, // application error code {"Unable to read rst stream error code.", - {0x00, 0x01}}, // Not varint62 encoded + {kVarInt62OneByte + 0x01}}, // Final Offset {"Unable to read rst stream sent byte offset.", {kVarInt62EightBytes + 0x3a, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54}} @@ -7801,8 +7801,8 @@ 0x04, // stream id kVarInt62FourBytes + 0x01, 0x02, 0x03, 0x04, - // error code (not VarInt32 encoded) - 0x00, 0x01, + // error code + kVarInt62OneByte + 0x01, // sent byte offset kVarInt62EightBytes + 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01 };
diff --git a/quic/core/quic_ietf_framer_test.cc b/quic/core/quic_ietf_framer_test.cc index 9d07e49..dbbacdd 100644 --- a/quic/core/quic_ietf_framer_test.cc +++ b/quic/core/quic_ietf_framer_test.cc
@@ -457,9 +457,10 @@ // Write the frame to the packet buffer. EXPECT_TRUE(QuicFramerPeer::AppendIetfResetStreamFrame( &framer_, transmit_frame, &writer)); - // Check that the size of the serialzed frame is in the allowed range. - EXPECT_LT(3u, writer.length()); - EXPECT_GT(19u, writer.length()); + // Check that the size of the serialzed frame is in the allowed range (3 to + // 24 bytes, inclusive). + EXPECT_LT(2u, writer.length()); + EXPECT_GT(25u, writer.length()); // Now set up a reader to read in the thing in. QuicDataReader reader(packet_buffer, writer.length(), NETWORK_BYTE_ORDER);