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/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.");