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

Unified Diff: trunk/src/net/quic/quic_framer.cc

Issue 16374004: Revert 204046 "Land Recent QUIC changes." (Closed) Base URL: svn://svn.chromium.org/chrome/
Patch Set: Created 7 years, 6 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 | « trunk/src/net/quic/quic_framer.h ('k') | trunk/src/net/quic/quic_framer_test.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: trunk/src/net/quic/quic_framer.cc
===================================================================
--- trunk/src/net/quic/quic_framer.cc (revision 204061)
+++ trunk/src/net/quic/quic_framer.cc (working copy)
@@ -22,14 +22,8 @@
namespace {
// Mask to select the lowest 48 bits of a sequence number.
-const QuicPacketSequenceNumber k6ByteSequenceNumberMask =
+const QuicPacketSequenceNumber kSequenceNumberMask =
GG_UINT64_C(0x0000FFFFFFFFFFFF);
-const QuicPacketSequenceNumber k4ByteSequenceNumberMask =
- GG_UINT64_C(0x00000000FFFFFFFF);
-const QuicPacketSequenceNumber k2ByteSequenceNumberMask =
- GG_UINT64_C(0x000000000000FFFF);
-const QuicPacketSequenceNumber k1ByteSequenceNumberMask =
- GG_UINT64_C(0x00000000000000FF);
const QuicGuid k1ByteGuidMask = GG_UINT64_C(0x00000000000000FF);
const QuicGuid k4ByteGuidMask = GG_UINT64_C(0x00000000FFFFFFFF);
@@ -89,10 +83,9 @@
// static
size_t QuicFramer::GetMinAckFrameSize() {
- return kQuicFrameTypeSize + kQuicEntropyHashSize +
- PACKET_6BYTE_SEQUENCE_NUMBER + kQuicEntropyHashSize +
- PACKET_6BYTE_SEQUENCE_NUMBER + kQuicDeltaTimeLargestObservedSize +
- kNumberOfMissingPacketsSize;
+ return kQuicFrameTypeSize + kQuicEntropyHashSize + kSequenceNumberSize +
+ kQuicEntropyHashSize + kSequenceNumberSize +
+ kQuicDeltaTimeLargestObservedSize + kNumberOfMissingPacketsSize;
}
// static
@@ -120,7 +113,7 @@
// 12-byte tags.
size_t QuicFramer::GetMaxUnackedPackets(QuicPacketHeader header) {
return (kMaxPacketSize - GetPacketHeaderSize(header) -
- GetMinAckFrameSize() - 16) / PACKET_6BYTE_SEQUENCE_NUMBER;
+ GetMinAckFrameSize() - 16) / kSequenceNumberSize;
}
bool QuicFramer::IsSupportedVersion(QuicTag version) {
@@ -248,8 +241,7 @@
DCHECK_LE(len, packet_size);
QuicPacket* packet = QuicPacket::NewDataPacket(
writer.take(), len, true, header.public_header.guid_length,
- header.public_header.version_flag,
- header.public_header.sequence_number_length);
+ header.public_header.version_flag);
if (fec_builder_) {
fec_builder_->OnBuiltFecProtectedPayload(header,
@@ -282,8 +274,7 @@
header.packet_sequence_number,
QuicPacket::NewFecPacket(writer.take(), len, true,
header.public_header.guid_length,
- header.public_header.version_flag,
- header.public_header.sequence_number_length),
+ header.public_header.version_flag),
GetPacketEntropyHash(header), NULL);
}
@@ -295,8 +286,7 @@
QuicDataWriter writer(len);
uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_RST |
- PACKET_PUBLIC_FLAGS_8BYTE_GUID |
- PACKET_PUBLIC_FLAGS_6BYTE_SEQUENCE);
+ PACKET_PUBLIC_FLAGS_8BYTE_GUID);
if (!writer.WriteUInt8(flags)) {
return NULL;
}
@@ -309,8 +299,7 @@
return NULL;
}
- if (!AppendPacketSequenceNumber(PACKET_6BYTE_SEQUENCE_NUMBER,
- packet.rejected_sequence_number,
+ if (!AppendPacketSequenceNumber(packet.rejected_sequence_number,
&writer)) {
return NULL;
}
@@ -326,8 +315,7 @@
QuicDataWriter writer(len);
uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_VERSION |
- PACKET_PUBLIC_FLAGS_8BYTE_GUID |
- PACKET_PUBLIC_FLAGS_6BYTE_SEQUENCE);
+ PACKET_PUBLIC_FLAGS_8BYTE_GUID);
if (!writer.WriteUInt8(flags)) {
return NULL;
}
@@ -496,21 +484,6 @@
if (header.public_header.version_flag) {
public_flags |= PACKET_PUBLIC_FLAGS_VERSION;
}
- switch (header.public_header.sequence_number_length) {
- case PACKET_1BYTE_SEQUENCE_NUMBER:
- public_flags |= PACKET_PUBLIC_FLAGS_1BYTE_SEQUENCE;
- break;
- case PACKET_2BYTE_SEQUENCE_NUMBER:
- public_flags |= PACKET_PUBLIC_FLAGS_2BYTE_SEQUENCE;
- break;
- case PACKET_4BYTE_SEQUENCE_NUMBER:
- public_flags |= PACKET_PUBLIC_FLAGS_4BYTE_SEQUENCE;
- break;
- case PACKET_6BYTE_SEQUENCE_NUMBER:
- public_flags |= PACKET_PUBLIC_FLAGS_6BYTE_SEQUENCE;
- break;
- }
-
switch (header.public_header.guid_length) {
case PACKET_0BYTE_GUID:
if (!writer->WriteUInt8(public_flags | PACKET_PUBLIC_FLAGS_0BYTE_GUID)) {
@@ -549,8 +522,7 @@
writer->WriteUInt32(quic_version_);
}
- if (!AppendPacketSequenceNumber(header.public_header.sequence_number_length,
- header.packet_sequence_number, writer)) {
+ if (!AppendPacketSequenceNumber(header.packet_sequence_number, writer)) {
return false;
}
@@ -586,47 +558,38 @@
}
QuicPacketSequenceNumber QuicFramer::CalculatePacketSequenceNumberFromWire(
- QuicSequenceNumberLength sequence_number_length,
QuicPacketSequenceNumber packet_sequence_number) const {
// The new sequence number might have wrapped to the next epoch, or
// it might have reverse wrapped to the previous epoch, or it might
// remain in the same epoch. Select the sequence number closest to the
- // next expected sequence number, the previous sequence number plus 1.
+ // previous sequence number.
+ QuicPacketSequenceNumber epoch = last_sequence_number_ & ~kSequenceNumberMask;
+ QuicPacketSequenceNumber prev_epoch = epoch - (GG_UINT64_C(1) << 48);
+ QuicPacketSequenceNumber next_epoch = epoch + (GG_UINT64_C(1) << 48);
- // epoch_delta is the delta between epochs the sequence number was serialized
- // with, so the correct value is likely the same epoch as the last sequence
- // number or an adjacent epoch.
- const QuicPacketSequenceNumber epoch_delta =
- GG_UINT64_C(1) << (8 * sequence_number_length);
- QuicPacketSequenceNumber next_sequence_number = last_sequence_number_ + 1;
- QuicPacketSequenceNumber epoch = last_sequence_number_ & ~(epoch_delta - 1);
- QuicPacketSequenceNumber prev_epoch = epoch - epoch_delta;
- QuicPacketSequenceNumber next_epoch = epoch + epoch_delta;
-
- return ClosestTo(next_sequence_number,
+ return ClosestTo(last_sequence_number_,
epoch + packet_sequence_number,
- ClosestTo(next_sequence_number,
+ ClosestTo(last_sequence_number_,
prev_epoch + packet_sequence_number,
next_epoch + packet_sequence_number));
}
-bool QuicFramer::ProcessPublicHeader(
- QuicPacketPublicHeader* public_header) {
+bool QuicFramer::ProcessPublicHeader(QuicPacketPublicHeader* public_header) {
uint8 public_flags;
if (!reader_->ReadBytes(&public_flags, 1)) {
set_detailed_error("Unable to read public flags.");
return false;
}
- public_header->reset_flag = (public_flags & PACKET_PUBLIC_FLAGS_RST) != 0;
- public_header->version_flag =
- (public_flags & PACKET_PUBLIC_FLAGS_VERSION) != 0;
-
- if (!public_header->version_flag && public_flags > PACKET_PUBLIC_FLAGS_MAX) {
+ if (public_flags > PACKET_PUBLIC_FLAGS_MAX) {
set_detailed_error("Illegal public flags value.");
return false;
}
+ public_header->reset_flag = (public_flags & PACKET_PUBLIC_FLAGS_RST) != 0;
+ public_header->version_flag =
+ (public_flags & PACKET_PUBLIC_FLAGS_VERSION) != 0;
+
if (public_header->reset_flag && public_header->version_flag) {
set_detailed_error("Got version flag in reset packet");
return false;
@@ -675,21 +638,6 @@
break;
}
- switch (public_flags & PACKET_PUBLIC_FLAGS_6BYTE_SEQUENCE) {
- case PACKET_PUBLIC_FLAGS_6BYTE_SEQUENCE:
- public_header->sequence_number_length = PACKET_6BYTE_SEQUENCE_NUMBER;
- break;
- case PACKET_PUBLIC_FLAGS_4BYTE_SEQUENCE:
- public_header->sequence_number_length = PACKET_4BYTE_SEQUENCE_NUMBER;
- break;
- case PACKET_PUBLIC_FLAGS_2BYTE_SEQUENCE:
- public_header->sequence_number_length = PACKET_2BYTE_SEQUENCE_NUMBER;
- break;
- case PACKET_PUBLIC_FLAGS_1BYTE_SEQUENCE:
- public_header->sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER;
- break;
- }
-
if (public_header->version_flag && is_server_) {
QuicTag version;
if (!reader_->ReadUInt32(&version)) {
@@ -698,10 +646,6 @@
set_detailed_error("Unable to read protocol version.");
return false;
}
- if (version == quic_version_ && public_flags > PACKET_PUBLIC_FLAGS_MAX) {
- set_detailed_error("Illegal public flags value.");
- return false;
- }
public_header->versions.push_back(version);
}
return true;
@@ -727,8 +671,7 @@
bool QuicFramer::ProcessPacketHeader(
QuicPacketHeader* header,
const QuicEncryptedPacket& packet) {
- if (!ProcessPacketSequenceNumber(header->public_header.sequence_number_length,
- &header->packet_sequence_number)) {
+ if (!ProcessPacketSequenceNumber(&header->packet_sequence_number)) {
set_detailed_error("Unable to read sequence number.");
return RaiseError(QUIC_INVALID_PACKET_HEADER);
}
@@ -738,7 +681,10 @@
return RaiseError(QUIC_INVALID_PACKET_HEADER);
}
- if (!DecryptPayload(*header, packet)) {
+ if (!DecryptPayload(header->packet_sequence_number,
+ header->public_header.guid_length,
+ header->public_header.version_flag,
+ packet)) {
set_detailed_error("Unable to decrypt payload.");
return RaiseError(QUIC_DECRYPTION_FAILURE);
}
@@ -776,18 +722,14 @@
}
bool QuicFramer::ProcessPacketSequenceNumber(
- QuicSequenceNumberLength sequence_number_length,
QuicPacketSequenceNumber* sequence_number) {
- QuicPacketSequenceNumber wire_sequence_number = 0u;
- if (!reader_->ReadBytes(&wire_sequence_number, sequence_number_length)) {
+ QuicPacketSequenceNumber wire_sequence_number;
+ if (!reader_->ReadUInt48(&wire_sequence_number)) {
return false;
}
- // TODO(ianswett): Explore the usefulness of trying multiple sequence numbers
- // in case the first guess is incorrect.
*sequence_number =
- CalculatePacketSequenceNumberFromWire(sequence_number_length,
- wire_sequence_number);
+ CalculatePacketSequenceNumberFromWire(wire_sequence_number);
return true;
}
@@ -942,8 +884,7 @@
return false;
}
- if (!ProcessPacketSequenceNumber(PACKET_6BYTE_SEQUENCE_NUMBER,
- &received_info->largest_observed)) {
+ if (!ProcessPacketSequenceNumber(&received_info->largest_observed)) {
set_detailed_error("Unable to read largest observed.");
return false;
}
@@ -969,8 +910,7 @@
for (int i = 0; i < num_missing_packets; ++i) {
QuicPacketSequenceNumber sequence_number;
- if (!ProcessPacketSequenceNumber(PACKET_6BYTE_SEQUENCE_NUMBER,
- &sequence_number)) {
+ if (!ProcessPacketSequenceNumber(&sequence_number)) {
set_detailed_error("Unable to read sequence number in missing packets.");
return false;
}
@@ -986,8 +926,7 @@
return false;
}
- if (!ProcessPacketSequenceNumber(PACKET_6BYTE_SEQUENCE_NUMBER,
- &sent_info->least_unacked)) {
+ if (!ProcessPacketSequenceNumber(&sent_info->least_unacked)) {
set_detailed_error("Unable to read least unacked.");
return false;
}
@@ -1023,8 +962,7 @@
if (num_received_packets > 0u) {
uint64 smallest_received;
- if (!ProcessPacketSequenceNumber(PACKET_6BYTE_SEQUENCE_NUMBER,
- &smallest_received)) {
+ if (!ProcessPacketSequenceNumber(&smallest_received)) {
set_detailed_error("Unable to read smallest received.");
return false;
}
@@ -1192,12 +1130,10 @@
StringPiece QuicFramer::GetAssociatedDataFromEncryptedPacket(
const QuicEncryptedPacket& encrypted,
QuicGuidLength guid_length,
- bool includes_version,
- QuicSequenceNumberLength sequence_number_length) {
+ bool includes_version) {
return StringPiece(encrypted.data() + kStartOfHashData,
GetStartOfEncryptedData(
- guid_length, includes_version, sequence_number_length)
- - kStartOfHashData);
+ guid_length, includes_version) - kStartOfHashData);
}
void QuicFramer::SetDecrypter(QuicDecrypter* decrypter) {
@@ -1285,7 +1221,9 @@
return min_plaintext_size;
}
-bool QuicFramer::DecryptPayload(const QuicPacketHeader& header,
+bool QuicFramer::DecryptPayload(QuicPacketSequenceNumber sequence_number,
+ QuicGuidLength guid_length,
+ bool version_flag,
const QuicEncryptedPacket& packet) {
StringPiece encrypted;
if (!reader_->ReadStringPiece(&encrypted, reader_->BytesRemaining())) {
@@ -1293,21 +1231,13 @@
}
DCHECK(decrypter_.get() != NULL);
decrypted_.reset(decrypter_->DecryptPacket(
- header.packet_sequence_number,
- GetAssociatedDataFromEncryptedPacket(
- packet,
- header.public_header.guid_length,
- header.public_header.version_flag,
- header.public_header.sequence_number_length),
+ sequence_number,
+ GetAssociatedDataFromEncryptedPacket(packet, guid_length, version_flag),
encrypted));
if (decrypted_.get() == NULL && alternative_decrypter_.get() != NULL) {
decrypted_.reset(alternative_decrypter_->DecryptPacket(
- header.packet_sequence_number,
- GetAssociatedDataFromEncryptedPacket(
- packet,
- header.public_header.guid_length,
- header.public_header.version_flag,
- header.public_header.sequence_number_length),
+ sequence_number,
+ GetAssociatedDataFromEncryptedPacket(packet, guid_length, version_flag),
encrypted));
if (decrypted_.get() != NULL) {
if (alternative_decrypter_latch_) {
@@ -1335,8 +1265,8 @@
return GetMinStreamFrameSize() + frame.stream_frame->data.size();
case ACK_FRAME: {
const QuicAckFrame& ack = *frame.ack_frame;
- return GetMinAckFrameSize() + PACKET_6BYTE_SEQUENCE_NUMBER *
- ack.received_info.missing_packets.size();
+ return GetMinAckFrameSize() +
+ kSequenceNumberSize * ack.received_info.missing_packets.size();
}
case CONGESTION_FEEDBACK_FRAME: {
size_t len = kQuicFrameTypeSize;
@@ -1351,10 +1281,10 @@
len += 2;
len += 1; // Number received packets.
if (inter_arrival.received_packet_times.size() > 0) {
- len += PACKET_6BYTE_SEQUENCE_NUMBER; // Smallest received.
+ len += kSequenceNumberSize; // Smallest received.
len += 8; // Time.
// 2 bytes per sequence number delta plus 4 bytes per delta time.
- len += PACKET_6BYTE_SEQUENCE_NUMBER *
+ len += kSequenceNumberSize *
(inter_arrival.received_packet_times.size() - 1);
}
break;
@@ -1379,8 +1309,7 @@
const QuicAckFrame& ack = frame.connection_close_frame->ack_frame;
return GetMinConnectionCloseFrameSize() +
frame.connection_close_frame->error_details.size() +
- PACKET_6BYTE_SEQUENCE_NUMBER *
- ack.received_info.missing_packets.size();
+ kSequenceNumberSize * ack.received_info.missing_packets.size();
}
case GOAWAY_FRAME:
return GetMinGoAwayFrameSize() + frame.goaway_frame->reason_phrase.size();
@@ -1399,35 +1328,13 @@
// static
bool QuicFramer::AppendPacketSequenceNumber(
- QuicSequenceNumberLength sequence_number_length,
QuicPacketSequenceNumber packet_sequence_number,
QuicDataWriter* writer) {
// Ensure the entire sequence number can be written.
- if (writer->capacity() - writer->length() <
- static_cast<size_t>( sequence_number_length)) {
+ if (writer->capacity() - writer->length() < kSequenceNumberSize) {
return false;
}
- switch (sequence_number_length) {
- case PACKET_1BYTE_SEQUENCE_NUMBER:
- return writer->WriteUInt8(
- packet_sequence_number & k1ByteSequenceNumberMask);
- break;
- case PACKET_2BYTE_SEQUENCE_NUMBER:
- return writer->WriteUInt16(
- packet_sequence_number & k2ByteSequenceNumberMask);
- break;
- case PACKET_4BYTE_SEQUENCE_NUMBER:
- return writer->WriteUInt32(
- packet_sequence_number & k4ByteSequenceNumberMask);
- break;
- case PACKET_6BYTE_SEQUENCE_NUMBER:
- return writer->WriteUInt48(
- packet_sequence_number & k6ByteSequenceNumberMask);
- break;
- default:
- NOTREACHED() << "sequence_number_length: " << sequence_number_length;
- return false;
- }
+ return writer->WriteUInt48(packet_sequence_number & kSequenceNumberMask);
}
bool QuicFramer::AppendStreamFramePayload(
@@ -1445,7 +1352,8 @@
if (!writer->WriteUInt16(frame.data.size())) {
return false;
}
- if (!writer->WriteBytes(frame.data.data(), frame.data.size())) {
+ if (!writer->WriteBytes(frame.data.data(),
+ frame.data.size())) {
return false;
}
return true;
@@ -1478,8 +1386,7 @@
return false;
}
- if (!AppendPacketSequenceNumber(PACKET_6BYTE_SEQUENCE_NUMBER,
- frame.sent_info.least_unacked, writer)) {
+ if (!AppendPacketSequenceNumber(frame.sent_info.least_unacked, writer)) {
return false;
}
@@ -1489,8 +1396,7 @@
}
size_t largest_observed_offset = writer->length();
- if (!AppendPacketSequenceNumber(PACKET_6BYTE_SEQUENCE_NUMBER,
- frame.received_info.largest_observed,
+ if (!AppendPacketSequenceNumber(frame.received_info.largest_observed,
writer)) {
return false;
}
@@ -1517,8 +1423,7 @@
frame.received_info.missing_packets.begin();
int num_missing_packets_written = 0;
for (; it != frame.received_info.missing_packets.end(); ++it) {
- if (!AppendPacketSequenceNumber(PACKET_6BYTE_SEQUENCE_NUMBER,
- *it, writer)) {
+ if (!AppendPacketSequenceNumber(*it, writer)) {
// We are truncating.
QuicPacketSequenceNumber largest_observed =
CalculateLargestObserved(frame.received_info.missing_packets, --it);
@@ -1527,7 +1432,7 @@
entropy_calculator_->ReceivedEntropyHash(largest_observed),
received_entropy_offset);
// Overwrite largest_observed.
- writer->WriteUInt48ToOffset(largest_observed & k6ByteSequenceNumberMask,
+ writer->WriteUInt48ToOffset(largest_observed & kSequenceNumberMask,
largest_observed_offset);
writer->WriteUInt32ToOffset(kInvalidDeltaTime,
delta_time_largest_observed_offset);
@@ -1574,8 +1479,7 @@
inter_arrival.received_packet_times.begin();
QuicPacketSequenceNumber lowest_sequence = it->first;
- if (!AppendPacketSequenceNumber(PACKET_6BYTE_SEQUENCE_NUMBER,
- lowest_sequence, writer)) {
+ if (!AppendPacketSequenceNumber(lowest_sequence, writer)) {
return false;
}
« no previous file with comments | « trunk/src/net/quic/quic_framer.h ('k') | trunk/src/net/quic/quic_framer_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698