| 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 <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 62 return delta <= kMaxPacketGap; | 62 return delta <= kMaxPacketGap; |
| 63 } | 63 } |
| 64 | 64 |
| 65 } // namespace | 65 } // namespace |
| 66 | 66 |
| 67 #define ENDPOINT (is_server_ ? "Server: " : " Client: ") | 67 #define ENDPOINT (is_server_ ? "Server: " : " Client: ") |
| 68 | 68 |
| 69 QuicConnection::QuicConnection(QuicGuid guid, | 69 QuicConnection::QuicConnection(QuicGuid guid, |
| 70 IPEndPoint address, | 70 IPEndPoint address, |
| 71 QuicConnectionHelperInterface* helper, | 71 QuicConnectionHelperInterface* helper, |
| 72 bool is_server) | 72 bool is_server, |
| 73 : framer_(kQuicVersion1, | 73 QuicVersion version) |
| 74 : framer_(version, |
| 74 helper->GetClock()->ApproximateNow(), | 75 helper->GetClock()->ApproximateNow(), |
| 75 is_server), | 76 is_server), |
| 76 helper_(helper), | 77 helper_(helper), |
| 77 encryption_level_(ENCRYPTION_NONE), | 78 encryption_level_(ENCRYPTION_NONE), |
| 78 clock_(helper->GetClock()), | 79 clock_(helper->GetClock()), |
| 79 random_generator_(helper->GetRandomGenerator()), | 80 random_generator_(helper->GetRandomGenerator()), |
| 80 guid_(guid), | 81 guid_(guid), |
| 81 peer_address_(address), | 82 peer_address_(address), |
| 82 largest_seen_packet_with_ack_(0), | 83 largest_seen_packet_with_ack_(0), |
| 83 peer_largest_observed_packet_(0), | 84 peer_largest_observed_packet_(0), |
| (...skipping 15 matching lines...) Expand all Loading... |
| 99 version_negotiation_state_(START_NEGOTIATION), | 100 version_negotiation_state_(START_NEGOTIATION), |
| 100 max_packets_per_retransmission_alarm_(kMaxPacketsPerRetransmissionAlarm), | 101 max_packets_per_retransmission_alarm_(kMaxPacketsPerRetransmissionAlarm), |
| 101 is_server_(is_server), | 102 is_server_(is_server), |
| 102 connected_(true), | 103 connected_(true), |
| 103 received_truncated_ack_(false), | 104 received_truncated_ack_(false), |
| 104 send_ack_in_response_to_packet_(false), | 105 send_ack_in_response_to_packet_(false), |
| 105 address_migrating_(false) { | 106 address_migrating_(false) { |
| 106 helper_->SetConnection(this); | 107 helper_->SetConnection(this); |
| 107 helper_->SetTimeoutAlarm(idle_network_timeout_); | 108 helper_->SetTimeoutAlarm(idle_network_timeout_); |
| 108 framer_.set_visitor(this); | 109 framer_.set_visitor(this); |
| 109 framer_.set_entropy_calculator(&entropy_manager_); | 110 framer_.set_received_entropy_calculator(&received_entropy_manager_); |
| 110 outgoing_ack_.sent_info.least_unacked = 0; | 111 outgoing_ack_.sent_info.least_unacked = 0; |
| 111 outgoing_ack_.sent_info.entropy_hash = 0; | 112 outgoing_ack_.sent_info.entropy_hash = 0; |
| 112 outgoing_ack_.received_info.largest_observed = 0; | 113 outgoing_ack_.received_info.largest_observed = 0; |
| 113 outgoing_ack_.received_info.entropy_hash = 0; | 114 outgoing_ack_.received_info.entropy_hash = 0; |
| 114 | 115 |
| 115 /* | 116 /* |
| 116 if (FLAGS_fake_packet_loss_percentage > 0) { | 117 if (FLAGS_fake_packet_loss_percentage > 0) { |
| 117 int32 seed = RandomBase::WeakSeed32(); | 118 int32 seed = RandomBase::WeakSeed32(); |
| 118 LOG(INFO) << ENDPOINT << "Seeding packet loss with " << seed; | 119 LOG(INFO) << ENDPOINT << "Seeding packet loss with " << seed; |
| 119 random_.reset(new MTRandom(seed)); | 120 random_.reset(new MTRandom(seed)); |
| 120 } | 121 } |
| 121 */ | 122 */ |
| 122 } | 123 } |
| 123 | 124 |
| 124 QuicConnection::~QuicConnection() { | 125 QuicConnection::~QuicConnection() { |
| 125 STLDeleteElements(&undecryptable_packets_); | 126 STLDeleteElements(&undecryptable_packets_); |
| 126 STLDeleteValues(&unacked_packets_); | 127 STLDeleteValues(&unacked_packets_); |
| 127 STLDeleteValues(&group_map_); | 128 STLDeleteValues(&group_map_); |
| 128 for (QueuedPacketList::iterator it = queued_packets_.begin(); | 129 for (QueuedPacketList::iterator it = queued_packets_.begin(); |
| 129 it != queued_packets_.end(); ++it) { | 130 it != queued_packets_.end(); ++it) { |
| 130 delete it->packet; | 131 delete it->packet; |
| 131 } | 132 } |
| 132 DLOG(INFO) << ENDPOINT << "write_blocked: " << write_blocked_; | 133 DLOG(INFO) << ENDPOINT << "write_blocked: " << write_blocked_; |
| 133 } | 134 } |
| 134 | 135 |
| 135 bool QuicConnection::SelectMutualVersion( | 136 bool QuicConnection::SelectMutualVersion( |
| 136 const QuicTagVector& available_versions) { | 137 const QuicVersionVector& available_versions) { |
| 137 // TODO(satyamshekhar): Make this generic. | 138 // Try to find the highest mutual version by iterating over supported |
| 138 if (std::find(available_versions.begin(), available_versions.end(), | 139 // versions, starting with the highest, and breaking out of the loop once we |
| 139 kQuicVersion1) == available_versions.end()) { | 140 // find a matching version in the provided available_versions vector. |
| 140 return false; | 141 for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) { |
| 142 const QuicVersion& version = kSupportedQuicVersions[i]; |
| 143 if (std::find(available_versions.begin(), available_versions.end(), |
| 144 version) != available_versions.end()) { |
| 145 framer_.set_version(version); |
| 146 return true; |
| 147 } |
| 141 } | 148 } |
| 142 | 149 |
| 143 // Right now we only support kQuicVersion1 so it's okay not to | 150 return false; |
| 144 // update the framer version. When we start supporting more | |
| 145 // versions please update. | |
| 146 return true; | |
| 147 } | 151 } |
| 148 | 152 |
| 149 void QuicConnection::OnError(QuicFramer* framer) { | 153 void QuicConnection::OnError(QuicFramer* framer) { |
| 150 // Packets that we cannot decrypt are dropped. | 154 // Packets that we cannot decrypt are dropped. |
| 151 // TODO(rch): add stats to measure this. | 155 // TODO(rch): add stats to measure this. |
| 152 if (!connected_ || framer->error() == QUIC_DECRYPTION_FAILURE) { | 156 if (!connected_ || framer->error() == QUIC_DECRYPTION_FAILURE) { |
| 153 return; | 157 return; |
| 154 } | 158 } |
| 155 SendConnectionClose(framer->error()); | 159 SendConnectionClose(framer->error()); |
| 156 } | 160 } |
| 157 | 161 |
| 158 void QuicConnection::OnPacket() { | 162 void QuicConnection::OnPacket() { |
| 159 } | 163 } |
| 160 | 164 |
| 161 void QuicConnection::OnPublicResetPacket( | 165 void QuicConnection::OnPublicResetPacket( |
| 162 const QuicPublicResetPacket& packet) { | 166 const QuicPublicResetPacket& packet) { |
| 163 if (debug_visitor_) { | 167 if (debug_visitor_) { |
| 164 debug_visitor_->OnPublicResetPacket(packet); | 168 debug_visitor_->OnPublicResetPacket(packet); |
| 165 } | 169 } |
| 166 CloseConnection(QUIC_PUBLIC_RESET, true); | 170 CloseConnection(QUIC_PUBLIC_RESET, true); |
| 167 } | 171 } |
| 168 | 172 |
| 169 bool QuicConnection::OnProtocolVersionMismatch(QuicTag received_version) { | 173 bool QuicConnection::OnProtocolVersionMismatch(QuicVersion received_version) { |
| 170 // TODO(satyamshekhar): Implement no server state in this mode. | 174 // TODO(satyamshekhar): Implement no server state in this mode. |
| 171 if (!is_server_) { | 175 if (!is_server_) { |
| 172 LOG(DFATAL) << ENDPOINT << "Framer called OnProtocolVersionMismatch. " | 176 LOG(DFATAL) << ENDPOINT << "Framer called OnProtocolVersionMismatch. " |
| 173 << "Closing connection."; | 177 << "Closing connection."; |
| 174 CloseConnection(QUIC_INTERNAL_ERROR, false); | 178 CloseConnection(QUIC_INTERNAL_ERROR, false); |
| 175 return false; | 179 return false; |
| 176 } | 180 } |
| 177 DCHECK_NE(version(), received_version); | 181 DCHECK_NE(version(), received_version); |
| 178 | 182 |
| 179 if (debug_visitor_) { | 183 if (debug_visitor_) { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 198 | 202 |
| 199 case NEGOTIATED_VERSION: | 203 case NEGOTIATED_VERSION: |
| 200 // Might be old packets that were sent by the client before the version | 204 // Might be old packets that were sent by the client before the version |
| 201 // was negotiated. Drop these. | 205 // was negotiated. Drop these. |
| 202 return false; | 206 return false; |
| 203 | 207 |
| 204 default: | 208 default: |
| 205 DCHECK(false); | 209 DCHECK(false); |
| 206 } | 210 } |
| 207 | 211 |
| 208 // Right now we only support kQuicVersion1 so it's okay not to | |
| 209 // update the framer version. When we start supporting more | |
| 210 // versions please update. | |
| 211 version_negotiation_state_ = NEGOTIATED_VERSION; | 212 version_negotiation_state_ = NEGOTIATED_VERSION; |
| 213 |
| 214 // Store the new version. |
| 215 framer_.set_version(received_version); |
| 216 |
| 212 // TODO(satyamshekhar): Store the sequence number of this packet and close the | 217 // TODO(satyamshekhar): Store the sequence number of this packet and close the |
| 213 // connection if we ever received a packet with incorrect version and whose | 218 // connection if we ever received a packet with incorrect version and whose |
| 214 // sequence number is greater. | 219 // sequence number is greater. |
| 215 return true; | 220 return true; |
| 216 } | 221 } |
| 217 | 222 |
| 218 // Handles version negotiation for client connection. | 223 // Handles version negotiation for client connection. |
| 219 void QuicConnection::OnVersionNegotiationPacket( | 224 void QuicConnection::OnVersionNegotiationPacket( |
| 220 const QuicVersionNegotiationPacket& packet) { | 225 const QuicVersionNegotiationPacket& packet) { |
| 221 if (is_server_) { | 226 if (is_server_) { |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 401 << packet_creator_.sequence_number(); | 406 << packet_creator_.sequence_number(); |
| 402 // We got an error for data we have not sent. Error out. | 407 // We got an error for data we have not sent. Error out. |
| 403 return false; | 408 return false; |
| 404 } | 409 } |
| 405 | 410 |
| 406 if (incoming_ack.received_info.largest_observed < | 411 if (incoming_ack.received_info.largest_observed < |
| 407 peer_largest_observed_packet_) { | 412 peer_largest_observed_packet_) { |
| 408 DLOG(ERROR) << ENDPOINT << "Peer's largest_observed packet decreased:" | 413 DLOG(ERROR) << ENDPOINT << "Peer's largest_observed packet decreased:" |
| 409 << incoming_ack.received_info.largest_observed << " vs " | 414 << incoming_ack.received_info.largest_observed << " vs " |
| 410 << peer_largest_observed_packet_; | 415 << peer_largest_observed_packet_; |
| 411 // We got an error for data we have not sent. Error out. | 416 // A new ack has a diminished largest_observed value. Error out. |
| 417 // If this was an old packet, we wouldn't even have checked. |
| 412 return false; | 418 return false; |
| 413 } | 419 } |
| 414 | 420 |
| 415 // We can't have too many unacked packets, or our ack frames go over | 421 // We can't have too many unacked packets, or our ack frames go over |
| 416 // kMaxPacketSize. | 422 // kMaxPacketSize. |
| 417 DCHECK_LE(incoming_ack.received_info.missing_packets.size(), | 423 DCHECK_LE(incoming_ack.received_info.missing_packets.size(), |
| 418 QuicFramer::GetMaxUnackedPackets(last_header_)); | 424 QuicFramer::GetMaxUnackedPackets(last_header_)); |
| 419 | 425 |
| 420 if (incoming_ack.sent_info.least_unacked < peer_least_packet_awaiting_ack_) { | 426 if (incoming_ack.sent_info.least_unacked < peer_least_packet_awaiting_ack_) { |
| 421 DLOG(ERROR) << ENDPOINT << "Peer's sent low least_unacked: " | 427 DLOG(ERROR) << ENDPOINT << "Peer's sent low least_unacked: " |
| (...skipping 25 matching lines...) Expand all Loading... |
| 447 if (!incoming_ack.received_info.missing_packets.empty() && | 453 if (!incoming_ack.received_info.missing_packets.empty() && |
| 448 *incoming_ack.received_info.missing_packets.begin() < | 454 *incoming_ack.received_info.missing_packets.begin() < |
| 449 least_packet_awaited_by_peer_) { | 455 least_packet_awaited_by_peer_) { |
| 450 DLOG(ERROR) << ENDPOINT << "Peer sent missing packet: " | 456 DLOG(ERROR) << ENDPOINT << "Peer sent missing packet: " |
| 451 << *incoming_ack.received_info.missing_packets.begin() | 457 << *incoming_ack.received_info.missing_packets.begin() |
| 452 << "smaller than least_packet_awaited_by_peer_: " | 458 << "smaller than least_packet_awaited_by_peer_: " |
| 453 << least_packet_awaited_by_peer_; | 459 << least_packet_awaited_by_peer_; |
| 454 return false; | 460 return false; |
| 455 } | 461 } |
| 456 | 462 |
| 457 if (!entropy_manager_.IsValidEntropy( | 463 if (!sent_entropy_manager_.IsValidEntropy( |
| 458 incoming_ack.received_info.largest_observed, | 464 incoming_ack.received_info.largest_observed, |
| 459 incoming_ack.received_info.missing_packets, | 465 incoming_ack.received_info.missing_packets, |
| 460 incoming_ack.received_info.entropy_hash)) { | 466 incoming_ack.received_info.entropy_hash)) { |
| 461 DLOG(ERROR) << ENDPOINT << "Peer sent invalid entropy."; | 467 DLOG(ERROR) << ENDPOINT << "Peer sent invalid entropy."; |
| 462 return false; | 468 return false; |
| 463 } | 469 } |
| 464 | 470 |
| 465 return true; | 471 return true; |
| 466 } | 472 } |
| 467 | 473 |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 537 incoming_ack.received_info.largest_observed); | 543 incoming_ack.received_info.largest_observed); |
| 538 peer_largest_observed_packet_ = incoming_ack.received_info.largest_observed; | 544 peer_largest_observed_packet_ = incoming_ack.received_info.largest_observed; |
| 539 | 545 |
| 540 if (incoming_ack.received_info.missing_packets.empty()) { | 546 if (incoming_ack.received_info.missing_packets.empty()) { |
| 541 least_packet_awaited_by_peer_ = peer_largest_observed_packet_ + 1; | 547 least_packet_awaited_by_peer_ = peer_largest_observed_packet_ + 1; |
| 542 } else { | 548 } else { |
| 543 least_packet_awaited_by_peer_ = | 549 least_packet_awaited_by_peer_ = |
| 544 *(incoming_ack.received_info.missing_packets.begin()); | 550 *(incoming_ack.received_info.missing_packets.begin()); |
| 545 } | 551 } |
| 546 | 552 |
| 547 entropy_manager_.ClearSentEntropyBefore(least_packet_awaited_by_peer_ - 1); | 553 sent_entropy_manager_.ClearEntropyBefore(least_packet_awaited_by_peer_ - 1); |
| 548 | 554 |
| 549 SequenceNumberSet acked_packets; | 555 SequenceNumberSet acked_packets; |
| 550 HandleAckForSentPackets(incoming_ack, &acked_packets); | 556 HandleAckForSentPackets(incoming_ack, &acked_packets); |
| 551 HandleAckForSentFecPackets(incoming_ack, &acked_packets); | 557 HandleAckForSentFecPackets(incoming_ack, &acked_packets); |
| 552 | 558 |
| 553 if (acked_packets.size() > 0) { | 559 if (acked_packets.size() > 0) { |
| 554 visitor_->OnAck(acked_packets); | 560 visitor_->OnAck(acked_packets); |
| 555 } | 561 } |
| 556 } | 562 } |
| 557 | 563 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 572 DCHECK_LE(peer_least_packet_awaiting_ack_, | 578 DCHECK_LE(peer_least_packet_awaiting_ack_, |
| 573 incoming_ack.sent_info.least_unacked); | 579 incoming_ack.sent_info.least_unacked); |
| 574 if (incoming_ack.sent_info.least_unacked > peer_least_packet_awaiting_ack_) { | 580 if (incoming_ack.sent_info.least_unacked > peer_least_packet_awaiting_ack_) { |
| 575 bool missed_packets = | 581 bool missed_packets = |
| 576 DontWaitForPacketsBefore(incoming_ack.sent_info.least_unacked); | 582 DontWaitForPacketsBefore(incoming_ack.sent_info.least_unacked); |
| 577 if (missed_packets || incoming_ack.sent_info.least_unacked > | 583 if (missed_packets || incoming_ack.sent_info.least_unacked > |
| 578 outgoing_ack_.received_info.largest_observed + 1) { | 584 outgoing_ack_.received_info.largest_observed + 1) { |
| 579 DVLOG(1) << ENDPOINT << "Updating entropy hashed since we missed packets"; | 585 DVLOG(1) << ENDPOINT << "Updating entropy hashed since we missed packets"; |
| 580 // There were some missing packets that we won't ever get now. Recalculate | 586 // There were some missing packets that we won't ever get now. Recalculate |
| 581 // the received entropy hash. | 587 // the received entropy hash. |
| 582 entropy_manager_.RecalculateReceivedEntropyHash( | 588 received_entropy_manager_.RecalculateEntropyHash( |
| 583 incoming_ack.sent_info.least_unacked, | 589 incoming_ack.sent_info.least_unacked, |
| 584 incoming_ack.sent_info.entropy_hash); | 590 incoming_ack.sent_info.entropy_hash); |
| 585 } | 591 } |
| 586 peer_least_packet_awaiting_ack_ = incoming_ack.sent_info.least_unacked; | 592 peer_least_packet_awaiting_ack_ = incoming_ack.sent_info.least_unacked; |
| 587 } | 593 } |
| 588 DCHECK(outgoing_ack_.received_info.missing_packets.empty() || | 594 DCHECK(outgoing_ack_.received_info.missing_packets.empty() || |
| 589 *outgoing_ack_.received_info.missing_packets.begin() >= | 595 *outgoing_ack_.received_info.missing_packets.begin() >= |
| 590 peer_least_packet_awaiting_ack_); | 596 peer_least_packet_awaiting_ack_); |
| 591 // Possibly close any FecGroups which are now irrelevant | 597 // Possibly close any FecGroups which are now irrelevant |
| 592 CloseFecGroupsBefore(incoming_ack.sent_info.least_unacked + 1); | 598 CloseFecGroupsBefore(incoming_ack.sent_info.least_unacked + 1); |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 690 SendAck(); | 696 SendAck(); |
| 691 } else if (!last_stream_frames_.empty()) { | 697 } else if (!last_stream_frames_.empty()) { |
| 692 // TODO(alyssar) this case should really be "if the packet contained any | 698 // TODO(alyssar) this case should really be "if the packet contained any |
| 693 // non-ack frame", rather than "if the packet contained a stream frame" | 699 // non-ack frame", rather than "if the packet contained a stream frame" |
| 694 helper_->SetAckAlarm(congestion_manager_.DefaultRetransmissionTime()); | 700 helper_->SetAckAlarm(congestion_manager_.DefaultRetransmissionTime()); |
| 695 } | 701 } |
| 696 send_ack_in_response_to_packet_ = !send_ack_in_response_to_packet_; | 702 send_ack_in_response_to_packet_ = !send_ack_in_response_to_packet_; |
| 697 } | 703 } |
| 698 | 704 |
| 699 void QuicConnection::SendVersionNegotiationPacket() { | 705 void QuicConnection::SendVersionNegotiationPacket() { |
| 700 QuicTagVector supported_versions; | 706 QuicVersionVector supported_versions; |
| 701 supported_versions.push_back(kQuicVersion1); | 707 for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) { |
| 708 supported_versions.push_back(kSupportedQuicVersions[i]); |
| 709 } |
| 702 QuicEncryptedPacket* encrypted = | 710 QuicEncryptedPacket* encrypted = |
| 703 packet_creator_.SerializeVersionNegotiationPacket(supported_versions); | 711 packet_creator_.SerializeVersionNegotiationPacket(supported_versions); |
| 704 // TODO(satyamshekhar): implement zero server state negotiation. | 712 // TODO(satyamshekhar): implement zero server state negotiation. |
| 705 int error; | 713 int error; |
| 706 helper_->WritePacketToWire(*encrypted, &error); | 714 helper_->WritePacketToWire(*encrypted, &error); |
| 707 delete encrypted; | 715 delete encrypted; |
| 708 } | 716 } |
| 709 | 717 |
| 710 QuicConsumedData QuicConnection::SendStreamData(QuicStreamId id, | 718 QuicConsumedData QuicConnection::SendStreamData(QuicStreamId id, |
| 711 base::StringPiece data, | 719 base::StringPiece data, |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 857 DVLOG(1) << ENDPOINT << "Removing " << sequence_number | 865 DVLOG(1) << ENDPOINT << "Removing " << sequence_number |
| 858 << " from missing list"; | 866 << " from missing list"; |
| 859 outgoing_ack_.received_info.missing_packets.erase(sequence_number); | 867 outgoing_ack_.received_info.missing_packets.erase(sequence_number); |
| 860 } | 868 } |
| 861 if (header.packet_sequence_number > | 869 if (header.packet_sequence_number > |
| 862 outgoing_ack_.received_info.largest_observed) { | 870 outgoing_ack_.received_info.largest_observed) { |
| 863 outgoing_ack_.received_info.largest_observed = | 871 outgoing_ack_.received_info.largest_observed = |
| 864 header.packet_sequence_number; | 872 header.packet_sequence_number; |
| 865 time_largest_observed_ = time_of_last_received_packet_; | 873 time_largest_observed_ = time_of_last_received_packet_; |
| 866 } | 874 } |
| 867 entropy_manager_.RecordReceivedPacketEntropyHash(sequence_number, | 875 received_entropy_manager_.RecordPacketEntropyHash( |
| 868 header.entropy_hash); | 876 sequence_number, header.entropy_hash); |
| 869 } | 877 } |
| 870 | 878 |
| 871 bool QuicConnection::MaybeRetransmitPacketForRTO( | 879 bool QuicConnection::MaybeRetransmitPacketForRTO( |
| 872 QuicPacketSequenceNumber sequence_number) { | 880 QuicPacketSequenceNumber sequence_number) { |
| 873 DCHECK_EQ(ContainsKey(unacked_packets_, sequence_number), | 881 DCHECK_EQ(ContainsKey(unacked_packets_, sequence_number), |
| 874 ContainsKey(retransmission_map_, sequence_number)); | 882 ContainsKey(retransmission_map_, sequence_number)); |
| 875 | 883 |
| 876 if (!ContainsKey(unacked_packets_, sequence_number)) { | 884 if (!ContainsKey(unacked_packets_, sequence_number)) { |
| 877 DVLOG(2) << ENDPOINT << "alarm fired for " << sequence_number | 885 DVLOG(2) << ENDPOINT << "alarm fired for " << sequence_number |
| 878 << " but it has been acked or already retransmitted with" | 886 << " but it has been acked or already retransmitted with" |
| (...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1153 return true; | 1161 return true; |
| 1154 } | 1162 } |
| 1155 | 1163 |
| 1156 int QuicConnection::WritePacketToWire(QuicPacketSequenceNumber sequence_number, | 1164 int QuicConnection::WritePacketToWire(QuicPacketSequenceNumber sequence_number, |
| 1157 EncryptionLevel level, | 1165 EncryptionLevel level, |
| 1158 const QuicEncryptedPacket& packet, | 1166 const QuicEncryptedPacket& packet, |
| 1159 int* error) { | 1167 int* error) { |
| 1160 int bytes_written = helper_->WritePacketToWire(packet, error); | 1168 int bytes_written = helper_->WritePacketToWire(packet, error); |
| 1161 if (debug_visitor_) { | 1169 if (debug_visitor_) { |
| 1162 // WritePacketToWire returned -1, then |error| will be populated with | 1170 // WritePacketToWire returned -1, then |error| will be populated with |
| 1163 // a NetErrorCode, which we want to pass along to the visitor. | 1171 // an error code, which we want to pass along to the visitor. |
| 1164 debug_visitor_->OnPacketSent(sequence_number, level, packet, | 1172 debug_visitor_->OnPacketSent(sequence_number, level, packet, |
| 1165 bytes_written == -1 ? *error : bytes_written); | 1173 bytes_written == -1 ? *error : bytes_written); |
| 1166 } | 1174 } |
| 1167 return bytes_written; | 1175 return bytes_written; |
| 1168 } | 1176 } |
| 1169 | 1177 |
| 1170 bool QuicConnection::OnSerializedPacket( | 1178 bool QuicConnection::OnSerializedPacket( |
| 1171 const SerializedPacket& serialized_packet) { | 1179 const SerializedPacket& serialized_packet) { |
| 1172 if (serialized_packet.retransmittable_frames != NULL) { | 1180 if (serialized_packet.retransmittable_frames != NULL) { |
| 1173 DCHECK(unacked_packets_.empty() || | 1181 DCHECK(unacked_packets_.empty() || |
| (...skipping 22 matching lines...) Expand all Loading... |
| 1196 serialized_packet.retransmittable_frames != NULL ? | 1204 serialized_packet.retransmittable_frames != NULL ? |
| 1197 HAS_RETRANSMITTABLE_DATA : | 1205 HAS_RETRANSMITTABLE_DATA : |
| 1198 NO_RETRANSMITTABLE_DATA); | 1206 NO_RETRANSMITTABLE_DATA); |
| 1199 } | 1207 } |
| 1200 | 1208 |
| 1201 bool QuicConnection::SendOrQueuePacket(EncryptionLevel level, | 1209 bool QuicConnection::SendOrQueuePacket(EncryptionLevel level, |
| 1202 QuicPacketSequenceNumber sequence_number, | 1210 QuicPacketSequenceNumber sequence_number, |
| 1203 QuicPacket* packet, | 1211 QuicPacket* packet, |
| 1204 QuicPacketEntropyHash entropy_hash, | 1212 QuicPacketEntropyHash entropy_hash, |
| 1205 HasRetransmittableData retransmittable) { | 1213 HasRetransmittableData retransmittable) { |
| 1206 entropy_manager_.RecordSentPacketEntropyHash(sequence_number, entropy_hash); | 1214 sent_entropy_manager_.RecordPacketEntropyHash(sequence_number, entropy_hash); |
| 1207 if (!WritePacket(level, sequence_number, packet, retransmittable, NO_FORCE)) { | 1215 if (!WritePacket(level, sequence_number, packet, retransmittable, NO_FORCE)) { |
| 1208 queued_packets_.push_back(QueuedPacket(sequence_number, packet, level, | 1216 queued_packets_.push_back(QueuedPacket(sequence_number, packet, level, |
| 1209 retransmittable)); | 1217 retransmittable)); |
| 1210 return false; | 1218 return false; |
| 1211 } | 1219 } |
| 1212 return true; | 1220 return true; |
| 1213 } | 1221 } |
| 1214 | 1222 |
| 1215 bool QuicConnection::ShouldSimulateLostPacket() { | 1223 bool QuicConnection::ShouldSimulateLostPacket() { |
| 1216 // TODO(rch): enable this | 1224 // TODO(rch): enable this |
| 1217 return false; | 1225 return false; |
| 1218 /* | 1226 /* |
| 1219 return FLAGS_fake_packet_loss_percentage > 0 && | 1227 return FLAGS_fake_packet_loss_percentage > 0 && |
| 1220 random_->Rand32() % 100 < FLAGS_fake_packet_loss_percentage; | 1228 random_->Rand32() % 100 < FLAGS_fake_packet_loss_percentage; |
| 1221 */ | 1229 */ |
| 1222 } | 1230 } |
| 1223 | 1231 |
| 1224 void QuicConnection::UpdateOutgoingAck() { | 1232 void QuicConnection::UpdateOutgoingAck() { |
| 1225 if (!unacked_packets_.empty()) { | 1233 if (!unacked_packets_.empty()) { |
| 1226 outgoing_ack_.sent_info.least_unacked = unacked_packets_.begin()->first; | 1234 outgoing_ack_.sent_info.least_unacked = unacked_packets_.begin()->first; |
| 1227 } else { | 1235 } else { |
| 1228 // If there are no unacked packets, set the least unacked packet to | 1236 // If there are no unacked packets, set the least unacked packet to |
| 1229 // sequence_number() + 1 since that will be the sequence number of this | 1237 // sequence_number() + 1 since that will be the sequence number of this |
| 1230 // ack packet whenever it is sent. | 1238 // ack packet whenever it is sent. |
| 1231 outgoing_ack_.sent_info.least_unacked = | 1239 outgoing_ack_.sent_info.least_unacked = |
| 1232 packet_creator_.sequence_number() + 1; | 1240 packet_creator_.sequence_number() + 1; |
| 1233 } | 1241 } |
| 1234 outgoing_ack_.sent_info.entropy_hash = entropy_manager_.SentEntropyHash( | 1242 outgoing_ack_.sent_info.entropy_hash = sent_entropy_manager_.EntropyHash( |
| 1235 outgoing_ack_.sent_info.least_unacked - 1); | 1243 outgoing_ack_.sent_info.least_unacked - 1); |
| 1236 outgoing_ack_.received_info.entropy_hash = | 1244 outgoing_ack_.received_info.entropy_hash = |
| 1237 entropy_manager_.ReceivedEntropyHash( | 1245 received_entropy_manager_.EntropyHash( |
| 1238 outgoing_ack_.received_info.largest_observed); | 1246 outgoing_ack_.received_info.largest_observed); |
| 1239 } | 1247 } |
| 1240 | 1248 |
| 1241 void QuicConnection::SendAck() { | 1249 void QuicConnection::SendAck() { |
| 1242 helper_->ClearAckAlarm(); | 1250 helper_->ClearAckAlarm(); |
| 1243 UpdateOutgoingAck(); | 1251 UpdateOutgoingAck(); |
| 1244 DVLOG(1) << ENDPOINT << "Sending ack: " << outgoing_ack_; | 1252 DVLOG(1) << ENDPOINT << "Sending ack: " << outgoing_ack_; |
| 1245 | 1253 |
| 1246 // TODO(rch): delay this until the CreateFeedbackFrame | 1254 // TODO(rch): delay this until the CreateFeedbackFrame |
| 1247 // method is invoked. This requires changes SetShouldSendAck | 1255 // method is invoked. This requires changes SetShouldSendAck |
| (...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1439 << details; | 1447 << details; |
| 1440 QuicConnectionCloseFrame frame; | 1448 QuicConnectionCloseFrame frame; |
| 1441 frame.error_code = error; | 1449 frame.error_code = error; |
| 1442 frame.error_details = details; | 1450 frame.error_details = details; |
| 1443 UpdateOutgoingAck(); | 1451 UpdateOutgoingAck(); |
| 1444 frame.ack_frame = outgoing_ack_; | 1452 frame.ack_frame = outgoing_ack_; |
| 1445 | 1453 |
| 1446 SerializedPacket serialized_packet = | 1454 SerializedPacket serialized_packet = |
| 1447 packet_creator_.SerializeConnectionClose(&frame); | 1455 packet_creator_.SerializeConnectionClose(&frame); |
| 1448 | 1456 |
| 1449 // We need to update the sent entrophy hash for all sent packets. | 1457 // We need to update the sent entropy hash for all sent packets. |
| 1450 entropy_manager_.RecordSentPacketEntropyHash( | 1458 sent_entropy_manager_.RecordPacketEntropyHash( |
| 1451 serialized_packet.sequence_number, | 1459 serialized_packet.sequence_number, |
| 1452 serialized_packet.entropy_hash); | 1460 serialized_packet.entropy_hash); |
| 1453 | 1461 |
| 1454 WritePacket(encryption_level_, | 1462 WritePacket(encryption_level_, |
| 1455 serialized_packet.sequence_number, | 1463 serialized_packet.sequence_number, |
| 1456 serialized_packet.packet, | 1464 serialized_packet.packet, |
| 1457 serialized_packet.retransmittable_frames != NULL ? | 1465 serialized_packet.retransmittable_frames != NULL ? |
| 1458 HAS_RETRANSMITTABLE_DATA : NO_RETRANSMITTABLE_DATA, | 1466 HAS_RETRANSMITTABLE_DATA : NO_RETRANSMITTABLE_DATA, |
| 1459 FORCE); | 1467 FORCE); |
| 1460 } | 1468 } |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1564 if (connection_timeout < timeout) { | 1572 if (connection_timeout < timeout) { |
| 1565 timeout = connection_timeout; | 1573 timeout = connection_timeout; |
| 1566 } | 1574 } |
| 1567 } | 1575 } |
| 1568 | 1576 |
| 1569 helper_->SetTimeoutAlarm(timeout); | 1577 helper_->SetTimeoutAlarm(timeout); |
| 1570 return false; | 1578 return false; |
| 1571 } | 1579 } |
| 1572 | 1580 |
| 1573 } // namespace net | 1581 } // namespace net |
| OLD | NEW |