Index: net/quic/quic_connection.cc |
diff --git a/net/quic/quic_connection.cc b/net/quic/quic_connection.cc |
index 5565b28866118b8e7139219ae64f488a983cb2e9..59421ca2912dc69241c15ec596f788d71e7a22b4 100644 |
--- a/net/quic/quic_connection.cc |
+++ b/net/quic/quic_connection.cc |
@@ -368,6 +368,11 @@ bool QuicConnection::OnPacketHeader(const QuicPacketHeader& header) { |
debug_visitor_->OnPacketHeader(header); |
} |
+ if (header.fec_flag && framer_.version() <= QUIC_VERSION_14) { |
+ DLOG(WARNING) << "Ignoring FEC packets for versions prior to 15."; |
+ return false; |
+ } |
+ |
if (!ProcessValidatedPacket()) { |
return false; |
} |
@@ -473,8 +478,10 @@ bool QuicConnection::OnAckFrame(const QuicAckFrame& incoming_ack) { |
void QuicConnection::ProcessAckFrame(const QuicAckFrame& incoming_ack) { |
largest_seen_packet_with_ack_ = last_header_.packet_sequence_number; |
- received_packet_manager_.UpdatePacketInformationReceivedByPeer(incoming_ack); |
- received_packet_manager_.UpdatePacketInformationSentByPeer(incoming_ack); |
+ received_packet_manager_.UpdatePacketInformationReceivedByPeer( |
+ incoming_ack.received_info); |
+ received_packet_manager_.UpdatePacketInformationSentByPeer( |
+ incoming_ack.sent_info); |
// Possibly close any FecGroups which are now irrelevant. |
CloseFecGroupsBefore(incoming_ack.sent_info.least_unacked + 1); |
@@ -574,6 +581,15 @@ bool QuicConnection::ValidateAckFrame(const QuicAckFrame& incoming_ack) { |
return false; |
} |
+ for (SequenceNumberSet::const_iterator iter = |
+ incoming_ack.received_info.revived_packets.begin(); |
+ iter != incoming_ack.received_info.revived_packets.end(); ++iter) { |
+ if (!ContainsKey(incoming_ack.received_info.missing_packets, *iter)) { |
+ DLOG(ERROR) << ENDPOINT |
+ << "Peer specified revived packet which was not missing."; |
+ return false; |
+ } |
+ } |
return true; |
} |
@@ -582,8 +598,7 @@ void QuicConnection::OnFecData(const QuicFecData& fec) { |
DCHECK_NE(0u, last_header_.fec_group); |
QuicFecGroup* group = GetFecGroup(); |
if (group != NULL) { |
- group->UpdateFec(last_header_.packet_sequence_number, |
- last_header_.entropy_flag, fec); |
+ group->UpdateFec(last_header_.packet_sequence_number, fec); |
} |
} |
@@ -645,10 +660,13 @@ void QuicConnection::OnPacketComplete() { |
return; |
} |
- received_packet_manager_.RecordPacketReceived(last_size_, |
- last_header_, |
- time_of_last_received_packet_, |
- last_packet_revived_); |
+ if (last_packet_revived_) { |
+ received_packet_manager_.RecordPacketRevived( |
+ last_header_.packet_sequence_number); |
+ } else { |
+ received_packet_manager_.RecordPacketReceived( |
+ last_size_, last_header_, time_of_last_received_packet_); |
+ } |
for (size_t i = 0; i < last_stream_frames_.size(); ++i) { |
stats_.stream_bytes_received += |
last_stream_frames_[i].data.TotalBufferSize(); |