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

Side by Side Diff: net/quic/quic_packet_creator.cc

Issue 242593002: Land Recent QUIC Changes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Build fix. Use uint32 instead of int Created 6 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/quic/quic_packet_creator.h ('k') | net/quic/quic_packet_creator_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/quic/quic_packet_creator.h" 5 #include "net/quic/quic_packet_creator.h"
6 6
7 #include "base/basictypes.h" 7 #include "base/basictypes.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "net/quic/crypto/quic_random.h" 9 #include "net/quic/crypto/quic_random.h"
10 #include "net/quic/quic_ack_notifier.h" 10 #include "net/quic/quic_ack_notifier.h"
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
82 } 82 }
83 } 83 }
84 84
85 bool QuicPacketCreator::ShouldSendFec(bool force_close) const { 85 bool QuicPacketCreator::ShouldSendFec(bool force_close) const {
86 return fec_group_.get() != NULL && fec_group_->NumReceivedPackets() > 0 && 86 return fec_group_.get() != NULL && fec_group_->NumReceivedPackets() > 0 &&
87 (force_close || 87 (force_close ||
88 fec_group_->NumReceivedPackets() >= options_.max_packets_per_fec_group); 88 fec_group_->NumReceivedPackets() >= options_.max_packets_per_fec_group);
89 } 89 }
90 90
91 InFecGroup QuicPacketCreator::MaybeStartFEC() { 91 InFecGroup QuicPacketCreator::MaybeStartFEC() {
92 // Don't send FEC until QUIC_VERSION_15. 92 if (IsFecEnabled() && fec_group_.get() == NULL) {
93 if (framer_->version() != QUIC_VERSION_13 &&
94 options_.max_packets_per_fec_group > 0 && fec_group_.get() == NULL) {
95 DCHECK(queued_frames_.empty()); 93 DCHECK(queued_frames_.empty());
96 // Set the fec group number to the sequence number of the next packet. 94 // Set the fec group number to the sequence number of the next packet.
97 fec_group_number_ = sequence_number() + 1; 95 fec_group_number_ = sequence_number() + 1;
98 fec_group_.reset(new QuicFecGroup()); 96 fec_group_.reset(new QuicFecGroup());
99 } 97 }
100 return fec_group_.get() == NULL ? NOT_IN_FEC_GROUP : IN_FEC_GROUP; 98 return fec_group_.get() == NULL ? NOT_IN_FEC_GROUP : IN_FEC_GROUP;
101 } 99 }
102 100
103 // Stops serializing version of the protocol in packets sent after this call. 101 // Stops serializing version of the protocol in packets sent after this call.
104 // A packet that is already open might send kQuicVersionSize bytes less than the 102 // A packet that is already open might send kQuicVersionSize bytes less than the
(...skipping 21 matching lines...) Expand all
126 const uint64 delta = max(current_delta, congestion_window_packets); 124 const uint64 delta = max(current_delta, congestion_window_packets);
127 options_.send_sequence_number_length = 125 options_.send_sequence_number_length =
128 QuicFramer::GetMinSequenceNumberLength(delta * 4); 126 QuicFramer::GetMinSequenceNumberLength(delta * 4);
129 } 127 }
130 128
131 bool QuicPacketCreator::HasRoomForStreamFrame(QuicStreamId id, 129 bool QuicPacketCreator::HasRoomForStreamFrame(QuicStreamId id,
132 QuicStreamOffset offset) const { 130 QuicStreamOffset offset) const {
133 // TODO(jri): This is a simple safe decision for now, but make 131 // TODO(jri): This is a simple safe decision for now, but make
134 // is_in_fec_group a parameter. Same as with all public methods in 132 // is_in_fec_group a parameter. Same as with all public methods in
135 // QuicPacketCreator. 133 // QuicPacketCreator.
136 InFecGroup is_in_fec_group = options_.max_packets_per_fec_group == 0 ?
137 NOT_IN_FEC_GROUP : IN_FEC_GROUP;
138 return BytesFree() > 134 return BytesFree() >
139 QuicFramer::GetMinStreamFrameSize(framer_->version(), id, offset, true, 135 QuicFramer::GetMinStreamFrameSize(framer_->version(), id, offset, true,
140 is_in_fec_group); 136 IsFecEnabled());
141 } 137 }
142 138
143 // static 139 // static
144 size_t QuicPacketCreator::StreamFramePacketOverhead( 140 size_t QuicPacketCreator::StreamFramePacketOverhead(
145 QuicVersion version, 141 QuicVersion version,
146 QuicConnectionIdLength connection_id_length, 142 QuicConnectionIdLength connection_id_length,
147 bool include_version, 143 bool include_version,
148 QuicSequenceNumberLength sequence_number_length, 144 QuicSequenceNumberLength sequence_number_length,
149 InFecGroup is_in_fec_group) { 145 InFecGroup is_in_fec_group) {
150 return GetPacketHeaderSize(connection_id_length, include_version, 146 return GetPacketHeaderSize(connection_id_length, include_version,
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
270 } 266 }
271 267
272 size_t QuicPacketCreator::BytesFree() const { 268 size_t QuicPacketCreator::BytesFree() const {
273 const size_t max_plaintext_size = 269 const size_t max_plaintext_size =
274 framer_->GetMaxPlaintextSize(options_.max_packet_length); 270 framer_->GetMaxPlaintextSize(options_.max_packet_length);
275 DCHECK_GE(max_plaintext_size, PacketSize()); 271 DCHECK_GE(max_plaintext_size, PacketSize());
276 return max_plaintext_size - min(max_plaintext_size, PacketSize() 272 return max_plaintext_size - min(max_plaintext_size, PacketSize()
277 + ExpansionOnNewFrame()); 273 + ExpansionOnNewFrame());
278 } 274 }
279 275
276 InFecGroup QuicPacketCreator::IsFecEnabled() const {
277 return (framer_->version() == QUIC_VERSION_13 ||
278 options_.max_packets_per_fec_group == 0) ?
279 NOT_IN_FEC_GROUP : IN_FEC_GROUP;
280 }
281
280 size_t QuicPacketCreator::PacketSize() const { 282 size_t QuicPacketCreator::PacketSize() const {
281 if (queued_frames_.empty()) { 283 if (queued_frames_.empty()) {
282 // Only adjust the sequence number length when the FEC group is not open, 284 // Only adjust the sequence number length when the FEC group is not open,
283 // to ensure no packets in a group are too large. 285 // to ensure no packets in a group are too large.
284 if (fec_group_.get() == NULL || 286 if (fec_group_.get() == NULL ||
285 fec_group_->NumReceivedPackets() == 0) { 287 fec_group_->NumReceivedPackets() == 0) {
286 sequence_number_length_ = options_.send_sequence_number_length; 288 sequence_number_length_ = options_.send_sequence_number_length;
287 } 289 }
288 packet_size_ = GetPacketHeaderSize(options_.send_connection_id_length, 290 packet_size_ = GetPacketHeaderSize(options_.send_connection_id_length,
289 send_version_in_packet_, 291 send_version_in_packet_,
290 sequence_number_length_, 292 sequence_number_length_,
291 options_.max_packets_per_fec_group == 0 ? 293 IsFecEnabled());
292 NOT_IN_FEC_GROUP : IN_FEC_GROUP);
293 } 294 }
294 return packet_size_; 295 return packet_size_;
295 } 296 }
296 297
297 bool QuicPacketCreator::AddSavedFrame(const QuicFrame& frame) { 298 bool QuicPacketCreator::AddSavedFrame(const QuicFrame& frame) {
298 return AddFrame(frame, true); 299 return AddFrame(frame, true);
299 } 300 }
300 301
301 SerializedPacket QuicPacketCreator::SerializePacket() { 302 SerializedPacket QuicPacketCreator::SerializePacket() {
302 LOG_IF(DFATAL, queued_frames_.empty()) 303 LOG_IF(DFATAL, queued_frames_.empty())
(...skipping 23 matching lines...) Expand all
326 if (!possibly_truncated) 327 if (!possibly_truncated)
327 DCHECK_EQ(packet_size_, serialized.packet->length()); 328 DCHECK_EQ(packet_size_, serialized.packet->length());
328 329
329 packet_size_ = 0; 330 packet_size_ = 0;
330 queued_frames_.clear(); 331 queued_frames_.clear();
331 serialized.retransmittable_frames = queued_retransmittable_frames_.release(); 332 serialized.retransmittable_frames = queued_retransmittable_frames_.release();
332 return serialized; 333 return serialized;
333 } 334 }
334 335
335 SerializedPacket QuicPacketCreator::SerializeFec() { 336 SerializedPacket QuicPacketCreator::SerializeFec() {
336 DCHECK_LT(0u, fec_group_->NumReceivedPackets()); 337 if (fec_group_.get() == NULL || fec_group_->NumReceivedPackets() <= 0) {
338 LOG(DFATAL) << "SerializeFEC called but no group or zero packets in group.";
339 // TODO(jri): Make this a public method of framer?
340 SerializedPacket kNoPacket(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL);
341 return kNoPacket;
342 }
337 DCHECK_EQ(0u, queued_frames_.size()); 343 DCHECK_EQ(0u, queued_frames_.size());
338 QuicPacketHeader header; 344 QuicPacketHeader header;
339 FillPacketHeader(fec_group_number_, true, &header); 345 FillPacketHeader(fec_group_number_, true, &header);
340 QuicFecData fec_data; 346 QuicFecData fec_data;
341 fec_data.fec_group = fec_group_->min_protected_packet(); 347 fec_data.fec_group = fec_group_->min_protected_packet();
342 fec_data.redundancy = fec_group_->payload_parity(); 348 fec_data.redundancy = fec_group_->payload_parity();
343 SerializedPacket serialized = framer_->BuildFecPacket(header, fec_data); 349 SerializedPacket serialized = framer_->BuildFecPacket(header, fec_data);
344 fec_group_.reset(NULL); 350 fec_group_.reset(NULL);
345 fec_group_number_ = 0; 351 fec_group_number_ = 0;
346 packet_size_ = 0; 352 packet_size_ = 0;
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
447 if (!is_handshake) { 453 if (!is_handshake) {
448 return; 454 return;
449 } 455 }
450 456
451 QuicPaddingFrame padding; 457 QuicPaddingFrame padding;
452 bool success = AddFrame(QuicFrame(&padding), false); 458 bool success = AddFrame(QuicFrame(&padding), false);
453 DCHECK(success); 459 DCHECK(success);
454 } 460 }
455 461
456 } // namespace net 462 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_packet_creator.h ('k') | net/quic/quic_packet_creator_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698