| Index: net/quic/quic_packet_creator.cc
|
| diff --git a/net/quic/quic_packet_creator.cc b/net/quic/quic_packet_creator.cc
|
| index 3679d199688b47e0b0b363432258a3a495c765a3..ccbf7e988a13f91da35a314828c3469a72a4bd5d 100644
|
| --- a/net/quic/quic_packet_creator.cc
|
| +++ b/net/quic/quic_packet_creator.cc
|
| @@ -76,7 +76,6 @@ QuicPacketCreator::QuicPacketCreator(QuicConnectionId connection_id,
|
| random_bool_source_(new QuicRandomBoolSource(random_generator)),
|
| packet_number_(0),
|
| should_fec_protect_(false),
|
| - fec_group_number_(0),
|
| send_version_in_packet_(framer->perspective() == Perspective::IS_CLIENT),
|
| max_packet_length_(0),
|
| max_packets_per_fec_group_(kDefaultMaxPacketsPerFecGroup),
|
| @@ -130,6 +129,10 @@ void QuicPacketCreator::set_max_packets_per_fec_group(
|
| DCHECK_LT(0u, max_packets_per_fec_group_);
|
| }
|
|
|
| +QuicFecGroupNumber QuicPacketCreator::fec_group_number() {
|
| + return fec_group_ != nullptr ? fec_group_->FecGroupNumber() : 0;
|
| +}
|
| +
|
| bool QuicPacketCreator::ShouldSendFec(bool force_close) const {
|
| DCHECK(!HasPendingFrames());
|
| return fec_group_.get() != nullptr && fec_group_->NumReceivedPackets() > 0 &&
|
| @@ -175,7 +178,6 @@ void QuicPacketCreator::StopFecProtectingPackets() {
|
| }
|
| DCHECK(should_fec_protect_);
|
| should_fec_protect_ = false;
|
| - fec_group_number_ = 0;
|
| }
|
|
|
| bool QuicPacketCreator::IsFecProtected() const {
|
| @@ -205,8 +207,7 @@ InFecGroup QuicPacketCreator::MaybeUpdateLengthsAndStartFec() {
|
| }
|
| // Start a new FEC group since protection is on. Set the fec group number to
|
| // the packet number of the next packet.
|
| - fec_group_number_ = packet_number() + 1;
|
| - fec_group_.reset(new QuicFecGroup(fec_group_number_));
|
| + fec_group_.reset(new QuicFecGroup(packet_number_ + 1));
|
| return IN_FEC_GROUP;
|
| }
|
|
|
| @@ -479,9 +480,12 @@ SerializedPacket QuicPacketCreator::SerializePacket(
|
| DCHECK_LT(0u, encrypted_buffer_len);
|
| LOG_IF(DFATAL, queued_frames_.empty())
|
| << "Attempt to serialize empty packet";
|
| - DCHECK_GE(packet_number_ + 1, fec_group_number_);
|
| + if (fec_group_.get() != nullptr) {
|
| + DCHECK_GE(packet_number_ + 1, fec_group_->FecGroupNumber());
|
| + }
|
| QuicPacketHeader header;
|
| - FillPacketHeader(should_fec_protect_ ? fec_group_number_ : 0, false, &header);
|
| + // FillPacketHeader increments packet_number_.
|
| + FillPacketHeader(fec_group_number(), false, &header);
|
|
|
| MaybeAddPadding();
|
|
|
| @@ -500,17 +504,8 @@ SerializedPacket QuicPacketCreator::SerializePacket(
|
| ALIGNAS(64) char buffer[kMaxPacketSize];
|
| // Use the packet_size_ instead of the buffer size to ensure smaller
|
| // packet sizes are properly used.
|
| - scoped_ptr<char[]> large_buffer;
|
| - size_t length = 0;
|
| - const bool use_stack_buffer = packet_size_ <= kMaxPacketSize;
|
| - if (use_stack_buffer) {
|
| - length =
|
| - framer_->BuildDataPacket(header, queued_frames_, buffer, packet_size_);
|
| - } else {
|
| - large_buffer.reset(new char[packet_size_]);
|
| - length = framer_->BuildDataPacket(header, queued_frames_,
|
| - large_buffer.get(), packet_size_);
|
| - }
|
| + size_t length =
|
| + framer_->BuildDataPacket(header, queued_frames_, buffer, packet_size_);
|
| if (length == 0) {
|
| LOG(DFATAL) << "Failed to serialize " << queued_frames_.size()
|
| << " frames.";
|
| @@ -519,7 +514,7 @@ SerializedPacket QuicPacketCreator::SerializePacket(
|
|
|
| // TODO(ianswett) Consider replacing QuicPacket with something else,
|
| // since it's only used to provide convenience methods to FEC and encryption.
|
| - QuicPacket packet(use_stack_buffer ? buffer : large_buffer.get(), length,
|
| + QuicPacket packet(buffer, length,
|
| /* owns_buffer */ false,
|
| header.public_header.connection_id_length,
|
| header.public_header.version_flag,
|
| @@ -533,10 +528,10 @@ SerializedPacket QuicPacketCreator::SerializePacket(
|
| }
|
| // Immediately encrypt the packet, to ensure we don't encrypt the same packet
|
| // packet number multiple times.
|
| - QuicEncryptedPacket* encrypted =
|
| + size_t encrypted_length =
|
| framer_->EncryptPayload(encryption_level_, packet_number_, packet,
|
| encrypted_buffer, encrypted_buffer_len);
|
| - if (encrypted == nullptr) {
|
| + if (encrypted_length == 0) {
|
| LOG(DFATAL) << "Failed to encrypt packet number " << packet_number_;
|
| return NoPacket();
|
| }
|
| @@ -561,7 +556,8 @@ SerializedPacket QuicPacketCreator::SerializePacket(
|
| needs_padding_ = false;
|
| return SerializedPacket(
|
| header.packet_number, header.public_header.packet_number_length,
|
| - encrypted, QuicFramer::GetPacketEntropyHash(header),
|
| + encrypted_buffer, encrypted_length, /* owns_buffer*/ false,
|
| + QuicFramer::GetPacketEntropyHash(header),
|
| queued_retransmittable_frames_.release(), has_ack, has_stop_waiting);
|
| }
|
|
|
| @@ -575,26 +571,27 @@ SerializedPacket QuicPacketCreator::SerializeFec(char* buffer,
|
| }
|
| DCHECK_EQ(0u, queued_frames_.size());
|
| QuicPacketHeader header;
|
| - FillPacketHeader(fec_group_number_, true, &header);
|
| + FillPacketHeader(fec_group_->FecGroupNumber(), true, &header);
|
| scoped_ptr<QuicPacket> packet(
|
| framer_->BuildFecPacket(header, fec_group_->PayloadParity()));
|
| fec_group_.reset(nullptr);
|
| packet_size_ = 0;
|
| LOG_IF(DFATAL, packet == nullptr)
|
| - << "Failed to serialize fec packet for group:" << fec_group_number_;
|
| + << "Failed to serialize fec packet for group:"
|
| + << fec_group_->FecGroupNumber();
|
| DCHECK_GE(max_packet_length_, packet->length());
|
| // Immediately encrypt the packet, to ensure we don't encrypt the same packet
|
| // packet number multiple times.
|
| - QuicEncryptedPacket* encrypted = framer_->EncryptPayload(
|
| + size_t encrypted_length = framer_->EncryptPayload(
|
| encryption_level_, packet_number_, *packet, buffer, buffer_len);
|
| - if (encrypted == nullptr) {
|
| + if (encrypted_length == 0) {
|
| LOG(DFATAL) << "Failed to encrypt packet number " << packet_number_;
|
| return NoPacket();
|
| }
|
| SerializedPacket serialized(
|
| - header.packet_number, header.public_header.packet_number_length,
|
| - encrypted, QuicFramer::GetPacketEntropyHash(header), nullptr, false,
|
| - false);
|
| + header.packet_number, header.public_header.packet_number_length, buffer,
|
| + encrypted_length, /* owns_buffer */ false,
|
| + QuicFramer::GetPacketEntropyHash(header), nullptr, false, false);
|
| serialized.is_fec_packet = true;
|
| return serialized;
|
| }
|
|
|