| 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 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 147 connection_->SendPing(); | 147 connection_->SendPing(); |
| 148 return QuicTime::Zero(); | 148 return QuicTime::Zero(); |
| 149 } | 149 } |
| 150 | 150 |
| 151 private: | 151 private: |
| 152 QuicConnection* connection_; | 152 QuicConnection* connection_; |
| 153 | 153 |
| 154 DISALLOW_COPY_AND_ASSIGN(PingAlarm); | 154 DISALLOW_COPY_AND_ASSIGN(PingAlarm); |
| 155 }; | 155 }; |
| 156 | 156 |
| 157 QuicConnection::PacketType GetPacketType( |
| 158 const RetransmittableFrames* retransmittable_frames) { |
| 159 if (!retransmittable_frames) { |
| 160 return QuicConnection::NORMAL; |
| 161 } |
| 162 for (size_t i = 0; i < retransmittable_frames->frames().size(); ++i) { |
| 163 if (retransmittable_frames->frames()[i].type == CONNECTION_CLOSE_FRAME) { |
| 164 return QuicConnection::CONNECTION_CLOSE; |
| 165 } |
| 166 } |
| 167 return QuicConnection::NORMAL; |
| 168 } |
| 169 |
| 157 } // namespace | 170 } // namespace |
| 158 | 171 |
| 159 QuicConnection::QueuedPacket::QueuedPacket(SerializedPacket packet, | 172 QuicConnection::QueuedPacket::QueuedPacket(SerializedPacket packet, |
| 160 EncryptionLevel level, | 173 EncryptionLevel level, |
| 161 TransmissionType transmission_type) | 174 TransmissionType transmission_type) |
| 162 : serialized_packet(packet), | 175 : sequence_number(packet.sequence_number), |
| 176 packet(packet.packet), |
| 163 encryption_level(level), | 177 encryption_level(level), |
| 164 transmission_type(transmission_type) { | 178 transmission_type(transmission_type), |
| 179 retransmittable((transmission_type != NOT_RETRANSMISSION || |
| 180 packet.retransmittable_frames != NULL) ? |
| 181 HAS_RETRANSMITTABLE_DATA : NO_RETRANSMITTABLE_DATA), |
| 182 handshake(packet.retransmittable_frames == NULL ? |
| 183 NOT_HANDSHAKE : packet.retransmittable_frames->HasCryptoHandshake()), |
| 184 type(GetPacketType(packet.retransmittable_frames)), |
| 185 length(packet.packet->length()) { |
| 165 } | 186 } |
| 166 | 187 |
| 167 #define ENDPOINT (is_server_ ? "Server: " : " Client: ") | 188 #define ENDPOINT (is_server_ ? "Server: " : " Client: ") |
| 168 | 189 |
| 169 QuicConnection::QuicConnection(QuicConnectionId connection_id, | 190 QuicConnection::QuicConnection(QuicConnectionId connection_id, |
| 170 IPEndPoint address, | 191 IPEndPoint address, |
| 171 QuicConnectionHelperInterface* helper, | 192 QuicConnectionHelperInterface* helper, |
| 172 const PacketWriterFactory& writer_factory, | 193 const PacketWriterFactory& writer_factory, |
| 173 bool owns_writer, | 194 bool owns_writer, |
| 174 bool is_server, | 195 bool is_server, |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 234 } | 255 } |
| 235 | 256 |
| 236 QuicConnection::~QuicConnection() { | 257 QuicConnection::~QuicConnection() { |
| 237 if (owns_writer_) { | 258 if (owns_writer_) { |
| 238 delete writer_; | 259 delete writer_; |
| 239 } | 260 } |
| 240 STLDeleteElements(&undecryptable_packets_); | 261 STLDeleteElements(&undecryptable_packets_); |
| 241 STLDeleteValues(&group_map_); | 262 STLDeleteValues(&group_map_); |
| 242 for (QueuedPacketList::iterator it = queued_packets_.begin(); | 263 for (QueuedPacketList::iterator it = queued_packets_.begin(); |
| 243 it != queued_packets_.end(); ++it) { | 264 it != queued_packets_.end(); ++it) { |
| 244 delete it->serialized_packet.packet; | 265 delete it->packet; |
| 245 } | 266 } |
| 246 } | 267 } |
| 247 | 268 |
| 248 void QuicConnection::SetFromConfig(const QuicConfig& config) { | 269 void QuicConnection::SetFromConfig(const QuicConfig& config) { |
| 249 SetIdleNetworkTimeout(config.idle_connection_state_lifetime()); | 270 SetIdleNetworkTimeout(config.idle_connection_state_lifetime()); |
| 250 sent_packet_manager_.SetFromConfig(config); | 271 sent_packet_manager_.SetFromConfig(config); |
| 251 } | 272 } |
| 252 | 273 |
| 253 bool QuicConnection::SelectMutualVersion( | 274 bool QuicConnection::SelectMutualVersion( |
| 254 const QuicVersionVector& available_versions) { | 275 const QuicVersionVector& available_versions) { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 272 // Packets that we cannot decrypt are dropped. | 293 // Packets that we cannot decrypt are dropped. |
| 273 // TODO(rch): add stats to measure this. | 294 // TODO(rch): add stats to measure this. |
| 274 if (!connected_ || framer->error() == QUIC_DECRYPTION_FAILURE) { | 295 if (!connected_ || framer->error() == QUIC_DECRYPTION_FAILURE) { |
| 275 return; | 296 return; |
| 276 } | 297 } |
| 277 SendConnectionCloseWithDetails(framer->error(), framer->detailed_error()); | 298 SendConnectionCloseWithDetails(framer->error(), framer->detailed_error()); |
| 278 } | 299 } |
| 279 | 300 |
| 280 void QuicConnection::OnPacket() { | 301 void QuicConnection::OnPacket() { |
| 281 DCHECK(last_stream_frames_.empty() && | 302 DCHECK(last_stream_frames_.empty() && |
| 282 last_ack_frames_.empty() && | |
| 283 last_congestion_frames_.empty() && | |
| 284 last_stop_waiting_frames_.empty() && | |
| 285 last_rst_frames_.empty() && | |
| 286 last_goaway_frames_.empty() && | 303 last_goaway_frames_.empty() && |
| 287 last_window_update_frames_.empty() && | 304 last_window_update_frames_.empty() && |
| 288 last_blocked_frames_.empty() && | 305 last_blocked_frames_.empty() && |
| 289 last_ping_frames_.empty() && | 306 last_rst_frames_.empty() && |
| 290 last_close_frames_.empty()); | 307 last_ack_frames_.empty() && |
| 308 last_congestion_frames_.empty() && |
| 309 last_stop_waiting_frames_.empty()); |
| 291 } | 310 } |
| 292 | 311 |
| 293 void QuicConnection::OnPublicResetPacket( | 312 void QuicConnection::OnPublicResetPacket( |
| 294 const QuicPublicResetPacket& packet) { | 313 const QuicPublicResetPacket& packet) { |
| 295 if (debug_visitor_.get() != NULL) { | 314 if (debug_visitor_.get() != NULL) { |
| 296 debug_visitor_->OnPublicResetPacket(packet); | 315 debug_visitor_->OnPublicResetPacket(packet); |
| 297 } | 316 } |
| 298 CloseConnection(QUIC_PUBLIC_RESET, true); | 317 CloseConnection(QUIC_PUBLIC_RESET, true); |
| 299 | 318 |
| 300 DVLOG(1) << ENDPOINT << "Connection " << connection_id() | 319 DVLOG(1) << ENDPOINT << "Connection " << connection_id() |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 337 // Might be old packets that were sent by the client before the version | 356 // Might be old packets that were sent by the client before the version |
| 338 // was negotiated. Drop these. | 357 // was negotiated. Drop these. |
| 339 return false; | 358 return false; |
| 340 | 359 |
| 341 default: | 360 default: |
| 342 DCHECK(false); | 361 DCHECK(false); |
| 343 } | 362 } |
| 344 | 363 |
| 345 version_negotiation_state_ = NEGOTIATED_VERSION; | 364 version_negotiation_state_ = NEGOTIATED_VERSION; |
| 346 visitor_->OnSuccessfulVersionNegotiation(received_version); | 365 visitor_->OnSuccessfulVersionNegotiation(received_version); |
| 347 if (debug_visitor_.get() != NULL) { | |
| 348 debug_visitor_->OnSuccessfulVersionNegotiation(received_version); | |
| 349 } | |
| 350 DVLOG(1) << ENDPOINT << "version negotiated " << received_version; | 366 DVLOG(1) << ENDPOINT << "version negotiated " << received_version; |
| 351 | 367 |
| 352 // Store the new version. | 368 // Store the new version. |
| 353 framer_.set_version(received_version); | 369 framer_.set_version(received_version); |
| 354 | 370 |
| 355 // TODO(satyamshekhar): Store the sequence number of this packet and close the | 371 // TODO(satyamshekhar): Store the sequence number of this packet and close the |
| 356 // connection if we ever received a packet with incorrect version and whose | 372 // connection if we ever received a packet with incorrect version and whose |
| 357 // sequence number is greater. | 373 // sequence number is greater. |
| 358 return true; | 374 return true; |
| 359 } | 375 } |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 466 << " without version flag before version negotiated."; | 482 << " without version flag before version negotiated."; |
| 467 // Packets should have the version flag till version negotiation is | 483 // Packets should have the version flag till version negotiation is |
| 468 // done. | 484 // done. |
| 469 CloseConnection(QUIC_INVALID_VERSION, false); | 485 CloseConnection(QUIC_INVALID_VERSION, false); |
| 470 return false; | 486 return false; |
| 471 } else { | 487 } else { |
| 472 DCHECK_EQ(1u, header.public_header.versions.size()); | 488 DCHECK_EQ(1u, header.public_header.versions.size()); |
| 473 DCHECK_EQ(header.public_header.versions[0], version()); | 489 DCHECK_EQ(header.public_header.versions[0], version()); |
| 474 version_negotiation_state_ = NEGOTIATED_VERSION; | 490 version_negotiation_state_ = NEGOTIATED_VERSION; |
| 475 visitor_->OnSuccessfulVersionNegotiation(version()); | 491 visitor_->OnSuccessfulVersionNegotiation(version()); |
| 476 if (debug_visitor_.get() != NULL) { | |
| 477 debug_visitor_->OnSuccessfulVersionNegotiation(version()); | |
| 478 } | |
| 479 } | 492 } |
| 480 } else { | 493 } else { |
| 481 DCHECK(!header.public_header.version_flag); | 494 DCHECK(!header.public_header.version_flag); |
| 482 // If the client gets a packet without the version flag from the server | 495 // If the client gets a packet without the version flag from the server |
| 483 // it should stop sending version since the version negotiation is done. | 496 // it should stop sending version since the version negotiation is done. |
| 484 packet_generator_.StopSendingVersion(); | 497 packet_generator_.StopSendingVersion(); |
| 485 version_negotiation_state_ = NEGOTIATED_VERSION; | 498 version_negotiation_state_ = NEGOTIATED_VERSION; |
| 486 visitor_->OnSuccessfulVersionNegotiation(version()); | 499 visitor_->OnSuccessfulVersionNegotiation(version()); |
| 487 if (debug_visitor_.get() != NULL) { | |
| 488 debug_visitor_->OnSuccessfulVersionNegotiation(version()); | |
| 489 } | |
| 490 } | 500 } |
| 491 } | 501 } |
| 492 | 502 |
| 493 DCHECK_EQ(NEGOTIATED_VERSION, version_negotiation_state_); | 503 DCHECK_EQ(NEGOTIATED_VERSION, version_negotiation_state_); |
| 494 | 504 |
| 495 --stats_.packets_dropped; | 505 --stats_.packets_dropped; |
| 496 DVLOG(1) << ENDPOINT << "Received packet header: " << header; | 506 DVLOG(1) << ENDPOINT << "Received packet header: " << header; |
| 497 last_header_ = header; | 507 last_header_ = header; |
| 498 DCHECK(connected_); | 508 DCHECK(connected_); |
| 499 return true; | 509 return true; |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 600 | 610 |
| 601 last_stop_waiting_frames_.push_back(frame); | 611 last_stop_waiting_frames_.push_back(frame); |
| 602 return connected_; | 612 return connected_; |
| 603 } | 613 } |
| 604 | 614 |
| 605 bool QuicConnection::OnPingFrame(const QuicPingFrame& frame) { | 615 bool QuicConnection::OnPingFrame(const QuicPingFrame& frame) { |
| 606 DCHECK(connected_); | 616 DCHECK(connected_); |
| 607 if (debug_visitor_.get() != NULL) { | 617 if (debug_visitor_.get() != NULL) { |
| 608 debug_visitor_->OnPingFrame(frame); | 618 debug_visitor_->OnPingFrame(frame); |
| 609 } | 619 } |
| 610 last_ping_frames_.push_back(frame); | |
| 611 return true; | 620 return true; |
| 612 } | 621 } |
| 613 | 622 |
| 614 bool QuicConnection::ValidateAckFrame(const QuicAckFrame& incoming_ack) { | 623 bool QuicConnection::ValidateAckFrame(const QuicAckFrame& incoming_ack) { |
| 615 if (incoming_ack.largest_observed > packet_generator_.sequence_number()) { | 624 if (incoming_ack.largest_observed > packet_generator_.sequence_number()) { |
| 616 DLOG(ERROR) << ENDPOINT << "Peer's observed unsent packet:" | 625 DLOG(ERROR) << ENDPOINT << "Peer's observed unsent packet:" |
| 617 << incoming_ack.largest_observed << " vs " | 626 << incoming_ack.largest_observed << " vs " |
| 618 << packet_generator_.sequence_number(); | 627 << packet_generator_.sequence_number(); |
| 619 // We got an error for data we have not sent. Error out. | 628 // We got an error for data we have not sent. Error out. |
| 620 return false; | 629 return false; |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 762 | 771 |
| 763 void QuicConnection::OnPacketComplete() { | 772 void QuicConnection::OnPacketComplete() { |
| 764 // Don't do anything if this packet closed the connection. | 773 // Don't do anything if this packet closed the connection. |
| 765 if (!connected_) { | 774 if (!connected_) { |
| 766 ClearLastFrames(); | 775 ClearLastFrames(); |
| 767 return; | 776 return; |
| 768 } | 777 } |
| 769 | 778 |
| 770 DVLOG(1) << ENDPOINT << (last_packet_revived_ ? "Revived" : "Got") | 779 DVLOG(1) << ENDPOINT << (last_packet_revived_ ? "Revived" : "Got") |
| 771 << " packet " << last_header_.packet_sequence_number | 780 << " packet " << last_header_.packet_sequence_number |
| 772 << " with " << last_stream_frames_.size()<< " stream frames " | 781 << " with " << last_ack_frames_.size() << " acks, " |
| 773 << last_ack_frames_.size() << " acks, " | |
| 774 << last_congestion_frames_.size() << " congestions, " | 782 << last_congestion_frames_.size() << " congestions, " |
| 775 << last_stop_waiting_frames_.size() << " stop_waiting, " | 783 << last_stop_waiting_frames_.size() << " stop_waiting, " |
| 776 << last_rst_frames_.size() << " rsts, " | |
| 777 << last_goaway_frames_.size() << " goaways, " | 784 << last_goaway_frames_.size() << " goaways, " |
| 778 << last_window_update_frames_.size() << " window updates, " | 785 << last_window_update_frames_.size() << " window updates, " |
| 779 << last_blocked_frames_.size() << " blocked, " | 786 << last_blocked_frames_.size() << " blocked, " |
| 780 << last_ping_frames_.size() << " pings, " | 787 << last_rst_frames_.size() << " rsts, " |
| 781 << last_close_frames_.size() << " closes, " | 788 << last_close_frames_.size() << " closes, " |
| 782 << "for " << last_header_.public_header.connection_id; | 789 << last_stream_frames_.size() |
| 790 << " stream frames for " |
| 791 << last_header_.public_header.connection_id; |
| 783 | 792 |
| 784 // Call MaybeQueueAck() before recording the received packet, since we want | 793 // Call MaybeQueueAck() before recording the received packet, since we want |
| 785 // to trigger an ack if the newly received packet was previously missing. | 794 // to trigger an ack if the newly received packet was previously missing. |
| 786 MaybeQueueAck(); | 795 MaybeQueueAck(); |
| 787 | 796 |
| 788 // Record received or revived packet to populate ack info correctly before | 797 // Record received or revived packet to populate ack info correctly before |
| 789 // processing stream frames, since the processing may result in a response | 798 // processing stream frames, since the processing may result in a response |
| 790 // packet with a bundled ack. | 799 // packet with a bundled ack. |
| 791 if (last_packet_revived_) { | 800 if (last_packet_revived_) { |
| 792 received_packet_manager_.RecordPacketRevived( | 801 received_packet_manager_.RecordPacketRevived( |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 865 } | 874 } |
| 866 } | 875 } |
| 867 | 876 |
| 868 if (ack_queued_) { | 877 if (ack_queued_) { |
| 869 ack_alarm_->Cancel(); | 878 ack_alarm_->Cancel(); |
| 870 } | 879 } |
| 871 } | 880 } |
| 872 | 881 |
| 873 void QuicConnection::ClearLastFrames() { | 882 void QuicConnection::ClearLastFrames() { |
| 874 last_stream_frames_.clear(); | 883 last_stream_frames_.clear(); |
| 875 last_ack_frames_.clear(); | |
| 876 last_congestion_frames_.clear(); | |
| 877 last_stop_waiting_frames_.clear(); | |
| 878 last_rst_frames_.clear(); | |
| 879 last_goaway_frames_.clear(); | 884 last_goaway_frames_.clear(); |
| 880 last_window_update_frames_.clear(); | 885 last_window_update_frames_.clear(); |
| 881 last_blocked_frames_.clear(); | 886 last_blocked_frames_.clear(); |
| 882 last_ping_frames_.clear(); | 887 last_rst_frames_.clear(); |
| 883 last_close_frames_.clear(); | 888 last_ack_frames_.clear(); |
| 889 last_stop_waiting_frames_.clear(); |
| 890 last_congestion_frames_.clear(); |
| 884 } | 891 } |
| 885 | 892 |
| 886 QuicAckFrame* QuicConnection::CreateAckFrame() { | 893 QuicAckFrame* QuicConnection::CreateAckFrame() { |
| 887 QuicAckFrame* outgoing_ack = new QuicAckFrame(); | 894 QuicAckFrame* outgoing_ack = new QuicAckFrame(); |
| 888 received_packet_manager_.UpdateReceivedPacketInfo( | 895 received_packet_manager_.UpdateReceivedPacketInfo( |
| 889 outgoing_ack, clock_->ApproximateNow()); | 896 outgoing_ack, clock_->ApproximateNow()); |
| 890 DVLOG(1) << ENDPOINT << "Creating ack frame: " << *outgoing_ack; | 897 DVLOG(1) << ENDPOINT << "Creating ack frame: " << *outgoing_ack; |
| 891 return outgoing_ack; | 898 return outgoing_ack; |
| 892 } | 899 } |
| 893 | 900 |
| 894 QuicCongestionFeedbackFrame* QuicConnection::CreateFeedbackFrame() { | 901 QuicCongestionFeedbackFrame* QuicConnection::CreateFeedbackFrame() { |
| 895 return new QuicCongestionFeedbackFrame(outgoing_congestion_feedback_); | 902 return new QuicCongestionFeedbackFrame(outgoing_congestion_feedback_); |
| 896 } | 903 } |
| 897 | 904 |
| 898 QuicStopWaitingFrame* QuicConnection::CreateStopWaitingFrame() { | 905 QuicStopWaitingFrame* QuicConnection::CreateStopWaitingFrame() { |
| 899 QuicStopWaitingFrame stop_waiting; | 906 QuicStopWaitingFrame stop_waiting; |
| 900 UpdateStopWaiting(&stop_waiting); | 907 UpdateStopWaiting(&stop_waiting); |
| 901 return new QuicStopWaitingFrame(stop_waiting); | 908 return new QuicStopWaitingFrame(stop_waiting); |
| 902 } | 909 } |
| 903 | 910 |
| 904 bool QuicConnection::ShouldLastPacketInstigateAck() const { | 911 bool QuicConnection::ShouldLastPacketInstigateAck() const { |
| 905 if (!last_stream_frames_.empty() || | 912 if (!last_stream_frames_.empty() || |
| 906 !last_goaway_frames_.empty() || | 913 !last_goaway_frames_.empty() || |
| 907 !last_rst_frames_.empty() || | 914 !last_rst_frames_.empty() || |
| 908 !last_window_update_frames_.empty() || | 915 !last_window_update_frames_.empty() || |
| 909 !last_blocked_frames_.empty() || | 916 !last_blocked_frames_.empty()) { |
| 910 !last_ping_frames_.empty()) { | |
| 911 return true; | 917 return true; |
| 912 } | 918 } |
| 913 | 919 |
| 914 if (!last_ack_frames_.empty() && last_ack_frames_.back().is_truncated) { | 920 if (!last_ack_frames_.empty() && last_ack_frames_.back().is_truncated) { |
| 915 return true; | 921 return true; |
| 916 } | 922 } |
| 917 return false; | 923 return false; |
| 918 } | 924 } |
| 919 | 925 |
| 920 void QuicConnection::UpdateStopWaitingCount() { | 926 void QuicConnection::UpdateStopWaitingCount() { |
| (...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1202 DCHECK(!writer_->IsWriteBlocked()); | 1208 DCHECK(!writer_->IsWriteBlocked()); |
| 1203 | 1209 |
| 1204 if (pending_version_negotiation_packet_) { | 1210 if (pending_version_negotiation_packet_) { |
| 1205 SendVersionNegotiationPacket(); | 1211 SendVersionNegotiationPacket(); |
| 1206 } | 1212 } |
| 1207 | 1213 |
| 1208 QueuedPacketList::iterator packet_iterator = queued_packets_.begin(); | 1214 QueuedPacketList::iterator packet_iterator = queued_packets_.begin(); |
| 1209 while (!writer_->IsWriteBlocked() && | 1215 while (!writer_->IsWriteBlocked() && |
| 1210 packet_iterator != queued_packets_.end()) { | 1216 packet_iterator != queued_packets_.end()) { |
| 1211 if (WritePacket(*packet_iterator)) { | 1217 if (WritePacket(*packet_iterator)) { |
| 1212 delete packet_iterator->serialized_packet.packet; | 1218 delete packet_iterator->packet; |
| 1213 packet_iterator = queued_packets_.erase(packet_iterator); | 1219 packet_iterator = queued_packets_.erase(packet_iterator); |
| 1214 } else { | 1220 } else { |
| 1215 // Continue, because some queued packets may still be writable. | 1221 // Continue, because some queued packets may still be writable. |
| 1216 // This can happen if a retransmit send fails. | 1222 // This can happen if a retransmit send fails. |
| 1217 ++packet_iterator; | 1223 ++packet_iterator; |
| 1218 } | 1224 } |
| 1219 } | 1225 } |
| 1220 } | 1226 } |
| 1221 | 1227 |
| 1222 void QuicConnection::WritePendingRetransmissions() { | 1228 void QuicConnection::WritePendingRetransmissions() { |
| 1223 // Keep writing as long as there's a pending retransmission which can be | 1229 // Keep writing as long as there's a pending retransmission which can be |
| 1224 // written. | 1230 // written. |
| 1225 while (sent_packet_manager_.HasPendingRetransmissions()) { | 1231 while (sent_packet_manager_.HasPendingRetransmissions()) { |
| 1226 const QuicSentPacketManager::PendingRetransmission pending = | 1232 const QuicSentPacketManager::PendingRetransmission pending = |
| 1227 sent_packet_manager_.NextPendingRetransmission(); | 1233 sent_packet_manager_.NextPendingRetransmission(); |
| 1228 if (!CanWrite(HAS_RETRANSMITTABLE_DATA)) { | 1234 if (GetPacketType(&pending.retransmittable_frames) == NORMAL && |
| 1235 !CanWrite(HAS_RETRANSMITTABLE_DATA)) { |
| 1229 break; | 1236 break; |
| 1230 } | 1237 } |
| 1231 | 1238 |
| 1232 // Re-packetize the frames with a new sequence number for retransmission. | 1239 // Re-packetize the frames with a new sequence number for retransmission. |
| 1233 // Retransmitted data packets do not use FEC, even when it's enabled. | 1240 // Retransmitted data packets do not use FEC, even when it's enabled. |
| 1234 // Retransmitted packets use the same sequence number length as the | 1241 // Retransmitted packets use the same sequence number length as the |
| 1235 // original. | 1242 // original. |
| 1236 // Flush the packet generator before making a new packet. | 1243 // Flush the packet generator before making a new packet. |
| 1237 // TODO(ianswett): Implement ReserializeAllFrames as a separate path that | 1244 // TODO(ianswett): Implement ReserializeAllFrames as a separate path that |
| 1238 // does not require the creator to be flushed. | 1245 // does not require the creator to be flushed. |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1303 if (!delay.IsZero()) { | 1310 if (!delay.IsZero()) { |
| 1304 send_alarm_->Update(now.Add(delay), QuicTime::Delta::FromMilliseconds(1)); | 1311 send_alarm_->Update(now.Add(delay), QuicTime::Delta::FromMilliseconds(1)); |
| 1305 DVLOG(1) << "Delaying sending."; | 1312 DVLOG(1) << "Delaying sending."; |
| 1306 return false; | 1313 return false; |
| 1307 } | 1314 } |
| 1308 send_alarm_->Cancel(); | 1315 send_alarm_->Cancel(); |
| 1309 return true; | 1316 return true; |
| 1310 } | 1317 } |
| 1311 | 1318 |
| 1312 bool QuicConnection::WritePacket(QueuedPacket packet) { | 1319 bool QuicConnection::WritePacket(QueuedPacket packet) { |
| 1313 QuicPacketSequenceNumber sequence_number = | 1320 QuicPacketSequenceNumber sequence_number = packet.sequence_number; |
| 1314 packet.serialized_packet.sequence_number; | |
| 1315 if (ShouldDiscardPacket(packet.encryption_level, | 1321 if (ShouldDiscardPacket(packet.encryption_level, |
| 1316 sequence_number, | 1322 sequence_number, |
| 1317 IsRetransmittable(packet))) { | 1323 packet.retransmittable)) { |
| 1318 ++stats_.packets_discarded; | 1324 ++stats_.packets_discarded; |
| 1319 return true; | 1325 return true; |
| 1320 } | 1326 } |
| 1321 | 1327 |
| 1328 // If the packet is CONNECTION_CLOSE, we need to try to send it immediately |
| 1329 // and encrypt it to hand it off to TimeWaitListManager. |
| 1330 // If the packet is QUEUED, we don't re-consult the congestion control. |
| 1331 // This ensures packets are sent in sequence number order. |
| 1332 // TODO(ianswett): The congestion control should have been consulted before |
| 1333 // serializing the packet, so this could be turned into a LOG_IF(DFATAL). |
| 1334 if (packet.type == NORMAL && !CanWrite(packet.retransmittable)) { |
| 1335 return false; |
| 1336 } |
| 1337 |
| 1322 // Some encryption algorithms require the packet sequence numbers not be | 1338 // Some encryption algorithms require the packet sequence numbers not be |
| 1323 // repeated. | 1339 // repeated. |
| 1324 DCHECK_LE(sequence_number_of_last_sent_packet_, sequence_number); | 1340 DCHECK_LE(sequence_number_of_last_sent_packet_, sequence_number); |
| 1325 sequence_number_of_last_sent_packet_ = sequence_number; | 1341 sequence_number_of_last_sent_packet_ = sequence_number; |
| 1326 | 1342 |
| 1327 QuicEncryptedPacket* encrypted = framer_.EncryptPacket( | 1343 QuicEncryptedPacket* encrypted = framer_.EncryptPacket( |
| 1328 packet.encryption_level, | 1344 packet.encryption_level, sequence_number, *packet.packet); |
| 1329 sequence_number, | |
| 1330 *packet.serialized_packet.packet); | |
| 1331 if (encrypted == NULL) { | 1345 if (encrypted == NULL) { |
| 1332 LOG(DFATAL) << ENDPOINT << "Failed to encrypt packet number " | 1346 LOG(DFATAL) << ENDPOINT << "Failed to encrypt packet number " |
| 1333 << sequence_number; | 1347 << sequence_number; |
| 1334 // CloseConnection does not send close packet, so no infinite loop here. | 1348 // CloseConnection does not send close packet, so no infinite loop here. |
| 1335 CloseConnection(QUIC_ENCRYPTION_FAILURE, false); | 1349 CloseConnection(QUIC_ENCRYPTION_FAILURE, false); |
| 1336 return false; | 1350 return false; |
| 1337 } | 1351 } |
| 1338 | 1352 |
| 1339 // Connection close packets are eventually owned by TimeWaitListManager. | 1353 // Connection close packets are eventually owned by TimeWaitListManager. |
| 1340 // Others are deleted at the end of this call. | 1354 // Others are deleted at the end of this call. |
| 1341 scoped_ptr<QuicEncryptedPacket> encrypted_deleter; | 1355 scoped_ptr<QuicEncryptedPacket> encrypted_deleter; |
| 1342 if (IsConnectionClose(packet)) { | 1356 if (packet.type == CONNECTION_CLOSE) { |
| 1343 DCHECK(connection_close_packet_.get() == NULL); | 1357 DCHECK(connection_close_packet_.get() == NULL); |
| 1344 connection_close_packet_.reset(encrypted); | 1358 connection_close_packet_.reset(encrypted); |
| 1345 // This assures we won't try to write *forced* packets when blocked. | 1359 // This assures we won't try to write *forced* packets when blocked. |
| 1346 // Return true to stop processing. | 1360 // Return true to stop processing. |
| 1347 if (writer_->IsWriteBlocked()) { | 1361 if (writer_->IsWriteBlocked()) { |
| 1348 visitor_->OnWriteBlocked(); | 1362 visitor_->OnWriteBlocked(); |
| 1349 return true; | 1363 return true; |
| 1350 } | 1364 } |
| 1351 } else { | 1365 } else { |
| 1352 encrypted_deleter.reset(encrypted); | 1366 encrypted_deleter.reset(encrypted); |
| 1353 } | 1367 } |
| 1354 | 1368 |
| 1355 if (!FLAGS_quic_allow_oversized_packets_for_test) { | 1369 if (!FLAGS_quic_allow_oversized_packets_for_test) { |
| 1356 DCHECK_LE(encrypted->length(), kMaxPacketSize); | 1370 DCHECK_LE(encrypted->length(), kMaxPacketSize); |
| 1357 } | 1371 } |
| 1358 DCHECK_LE(encrypted->length(), packet_generator_.max_packet_length()); | 1372 DCHECK_LE(encrypted->length(), packet_generator_.max_packet_length()); |
| 1359 DVLOG(1) << ENDPOINT << "Sending packet " << sequence_number << " : " | 1373 DVLOG(1) << ENDPOINT << "Sending packet " << sequence_number |
| 1360 << (packet.serialized_packet.packet->is_fec_packet() ? "FEC " : | 1374 << " : " << (packet.packet->is_fec_packet() ? "FEC " : |
| 1361 (IsRetransmittable(packet) == HAS_RETRANSMITTABLE_DATA | 1375 (packet.retransmittable == HAS_RETRANSMITTABLE_DATA |
| 1362 ? "data bearing " : " ack only ")) | 1376 ? "data bearing " : " ack only ")) |
| 1363 << ", encryption level: " | 1377 << ", encryption level: " |
| 1364 << QuicUtils::EncryptionLevelToString(packet.encryption_level) | 1378 << QuicUtils::EncryptionLevelToString(packet.encryption_level) |
| 1365 << ", length:" | 1379 << ", length:" << packet.packet->length() << ", encrypted length:" |
| 1366 << packet.serialized_packet.packet->length() | |
| 1367 << ", encrypted length:" | |
| 1368 << encrypted->length(); | 1380 << encrypted->length(); |
| 1369 DVLOG(2) << ENDPOINT << "packet(" << sequence_number << "): " << std::endl | 1381 DVLOG(2) << ENDPOINT << "packet(" << sequence_number << "): " << std::endl |
| 1370 << QuicUtils::StringToHexASCIIDump( | 1382 << QuicUtils::StringToHexASCIIDump(packet.packet->AsStringPiece()); |
| 1371 packet.serialized_packet.packet->AsStringPiece()); | |
| 1372 | 1383 |
| 1373 WriteResult result = writer_->WritePacket(encrypted->data(), | 1384 WriteResult result = writer_->WritePacket(encrypted->data(), |
| 1374 encrypted->length(), | 1385 encrypted->length(), |
| 1375 self_address().address(), | 1386 self_address().address(), |
| 1376 peer_address()); | 1387 peer_address()); |
| 1377 if (result.error_code == ERR_IO_PENDING) { | 1388 if (result.error_code == ERR_IO_PENDING) { |
| 1378 DCHECK_EQ(WRITE_STATUS_BLOCKED, result.status); | 1389 DCHECK_EQ(WRITE_STATUS_BLOCKED, result.status); |
| 1379 } | 1390 } |
| 1380 if (debug_visitor_.get() != NULL) { | 1391 if (debug_visitor_.get() != NULL) { |
| 1381 // Pass the write result to the visitor. | 1392 // Pass the write result to the visitor. |
| (...skipping 22 matching lines...) Expand all Loading... |
| 1404 DVLOG(1) << ENDPOINT << "time of last sent packet: " | 1415 DVLOG(1) << ENDPOINT << "time of last sent packet: " |
| 1405 << now.ToDebuggingValue(); | 1416 << now.ToDebuggingValue(); |
| 1406 | 1417 |
| 1407 // TODO(ianswett): Change the sequence number length and other packet creator | 1418 // TODO(ianswett): Change the sequence number length and other packet creator |
| 1408 // options by a more explicit API than setting a struct value directly, | 1419 // options by a more explicit API than setting a struct value directly, |
| 1409 // perhaps via the NetworkChangeVisitor. | 1420 // perhaps via the NetworkChangeVisitor. |
| 1410 packet_generator_.UpdateSequenceNumberLength( | 1421 packet_generator_.UpdateSequenceNumberLength( |
| 1411 sent_packet_manager_.least_packet_awaited_by_peer(), | 1422 sent_packet_manager_.least_packet_awaited_by_peer(), |
| 1412 sent_packet_manager_.GetCongestionWindow()); | 1423 sent_packet_manager_.GetCongestionWindow()); |
| 1413 | 1424 |
| 1414 bool reset_retransmission_alarm = sent_packet_manager_.OnPacketSent( | 1425 bool reset_retransmission_alarm = |
| 1415 sequence_number, | 1426 sent_packet_manager_.OnPacketSent(sequence_number, |
| 1416 now, | 1427 now, |
| 1417 encrypted->length(), | 1428 encrypted->length(), |
| 1418 packet.transmission_type, | 1429 packet.transmission_type, |
| 1419 IsRetransmittable(packet)); | 1430 packet.retransmittable); |
| 1420 | 1431 |
| 1421 if (reset_retransmission_alarm || !retransmission_alarm_->IsSet()) { | 1432 if (reset_retransmission_alarm || !retransmission_alarm_->IsSet()) { |
| 1422 retransmission_alarm_->Update(sent_packet_manager_.GetRetransmissionTime(), | 1433 retransmission_alarm_->Update(sent_packet_manager_.GetRetransmissionTime(), |
| 1423 QuicTime::Delta::FromMilliseconds(1)); | 1434 QuicTime::Delta::FromMilliseconds(1)); |
| 1424 } | 1435 } |
| 1425 | 1436 |
| 1426 stats_.bytes_sent += result.bytes_written; | 1437 stats_.bytes_sent += result.bytes_written; |
| 1427 ++stats_.packets_sent; | 1438 ++stats_.packets_sent; |
| 1428 if (packet.transmission_type != NOT_RETRANSMISSION) { | 1439 if (packet.transmission_type != NOT_RETRANSMISSION) { |
| 1429 stats_.bytes_retransmitted += result.bytes_written; | 1440 stats_.bytes_retransmitted += result.bytes_written; |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1505 visitor_->OnCongestionWindowChange(clock_->ApproximateNow()); | 1516 visitor_->OnCongestionWindowChange(clock_->ApproximateNow()); |
| 1506 } | 1517 } |
| 1507 | 1518 |
| 1508 void QuicConnection::OnHandshakeComplete() { | 1519 void QuicConnection::OnHandshakeComplete() { |
| 1509 sent_packet_manager_.SetHandshakeConfirmed(); | 1520 sent_packet_manager_.SetHandshakeConfirmed(); |
| 1510 } | 1521 } |
| 1511 | 1522 |
| 1512 bool QuicConnection::SendOrQueuePacket(EncryptionLevel level, | 1523 bool QuicConnection::SendOrQueuePacket(EncryptionLevel level, |
| 1513 const SerializedPacket& packet, | 1524 const SerializedPacket& packet, |
| 1514 TransmissionType transmission_type) { | 1525 TransmissionType transmission_type) { |
| 1515 // The caller of this function is responsible for checking CanWrite(). | |
| 1516 if (packet.packet == NULL) { | 1526 if (packet.packet == NULL) { |
| 1517 LOG(DFATAL) << "NULL packet passed in to SendOrQueuePacket"; | 1527 LOG(DFATAL) << "NULL packet passed in to SendOrQueuePacket"; |
| 1518 return true; | 1528 return true; |
| 1519 } | 1529 } |
| 1520 | 1530 |
| 1521 sent_entropy_manager_.RecordPacketEntropyHash(packet.sequence_number, | 1531 sent_entropy_manager_.RecordPacketEntropyHash(packet.sequence_number, |
| 1522 packet.entropy_hash); | 1532 packet.entropy_hash); |
| 1523 QueuedPacket queued_packet(packet, level, transmission_type); | 1533 QueuedPacket queued_packet(packet, level, transmission_type); |
| 1524 // If there are already queued packets, put this at the end, | 1534 // If there are already queued packets, put this at the end, |
| 1525 // unless it's ConnectionClose, in which case it is written immediately. | 1535 // unless it's ConnectionClose, in which case it is written immediately. |
| 1526 if ((IsConnectionClose(queued_packet) | 1536 if ((queued_packet.type == CONNECTION_CLOSE || queued_packets_.empty()) && |
| 1527 || queued_packets_.empty()) && | |
| 1528 WritePacket(queued_packet)) { | 1537 WritePacket(queued_packet)) { |
| 1529 delete packet.packet; | 1538 delete packet.packet; |
| 1530 return true; | 1539 return true; |
| 1531 } | 1540 } |
| 1541 queued_packet.type = QUEUED; |
| 1532 queued_packets_.push_back(queued_packet); | 1542 queued_packets_.push_back(queued_packet); |
| 1533 return false; | 1543 return false; |
| 1534 } | 1544 } |
| 1535 | 1545 |
| 1536 void QuicConnection::UpdateStopWaiting(QuicStopWaitingFrame* stop_waiting) { | 1546 void QuicConnection::UpdateStopWaiting(QuicStopWaitingFrame* stop_waiting) { |
| 1537 stop_waiting->least_unacked = GetLeastUnacked(); | 1547 stop_waiting->least_unacked = GetLeastUnacked(); |
| 1538 stop_waiting->entropy_hash = sent_entropy_manager_.GetCumulativeEntropy( | 1548 stop_waiting->entropy_hash = sent_entropy_manager_.GetCumulativeEntropy( |
| 1539 stop_waiting->least_unacked - 1); | 1549 stop_waiting->least_unacked - 1); |
| 1540 } | 1550 } |
| 1541 | 1551 |
| (...skipping 432 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1974 } | 1984 } |
| 1975 // If we changed the generator's batch state, restore original batch state. | 1985 // If we changed the generator's batch state, restore original batch state. |
| 1976 if (!already_in_batch_mode_) { | 1986 if (!already_in_batch_mode_) { |
| 1977 DVLOG(1) << "Leaving Batch Mode."; | 1987 DVLOG(1) << "Leaving Batch Mode."; |
| 1978 connection_->packet_generator_.FinishBatchOperations(); | 1988 connection_->packet_generator_.FinishBatchOperations(); |
| 1979 } | 1989 } |
| 1980 DCHECK_EQ(already_in_batch_mode_, | 1990 DCHECK_EQ(already_in_batch_mode_, |
| 1981 connection_->packet_generator_.InBatchMode()); | 1991 connection_->packet_generator_.InBatchMode()); |
| 1982 } | 1992 } |
| 1983 | 1993 |
| 1984 HasRetransmittableData QuicConnection::IsRetransmittable( | |
| 1985 QueuedPacket packet) { | |
| 1986 // TODO(cyr): Understand why the first check here is necessary. Without it, | |
| 1987 // DiscardRetransmit test fails. | |
| 1988 if (packet.transmission_type != NOT_RETRANSMISSION || | |
| 1989 packet.serialized_packet.retransmittable_frames != NULL) { | |
| 1990 return HAS_RETRANSMITTABLE_DATA; | |
| 1991 } else { | |
| 1992 return NO_RETRANSMITTABLE_DATA; | |
| 1993 } | |
| 1994 } | |
| 1995 | |
| 1996 bool QuicConnection::IsConnectionClose( | |
| 1997 QueuedPacket packet) { | |
| 1998 RetransmittableFrames* retransmittable_frames = | |
| 1999 packet.serialized_packet.retransmittable_frames; | |
| 2000 if (!retransmittable_frames) { | |
| 2001 return false; | |
| 2002 } | |
| 2003 for (size_t i = 0; i < retransmittable_frames->frames().size(); ++i) { | |
| 2004 if (retransmittable_frames->frames()[i].type == CONNECTION_CLOSE_FRAME) { | |
| 2005 return true; | |
| 2006 } | |
| 2007 } | |
| 2008 return false; | |
| 2009 } | |
| 2010 | |
| 2011 } // namespace net | 1994 } // namespace net |
| OLD | NEW |