Index: net/quic/quic_connection.cc |
diff --git a/net/quic/quic_connection.cc b/net/quic/quic_connection.cc |
index e4ee743f9549c03aa3d5bb5d4c531c09b5a16a31..997be1c388b874968d15609f87bd586973cf808d 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; |
} |
@@ -574,6 +579,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; |
} |
@@ -644,10 +658,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(); |