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; |
} |