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

Unified Diff: net/quic/quic_connection.cc

Issue 1782143003: Remove FEC code from receive path. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@115997404
Patch Set: Created 4 years, 9 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/quic/quic_connection.h ('k') | net/quic/quic_connection_logger.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/quic/quic_connection.cc
diff --git a/net/quic/quic_connection.cc b/net/quic/quic_connection.cc
index af10c61c320a73a53c2559bdafad6db7de81dbd2..4b4431f175fde74e90ddb7c94bdb2d3a42a81cc4 100644
--- a/net/quic/quic_connection.cc
+++ b/net/quic/quic_connection.cc
@@ -31,7 +31,6 @@
#include "net/quic/quic_bandwidth.h"
#include "net/quic/quic_bug_tracker.h"
#include "net/quic/quic_config.h"
-#include "net/quic/quic_fec_group.h"
#include "net/quic/quic_flags.h"
#include "net/quic/quic_packet_generator.h"
#include "net/quic/quic_utils.h"
@@ -60,10 +59,6 @@ namespace {
// This will likely have to be tuned.
const QuicPacketNumber kMaxPacketGap = 5000;
-// Limit the number of FEC groups to two. If we get enough out of order packets
-// that this becomes limiting, we can revisit.
-const size_t kMaxFecGroups = 2;
-
// Maximum number of acks received before sending an ack in response.
const QuicPacketCount kMaxPacketsReceivedBeforeAckSend = 20;
@@ -248,7 +243,6 @@ QuicConnection::QuicConnection(QuicConnectionId connection_id,
peer_address_(address),
migrating_peer_port_(0),
last_packet_decrypted_(false),
- last_packet_revived_(false),
last_size_(0),
last_decrypted_packet_level_(ENCRYPTION_NONE),
should_last_packet_instigate_acks_(false),
@@ -339,7 +333,6 @@ QuicConnection::~QuicConnection() {
if (termination_packets_.get() != nullptr) {
STLDeleteElements(termination_packets_.get());
}
- STLDeleteValues(&group_map_);
ClearQueuedPackets();
}
@@ -449,7 +442,6 @@ void QuicConnection::OnError(QuicFramer* framer) {
void QuicConnection::OnPacket() {
last_packet_decrypted_ = false;
- last_packet_revived_ = false;
}
void QuicConnection::OnPublicResetPacket(const QuicPublicResetPacket& packet) {
@@ -567,8 +559,6 @@ void QuicConnection::OnVersionNegotiationPacket(
RetransmitUnackedPackets(ALL_UNACKED_RETRANSMISSION);
}
-void QuicConnection::OnRevivedPacket() {}
-
bool QuicConnection::OnUnauthenticatedPublicHeader(
const QuicPacketPublicHeader& header) {
if (header.connection_id == connection_id_) {
@@ -655,15 +645,6 @@ bool QuicConnection::OnPacketHeader(const QuicPacketHeader& header) {
return true;
}
-void QuicConnection::OnFecProtectedPayload(StringPiece payload) {
- DCHECK_EQ(IN_FEC_GROUP, last_header_.is_in_fec_group);
- DCHECK_NE(0u, last_header_.fec_group);
- QuicFecGroup* group = GetFecGroup();
- if (group != nullptr) {
- group->Update(last_decrypted_packet_level_, last_header_, payload);
- }
-}
-
bool QuicConnection::OnStreamFrame(const QuicStreamFrame& frame) {
DCHECK(connected_);
if (debug_visitor_ != nullptr) {
@@ -739,8 +720,6 @@ void QuicConnection::ProcessStopWaitingFrame(
const QuicStopWaitingFrame& stop_waiting) {
largest_seen_packet_with_stop_waiting_ = last_header_.packet_number;
received_packet_manager_.UpdatePacketInformationSentByPeer(stop_waiting);
- // Possibly close any FecGroups which are now irrelevant.
- CloseFecGroupsBefore(stop_waiting.least_unacked + 1);
}
bool QuicConnection::OnStopWaitingFrame(const QuicStopWaitingFrame& frame) {
@@ -820,14 +799,6 @@ const char* QuicConnection::ValidateAckFrame(const QuicAckFrame& incoming_ack) {
return "Invalid entropy";
}
- if (incoming_ack.latest_revived_packet != 0 &&
- !incoming_ack.missing_packets.Contains(
- incoming_ack.latest_revived_packet)) {
- LOG(WARNING) << ENDPOINT
- << "Peer specified revived packet which was not missing."
- << " revived_packet:" << incoming_ack.latest_revived_packet;
- return "Invalid revived packet";
- }
return nullptr;
}
@@ -853,15 +824,6 @@ const char* QuicConnection::ValidateStopWaitingFrame(
return nullptr;
}
-void QuicConnection::OnFecData(StringPiece redundancy) {
- DCHECK_EQ(IN_FEC_GROUP, last_header_.is_in_fec_group);
- DCHECK_NE(0u, last_header_.fec_group);
- QuicFecGroup* group = GetFecGroup();
- if (group != nullptr) {
- group->UpdateFec(last_decrypted_packet_level_, last_header_, redundancy);
- }
-}
-
bool QuicConnection::OnRstStreamFrame(const QuicRstStreamFrame& frame) {
DCHECK(connected_);
if (debug_visitor_ != nullptr) {
@@ -953,8 +915,7 @@ void QuicConnection::OnPacketComplete() {
return;
}
- DVLOG(1) << ENDPOINT << (last_packet_revived_ ? "Revived" : "Got")
- << " packet " << last_header_.packet_number << " for "
+ DVLOG(1) << ENDPOINT << "Got packet " << last_header_.packet_number << " for "
<< last_header_.public_header.connection_id;
// An ack will be sent if a missing retransmittable packet was received;
@@ -962,15 +923,11 @@ void QuicConnection::OnPacketComplete() {
should_last_packet_instigate_acks_ &&
received_packet_manager_.IsMissing(last_header_.packet_number);
- // Record received or revived packet to populate ack info correctly before
- // processing stream frames, since the processing may result in a response
- // packet with a bundled ack.
- if (last_packet_revived_) {
- received_packet_manager_.RecordPacketRevived(last_header_.packet_number);
- } else {
- received_packet_manager_.RecordPacketReceived(
- last_size_, last_header_, time_of_last_received_packet_);
- }
+ // Record received to populate ack info correctly before processing stream
+ // frames, since the processing may result in a response packet with a bundled
+ // ack.
+ received_packet_manager_.RecordPacketReceived(last_size_, last_header_,
+ time_of_last_received_packet_);
// Process stop waiting frames here, instead of inline, because the packet
// needs to be considered 'received' before the entropy can be updated.
@@ -985,7 +942,6 @@ void QuicConnection::OnPacketComplete() {
ClearLastFrames();
MaybeCloseIfTooManyOutstandingPackets();
- MaybeProcessRevivedPacket();
}
void QuicConnection::MaybeQueueAck(bool was_missing) {
@@ -1370,6 +1326,11 @@ void QuicConnection::WriteAndBundleAcksIfNotBlocked() {
}
bool QuicConnection::ProcessValidatedPacket(const QuicPacketHeader& header) {
+ if (header.fec_flag) {
+ // Drop any FEC packet.
+ return false;
+ }
+
if (FLAGS_check_peer_address_change_after_decryption) {
if (perspective_ == Perspective::IS_SERVER &&
IsInitializedIPEndPoint(self_address_) &&
@@ -1939,75 +1900,6 @@ void QuicConnection::MaybeProcessUndecryptablePackets() {
}
}
-void QuicConnection::MaybeProcessRevivedPacket() {
- QuicFecGroup* group = GetFecGroup();
- if (!connected_ || group == nullptr || !group->CanRevive()) {
- return;
- }
- QuicPacketHeader revived_header;
- char revived_payload[kMaxPacketSize];
- size_t len = group->Revive(&revived_header, revived_payload, kMaxPacketSize);
- if (!received_packet_manager_.IsAwaitingPacket(
- revived_header.packet_number)) {
- // Close this FEC group because all packets in the group has been received.
- group_map_.erase(last_header_.fec_group);
- delete group;
- return;
- }
- revived_header.public_header.connection_id = connection_id_;
- revived_header.public_header.connection_id_length =
- last_header_.public_header.connection_id_length;
- revived_header.public_header.version_flag = false;
- revived_header.public_header.reset_flag = false;
- revived_header.public_header.packet_number_length =
- last_header_.public_header.packet_number_length;
- revived_header.fec_flag = false;
- revived_header.is_in_fec_group = NOT_IN_FEC_GROUP;
- revived_header.fec_group = 0;
- group_map_.erase(last_header_.fec_group);
- last_decrypted_packet_level_ = group->EffectiveEncryptionLevel();
- DCHECK_LT(last_decrypted_packet_level_, NUM_ENCRYPTION_LEVELS);
- delete group;
-
- last_packet_revived_ = true;
- if (debug_visitor_ != nullptr) {
- debug_visitor_->OnRevivedPacket(revived_header,
- StringPiece(revived_payload, len));
- }
-
- ++stats_.packets_revived;
- framer_.ProcessRevivedPacket(&revived_header,
- StringPiece(revived_payload, len));
-}
-
-QuicFecGroup* QuicConnection::GetFecGroup() {
- QuicFecGroupNumber fec_group_num = last_header_.fec_group;
- if (fec_group_num == 0 ||
- (fec_group_num <
- received_packet_manager_.peer_least_packet_awaiting_ack() &&
- !ContainsKey(group_map_, fec_group_num))) {
- // If the group number is below peer_least_packet_awaiting_ack and this
- // group does not exist, which means this group has missing packets below
- // |peer_least_packet_awaiting_ack| which we would never receive, so return
- // nullptr.
- return nullptr;
- }
- if (!ContainsKey(group_map_, fec_group_num)) {
- if (group_map_.size() >= kMaxFecGroups) { // Too many groups
- if (fec_group_num < group_map_.begin()->first) {
- // The group being requested is a group we've seen before and deleted.
- // Don't recreate it.
- return nullptr;
- }
- // Clear the lowest group number.
- delete group_map_.begin()->second;
- group_map_.erase(group_map_.begin());
- }
- group_map_[fec_group_num] = new QuicFecGroup(fec_group_num);
- }
- return group_map_[fec_group_num];
-}
-
void QuicConnection::SendConnectionCloseWithDetails(QuicErrorCode error,
const string& details) {
if (!connected_) {
@@ -2081,24 +1973,6 @@ void QuicConnection::SendGoAway(QuicErrorCode error,
QuicFrame(new QuicGoAwayFrame(error, last_good_stream_id, reason)));
}
-void QuicConnection::CloseFecGroupsBefore(QuicPacketNumber packet_number) {
- FecGroupMap::iterator it = group_map_.begin();
- while (it != group_map_.end()) {
- // If the group doesn't protect this packet we can ignore it.
- if (!it->second->IsWaitingForPacketBefore(packet_number)) {
- ++it;
- continue;
- }
- QuicFecGroup* fec_group = it->second;
- DCHECK(!fec_group->CanRevive());
- FecGroupMap::iterator next = it;
- ++next;
- group_map_.erase(it);
- delete fec_group;
- it = next;
- }
-}
-
QuicByteCount QuicConnection::max_packet_length() const {
return packet_generator_.GetMaxPacketLength();
}
« no previous file with comments | « net/quic/quic_connection.h ('k') | net/quic/quic_connection_logger.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698