Index: net/quic/quic_packet_creator.cc |
diff --git a/net/quic/quic_packet_creator.cc b/net/quic/quic_packet_creator.cc |
index 4b64ae503d572b494038a67514e08a56d9e92315..f7d2d14a13f9e54e5ea5dc8989539478abe37836 100644 |
--- a/net/quic/quic_packet_creator.cc |
+++ b/net/quic/quic_packet_creator.cc |
@@ -68,7 +68,11 @@ QuicPacketCreator::QuicPacketCreator(QuicConnectionId connection_id, |
fec_group_number_(0), |
is_server_(is_server), |
send_version_in_packet_(!is_server), |
- sequence_number_length_(options_.send_sequence_number_length), |
+ max_packet_length_(kDefaultMaxPacketSize), |
+ max_packets_per_fec_group_(0), |
+ connection_id_length_(PACKET_8BYTE_CONNECTION_ID), |
+ next_sequence_number_length_(PACKET_1BYTE_SEQUENCE_NUMBER), |
+ sequence_number_length_(next_sequence_number_length_), |
packet_size_(0) { |
framer_->set_fec_builder(this); |
} |
@@ -87,7 +91,7 @@ void QuicPacketCreator::OnBuiltFecProtectedPayload( |
bool QuicPacketCreator::ShouldSendFec(bool force_close) const { |
return fec_group_.get() != NULL && fec_group_->NumReceivedPackets() > 0 && |
(force_close || fec_group_->NumReceivedPackets() >= |
- options_.max_packets_per_fec_group); |
+ max_packets_per_fec_group_); |
} |
void QuicPacketCreator::StartFecProtectingPackets() { |
@@ -123,18 +127,7 @@ bool QuicPacketCreator::IsFecProtected() const { |
} |
bool QuicPacketCreator::IsFecEnabled() const { |
- return options_.max_packets_per_fec_group > 0; |
-} |
- |
-size_t QuicPacketCreator::max_packets_per_fec_group() const { |
- return options_.max_packets_per_fec_group; |
-} |
- |
-void QuicPacketCreator::set_max_packets_per_fec_group( |
- size_t max_packets_per_fec_group) { |
- // To turn off FEC protection, use StopFecProtectingPackets(). |
- DCHECK_NE(0u, max_packets_per_fec_group); |
- options_.max_packets_per_fec_group = max_packets_per_fec_group; |
+ return max_packets_per_fec_group_ > 0; |
} |
InFecGroup QuicPacketCreator::MaybeUpdateLengthsAndStartFec() { |
@@ -147,8 +140,9 @@ InFecGroup QuicPacketCreator::MaybeUpdateLengthsAndStartFec() { |
// Don't change creator state if there are frames queued. |
return fec_group_.get() == NULL ? NOT_IN_FEC_GROUP : IN_FEC_GROUP; |
} |
- // TODO(jri): Add max_packet_length and send_connection_id_length here too. |
- sequence_number_length_ = options_.send_sequence_number_length; |
+ |
+ // Update sequence number length only on packet and FEC group boundaries. |
+ sequence_number_length_ = next_sequence_number_length_; |
if (!should_fec_protect_) { |
return NOT_IN_FEC_GROUP; |
@@ -179,12 +173,12 @@ void QuicPacketCreator::UpdateSequenceNumberLength( |
// Since the packet creator will not change sequence number length mid FEC |
// group, include the size of an FEC group to be safe. |
const QuicPacketSequenceNumber current_delta = |
- options_.max_packets_per_fec_group + sequence_number_ + 1 |
+ max_packets_per_fec_group_ + sequence_number_ + 1 |
- least_packet_awaited_by_peer; |
const uint64 congestion_window_packets = |
- congestion_window / options_.max_packet_length; |
+ congestion_window / max_packet_length_; |
const uint64 delta = max(current_delta, congestion_window_packets); |
- options_.send_sequence_number_length = |
+ next_sequence_number_length_ = |
QuicFramer::GetMinSequenceNumberLength(delta * 4); |
} |
@@ -219,8 +213,7 @@ size_t QuicPacketCreator::CreateStreamFrame(QuicStreamId id, |
QuicStreamOffset offset, |
bool fin, |
QuicFrame* frame) { |
- DCHECK_GT(options_.max_packet_length, |
- StreamFramePacketOverhead( |
+ DCHECK_GT(max_packet_length_, StreamFramePacketOverhead( |
framer_->version(), PACKET_8BYTE_CONNECTION_ID, kIncludeVersion, |
PACKET_6BYTE_SEQUENCE_NUMBER, offset, IN_FEC_GROUP)); |
@@ -277,19 +270,19 @@ SerializedPacket QuicPacketCreator::ReserializeAllFrames( |
QuicSequenceNumberLength original_length) { |
DCHECK(fec_group_.get() == NULL); |
const QuicSequenceNumberLength saved_length = sequence_number_length_; |
- const QuicSequenceNumberLength saved_options_length = |
- options_.send_sequence_number_length; |
+ const QuicSequenceNumberLength saved_next_length = |
+ next_sequence_number_length_; |
const bool saved_should_fec_protect = should_fec_protect_; |
// Temporarily set the sequence number length and stop FEC protection. |
sequence_number_length_ = original_length; |
- options_.send_sequence_number_length = original_length; |
+ next_sequence_number_length_ = original_length; |
should_fec_protect_ = false; |
// Serialize the packet and restore the FEC and sequence number length state. |
SerializedPacket serialized_packet = SerializeAllFrames(frames); |
sequence_number_length_ = saved_length; |
- options_.send_sequence_number_length = saved_options_length; |
+ next_sequence_number_length_ = saved_next_length; |
should_fec_protect_ = saved_should_fec_protect; |
return serialized_packet; |
@@ -330,26 +323,23 @@ size_t QuicPacketCreator::ExpansionOnNewFrame() const { |
size_t QuicPacketCreator::BytesFree() const { |
const size_t max_plaintext_size = |
- framer_->GetMaxPlaintextSize(options_.max_packet_length); |
+ framer_->GetMaxPlaintextSize(max_packet_length_); |
DCHECK_GE(max_plaintext_size, PacketSize()); |
return max_plaintext_size - min(max_plaintext_size, PacketSize() |
+ ExpansionOnNewFrame()); |
} |
size_t QuicPacketCreator::PacketSize() const { |
- if (queued_frames_.empty()) { |
- // Only adjust the sequence number length when the FEC group is not open, |
- // to ensure no packets in a group are too large. |
- if (fec_group_.get() == NULL || |
- fec_group_->NumReceivedPackets() == 0) { |
- sequence_number_length_ = options_.send_sequence_number_length; |
- } |
- packet_size_ = GetPacketHeaderSize(options_.send_connection_id_length, |
- send_version_in_packet_, |
- sequence_number_length_, |
- should_fec_protect_ ? IN_FEC_GROUP : |
- NOT_IN_FEC_GROUP); |
+ if (!queued_frames_.empty()) { |
+ return packet_size_; |
} |
+ if (fec_group_.get() == NULL) { |
+ // Update sequence number length on packet and FEC boundary. |
+ sequence_number_length_ = next_sequence_number_length_; |
+ } |
+ packet_size_ = GetPacketHeaderSize( |
+ connection_id_length_, send_version_in_packet_, sequence_number_length_, |
+ should_fec_protect_ ? IN_FEC_GROUP : NOT_IN_FEC_GROUP); |
return packet_size_; |
} |
@@ -367,7 +357,7 @@ SerializedPacket QuicPacketCreator::SerializePacket() { |
MaybeAddPadding(); |
size_t max_plaintext_size = |
- framer_->GetMaxPlaintextSize(options_.max_packet_length); |
+ framer_->GetMaxPlaintextSize(max_packet_length_); |
DCHECK_GE(max_plaintext_size, packet_size_); |
// ACK Frames will be truncated only if they're the only frame in the packet, |
// and if packet_size_ was set to max_plaintext_size. If truncation occurred, |
@@ -384,7 +374,6 @@ SerializedPacket QuicPacketCreator::SerializePacket() { |
if (!possibly_truncated) { |
DCHECK_EQ(packet_size_, serialized.packet->length()); |
} |
- |
packet_size_ = 0; |
queued_frames_.clear(); |
serialized.retransmittable_frames = queued_retransmittable_frames_.release(); |
@@ -409,7 +398,7 @@ SerializedPacket QuicPacketCreator::SerializeFec() { |
packet_size_ = 0; |
LOG_IF(DFATAL, !serialized.packet) |
<< "Failed to serialize fec packet for group:" << fec_data.fec_group; |
- DCHECK_GE(options_.max_packet_length, serialized.packet->length()); |
+ DCHECK_GE(max_packet_length_, serialized.packet->length()); |
return serialized; |
} |
@@ -431,7 +420,7 @@ QuicEncryptedPacket* QuicPacketCreator::SerializeVersionNegotiationPacket( |
QuicEncryptedPacket* encrypted = |
framer_->BuildVersionNegotiationPacket(header, supported_versions); |
DCHECK(encrypted); |
- DCHECK_GE(options_.max_packet_length, encrypted->length()); |
+ DCHECK_GE(max_packet_length_, encrypted->length()); |
return encrypted; |
} |