Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(149)

Unified Diff: net/quic/core/quic_framer.cc

Issue 2850573002: Landing Recent QUIC changes until 3:35 PM, Apr 26, 2017 UTC-4 (Closed)
Patch Set: Remove Disconnect from ~QuicTestClient Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/quic/core/quic_framer.h ('k') | net/quic/core/quic_framer_test.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/quic/core/quic_framer.cc
diff --git a/net/quic/core/quic_framer.cc b/net/quic/core/quic_framer.cc
index 0fa3442d3d398d5e0f4f21593a1655d895914714..7404ebb1624bac5d7c36c8e05ea834d5be008a8a 100644
--- a/net/quic/core/quic_framer.cc
+++ b/net/quic/core/quic_framer.cc
@@ -36,12 +36,6 @@ namespace {
#define ENDPOINT \
(perspective_ == Perspective::IS_SERVER ? "Server: " : "Client: ")
-// Mask to select the lowest 48 bits of a packet number.
-const QuicPacketNumber k6ByteSequenceNumberMask = UINT64_C(0x0000FFFFFFFFFFFF);
-const QuicPacketNumber k4ByteSequenceNumberMask = UINT64_C(0x00000000FFFFFFFF);
-const QuicPacketNumber k2ByteSequenceNumberMask = UINT64_C(0x000000000000FFFF);
-const QuicPacketNumber k1ByteSequenceNumberMask = UINT64_C(0x00000000000000FF);
-
// Number of bits the packet number length bits are shifted from the right
// edge of the public header.
const uint8_t kPublicHeaderSequenceNumberShift = 4;
@@ -319,7 +313,7 @@ size_t QuicFramer::BuildDataPacket(const QuicPacketHeader& header,
const QuicFrames& frames,
char* buffer,
size_t packet_length) {
- QuicDataWriter writer(packet_length, buffer, perspective_);
+ QuicDataWriter writer(packet_length, buffer, perspective_, endianness());
if (!AppendPacketHeader(header, &writer)) {
QUIC_BUG << "AppendPacketHeader failed";
return 0;
@@ -417,9 +411,6 @@ std::unique_ptr<QuicEncryptedPacket> QuicFramer::BuildPublicResetPacket(
CryptoHandshakeMessage reset;
reset.set_tag(kPRST);
reset.SetValue(kRNON, packet.nonce_proof);
- if (!FLAGS_quic_reloadable_flag_quic_remove_packet_number_from_public_reset) {
- reset.SetValue(kRSEQ, packet.rejected_packet_number);
- }
if (packet.client_address.host().address_family() !=
IpAddressFamily::IP_UNSPEC) {
// packet.client_address is non-empty.
@@ -436,7 +427,10 @@ std::unique_ptr<QuicEncryptedPacket> QuicFramer::BuildPublicResetPacket(
size_t len =
kPublicFlagsSize + PACKET_8BYTE_CONNECTION_ID + reset_serialized.length();
std::unique_ptr<char[]> buffer(new char[len]);
- QuicDataWriter writer(len, buffer.get(), Perspective::IS_SERVER);
+ // Endianness is not a concern here, as writer is not going to write integers
+ // or floating numbers.
+ QuicDataWriter writer(len, buffer.get(), Perspective::IS_SERVER,
+ NETWORK_BYTE_ORDER);
uint8_t flags = static_cast<uint8_t>(PACKET_PUBLIC_FLAGS_RST |
PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID);
@@ -466,7 +460,10 @@ std::unique_ptr<QuicEncryptedPacket> QuicFramer::BuildVersionNegotiationPacket(
DCHECK(!versions.empty());
size_t len = GetVersionNegotiationPacketSize(versions.size());
std::unique_ptr<char[]> buffer(new char[len]);
- QuicDataWriter writer(len, buffer.get(), Perspective::IS_SERVER);
+ // Endianness is not a concern here, version negotiation packet does not have
+ // integers or floating numbers.
+ QuicDataWriter writer(len, buffer.get(), Perspective::IS_SERVER,
+ NETWORK_BYTE_ORDER);
uint8_t flags = static_cast<uint8_t>(
PACKET_PUBLIC_FLAGS_VERSION | PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID |
@@ -490,7 +487,8 @@ std::unique_ptr<QuicEncryptedPacket> QuicFramer::BuildVersionNegotiationPacket(
}
bool QuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) {
- QuicDataReader reader(packet.data(), packet.length(), perspective_);
+ QuicDataReader reader(packet.data(), packet.length(), perspective_,
+ endianness());
visitor_->OnPacket();
@@ -516,6 +514,9 @@ bool QuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) {
}
}
+ // framer's version may change, reset reader's endianness.
+ reader.set_endianness(endianness());
+
bool rv;
if (perspective_ == Perspective::IS_CLIENT && public_header.version_flag) {
rv = ProcessVersionNegotiationPacket(&reader, &public_header);
@@ -578,7 +579,8 @@ bool QuicFramer::ProcessDataPacket(QuicDataReader* encrypted_reader,
return RaiseError(QUIC_DECRYPTION_FAILURE);
}
- QuicDataReader reader(decrypted_buffer, decrypted_length, perspective_);
+ QuicDataReader reader(decrypted_buffer, decrypted_length, perspective_,
+ endianness());
// Set the last packet number after we have decrypted the packet
// so we are confident is not attacker controlled.
@@ -658,7 +660,7 @@ bool QuicFramer::AppendPacketHeader(const QuicPacketHeader& header,
}
public_flags |=
- GetSequenceNumberFlags(header.public_header.packet_number_length)
+ GetPacketNumberFlags(header.public_header.packet_number_length)
<< kPublicHeaderSequenceNumberShift;
if (header.public_header.nonce != nullptr) {
@@ -703,8 +705,8 @@ bool QuicFramer::AppendPacketHeader(const QuicPacketHeader& header,
return false;
}
- if (!AppendPacketSequenceNumber(header.public_header.packet_number_length,
- header.packet_number, writer)) {
+ if (!AppendPacketNumber(header.public_header.packet_number_length,
+ header.packet_number, writer)) {
return false;
}
@@ -860,7 +862,7 @@ bool QuicFramer::ProcessPublicHeader(QuicDataReader* reader,
}
// static
-QuicPacketNumberLength QuicFramer::GetMinSequenceNumberLength(
+QuicPacketNumberLength QuicFramer::GetMinPacketNumberLength(
QuicPacketNumber packet_number) {
if (packet_number < 1 << (PACKET_1BYTE_PACKET_NUMBER * 8)) {
return PACKET_1BYTE_PACKET_NUMBER;
@@ -874,7 +876,7 @@ QuicPacketNumberLength QuicFramer::GetMinSequenceNumberLength(
}
// static
-uint8_t QuicFramer::GetSequenceNumberFlags(
+uint8_t QuicFramer::GetPacketNumberFlags(
QuicPacketNumberLength packet_number_length) {
switch (packet_number_length) {
case PACKET_1BYTE_PACKET_NUMBER:
@@ -926,7 +928,7 @@ bool QuicFramer::ProcessUnauthenticatedHeader(QuicDataReader* encrypted_reader,
QuicPacketHeader* header) {
QuicPacketNumber base_packet_number = largest_packet_number_;
- if (!ProcessPacketSequenceNumber(
+ if (!ProcessAndCalculatePacketNumber(
encrypted_reader, header->public_header.packet_number_length,
base_packet_number, &header->packet_number)) {
set_detailed_error("Unable to read packet number.");
@@ -946,13 +948,13 @@ bool QuicFramer::ProcessUnauthenticatedHeader(QuicDataReader* encrypted_reader,
return true;
}
-bool QuicFramer::ProcessPacketSequenceNumber(
+bool QuicFramer::ProcessAndCalculatePacketNumber(
QuicDataReader* reader,
QuicPacketNumberLength packet_number_length,
QuicPacketNumber base_packet_number,
QuicPacketNumber* packet_number) {
QuicPacketNumber wire_packet_number = 0u;
- if (!reader->ReadBytes(&wire_packet_number, packet_number_length)) {
+ if (!reader->ReadBytesToUInt64(packet_number_length, &wire_packet_number)) {
return false;
}
@@ -1157,14 +1159,15 @@ bool QuicFramer::ProcessStreamFrame(QuicDataReader* reader,
frame->fin = (stream_flags & kQuicStreamFinMask) == kQuicStreamFinShift;
- frame->stream_id = 0;
- if (!reader->ReadBytes(&frame->stream_id, stream_id_length)) {
+ uint64_t stream_id = 0;
+ if (!reader->ReadBytesToUInt64(stream_id_length, &stream_id)) {
set_detailed_error("Unable to read stream_id.");
return false;
}
+ frame->stream_id = static_cast<QuicStreamId>(stream_id);
frame->offset = 0;
- if (!reader->ReadBytes(&frame->offset, offset_length)) {
+ if (!reader->ReadBytesToUInt64(offset_length, &frame->offset)) {
set_detailed_error("Unable to read offset.");
return false;
}
@@ -1202,7 +1205,8 @@ bool QuicFramer::ProcessAckFrame(QuicDataReader* reader,
frame_type >>= kQuicHasMultipleAckBlocksShift;
bool has_ack_blocks = frame_type & kQuicHasMultipleAckBlocksMask;
- if (!reader->ReadBytes(&ack_frame->largest_observed, largest_acked_length)) {
+ if (!reader->ReadBytesToUInt64(largest_acked_length,
+ &ack_frame->largest_observed)) {
set_detailed_error("Unable to read largest acked.");
return false;
}
@@ -1222,14 +1226,14 @@ bool QuicFramer::ProcessAckFrame(QuicDataReader* reader,
uint8_t num_ack_blocks = 0;
if (has_ack_blocks) {
- if (!reader->ReadBytes(&num_ack_blocks, 1)) {
+ if (!reader->ReadUInt8(&num_ack_blocks)) {
set_detailed_error("Unable to read num of ack blocks.");
return false;
}
}
- size_t first_block_length = 0;
- if (!reader->ReadBytes(&first_block_length, ack_block_length)) {
+ uint64_t first_block_length = 0;
+ if (!reader->ReadBytesToUInt64(ack_block_length, &first_block_length)) {
set_detailed_error("Unable to read first ack block length.");
return false;
}
@@ -1239,13 +1243,13 @@ bool QuicFramer::ProcessAckFrame(QuicDataReader* reader,
if (num_ack_blocks > 0) {
for (size_t i = 0; i < num_ack_blocks; ++i) {
- size_t gap = 0;
- if (!reader->ReadBytes(&gap, PACKET_1BYTE_PACKET_NUMBER)) {
+ uint8_t gap = 0;
+ if (!reader->ReadUInt8(&gap)) {
set_detailed_error("Unable to read gap to next ack block.");
return false;
}
- size_t current_block_length = 0;
- if (!reader->ReadBytes(&current_block_length, ack_block_length)) {
+ uint64_t current_block_length = 0;
+ if (!reader->ReadBytesToUInt64(ack_block_length, &current_block_length)) {
set_detailed_error("Unable to ack block length.");
return false;
}
@@ -1267,15 +1271,14 @@ bool QuicFramer::ProcessAckFrame(QuicDataReader* reader,
bool QuicFramer::ProcessTimestampsInAckFrame(QuicDataReader* reader,
QuicAckFrame* ack_frame) {
uint8_t num_received_packets;
- if (!reader->ReadBytes(&num_received_packets, 1)) {
+ if (!reader->ReadUInt8(&num_received_packets)) {
set_detailed_error("Unable to read num received packets.");
return false;
}
if (num_received_packets > 0) {
uint8_t delta_from_largest_observed;
- if (!reader->ReadBytes(&delta_from_largest_observed,
- PACKET_1BYTE_PACKET_NUMBER)) {
+ if (!reader->ReadUInt8(&delta_from_largest_observed)) {
set_detailed_error("Unable to read sequence delta in received packets.");
return false;
}
@@ -1284,7 +1287,7 @@ bool QuicFramer::ProcessTimestampsInAckFrame(QuicDataReader* reader,
// Time delta from the framer creation.
uint32_t time_delta_us;
- if (!reader->ReadBytes(&time_delta_us, sizeof(time_delta_us))) {
+ if (!reader->ReadUInt32(&time_delta_us)) {
set_detailed_error("Unable to read time delta in received packets.");
return false;
}
@@ -1296,8 +1299,7 @@ bool QuicFramer::ProcessTimestampsInAckFrame(QuicDataReader* reader,
std::make_pair(seq_num, creation_time_ + last_timestamp_));
for (uint8_t i = 1; i < num_received_packets; ++i) {
- if (!reader->ReadBytes(&delta_from_largest_observed,
- PACKET_1BYTE_PACKET_NUMBER)) {
+ if (!reader->ReadUInt8(&delta_from_largest_observed)) {
set_detailed_error(
"Unable to read sequence delta in received packets.");
return false;
@@ -1325,8 +1327,8 @@ bool QuicFramer::ProcessStopWaitingFrame(QuicDataReader* reader,
const QuicPacketHeader& header,
QuicStopWaitingFrame* stop_waiting) {
QuicPacketNumber least_unacked_delta = 0;
- if (!reader->ReadBytes(&least_unacked_delta,
- header.public_header.packet_number_length)) {
+ if (!reader->ReadBytesToUInt64(header.public_header.packet_number_length,
+ &least_unacked_delta)) {
set_detailed_error("Unable to read least unacked delta.");
return false;
}
@@ -1651,9 +1653,9 @@ size_t QuicFramer::GetAckFrameSize(
AckFrameInfo ack_info = GetAckFrameInfo(ack);
QuicPacketNumberLength largest_acked_length =
- GetMinSequenceNumberLength(ack.largest_observed);
+ GetMinPacketNumberLength(ack.largest_observed);
QuicPacketNumberLength ack_block_length =
- GetMinSequenceNumberLength(ack_info.max_block_length);
+ GetMinPacketNumberLength(ack_info.max_block_length);
ack_size = GetMinAckFrameSize(quic_version_, largest_acked_length);
// First ack block length.
@@ -1757,32 +1759,38 @@ bool QuicFramer::AppendTypeByte(const QuicFrame& frame,
}
// static
-bool QuicFramer::AppendPacketSequenceNumber(
- QuicPacketNumberLength packet_number_length,
- QuicPacketNumber packet_number,
- QuicDataWriter* writer) {
- // Ensure the entire packet number can be written.
- if (writer->capacity() - writer->length() <
- static_cast<size_t>(packet_number_length)) {
+bool QuicFramer::AppendPacketNumber(QuicPacketNumberLength packet_number_length,
+ QuicPacketNumber packet_number,
+ QuicDataWriter* writer) {
+ size_t length = packet_number_length;
+ if (length != 1 && length != 2 && length != 4 && length != 6) {
+ QUIC_BUG << "Invalid packet_number_length: " << length;
return false;
}
- switch (packet_number_length) {
- case PACKET_1BYTE_PACKET_NUMBER:
- return writer->WriteUInt8(packet_number & k1ByteSequenceNumberMask);
- break;
- case PACKET_2BYTE_PACKET_NUMBER:
- return writer->WriteUInt16(packet_number & k2ByteSequenceNumberMask);
- break;
- case PACKET_4BYTE_PACKET_NUMBER:
- return writer->WriteUInt32(packet_number & k4ByteSequenceNumberMask);
- break;
- case PACKET_6BYTE_PACKET_NUMBER:
- return writer->WriteUInt48(packet_number & k6ByteSequenceNumberMask);
- break;
- default:
- DCHECK(false) << "packet_number_length: " << packet_number_length;
- return false;
+ return writer->WriteBytesToUInt64(packet_number_length, packet_number);
+}
+
+// static
+bool QuicFramer::AppendStreamId(size_t stream_id_length,
+ QuicStreamId stream_id,
+ QuicDataWriter* writer) {
+ if (stream_id_length == 0 || stream_id_length > 4) {
+ QUIC_BUG << "Invalid stream_id_length: " << stream_id_length;
+ return false;
+ }
+ return writer->WriteBytesToUInt64(stream_id_length, stream_id);
+}
+
+// static
+bool QuicFramer::AppendStreamOffset(size_t offset_length,
+ QuicStreamOffset offset,
+ QuicDataWriter* writer) {
+ if (offset_length == 1 || offset_length > 8) {
+ QUIC_BUG << "Invalid stream_offset_length: " << offset_length;
+ return false;
}
+
+ return writer->WriteBytesToUInt64(offset_length, offset);
}
// static
@@ -1790,18 +1798,20 @@ bool QuicFramer::AppendAckBlock(uint8_t gap,
QuicPacketNumberLength length_length,
QuicPacketNumber length,
QuicDataWriter* writer) {
- return AppendPacketSequenceNumber(PACKET_1BYTE_PACKET_NUMBER, gap, writer) &&
- AppendPacketSequenceNumber(length_length, length, writer);
+ return writer->WriteUInt8(gap) &&
+ AppendPacketNumber(length_length, length, writer);
}
bool QuicFramer::AppendStreamFrame(const QuicStreamFrame& frame,
bool no_stream_frame_length,
QuicDataWriter* writer) {
- if (!writer->WriteBytes(&frame.stream_id, GetStreamIdSize(frame.stream_id))) {
+ if (!AppendStreamId(GetStreamIdSize(frame.stream_id), frame.stream_id,
+ writer)) {
QUIC_BUG << "Writing stream id size failed.";
return false;
}
- if (!writer->WriteBytes(&frame.offset, GetStreamOffsetSize(frame.offset))) {
+ if (!AppendStreamOffset(GetStreamOffsetSize(frame.offset), frame.offset,
+ writer)) {
QUIC_BUG << "Writing offset size failed.";
return false;
}
@@ -1830,9 +1840,9 @@ bool QuicFramer::AppendAckFrameAndTypeByte(const QuicAckFrame& frame,
const AckFrameInfo new_ack_info = GetAckFrameInfo(frame);
QuicPacketNumber largest_acked = frame.largest_observed;
QuicPacketNumberLength largest_acked_length =
- GetMinSequenceNumberLength(largest_acked);
+ GetMinPacketNumberLength(largest_acked);
QuicPacketNumberLength ack_block_length =
- GetMinSequenceNumberLength(new_ack_info.max_block_length);
+ GetMinPacketNumberLength(new_ack_info.max_block_length);
// Calculate available bytes for timestamps and ack blocks.
int32_t available_timestamp_and_ack_block_bytes =
writer->capacity() - writer->length() - ack_block_length -
@@ -1849,11 +1859,11 @@ bool QuicFramer::AppendAckFrameAndTypeByte(const QuicAckFrame& frame,
// Largest acked length.
type_byte <<= kQuicSequenceNumberLengthShift;
- type_byte |= GetSequenceNumberFlags(largest_acked_length);
+ type_byte |= GetPacketNumberFlags(largest_acked_length);
// Ack block length.
type_byte <<= kQuicSequenceNumberLengthShift;
- type_byte |= GetSequenceNumberFlags(ack_block_length);
+ type_byte |= GetPacketNumberFlags(ack_block_length);
type_byte |= kQuicFrameTypeAckMask;
@@ -1862,8 +1872,7 @@ bool QuicFramer::AppendAckFrameAndTypeByte(const QuicAckFrame& frame,
}
// Largest acked.
- if (!AppendPacketSequenceNumber(largest_acked_length, largest_acked,
- writer)) {
+ if (!AppendPacketNumber(largest_acked_length, largest_acked, writer)) {
return false;
}
@@ -1894,8 +1903,8 @@ bool QuicFramer::AppendAckFrameAndTypeByte(const QuicAckFrame& frame,
}
// First ack block length.
- if (!AppendPacketSequenceNumber(ack_block_length,
- new_ack_info.first_block_length, writer)) {
+ if (!AppendPacketNumber(ack_block_length, new_ack_info.first_block_length,
+ writer)) {
return false;
}
@@ -2001,8 +2010,7 @@ bool QuicFramer::AppendTimestampToAckFrame(const QuicAckFrame& frame,
return false;
}
- if (!writer->WriteUInt8(delta_from_largest_observed &
- k1ByteSequenceNumberMask)) {
+ if (!writer->WriteUInt8(delta_from_largest_observed)) {
return false;
}
@@ -2011,7 +2019,7 @@ bool QuicFramer::AppendTimestampToAckFrame(const QuicAckFrame& frame,
uint32_t time_delta_us =
static_cast<uint32_t>((it->second - creation_time_).ToMicroseconds() &
(time_epoch_delta_us - 1));
- if (!writer->WriteBytes(&time_delta_us, sizeof(time_delta_us))) {
+ if (!writer->WriteUInt32(time_delta_us)) {
return false;
}
@@ -2025,8 +2033,7 @@ bool QuicFramer::AppendTimestampToAckFrame(const QuicAckFrame& frame,
return false;
}
- if (!writer->WriteUInt8(delta_from_largest_observed &
- k1ByteSequenceNumberMask)) {
+ if (!writer->WriteUInt8(delta_from_largest_observed)) {
return false;
}
@@ -2057,8 +2064,8 @@ bool QuicFramer::AppendStopWaitingFrame(const QuicPacketHeader& header,
<< " version:" << quic_version_;
return false;
}
- if (!AppendPacketSequenceNumber(header.public_header.packet_number_length,
- least_unacked_delta, writer)) {
+ if (!AppendPacketNumber(header.public_header.packet_number_length,
+ least_unacked_delta, writer)) {
QUIC_BUG << " seq failed: " << header.public_header.packet_number_length;
return false;
}
@@ -2161,4 +2168,8 @@ bool QuicFramer::RaiseError(QuicErrorCode error) {
return false;
}
+Endianness QuicFramer::endianness() const {
+ return quic_version_ > QUIC_VERSION_38 ? NETWORK_BYTE_ORDER : HOST_BYTE_ORDER;
+}
+
} // namespace net
« no previous file with comments | « net/quic/core/quic_framer.h ('k') | net/quic/core/quic_framer_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698