| 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();
|
|
|