| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/quic/quic_connection.h" | 5 #include "net/quic/quic_connection.h" |
| 6 | 6 |
| 7 #include <string.h> | 7 #include <string.h> |
| 8 #include <sys/types.h> | 8 #include <sys/types.h> |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <iterator> | 10 #include <iterator> |
| (...skipping 350 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 361 | 361 |
| 362 bool QuicConnection::OnUnauthenticatedHeader(const QuicPacketHeader& header) { | 362 bool QuicConnection::OnUnauthenticatedHeader(const QuicPacketHeader& header) { |
| 363 return true; | 363 return true; |
| 364 } | 364 } |
| 365 | 365 |
| 366 bool QuicConnection::OnPacketHeader(const QuicPacketHeader& header) { | 366 bool QuicConnection::OnPacketHeader(const QuicPacketHeader& header) { |
| 367 if (debug_visitor_) { | 367 if (debug_visitor_) { |
| 368 debug_visitor_->OnPacketHeader(header); | 368 debug_visitor_->OnPacketHeader(header); |
| 369 } | 369 } |
| 370 | 370 |
| 371 if (header.fec_flag && framer_.version() <= QUIC_VERSION_14) { |
| 372 DLOG(WARNING) << "Ignoring FEC packets for versions prior to 15."; |
| 373 return false; |
| 374 } |
| 375 |
| 371 if (!ProcessValidatedPacket()) { | 376 if (!ProcessValidatedPacket()) { |
| 372 return false; | 377 return false; |
| 373 } | 378 } |
| 374 | 379 |
| 375 // Will be decrement below if we fall through to return true; | 380 // Will be decrement below if we fall through to return true; |
| 376 ++stats_.packets_dropped; | 381 ++stats_.packets_dropped; |
| 377 | 382 |
| 378 if (header.public_header.guid != guid_) { | 383 if (header.public_header.guid != guid_) { |
| 379 DVLOG(1) << ENDPOINT << "Ignoring packet from unexpected GUID: " | 384 DVLOG(1) << ENDPOINT << "Ignoring packet from unexpected GUID: " |
| 380 << header.public_header.guid << " instead of " << guid_; | 385 << header.public_header.guid << " instead of " << guid_; |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 466 return false; | 471 return false; |
| 467 } | 472 } |
| 468 | 473 |
| 469 last_ack_frames_.push_back(incoming_ack); | 474 last_ack_frames_.push_back(incoming_ack); |
| 470 return connected_; | 475 return connected_; |
| 471 } | 476 } |
| 472 | 477 |
| 473 void QuicConnection::ProcessAckFrame(const QuicAckFrame& incoming_ack) { | 478 void QuicConnection::ProcessAckFrame(const QuicAckFrame& incoming_ack) { |
| 474 largest_seen_packet_with_ack_ = last_header_.packet_sequence_number; | 479 largest_seen_packet_with_ack_ = last_header_.packet_sequence_number; |
| 475 | 480 |
| 476 received_packet_manager_.UpdatePacketInformationReceivedByPeer(incoming_ack); | 481 received_packet_manager_.UpdatePacketInformationReceivedByPeer( |
| 477 received_packet_manager_.UpdatePacketInformationSentByPeer(incoming_ack); | 482 incoming_ack.received_info); |
| 483 received_packet_manager_.UpdatePacketInformationSentByPeer( |
| 484 incoming_ack.sent_info); |
| 478 // Possibly close any FecGroups which are now irrelevant. | 485 // Possibly close any FecGroups which are now irrelevant. |
| 479 CloseFecGroupsBefore(incoming_ack.sent_info.least_unacked + 1); | 486 CloseFecGroupsBefore(incoming_ack.sent_info.least_unacked + 1); |
| 480 | 487 |
| 481 sent_entropy_manager_.ClearEntropyBefore( | 488 sent_entropy_manager_.ClearEntropyBefore( |
| 482 received_packet_manager_.least_packet_awaited_by_peer() - 1); | 489 received_packet_manager_.least_packet_awaited_by_peer() - 1); |
| 483 | 490 |
| 484 bool reset_retransmission_alarm = | 491 bool reset_retransmission_alarm = |
| 485 sent_packet_manager_.OnIncomingAck(incoming_ack.received_info, | 492 sent_packet_manager_.OnIncomingAck(incoming_ack.received_info, |
| 486 time_of_last_received_packet_); | 493 time_of_last_received_packet_); |
| 487 if (sent_packet_manager_.HasPendingRetransmissions()) { | 494 if (sent_packet_manager_.HasPendingRetransmissions()) { |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 567 } | 574 } |
| 568 | 575 |
| 569 if (!sent_entropy_manager_.IsValidEntropy( | 576 if (!sent_entropy_manager_.IsValidEntropy( |
| 570 incoming_ack.received_info.largest_observed, | 577 incoming_ack.received_info.largest_observed, |
| 571 incoming_ack.received_info.missing_packets, | 578 incoming_ack.received_info.missing_packets, |
| 572 incoming_ack.received_info.entropy_hash)) { | 579 incoming_ack.received_info.entropy_hash)) { |
| 573 DLOG(ERROR) << ENDPOINT << "Peer sent invalid entropy."; | 580 DLOG(ERROR) << ENDPOINT << "Peer sent invalid entropy."; |
| 574 return false; | 581 return false; |
| 575 } | 582 } |
| 576 | 583 |
| 584 for (SequenceNumberSet::const_iterator iter = |
| 585 incoming_ack.received_info.revived_packets.begin(); |
| 586 iter != incoming_ack.received_info.revived_packets.end(); ++iter) { |
| 587 if (!ContainsKey(incoming_ack.received_info.missing_packets, *iter)) { |
| 588 DLOG(ERROR) << ENDPOINT |
| 589 << "Peer specified revived packet which was not missing."; |
| 590 return false; |
| 591 } |
| 592 } |
| 577 return true; | 593 return true; |
| 578 } | 594 } |
| 579 | 595 |
| 580 void QuicConnection::OnFecData(const QuicFecData& fec) { | 596 void QuicConnection::OnFecData(const QuicFecData& fec) { |
| 581 DCHECK_EQ(IN_FEC_GROUP, last_header_.is_in_fec_group); | 597 DCHECK_EQ(IN_FEC_GROUP, last_header_.is_in_fec_group); |
| 582 DCHECK_NE(0u, last_header_.fec_group); | 598 DCHECK_NE(0u, last_header_.fec_group); |
| 583 QuicFecGroup* group = GetFecGroup(); | 599 QuicFecGroup* group = GetFecGroup(); |
| 584 if (group != NULL) { | 600 if (group != NULL) { |
| 585 group->UpdateFec(last_header_.packet_sequence_number, | 601 group->UpdateFec(last_header_.packet_sequence_number, fec); |
| 586 last_header_.entropy_flag, fec); | |
| 587 } | 602 } |
| 588 } | 603 } |
| 589 | 604 |
| 590 bool QuicConnection::OnRstStreamFrame(const QuicRstStreamFrame& frame) { | 605 bool QuicConnection::OnRstStreamFrame(const QuicRstStreamFrame& frame) { |
| 591 DCHECK(connected_); | 606 DCHECK(connected_); |
| 592 if (debug_visitor_) { | 607 if (debug_visitor_) { |
| 593 debug_visitor_->OnRstStreamFrame(frame); | 608 debug_visitor_->OnRstStreamFrame(frame); |
| 594 } | 609 } |
| 595 DVLOG(1) << ENDPOINT << "Stream reset with error " | 610 DVLOG(1) << ENDPOINT << "Stream reset with error " |
| 596 << QuicUtils::StreamErrorToString(frame.error_code); | 611 << QuicUtils::StreamErrorToString(frame.error_code); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 638 << " stream frames for " << last_header_.public_header.guid; | 653 << " stream frames for " << last_header_.public_header.guid; |
| 639 | 654 |
| 640 MaybeQueueAck(); | 655 MaybeQueueAck(); |
| 641 | 656 |
| 642 // Discard the packet if the visitor fails to process the stream frames. | 657 // Discard the packet if the visitor fails to process the stream frames. |
| 643 if (!last_stream_frames_.empty() && | 658 if (!last_stream_frames_.empty() && |
| 644 !visitor_->OnStreamFrames(last_stream_frames_)) { | 659 !visitor_->OnStreamFrames(last_stream_frames_)) { |
| 645 return; | 660 return; |
| 646 } | 661 } |
| 647 | 662 |
| 648 received_packet_manager_.RecordPacketReceived(last_size_, | 663 if (last_packet_revived_) { |
| 649 last_header_, | 664 received_packet_manager_.RecordPacketRevived( |
| 650 time_of_last_received_packet_, | 665 last_header_.packet_sequence_number); |
| 651 last_packet_revived_); | 666 } else { |
| 667 received_packet_manager_.RecordPacketReceived( |
| 668 last_size_, last_header_, time_of_last_received_packet_); |
| 669 } |
| 652 for (size_t i = 0; i < last_stream_frames_.size(); ++i) { | 670 for (size_t i = 0; i < last_stream_frames_.size(); ++i) { |
| 653 stats_.stream_bytes_received += | 671 stats_.stream_bytes_received += |
| 654 last_stream_frames_[i].data.TotalBufferSize(); | 672 last_stream_frames_[i].data.TotalBufferSize(); |
| 655 } | 673 } |
| 656 | 674 |
| 657 // Process stream resets, then acks, then congestion feedback. | 675 // Process stream resets, then acks, then congestion feedback. |
| 658 for (size_t i = 0; i < last_goaway_frames_.size(); ++i) { | 676 for (size_t i = 0; i < last_goaway_frames_.size(); ++i) { |
| 659 visitor_->OnGoAway(last_goaway_frames_[i]); | 677 visitor_->OnGoAway(last_goaway_frames_[i]); |
| 660 } | 678 } |
| 661 for (size_t i = 0; i < last_rst_frames_.size(); ++i) { | 679 for (size_t i = 0; i < last_rst_frames_.size(); ++i) { |
| (...skipping 1003 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1665 // If we changed the generator's batch state, restore original batch state. | 1683 // If we changed the generator's batch state, restore original batch state. |
| 1666 if (!already_in_batch_mode_) { | 1684 if (!already_in_batch_mode_) { |
| 1667 DVLOG(1) << "Leaving Batch Mode."; | 1685 DVLOG(1) << "Leaving Batch Mode."; |
| 1668 connection_->packet_generator_.FinishBatchOperations(); | 1686 connection_->packet_generator_.FinishBatchOperations(); |
| 1669 } | 1687 } |
| 1670 DCHECK_EQ(already_in_batch_mode_, | 1688 DCHECK_EQ(already_in_batch_mode_, |
| 1671 connection_->packet_generator_.InBatchMode()); | 1689 connection_->packet_generator_.InBatchMode()); |
| 1672 } | 1690 } |
| 1673 | 1691 |
| 1674 } // namespace net | 1692 } // namespace net |
| OLD | NEW |