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

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

Issue 157803007: Land Recent QUIC Changes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: win_x64 compiler error fix Created 6 years, 10 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_protocol.h » ('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 void QuicPacketCreator::MaybeStartFEC() { 91 void QuicPacketCreator::MaybeStartFEC() {
92 if (options_.max_packets_per_fec_group > 0 && fec_group_.get() == NULL) { 92 // Don't send FEC until QUIC_VERSION_15.
93 if (framer_->version() > QUIC_VERSION_14 &&
94 options_.max_packets_per_fec_group > 0 && fec_group_.get() == NULL) {
93 DCHECK(queued_frames_.empty()); 95 DCHECK(queued_frames_.empty());
94 // Set the fec group number to the sequence number of the next packet. 96 // Set the fec group number to the sequence number of the next packet.
95 fec_group_number_ = sequence_number() + 1; 97 fec_group_number_ = sequence_number() + 1;
96 fec_group_.reset(new QuicFecGroup()); 98 fec_group_.reset(new QuicFecGroup());
97 } 99 }
98 } 100 }
99 101
100 // Stops serializing version of the protocol in packets sent after this call. 102 // Stops serializing version of the protocol in packets sent after this call.
101 // A packet that is already open might send kQuicVersionSize bytes less than the 103 // A packet that is already open might send kQuicVersionSize bytes less than the
102 // maximum packet size if we stop sending version before it is serialized. 104 // maximum packet size if we stop sending version before it is serialized.
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after
308 310
309 bool QuicPacketCreator::AddSavedFrame(const QuicFrame& frame) { 311 bool QuicPacketCreator::AddSavedFrame(const QuicFrame& frame) {
310 return AddFrame(frame, true); 312 return AddFrame(frame, true);
311 } 313 }
312 314
313 SerializedPacket QuicPacketCreator::SerializePacket() { 315 SerializedPacket QuicPacketCreator::SerializePacket() {
314 if (queued_frames_.empty()) { 316 if (queued_frames_.empty()) {
315 LOG(DFATAL) << "Attempt to serialize empty packet"; 317 LOG(DFATAL) << "Attempt to serialize empty packet";
316 } 318 }
317 QuicPacketHeader header; 319 QuicPacketHeader header;
318 FillPacketHeader(fec_group_number_, false, false, &header); 320 FillPacketHeader(fec_group_number_, false, &header);
319 321
320 MaybeAddPadding(); 322 MaybeAddPadding();
321 323
322 size_t max_plaintext_size = 324 size_t max_plaintext_size =
323 framer_->GetMaxPlaintextSize(options_.max_packet_length); 325 framer_->GetMaxPlaintextSize(options_.max_packet_length);
324 DCHECK_GE(max_plaintext_size, packet_size_); 326 DCHECK_GE(max_plaintext_size, packet_size_);
325 // ACK and CONNECTION_CLOSE Frames will be truncated only if they're 327 // ACK and CONNECTION_CLOSE Frames will be truncated only if they're
326 // the first frame in the packet. If truncation is to occur, then 328 // the first frame in the packet. If truncation is to occur, then
327 // GetSerializedFrameLength will have returned all bytes free. 329 // GetSerializedFrameLength will have returned all bytes free.
328 bool possibly_truncated = 330 bool possibly_truncated =
(...skipping 15 matching lines...) Expand all
344 packet_size_ = 0; 346 packet_size_ = 0;
345 queued_frames_.clear(); 347 queued_frames_.clear();
346 serialized.retransmittable_frames = queued_retransmittable_frames_.release(); 348 serialized.retransmittable_frames = queued_retransmittable_frames_.release();
347 return serialized; 349 return serialized;
348 } 350 }
349 351
350 SerializedPacket QuicPacketCreator::SerializeFec() { 352 SerializedPacket QuicPacketCreator::SerializeFec() {
351 DCHECK_LT(0u, fec_group_->NumReceivedPackets()); 353 DCHECK_LT(0u, fec_group_->NumReceivedPackets());
352 DCHECK_EQ(0u, queued_frames_.size()); 354 DCHECK_EQ(0u, queued_frames_.size());
353 QuicPacketHeader header; 355 QuicPacketHeader header;
354 FillPacketHeader(fec_group_number_, true, 356 FillPacketHeader(fec_group_number_, true, &header);
355 fec_group_->entropy_parity(), &header);
356 QuicFecData fec_data; 357 QuicFecData fec_data;
357 fec_data.fec_group = fec_group_->min_protected_packet(); 358 fec_data.fec_group = fec_group_->min_protected_packet();
358 fec_data.redundancy = fec_group_->payload_parity(); 359 fec_data.redundancy = fec_group_->payload_parity();
359 SerializedPacket serialized = framer_->BuildFecPacket(header, fec_data); 360 SerializedPacket serialized = framer_->BuildFecPacket(header, fec_data);
360 fec_group_.reset(NULL); 361 fec_group_.reset(NULL);
361 fec_group_number_ = 0; 362 fec_group_number_ = 0;
362 packet_size_ = 0; 363 packet_size_ = 0;
363 if (!serialized.packet) { 364 if (!serialized.packet) {
364 LOG(DFATAL) << "Failed to serialize fec packet for group:" 365 LOG(DFATAL) << "Failed to serialize fec packet for group:"
365 << fec_data.fec_group; 366 << fec_data.fec_group;
(...skipping 19 matching lines...) Expand all
385 header.versions = supported_versions; 386 header.versions = supported_versions;
386 QuicEncryptedPacket* encrypted = 387 QuicEncryptedPacket* encrypted =
387 framer_->BuildVersionNegotiationPacket(header, supported_versions); 388 framer_->BuildVersionNegotiationPacket(header, supported_versions);
388 DCHECK(encrypted); 389 DCHECK(encrypted);
389 DCHECK_GE(options_.max_packet_length, encrypted->length()); 390 DCHECK_GE(options_.max_packet_length, encrypted->length());
390 return encrypted; 391 return encrypted;
391 } 392 }
392 393
393 void QuicPacketCreator::FillPacketHeader(QuicFecGroupNumber fec_group, 394 void QuicPacketCreator::FillPacketHeader(QuicFecGroupNumber fec_group,
394 bool fec_flag, 395 bool fec_flag,
395 bool fec_entropy_flag,
396 QuicPacketHeader* header) { 396 QuicPacketHeader* header) {
397 header->public_header.guid = guid_; 397 header->public_header.guid = guid_;
398 header->public_header.reset_flag = false; 398 header->public_header.reset_flag = false;
399 header->public_header.version_flag = send_version_in_packet_; 399 header->public_header.version_flag = send_version_in_packet_;
400 header->fec_flag = fec_flag; 400 header->fec_flag = fec_flag;
401 header->packet_sequence_number = ++sequence_number_; 401 header->packet_sequence_number = ++sequence_number_;
402 header->public_header.sequence_number_length = sequence_number_length_; 402 header->public_header.sequence_number_length = sequence_number_length_;
403 403 header->entropy_flag = random_bool_source_->RandBool();
404 bool entropy_flag;
405 if (fec_flag) {
406 // FEC packets don't have an entropy of their own. Entropy flag for FEC
407 // packets is the XOR of entropy of previous packets.
408 entropy_flag = fec_entropy_flag;
409 } else {
410 entropy_flag = random_bool_source_->RandBool();
411 }
412 header->entropy_flag = entropy_flag;
413 header->is_in_fec_group = fec_group == 0 ? NOT_IN_FEC_GROUP : IN_FEC_GROUP; 404 header->is_in_fec_group = fec_group == 0 ? NOT_IN_FEC_GROUP : IN_FEC_GROUP;
414 header->fec_group = fec_group; 405 header->fec_group = fec_group;
415 } 406 }
416 407
417 bool QuicPacketCreator::ShouldRetransmit(const QuicFrame& frame) { 408 bool QuicPacketCreator::ShouldRetransmit(const QuicFrame& frame) {
418 return frame.type != ACK_FRAME && frame.type != CONGESTION_FEEDBACK_FRAME && 409 return frame.type != ACK_FRAME && frame.type != CONGESTION_FEEDBACK_FRAME &&
419 frame.type != PADDING_FRAME; 410 frame.type != PADDING_FRAME;
420 } 411 }
421 412
422 bool QuicPacketCreator::AddFrame(const QuicFrame& frame, 413 bool QuicPacketCreator::AddFrame(const QuicFrame& frame,
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
472 if (!is_handshake) { 463 if (!is_handshake) {
473 return; 464 return;
474 } 465 }
475 466
476 QuicPaddingFrame padding; 467 QuicPaddingFrame padding;
477 bool success = AddFrame(QuicFrame(&padding), false); 468 bool success = AddFrame(QuicFrame(&padding), false);
478 DCHECK(success); 469 DCHECK(success);
479 } 470 }
480 471
481 } // namespace net 472 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_packet_creator.h ('k') | net/quic/quic_protocol.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698