| Index: net/quic/quic_connection.cc
|
| diff --git a/net/quic/quic_connection.cc b/net/quic/quic_connection.cc
|
| index 1c058e3f4dbab132a84acd17fb43649d09a72994..85924614c0f389a1c929d532da7a2489623e4651 100644
|
| --- a/net/quic/quic_connection.cc
|
| +++ b/net/quic/quic_connection.cc
|
| @@ -231,19 +231,6 @@ class MtuDiscoveryAckListener : public QuicAckListenerInterface {
|
|
|
| } // namespace
|
|
|
| -QuicConnection::QueuedPacket::QueuedPacket(SerializedPacket packet)
|
| - : serialized_packet(packet),
|
| - transmission_type(NOT_RETRANSMISSION),
|
| - original_packet_number(0) {}
|
| -
|
| -QuicConnection::QueuedPacket::QueuedPacket(
|
| - SerializedPacket packet,
|
| - TransmissionType transmission_type,
|
| - QuicPacketNumber original_packet_number)
|
| - : serialized_packet(packet),
|
| - transmission_type(transmission_type),
|
| - original_packet_number(original_packet_number) {}
|
| -
|
| #define ENDPOINT \
|
| (perspective_ == Perspective::IS_SERVER ? "Server: " : "Client: ")
|
|
|
| @@ -359,8 +346,8 @@ QuicConnection::~QuicConnection() {
|
| void QuicConnection::ClearQueuedPackets() {
|
| for (QueuedPacketList::iterator it = queued_packets_.begin();
|
| it != queued_packets_.end(); ++it) {
|
| - delete it->serialized_packet.retransmittable_frames;
|
| - delete it->serialized_packet.packet;
|
| + delete it->retransmittable_frames;
|
| + delete it->packet;
|
| }
|
| queued_packets_.clear();
|
| }
|
| @@ -1161,7 +1148,7 @@ void QuicConnection::SendRstStream(QuicStreamId id,
|
| QueuedPacketList::iterator packet_iterator = queued_packets_.begin();
|
| while (packet_iterator != queued_packets_.end()) {
|
| RetransmittableFrames* retransmittable_frames =
|
| - packet_iterator->serialized_packet.retransmittable_frames;
|
| + packet_iterator->retransmittable_frames;
|
| if (!retransmittable_frames) {
|
| ++packet_iterator;
|
| continue;
|
| @@ -1171,10 +1158,10 @@ void QuicConnection::SendRstStream(QuicStreamId id,
|
| ++packet_iterator;
|
| continue;
|
| }
|
| - delete packet_iterator->serialized_packet.retransmittable_frames;
|
| - delete packet_iterator->serialized_packet.packet;
|
| - packet_iterator->serialized_packet.retransmittable_frames = nullptr;
|
| - packet_iterator->serialized_packet.packet = nullptr;
|
| + delete packet_iterator->retransmittable_frames;
|
| + delete packet_iterator->packet;
|
| + packet_iterator->retransmittable_frames = nullptr;
|
| + packet_iterator->packet = nullptr;
|
| packet_iterator = queued_packets_.erase(packet_iterator);
|
| }
|
| }
|
| @@ -1471,14 +1458,17 @@ void QuicConnection::WritePendingRetransmissions() {
|
| if (serialized_packet.packet == nullptr) {
|
| // We failed to serialize the packet, so close the connection.
|
| // CloseConnection does not send close packet, so no infinite loop here.
|
| + // TODO(ianswett): This is actually an internal error, not an encryption
|
| + // failure.
|
| CloseConnection(QUIC_ENCRYPTION_FAILURE, false);
|
| return;
|
| }
|
|
|
| DVLOG(1) << ENDPOINT << "Retransmitting " << pending.packet_number << " as "
|
| << serialized_packet.packet_number;
|
| - SendOrQueuePacket(QueuedPacket(serialized_packet, pending.transmission_type,
|
| - pending.packet_number));
|
| + serialized_packet.original_packet_number = pending.packet_number;
|
| + serialized_packet.transmission_type = pending.transmission_type;
|
| + SendOrQueuePacket(&serialized_packet);
|
| }
|
| }
|
|
|
| @@ -1551,22 +1541,20 @@ bool QuicConnection::CanWrite(HasRetransmittableData retransmittable) {
|
| return true;
|
| }
|
|
|
| -bool QuicConnection::WritePacket(QueuedPacket* packet) {
|
| +bool QuicConnection::WritePacket(SerializedPacket* packet) {
|
| if (!WritePacketInner(packet)) {
|
| return false;
|
| }
|
| - delete packet->serialized_packet.retransmittable_frames;
|
| - delete packet->serialized_packet.packet;
|
| - packet->serialized_packet.retransmittable_frames = nullptr;
|
| - packet->serialized_packet.packet = nullptr;
|
| + delete packet->retransmittable_frames;
|
| + delete packet->packet;
|
| + packet->retransmittable_frames = nullptr;
|
| + packet->packet = nullptr;
|
| return true;
|
| }
|
|
|
| -bool QuicConnection::WritePacketInner(QueuedPacket* packet) {
|
| - if (packet->serialized_packet.packet_number <
|
| - sent_packet_manager_.largest_sent_packet()) {
|
| - LOG(DFATAL) << "Attempt to write packet:"
|
| - << packet->serialized_packet.packet_number
|
| +bool QuicConnection::WritePacketInner(SerializedPacket* packet) {
|
| + if (packet->packet_number < sent_packet_manager_.largest_sent_packet()) {
|
| + LOG(DFATAL) << "Attempt to write packet:" << packet->packet_number
|
| << " after:" << sent_packet_manager_.largest_sent_packet();
|
| SendConnectionCloseWithDetails(QUIC_INTERNAL_ERROR,
|
| "Packet written out of order.");
|
| @@ -1582,11 +1570,11 @@ bool QuicConnection::WritePacketInner(QueuedPacket* packet) {
|
| return false;
|
| }
|
|
|
| - QuicPacketNumber packet_number = packet->serialized_packet.packet_number;
|
| + QuicPacketNumber packet_number = packet->packet_number;
|
| DCHECK_LE(packet_number_of_last_sent_packet_, packet_number);
|
| packet_number_of_last_sent_packet_ = packet_number;
|
|
|
| - QuicEncryptedPacket* encrypted = packet->serialized_packet.packet;
|
| + QuicEncryptedPacket* encrypted = packet->packet;
|
| // Termination packets are eventually owned by TimeWaitListManager.
|
| // Others are deleted at the end of this call.
|
| if (is_termination_packet) {
|
| @@ -1606,14 +1594,13 @@ bool QuicConnection::WritePacketInner(QueuedPacket* packet) {
|
| DCHECK_LE(encrypted->length(), kMaxPacketSize);
|
| DCHECK_LE(encrypted->length(), packet_generator_.GetMaxPacketLength());
|
| DVLOG(1) << ENDPOINT << "Sending packet " << packet_number << " : "
|
| - << (packet->serialized_packet.is_fec_packet
|
| + << (packet->is_fec_packet
|
| ? "FEC "
|
| : (IsRetransmittable(*packet) == HAS_RETRANSMITTABLE_DATA
|
| ? "data bearing "
|
| : " ack only "))
|
| << ", encryption level: "
|
| - << QuicUtils::EncryptionLevelToString(
|
| - packet->serialized_packet.encryption_level)
|
| + << QuicUtils::EncryptionLevelToString(packet->encryption_level)
|
| << ", encrypted length:" << encrypted->length();
|
| DVLOG(2) << ENDPOINT << "packet(" << packet_number << "): " << std::endl
|
| << QuicUtils::StringToHexASCIIDump(encrypted->AsStringPiece());
|
| @@ -1641,9 +1628,9 @@ bool QuicConnection::WritePacketInner(QueuedPacket* packet) {
|
| }
|
| if (result.status != WRITE_STATUS_ERROR && debug_visitor_ != nullptr) {
|
| // Pass the write result to the visitor.
|
| - debug_visitor_->OnPacketSent(
|
| - packet->serialized_packet, packet->original_packet_number,
|
| - packet->transmission_type, encrypted->length(), packet_send_time);
|
| + debug_visitor_->OnPacketSent(*packet, packet->original_packet_number,
|
| + packet->transmission_type, encrypted->length(),
|
| + packet_send_time);
|
| }
|
| if (packet->transmission_type == NOT_RETRANSMISSION) {
|
| time_of_last_sent_new_packet_ = packet_send_time;
|
| @@ -1666,8 +1653,8 @@ bool QuicConnection::WritePacketInner(QueuedPacket* packet) {
|
| sent_packet_manager_.EstimateMaxPacketsInFlight(max_packet_length()));
|
|
|
| bool reset_retransmission_alarm = sent_packet_manager_.OnPacketSent(
|
| - &packet->serialized_packet, packet->original_packet_number,
|
| - packet_send_time, encrypted->length(), packet->transmission_type,
|
| + packet, packet->original_packet_number, packet_send_time,
|
| + encrypted->length(), packet->transmission_type,
|
| IsRetransmittable(*packet));
|
|
|
| if (reset_retransmission_alarm || !retransmission_alarm_->IsSet()) {
|
| @@ -1695,15 +1682,15 @@ bool QuicConnection::WritePacketInner(QueuedPacket* packet) {
|
| return true;
|
| }
|
|
|
| -bool QuicConnection::ShouldDiscardPacket(const QueuedPacket& packet) {
|
| +bool QuicConnection::ShouldDiscardPacket(const SerializedPacket& packet) {
|
| if (!connected_) {
|
| DVLOG(1) << ENDPOINT << "Not sending packet as connection is disconnected.";
|
| return true;
|
| }
|
|
|
| - QuicPacketNumber packet_number = packet.serialized_packet.packet_number;
|
| + QuicPacketNumber packet_number = packet.packet_number;
|
| if (encryption_level_ == ENCRYPTION_FORWARD_SECURE &&
|
| - packet.serialized_packet.encryption_level == ENCRYPTION_NONE) {
|
| + packet.encryption_level == ENCRYPTION_NONE) {
|
| // Drop packets that are NULL encrypted since the peer won't accept them
|
| // anymore.
|
| DVLOG(1) << ENDPOINT << "Dropping NULL encrypted packet: " << packet_number
|
| @@ -1737,6 +1724,8 @@ void QuicConnection::OnSerializedPacket(SerializedPacket* serialized_packet) {
|
| if (serialized_packet->packet == nullptr) {
|
| // We failed to serialize the packet, so close the connection.
|
| // CloseConnection does not send close packet, so no infinite loop here.
|
| + // TODO(ianswett): This is actually an internal error, not an encryption
|
| + // failure.
|
| CloseConnection(QUIC_ENCRYPTION_FAILURE, false);
|
| return;
|
| }
|
| @@ -1744,7 +1733,7 @@ void QuicConnection::OnSerializedPacket(SerializedPacket* serialized_packet) {
|
| // If an FEC packet is serialized with the FEC alarm set, cancel the alarm.
|
| fec_alarm_->Cancel();
|
| }
|
| - SendOrQueuePacket(QueuedPacket(*serialized_packet));
|
| + SendOrQueuePacket(serialized_packet);
|
| }
|
|
|
| void QuicConnection::OnResetFecGroup() {
|
| @@ -1784,28 +1773,24 @@ void QuicConnection::OnHandshakeComplete() {
|
| }
|
| }
|
|
|
| -void QuicConnection::SendOrQueuePacket(QueuedPacket packet) {
|
| +void QuicConnection::SendOrQueuePacket(SerializedPacket* packet) {
|
| // The caller of this function is responsible for checking CanWrite().
|
| - if (packet.serialized_packet.packet == nullptr) {
|
| - LOG(DFATAL)
|
| - << "packet.serialized_packet.packet == nullptr in to SendOrQueuePacket";
|
| + if (packet->packet == nullptr) {
|
| + LOG(DFATAL) << "packet.packet == nullptr in to SendOrQueuePacket";
|
| return;
|
| }
|
|
|
| - sent_entropy_manager_.RecordPacketEntropyHash(
|
| - packet.serialized_packet.packet_number,
|
| - packet.serialized_packet.entropy_hash);
|
| + sent_entropy_manager_.RecordPacketEntropyHash(packet->packet_number,
|
| + packet->entropy_hash);
|
| // If there are already queued packets, queue this one immediately to ensure
|
| // it's written in sequence number order.
|
| - if (!queued_packets_.empty() || !WritePacket(&packet)) {
|
| + if (!queued_packets_.empty() || !WritePacket(packet)) {
|
| // Take ownership of the underlying encrypted packet.
|
| - if (!packet.serialized_packet.packet->owns_buffer()) {
|
| - scoped_ptr<QuicEncryptedPacket> encrypted_deleter(
|
| - packet.serialized_packet.packet);
|
| - packet.serialized_packet.packet =
|
| - packet.serialized_packet.packet->Clone();
|
| + if (!packet->packet->owns_buffer()) {
|
| + scoped_ptr<QuicEncryptedPacket> encrypted_deleter(packet->packet);
|
| + packet->packet = packet->packet->Clone();
|
| }
|
| - queued_packets_.push_back(packet);
|
| + queued_packets_.push_back(*packet);
|
| }
|
|
|
| // If a forward-secure encrypter is available but is not being used and the
|
| @@ -1813,8 +1798,7 @@ void QuicConnection::SendOrQueuePacket(QueuedPacket packet) {
|
| // forward security, start using the forward-secure encrypter.
|
| if (encryption_level_ != ENCRYPTION_FORWARD_SECURE &&
|
| has_forward_secure_encrypter_ &&
|
| - packet.serialized_packet.packet_number >=
|
| - first_required_forward_secure_packet_ - 1) {
|
| + packet->packet_number >= first_required_forward_secure_packet_ - 1) {
|
| SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE);
|
| }
|
| }
|
| @@ -2328,24 +2312,22 @@ QuicConnection::ScopedRetransmissionScheduler::
|
| }
|
|
|
| HasRetransmittableData QuicConnection::IsRetransmittable(
|
| - const QueuedPacket& packet) {
|
| + const SerializedPacket& packet) {
|
| // Retransmitted packets retransmittable frames are owned by the unacked
|
| // packet map, but are not present in the serialized packet.
|
| if (packet.transmission_type != NOT_RETRANSMISSION ||
|
| - packet.serialized_packet.retransmittable_frames != nullptr) {
|
| + packet.retransmittable_frames != nullptr) {
|
| return HAS_RETRANSMITTABLE_DATA;
|
| } else {
|
| return NO_RETRANSMITTABLE_DATA;
|
| }
|
| }
|
|
|
| -bool QuicConnection::IsTerminationPacket(const QueuedPacket& packet) {
|
| - const RetransmittableFrames* retransmittable_frames =
|
| - packet.serialized_packet.retransmittable_frames;
|
| - if (retransmittable_frames == nullptr) {
|
| +bool QuicConnection::IsTerminationPacket(const SerializedPacket& packet) {
|
| + if (packet.retransmittable_frames == nullptr) {
|
| return false;
|
| }
|
| - for (const QuicFrame& frame : retransmittable_frames->frames()) {
|
| + for (const QuicFrame& frame : packet.retransmittable_frames->frames()) {
|
| if (frame.type == CONNECTION_CLOSE_FRAME) {
|
| return true;
|
| }
|
|
|