Index: net/quic/core/quic_framer.cc |
diff --git a/net/quic/core/quic_framer.cc b/net/quic/core/quic_framer.cc |
index 87ef7af79d09dd1aa256e41c585bd31bbf7f9959..a6788128624521e0c2549c0cb37014956b0ee1cb 100644 |
--- a/net/quic/core/quic_framer.cc |
+++ b/net/quic/core/quic_framer.cc |
@@ -23,6 +23,7 @@ |
#include "net/quic/core/quic_socket_address_coder.h" |
#include "net/quic/core/quic_utils.h" |
+using base::ContainsKey; |
using base::StringPiece; |
using std::map; |
using std::max; |
@@ -142,6 +143,7 @@ QuicFramer::QuicFramer(const QuicVersionVector& supported_versions, |
entropy_calculator_(nullptr), |
error_(QUIC_NO_ERROR), |
last_packet_number_(0), |
+ largest_packet_number_(0), |
last_path_id_(kInvalidPathId), |
last_serialized_connection_id_(0), |
supported_versions_(supported_versions), |
@@ -799,21 +801,34 @@ const QuicTime::Delta QuicFramer::CalculateTimestampFromWire( |
} |
bool QuicFramer::IsValidPath(QuicPathId path_id, |
- QuicPacketNumber* last_packet_number) { |
- if (base::ContainsKey(closed_paths_, path_id)) { |
+ QuicPacketNumber* base_packet_number) { |
+ if (ContainsKey(closed_paths_, path_id)) { |
// Path is closed. |
return false; |
} |
- if (path_id == last_path_id_) { |
- *last_packet_number = last_packet_number_; |
- return true; |
- } |
+ if (FLAGS_quic_packet_numbers_largest_received) { |
+ if (path_id == last_path_id_) { |
+ *base_packet_number = largest_packet_number_; |
+ return true; |
+ } |
- if (base::ContainsKey(last_packet_numbers_, path_id)) { |
- *last_packet_number = last_packet_numbers_[path_id]; |
+ if (ContainsKey(largest_packet_numbers_, path_id)) { |
+ *base_packet_number = largest_packet_numbers_[path_id]; |
+ } else { |
+ *base_packet_number = 0; |
+ } |
} else { |
- *last_packet_number = 0; |
+ if (path_id == last_path_id_) { |
+ *base_packet_number = last_packet_number_; |
+ return true; |
+ } |
+ |
+ if (ContainsKey(last_packet_numbers_, path_id)) { |
+ *base_packet_number = last_packet_numbers_[path_id]; |
+ } else { |
+ *base_packet_number = 0; |
+ } |
} |
return true; |
@@ -824,11 +839,17 @@ void QuicFramer::SetLastPacketNumber(const QuicPacketHeader& header) { |
if (last_path_id_ != kInvalidPathId) { |
// Save current last packet number before changing path. |
last_packet_numbers_[last_path_id_] = last_packet_number_; |
+ if (FLAGS_quic_packet_numbers_largest_received) { |
+ largest_packet_numbers_[last_path_id_] = largest_packet_number_; |
+ } |
} |
// Change path. |
last_path_id_ = header.path_id; |
} |
last_packet_number_ = header.packet_number; |
+ if (FLAGS_quic_packet_numbers_largest_received) { |
+ largest_packet_number_ = max(header.packet_number, largest_packet_number_); |
+ } |
} |
void QuicFramer::OnPathClosed(QuicPathId path_id) { |
@@ -838,7 +859,7 @@ void QuicFramer::OnPathClosed(QuicPathId path_id) { |
QuicPacketNumber QuicFramer::CalculatePacketNumberFromWire( |
QuicPacketNumberLength packet_number_length, |
- QuicPacketNumber last_packet_number, |
+ QuicPacketNumber base_packet_number, |
QuicPacketNumber packet_number) const { |
// The new packet number might have wrapped to the next epoch, or |
// it might have reverse wrapped to the previous epoch, or it might |
@@ -850,8 +871,8 @@ QuicPacketNumber QuicFramer::CalculatePacketNumberFromWire( |
// number or an adjacent epoch. |
const QuicPacketNumber epoch_delta = UINT64_C(1) |
<< (8 * packet_number_length); |
- QuicPacketNumber next_packet_number = last_packet_number + 1; |
- QuicPacketNumber epoch = last_packet_number & ~(epoch_delta - 1); |
+ QuicPacketNumber next_packet_number = base_packet_number + 1; |
+ QuicPacketNumber epoch = base_packet_number & ~(epoch_delta - 1); |
QuicPacketNumber prev_epoch = epoch - epoch_delta; |
QuicPacketNumber next_epoch = epoch + epoch_delta; |
@@ -935,8 +956,8 @@ bool QuicFramer::ProcessPublicHeader(QuicDataReader* reader, |
// The nonce flag from a client is ignored and is assumed to be an older |
// client indicating an eight-byte connection ID. |
perspective_ == Perspective::IS_CLIENT) { |
- if (!reader->ReadBytes(reinterpret_cast<uint8_t*>(last_nonce_), |
- sizeof(last_nonce_))) { |
+ if (!reader->ReadBytes(reinterpret_cast<uint8_t*>(last_nonce_.data()), |
+ last_nonce_.size())) { |
set_detailed_error("Unable to read nonce."); |
return false; |
} |
@@ -1051,16 +1072,18 @@ bool QuicFramer::ProcessUnauthenticatedHeader(QuicDataReader* encrypted_reader, |
return RaiseError(QUIC_INVALID_PACKET_HEADER); |
} |
- QuicPacketNumber last_packet_number = last_packet_number_; |
+ QuicPacketNumber base_packet_number = |
+ FLAGS_quic_packet_numbers_largest_received ? largest_packet_number_ |
+ : last_packet_number_; |
if (header->public_header.multipath_flag && |
- !IsValidPath(header->path_id, &last_packet_number)) { |
+ !IsValidPath(header->path_id, &base_packet_number)) { |
// Stop processing because path is closed. |
return false; |
} |
if (!ProcessPacketSequenceNumber( |
encrypted_reader, header->public_header.packet_number_length, |
- last_packet_number, &header->packet_number)) { |
+ base_packet_number, &header->packet_number)) { |
set_detailed_error("Unable to read packet number."); |
return RaiseError(QUIC_INVALID_PACKET_HEADER); |
} |
@@ -1128,7 +1151,7 @@ bool QuicFramer::ProcessPathId(QuicDataReader* reader, QuicPathId* path_id) { |
bool QuicFramer::ProcessPacketSequenceNumber( |
QuicDataReader* reader, |
QuicPacketNumberLength packet_number_length, |
- QuicPacketNumber last_packet_number, |
+ QuicPacketNumber base_packet_number, |
QuicPacketNumber* packet_number) { |
QuicPacketNumber wire_packet_number = 0u; |
if (!reader->ReadBytes(&wire_packet_number, packet_number_length)) { |
@@ -1138,7 +1161,7 @@ bool QuicFramer::ProcessPacketSequenceNumber( |
// TODO(ianswett): Explore the usefulness of trying multiple packet numbers |
// in case the first guess is incorrect. |
*packet_number = CalculatePacketNumberFromWire( |
- packet_number_length, last_packet_number, wire_packet_number); |
+ packet_number_length, base_packet_number, wire_packet_number); |
return true; |
} |