| Index: net/quic/quic_packet_generator.cc
|
| diff --git a/net/quic/quic_packet_generator.cc b/net/quic/quic_packet_generator.cc
|
| deleted file mode 100644
|
| index b9814c5f5098450420a38d6e299d012995068413..0000000000000000000000000000000000000000
|
| --- a/net/quic/quic_packet_generator.cc
|
| +++ /dev/null
|
| @@ -1,329 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "net/quic/quic_packet_generator.h"
|
| -
|
| -#include "base/logging.h"
|
| -#include "net/quic/quic_bug_tracker.h"
|
| -#include "net/quic/quic_flags.h"
|
| -#include "net/quic/quic_utils.h"
|
| -
|
| -using base::StringPiece;
|
| -
|
| -namespace net {
|
| -
|
| -QuicPacketGenerator::QuicPacketGenerator(QuicConnectionId connection_id,
|
| - QuicFramer* framer,
|
| - QuicRandom* random_generator,
|
| - QuicBufferAllocator* buffer_allocator,
|
| - DelegateInterface* delegate)
|
| - : delegate_(delegate),
|
| - packet_creator_(connection_id,
|
| - framer,
|
| - random_generator,
|
| - buffer_allocator,
|
| - delegate),
|
| - batch_mode_(false),
|
| - should_send_ack_(false),
|
| - should_send_stop_waiting_(false) {}
|
| -
|
| -QuicPacketGenerator::~QuicPacketGenerator() {
|
| - QuicUtils::DeleteFrames(&queued_control_frames_);
|
| -}
|
| -
|
| -void QuicPacketGenerator::SetShouldSendAck(bool also_send_stop_waiting) {
|
| - if (packet_creator_.has_ack()) {
|
| - // Ack already queued, nothing to do.
|
| - return;
|
| - }
|
| -
|
| - if (also_send_stop_waiting && packet_creator_.has_stop_waiting()) {
|
| - QUIC_BUG << "Should only ever be one pending stop waiting frame.";
|
| - return;
|
| - }
|
| -
|
| - should_send_ack_ = true;
|
| - should_send_stop_waiting_ = also_send_stop_waiting;
|
| - SendQueuedFrames(/*flush=*/false);
|
| -}
|
| -
|
| -void QuicPacketGenerator::AddControlFrame(const QuicFrame& frame) {
|
| - queued_control_frames_.push_back(frame);
|
| - SendQueuedFrames(/*flush=*/false);
|
| -}
|
| -
|
| -QuicConsumedData QuicPacketGenerator::ConsumeData(
|
| - QuicStreamId id,
|
| - QuicIOVector iov,
|
| - QuicStreamOffset offset,
|
| - bool fin,
|
| - QuicAckListenerInterface* listener) {
|
| - bool has_handshake = (id == kCryptoStreamId);
|
| - QUIC_BUG_IF(has_handshake && fin)
|
| - << "Handshake packets should never send a fin";
|
| - // To make reasoning about crypto frames easier, we don't combine them with
|
| - // other retransmittable frames in a single packet.
|
| - const bool flush =
|
| - has_handshake && packet_creator_.HasPendingRetransmittableFrames();
|
| - SendQueuedFrames(flush);
|
| -
|
| - size_t total_bytes_consumed = 0;
|
| - bool fin_consumed = false;
|
| -
|
| - if (!packet_creator_.HasRoomForStreamFrame(id, offset)) {
|
| - packet_creator_.Flush();
|
| - }
|
| -
|
| - if (!fin && (iov.total_length == 0)) {
|
| - QUIC_BUG << "Attempt to consume empty data without FIN.";
|
| - return QuicConsumedData(0, false);
|
| - }
|
| -
|
| - while (delegate_->ShouldGeneratePacket(
|
| - HAS_RETRANSMITTABLE_DATA, has_handshake ? IS_HANDSHAKE : NOT_HANDSHAKE)) {
|
| - QuicFrame frame;
|
| - if (!packet_creator_.ConsumeData(id, iov, total_bytes_consumed,
|
| - offset + total_bytes_consumed, fin,
|
| - has_handshake, &frame)) {
|
| - // The creator is always flushed if there's not enough room for a new
|
| - // stream frame before ConsumeData, so ConsumeData should always succeed.
|
| - QUIC_BUG << "Failed to ConsumeData, stream:" << id;
|
| - return QuicConsumedData(0, false);
|
| - }
|
| -
|
| - // A stream frame is created and added.
|
| - size_t bytes_consumed = frame.stream_frame->data_length;
|
| - if (listener != nullptr) {
|
| - packet_creator_.AddAckListener(listener, bytes_consumed);
|
| - }
|
| - total_bytes_consumed += bytes_consumed;
|
| - fin_consumed = fin && total_bytes_consumed == iov.total_length;
|
| - DCHECK(total_bytes_consumed == iov.total_length ||
|
| - (bytes_consumed > 0 && packet_creator_.HasPendingFrames()));
|
| -
|
| - if (!InBatchMode()) {
|
| - packet_creator_.Flush();
|
| - }
|
| -
|
| - if (total_bytes_consumed == iov.total_length) {
|
| - // We're done writing the data. Exit the loop.
|
| - // We don't make this a precondition because we could have 0 bytes of data
|
| - // if we're simply writing a fin.
|
| - break;
|
| - }
|
| - // TODO(ianswett): Move to having the creator flush itself when it's full.
|
| - packet_creator_.Flush();
|
| - }
|
| -
|
| - // Don't allow the handshake to be bundled with other retransmittable frames.
|
| - if (has_handshake) {
|
| - SendQueuedFrames(/*flush=*/true);
|
| - }
|
| -
|
| - DCHECK(InBatchMode() || !packet_creator_.HasPendingFrames());
|
| - return QuicConsumedData(total_bytes_consumed, fin_consumed);
|
| -}
|
| -
|
| -QuicConsumedData QuicPacketGenerator::ConsumeDataFastPath(
|
| - QuicStreamId id,
|
| - const QuicIOVector& iov,
|
| - QuicStreamOffset offset,
|
| - bool fin,
|
| - QuicAckListenerInterface* listener) {
|
| - DCHECK_NE(id, kCryptoStreamId);
|
| - size_t total_bytes_consumed = 0;
|
| - while (total_bytes_consumed < iov.total_length &&
|
| - delegate_->ShouldGeneratePacket(HAS_RETRANSMITTABLE_DATA,
|
| - NOT_HANDSHAKE)) {
|
| - // Serialize and encrypt the packet.
|
| - ALIGNAS(64) char encrypted_buffer[kMaxPacketSize];
|
| - size_t bytes_consumed = 0;
|
| - packet_creator_.CreateAndSerializeStreamFrame(
|
| - id, iov, total_bytes_consumed, offset + total_bytes_consumed, fin,
|
| - listener, encrypted_buffer, kMaxPacketSize, &bytes_consumed);
|
| - total_bytes_consumed += bytes_consumed;
|
| - }
|
| -
|
| - return QuicConsumedData(total_bytes_consumed,
|
| - fin && (total_bytes_consumed == iov.total_length));
|
| -}
|
| -
|
| -void QuicPacketGenerator::GenerateMtuDiscoveryPacket(
|
| - QuicByteCount target_mtu,
|
| - QuicAckListenerInterface* listener) {
|
| - // MTU discovery frames must be sent by themselves.
|
| - if (!packet_creator_.CanSetMaxPacketLength()) {
|
| - QUIC_BUG << "MTU discovery packets should only be sent when no other "
|
| - << "frames needs to be sent.";
|
| - return;
|
| - }
|
| - const QuicByteCount current_mtu = GetCurrentMaxPacketLength();
|
| -
|
| - // The MTU discovery frame is allocated on the stack, since it is going to be
|
| - // serialized within this function.
|
| - QuicMtuDiscoveryFrame mtu_discovery_frame;
|
| - QuicFrame frame(mtu_discovery_frame);
|
| -
|
| - // Send the probe packet with the new length.
|
| - SetMaxPacketLength(target_mtu);
|
| - const bool success = packet_creator_.AddPaddedSavedFrame(frame);
|
| - if (listener != nullptr) {
|
| - packet_creator_.AddAckListener(listener, 0);
|
| - }
|
| - packet_creator_.Flush();
|
| - // The only reason AddFrame can fail is that the packet is too full to fit in
|
| - // a ping. This is not possible for any sane MTU.
|
| - DCHECK(success);
|
| -
|
| - // Reset the packet length back.
|
| - SetMaxPacketLength(current_mtu);
|
| -}
|
| -
|
| -bool QuicPacketGenerator::CanSendWithNextPendingFrameAddition() const {
|
| - DCHECK(HasPendingFrames());
|
| - HasRetransmittableData retransmittable =
|
| - (should_send_ack_ || should_send_stop_waiting_)
|
| - ? NO_RETRANSMITTABLE_DATA
|
| - : HAS_RETRANSMITTABLE_DATA;
|
| - if (retransmittable == HAS_RETRANSMITTABLE_DATA) {
|
| - DCHECK(!queued_control_frames_.empty()); // These are retransmittable.
|
| - }
|
| - return delegate_->ShouldGeneratePacket(retransmittable, NOT_HANDSHAKE);
|
| -}
|
| -
|
| -void QuicPacketGenerator::SendQueuedFrames(bool flush) {
|
| - // Only add pending frames if we are SURE we can then send the whole packet.
|
| - while (HasPendingFrames() &&
|
| - (flush || CanSendWithNextPendingFrameAddition())) {
|
| - AddNextPendingFrame();
|
| - }
|
| - if (flush || !InBatchMode()) {
|
| - packet_creator_.Flush();
|
| - }
|
| -}
|
| -
|
| -bool QuicPacketGenerator::InBatchMode() {
|
| - return batch_mode_;
|
| -}
|
| -
|
| -void QuicPacketGenerator::StartBatchOperations() {
|
| - batch_mode_ = true;
|
| -}
|
| -
|
| -void QuicPacketGenerator::FinishBatchOperations() {
|
| - batch_mode_ = false;
|
| - SendQueuedFrames(/*flush=*/false);
|
| -}
|
| -
|
| -void QuicPacketGenerator::FlushAllQueuedFrames() {
|
| - SendQueuedFrames(/*flush=*/true);
|
| -}
|
| -
|
| -bool QuicPacketGenerator::HasQueuedFrames() const {
|
| - return packet_creator_.HasPendingFrames() || HasPendingFrames();
|
| -}
|
| -
|
| -bool QuicPacketGenerator::IsPendingPacketEmpty() const {
|
| - return !packet_creator_.HasPendingFrames();
|
| -}
|
| -
|
| -bool QuicPacketGenerator::HasPendingFrames() const {
|
| - return should_send_ack_ || should_send_stop_waiting_ ||
|
| - !queued_control_frames_.empty();
|
| -}
|
| -
|
| -bool QuicPacketGenerator::AddNextPendingFrame() {
|
| - if (should_send_ack_) {
|
| - should_send_ack_ =
|
| - !packet_creator_.AddSavedFrame(delegate_->GetUpdatedAckFrame());
|
| - return !should_send_ack_;
|
| - }
|
| -
|
| - if (should_send_stop_waiting_) {
|
| - delegate_->PopulateStopWaitingFrame(&pending_stop_waiting_frame_);
|
| - // If we can't this add the frame now, then we still need to do so later.
|
| - should_send_stop_waiting_ =
|
| - !packet_creator_.AddSavedFrame(QuicFrame(&pending_stop_waiting_frame_));
|
| - // Return success if we have cleared out this flag (i.e., added the frame).
|
| - // If we still need to send, then the frame is full, and we have failed.
|
| - return !should_send_stop_waiting_;
|
| - }
|
| -
|
| - QUIC_BUG_IF(queued_control_frames_.empty())
|
| - << "AddNextPendingFrame called with no queued control frames.";
|
| - if (!packet_creator_.AddSavedFrame(queued_control_frames_.back())) {
|
| - // Packet was full.
|
| - return false;
|
| - }
|
| - queued_control_frames_.pop_back();
|
| - return true;
|
| -}
|
| -
|
| -void QuicPacketGenerator::StopSendingVersion() {
|
| - packet_creator_.StopSendingVersion();
|
| -}
|
| -
|
| -void QuicPacketGenerator::SetDiversificationNonce(
|
| - const DiversificationNonce nonce) {
|
| - packet_creator_.SetDiversificationNonce(nonce);
|
| -}
|
| -
|
| -QuicPacketNumber QuicPacketGenerator::packet_number() const {
|
| - return packet_creator_.packet_number();
|
| -}
|
| -
|
| -QuicByteCount QuicPacketGenerator::GetCurrentMaxPacketLength() const {
|
| - return packet_creator_.max_packet_length();
|
| -}
|
| -
|
| -void QuicPacketGenerator::SetMaxPacketLength(QuicByteCount length) {
|
| - DCHECK(packet_creator_.CanSetMaxPacketLength());
|
| - packet_creator_.SetMaxPacketLength(length);
|
| -}
|
| -
|
| -QuicEncryptedPacket* QuicPacketGenerator::SerializeVersionNegotiationPacket(
|
| - const QuicVersionVector& supported_versions) {
|
| - return packet_creator_.SerializeVersionNegotiationPacket(supported_versions);
|
| -}
|
| -
|
| -void QuicPacketGenerator::ReserializeAllFrames(
|
| - const PendingRetransmission& retransmission,
|
| - char* buffer,
|
| - size_t buffer_len) {
|
| - packet_creator_.ReserializeAllFrames(retransmission, buffer, buffer_len);
|
| -}
|
| -
|
| -void QuicPacketGenerator::UpdateSequenceNumberLength(
|
| - QuicPacketNumber least_packet_awaited_by_peer,
|
| - QuicPacketCount max_packets_in_flight) {
|
| - return packet_creator_.UpdatePacketNumberLength(least_packet_awaited_by_peer,
|
| - max_packets_in_flight);
|
| -}
|
| -
|
| -void QuicPacketGenerator::SetConnectionIdLength(uint32_t length) {
|
| - if (length == 0) {
|
| - packet_creator_.set_connection_id_length(PACKET_0BYTE_CONNECTION_ID);
|
| - } else {
|
| - packet_creator_.set_connection_id_length(PACKET_8BYTE_CONNECTION_ID);
|
| - }
|
| -}
|
| -
|
| -void QuicPacketGenerator::set_encryption_level(EncryptionLevel level) {
|
| - packet_creator_.set_encryption_level(level);
|
| -}
|
| -
|
| -void QuicPacketGenerator::SetEncrypter(EncryptionLevel level,
|
| - QuicEncrypter* encrypter) {
|
| - packet_creator_.SetEncrypter(level, encrypter);
|
| -}
|
| -
|
| -void QuicPacketGenerator::SetCurrentPath(
|
| - QuicPathId path_id,
|
| - QuicPacketNumber least_packet_awaited_by_peer,
|
| - QuicPacketCount max_packets_in_flight) {
|
| - packet_creator_.SetCurrentPath(path_id, least_packet_awaited_by_peer,
|
| - max_packets_in_flight);
|
| -}
|
| -
|
| -} // namespace net
|
|
|