Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(604)

Side by Side Diff: net/quic/quic_connection.cc

Issue 1660533002: Landing Recent QUIC changes until 01/26/2016 18:14 UTC (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/quic/quic_connection.h ('k') | net/quic/quic_connection_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 9
10 #include <algorithm> 10 #include <algorithm>
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after
239 IPEndPoint address, 239 IPEndPoint address,
240 QuicConnectionHelperInterface* helper, 240 QuicConnectionHelperInterface* helper,
241 QuicPacketWriter* writer, 241 QuicPacketWriter* writer,
242 bool owns_writer, 242 bool owns_writer,
243 Perspective perspective, 243 Perspective perspective,
244 const QuicVersionVector& supported_versions) 244 const QuicVersionVector& supported_versions)
245 : framer_(supported_versions, 245 : framer_(supported_versions,
246 helper->GetClock()->ApproximateNow(), 246 helper->GetClock()->ApproximateNow(),
247 perspective), 247 perspective),
248 helper_(helper), 248 helper_(helper),
249 per_packet_options_(nullptr),
249 writer_(writer), 250 writer_(writer),
250 owns_writer_(owns_writer), 251 owns_writer_(owns_writer),
251 encryption_level_(ENCRYPTION_NONE), 252 encryption_level_(ENCRYPTION_NONE),
252 has_forward_secure_encrypter_(false), 253 has_forward_secure_encrypter_(false),
253 first_required_forward_secure_packet_(0), 254 first_required_forward_secure_packet_(0),
254 clock_(helper->GetClock()), 255 clock_(helper->GetClock()),
255 random_generator_(helper->GetRandomGenerator()), 256 random_generator_(helper->GetRandomGenerator()),
256 connection_id_(connection_id), 257 connection_id_(connection_id),
257 peer_address_(address), 258 peer_address_(address),
258 migrating_peer_port_(0), 259 migrating_peer_port_(0),
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
395 396
396 if (config.HasClientSentConnectionOption(kMTUH, perspective_)) { 397 if (config.HasClientSentConnectionOption(kMTUH, perspective_)) {
397 SetMtuDiscoveryTarget(kMtuDiscoveryTargetPacketSizeHigh); 398 SetMtuDiscoveryTarget(kMtuDiscoveryTargetPacketSizeHigh);
398 } 399 }
399 if (config.HasClientSentConnectionOption(kMTUL, perspective_)) { 400 if (config.HasClientSentConnectionOption(kMTUL, perspective_)) {
400 SetMtuDiscoveryTarget(kMtuDiscoveryTargetPacketSizeLow); 401 SetMtuDiscoveryTarget(kMtuDiscoveryTargetPacketSizeLow);
401 } 402 }
402 if (debug_visitor_ != nullptr) { 403 if (debug_visitor_ != nullptr) {
403 debug_visitor_->OnSetFromConfig(config); 404 debug_visitor_->OnSetFromConfig(config);
404 } 405 }
405 if (FLAGS_quic_ack_decimation && 406 if (config.HasClientSentConnectionOption(kACKD, perspective_)) {
406 config.HasClientSentConnectionOption(kACKD, perspective_)) {
407 ack_decimation_enabled_ = true; 407 ack_decimation_enabled_ = true;
408 } 408 }
409 } 409 }
410 410
411 void QuicConnection::OnSendConnectionState( 411 void QuicConnection::OnSendConnectionState(
412 const CachedNetworkParameters& cached_network_params) { 412 const CachedNetworkParameters& cached_network_params) {
413 if (debug_visitor_ != nullptr) { 413 if (debug_visitor_ != nullptr) {
414 debug_visitor_->OnSendConnectionState(cached_network_params); 414 debug_visitor_->OnSendConnectionState(cached_network_params);
415 } 415 }
416 } 416 }
(...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after
688 } 688 }
689 if (frame.stream_id != kCryptoStreamId && 689 if (frame.stream_id != kCryptoStreamId &&
690 last_decrypted_packet_level_ == ENCRYPTION_NONE) { 690 last_decrypted_packet_level_ == ENCRYPTION_NONE) {
691 DLOG(WARNING) << ENDPOINT 691 DLOG(WARNING) << ENDPOINT
692 << "Received an unencrypted data frame: closing connection"; 692 << "Received an unencrypted data frame: closing connection";
693 SendConnectionCloseWithDetails(QUIC_UNENCRYPTED_STREAM_DATA, 693 SendConnectionCloseWithDetails(QUIC_UNENCRYPTED_STREAM_DATA,
694 "Unencrypted stream data seen"); 694 "Unencrypted stream data seen");
695 return false; 695 return false;
696 } 696 }
697 visitor_->OnStreamFrame(frame); 697 visitor_->OnStreamFrame(frame);
698 visitor_->PostProcessAfterData();
698 stats_.stream_bytes_received += frame.frame_length; 699 stats_.stream_bytes_received += frame.frame_length;
699 should_last_packet_instigate_acks_ = true; 700 should_last_packet_instigate_acks_ = true;
700 return connected_; 701 return connected_;
701 } 702 }
702 703
703 bool QuicConnection::OnAckFrame(const QuicAckFrame& incoming_ack) { 704 bool QuicConnection::OnAckFrame(const QuicAckFrame& incoming_ack) {
704 DCHECK(connected_); 705 DCHECK(connected_);
705 if (debug_visitor_ != nullptr) { 706 if (debug_visitor_ != nullptr) {
706 debug_visitor_->OnAckFrame(incoming_ack); 707 debug_visitor_->OnAckFrame(incoming_ack);
707 } 708 }
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
821 LOG(WARNING) << ENDPOINT << "Peer sent missing packet: " 822 LOG(WARNING) << ENDPOINT << "Peer sent missing packet: "
822 << incoming_ack.missing_packets.Min() 823 << incoming_ack.missing_packets.Min()
823 << " which is smaller than least_packet_awaited_by_peer_: " 824 << " which is smaller than least_packet_awaited_by_peer_: "
824 << sent_packet_manager_.least_packet_awaited_by_peer(); 825 << sent_packet_manager_.least_packet_awaited_by_peer();
825 return "Missing packet smaller than least awaited"; 826 return "Missing packet smaller than least awaited";
826 } 827 }
827 828
828 if (!sent_entropy_manager_.IsValidEntropy(incoming_ack.largest_observed, 829 if (!sent_entropy_manager_.IsValidEntropy(incoming_ack.largest_observed,
829 incoming_ack.missing_packets, 830 incoming_ack.missing_packets,
830 incoming_ack.entropy_hash)) { 831 incoming_ack.entropy_hash)) {
831 LOG(WARNING) << ENDPOINT << "Peer sent invalid entropy."; 832 LOG(WARNING) << ENDPOINT << "Peer sent invalid entropy."
833 << " largest_observed:" << incoming_ack.largest_observed
834 << " last_received:" << last_header_.packet_number;
832 return "Invalid entropy"; 835 return "Invalid entropy";
833 } 836 }
834 837
835 if (incoming_ack.latest_revived_packet != 0 && 838 if (incoming_ack.latest_revived_packet != 0 &&
836 !incoming_ack.missing_packets.Contains( 839 !incoming_ack.missing_packets.Contains(
837 incoming_ack.latest_revived_packet)) { 840 incoming_ack.latest_revived_packet)) {
838 LOG(WARNING) << ENDPOINT 841 LOG(WARNING) << ENDPOINT
839 << "Peer specified revived packet which was not missing."; 842 << "Peer specified revived packet which was not missing."
843 << " revived_packet:" << incoming_ack.latest_revived_packet;
840 return "Invalid revived packet"; 844 return "Invalid revived packet";
841 } 845 }
842 return nullptr; 846 return nullptr;
843 } 847 }
844 848
845 const char* QuicConnection::ValidateStopWaitingFrame( 849 const char* QuicConnection::ValidateStopWaitingFrame(
846 const QuicStopWaitingFrame& stop_waiting) { 850 const QuicStopWaitingFrame& stop_waiting) {
847 if (stop_waiting.least_unacked < 851 if (stop_waiting.least_unacked <
848 received_packet_manager_.peer_least_packet_awaiting_ack()) { 852 received_packet_manager_.peer_least_packet_awaiting_ack()) {
849 DLOG(ERROR) << ENDPOINT << "Peer's sent low least_unacked: " 853 DLOG(ERROR) << ENDPOINT << "Peer's sent low least_unacked: "
(...skipping 26 matching lines...) Expand all
876 bool QuicConnection::OnRstStreamFrame(const QuicRstStreamFrame& frame) { 880 bool QuicConnection::OnRstStreamFrame(const QuicRstStreamFrame& frame) {
877 DCHECK(connected_); 881 DCHECK(connected_);
878 if (debug_visitor_ != nullptr) { 882 if (debug_visitor_ != nullptr) {
879 debug_visitor_->OnRstStreamFrame(frame); 883 debug_visitor_->OnRstStreamFrame(frame);
880 } 884 }
881 DVLOG(1) << ENDPOINT 885 DVLOG(1) << ENDPOINT
882 << "RST_STREAM_FRAME received for stream: " << frame.stream_id 886 << "RST_STREAM_FRAME received for stream: " << frame.stream_id
883 << " with error: " 887 << " with error: "
884 << QuicUtils::StreamErrorToString(frame.error_code); 888 << QuicUtils::StreamErrorToString(frame.error_code);
885 visitor_->OnRstStream(frame); 889 visitor_->OnRstStream(frame);
890 visitor_->PostProcessAfterData();
886 should_last_packet_instigate_acks_ = true; 891 should_last_packet_instigate_acks_ = true;
887 return connected_; 892 return connected_;
888 } 893 }
889 894
890 bool QuicConnection::OnConnectionCloseFrame( 895 bool QuicConnection::OnConnectionCloseFrame(
891 const QuicConnectionCloseFrame& frame) { 896 const QuicConnectionCloseFrame& frame) {
892 DCHECK(connected_); 897 DCHECK(connected_);
893 if (debug_visitor_ != nullptr) { 898 if (debug_visitor_ != nullptr) {
894 debug_visitor_->OnConnectionCloseFrame(frame); 899 debug_visitor_->OnConnectionCloseFrame(frame);
895 } 900 }
(...skipping 10 matching lines...) Expand all
906 if (debug_visitor_ != nullptr) { 911 if (debug_visitor_ != nullptr) {
907 debug_visitor_->OnGoAwayFrame(frame); 912 debug_visitor_->OnGoAwayFrame(frame);
908 } 913 }
909 DVLOG(1) << ENDPOINT << "GOAWAY_FRAME received with last good stream: " 914 DVLOG(1) << ENDPOINT << "GOAWAY_FRAME received with last good stream: "
910 << frame.last_good_stream_id 915 << frame.last_good_stream_id
911 << " and error: " << QuicUtils::ErrorToString(frame.error_code) 916 << " and error: " << QuicUtils::ErrorToString(frame.error_code)
912 << " and reason: " << frame.reason_phrase; 917 << " and reason: " << frame.reason_phrase;
913 918
914 goaway_received_ = true; 919 goaway_received_ = true;
915 visitor_->OnGoAway(frame); 920 visitor_->OnGoAway(frame);
921 visitor_->PostProcessAfterData();
916 should_last_packet_instigate_acks_ = true; 922 should_last_packet_instigate_acks_ = true;
917 return connected_; 923 return connected_;
918 } 924 }
919 925
920 bool QuicConnection::OnWindowUpdateFrame(const QuicWindowUpdateFrame& frame) { 926 bool QuicConnection::OnWindowUpdateFrame(const QuicWindowUpdateFrame& frame) {
921 DCHECK(connected_); 927 DCHECK(connected_);
922 if (debug_visitor_ != nullptr) { 928 if (debug_visitor_ != nullptr) {
923 debug_visitor_->OnWindowUpdateFrame(frame); 929 debug_visitor_->OnWindowUpdateFrame(frame);
924 } 930 }
925 DVLOG(1) << ENDPOINT 931 DVLOG(1) << ENDPOINT
926 << "WINDOW_UPDATE_FRAME received for stream: " << frame.stream_id 932 << "WINDOW_UPDATE_FRAME received for stream: " << frame.stream_id
927 << " with byte offset: " << frame.byte_offset; 933 << " with byte offset: " << frame.byte_offset;
928 visitor_->OnWindowUpdateFrame(frame); 934 visitor_->OnWindowUpdateFrame(frame);
935 visitor_->PostProcessAfterData();
929 should_last_packet_instigate_acks_ = true; 936 should_last_packet_instigate_acks_ = true;
930 return connected_; 937 return connected_;
931 } 938 }
932 939
933 bool QuicConnection::OnBlockedFrame(const QuicBlockedFrame& frame) { 940 bool QuicConnection::OnBlockedFrame(const QuicBlockedFrame& frame) {
934 DCHECK(connected_); 941 DCHECK(connected_);
935 if (debug_visitor_ != nullptr) { 942 if (debug_visitor_ != nullptr) {
936 debug_visitor_->OnBlockedFrame(frame); 943 debug_visitor_->OnBlockedFrame(frame);
937 } 944 }
938 DVLOG(1) << ENDPOINT 945 DVLOG(1) << ENDPOINT
939 << "BLOCKED_FRAME received for stream: " << frame.stream_id; 946 << "BLOCKED_FRAME received for stream: " << frame.stream_id;
940 visitor_->OnBlockedFrame(frame); 947 visitor_->OnBlockedFrame(frame);
948 visitor_->PostProcessAfterData();
941 should_last_packet_instigate_acks_ = true; 949 should_last_packet_instigate_acks_ = true;
942 return connected_; 950 return connected_;
943 } 951 }
944 952
945 bool QuicConnection::OnPathCloseFrame(const QuicPathCloseFrame& frame) { 953 bool QuicConnection::OnPathCloseFrame(const QuicPathCloseFrame& frame) {
946 DCHECK(connected_); 954 DCHECK(connected_);
947 if (debug_visitor_ != nullptr) { 955 if (debug_visitor_ != nullptr) {
948 debug_visitor_->OnPathCloseFrame(frame); 956 debug_visitor_->OnPathCloseFrame(frame);
949 } 957 }
950 DVLOG(1) << ENDPOINT 958 DVLOG(1) << ENDPOINT
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
1104 pending_version_negotiation_packet_ = true; 1112 pending_version_negotiation_packet_ = true;
1105 if (writer_->IsWriteBlocked()) { 1113 if (writer_->IsWriteBlocked()) {
1106 visitor_->OnWriteBlocked(); 1114 visitor_->OnWriteBlocked();
1107 return; 1115 return;
1108 } 1116 }
1109 DVLOG(1) << ENDPOINT << "Sending version negotiation packet: {" 1117 DVLOG(1) << ENDPOINT << "Sending version negotiation packet: {"
1110 << QuicVersionVectorToString(framer_.supported_versions()) << "}"; 1118 << QuicVersionVectorToString(framer_.supported_versions()) << "}";
1111 scoped_ptr<QuicEncryptedPacket> version_packet( 1119 scoped_ptr<QuicEncryptedPacket> version_packet(
1112 packet_generator_.SerializeVersionNegotiationPacket( 1120 packet_generator_.SerializeVersionNegotiationPacket(
1113 framer_.supported_versions())); 1121 framer_.supported_versions()));
1114 WriteResult result = 1122 WriteResult result = writer_->WritePacket(
1115 writer_->WritePacket(version_packet->data(), version_packet->length(), 1123 version_packet->data(), version_packet->length(),
1116 self_address().address().bytes(), peer_address()); 1124 self_address().address().bytes(), peer_address(), per_packet_options_);
1117 1125
1118 if (result.status == WRITE_STATUS_ERROR) { 1126 if (result.status == WRITE_STATUS_ERROR) {
1119 OnWriteError(result.error_code); 1127 OnWriteError(result.error_code);
1120 return; 1128 return;
1121 } 1129 }
1122 if (result.status == WRITE_STATUS_BLOCKED) { 1130 if (result.status == WRITE_STATUS_BLOCKED) {
1123 visitor_->OnWriteBlocked(); 1131 visitor_->OnWriteBlocked();
1124 if (writer_->IsWriteBlockedDataBuffered()) { 1132 if (writer_->IsWriteBlockedDataBuffered()) {
1125 pending_version_negotiation_packet_ = false; 1133 pending_version_negotiation_packet_ = false;
1126 } 1134 }
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
1326 // or the congestion manager to prohibit sending. If we've sent everything 1334 // or the congestion manager to prohibit sending. If we've sent everything
1327 // we had queued and we're still not blocked, let the visitor know it can 1335 // we had queued and we're still not blocked, let the visitor know it can
1328 // write more. 1336 // write more.
1329 if (!CanWrite(HAS_RETRANSMITTABLE_DATA)) { 1337 if (!CanWrite(HAS_RETRANSMITTABLE_DATA)) {
1330 return; 1338 return;
1331 } 1339 }
1332 1340
1333 { // Limit the scope of the bundler. ACK inclusion happens elsewhere. 1341 { // Limit the scope of the bundler. ACK inclusion happens elsewhere.
1334 ScopedPacketBundler bundler(this, NO_ACK); 1342 ScopedPacketBundler bundler(this, NO_ACK);
1335 visitor_->OnCanWrite(); 1343 visitor_->OnCanWrite();
1344 visitor_->PostProcessAfterData();
1336 } 1345 }
1337 1346
1338 // After the visitor writes, it may have caused the socket to become write 1347 // After the visitor writes, it may have caused the socket to become write
1339 // blocked or the congestion manager to prohibit sending, so check again. 1348 // blocked or the congestion manager to prohibit sending, so check again.
1340 if (visitor_->WillingAndAbleToWrite() && !resume_writes_alarm_->IsSet() && 1349 if (visitor_->WillingAndAbleToWrite() && !resume_writes_alarm_->IsSet() &&
1341 CanWrite(HAS_RETRANSMITTABLE_DATA)) { 1350 CanWrite(HAS_RETRANSMITTABLE_DATA)) {
1342 // We're not write blocked, but some stream didn't write out all of its 1351 // We're not write blocked, but some stream didn't write out all of its
1343 // bytes. Register for 'immediate' resumption so we'll keep writing after 1352 // bytes. Register for 'immediate' resumption so we'll keep writing after
1344 // other connections and events have had a chance to use the thread. 1353 // other connections and events have had a chance to use the thread.
1345 resume_writes_alarm_->Set(clock_->ApproximateNow()); 1354 resume_writes_alarm_->Set(clock_->ApproximateNow());
1346 } 1355 }
1347 } 1356 }
1348 1357
1349 void QuicConnection::WriteIfNotBlocked() { 1358 void QuicConnection::WriteIfNotBlocked() {
1350 if (!writer_->IsWriteBlocked()) { 1359 if (!writer_->IsWriteBlocked()) {
1351 OnCanWrite(); 1360 OnCanWrite();
1352 } 1361 }
1353 } 1362 }
1354 1363
1355 bool QuicConnection::ProcessValidatedPacket(const QuicPacketHeader& header) { 1364 bool QuicConnection::ProcessValidatedPacket(const QuicPacketHeader& header) {
1356 if (self_ip_changed_ || self_port_changed_) { 1365 if (self_ip_changed_ || self_port_changed_) {
1357 SendConnectionCloseWithDetails(QUIC_ERROR_MIGRATING_ADDRESS, 1366 SendConnectionCloseWithDetails(QUIC_ERROR_MIGRATING_ADDRESS,
1358 "Self address migration is not supported."); 1367 "Self address migration is not supported.");
1359 return false; 1368 return false;
1360 } 1369 }
1361 1370
1362 PeerAddressChangeType type = NO_CHANGE;
1363 if (peer_ip_changed_ || peer_port_changed_) {
1364 type = DeterminePeerAddressChangeType();
1365 if (FLAGS_quic_disable_non_nat_address_migration && type != PORT_CHANGE &&
1366 type != IPV4_SUBNET_CHANGE) {
1367 SendConnectionCloseWithDetails(QUIC_ERROR_MIGRATING_ADDRESS,
1368 "Invalid peer address migration.");
1369 return false;
1370 }
1371 }
1372
1373 if (!Near(header.packet_number, last_header_.packet_number)) { 1371 if (!Near(header.packet_number, last_header_.packet_number)) {
1374 DVLOG(1) << ENDPOINT << "Packet " << header.packet_number 1372 DVLOG(1) << ENDPOINT << "Packet " << header.packet_number
1375 << " out of bounds. Discarding"; 1373 << " out of bounds. Discarding";
1376 SendConnectionCloseWithDetails(QUIC_INVALID_PACKET_HEADER, 1374 SendConnectionCloseWithDetails(QUIC_INVALID_PACKET_HEADER,
1377 "packet number out of bounds"); 1375 "packet number out of bounds");
1378 return false; 1376 return false;
1379 } 1377 }
1380 1378
1381 // If this packet has already been seen, or the sender has told us that it 1379 // If this packet has already been seen, or the sender has told us that it
1382 // will not be retransmitted, then stop processing the packet. 1380 // will not be retransmitted, then stop processing the packet.
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
1417 visitor_->OnSuccessfulVersionNegotiation(version()); 1415 visitor_->OnSuccessfulVersionNegotiation(version());
1418 if (debug_visitor_ != nullptr) { 1416 if (debug_visitor_ != nullptr) {
1419 debug_visitor_->OnSuccessfulVersionNegotiation(version()); 1417 debug_visitor_->OnSuccessfulVersionNegotiation(version());
1420 } 1418 }
1421 } 1419 }
1422 } 1420 }
1423 1421
1424 DCHECK_EQ(NEGOTIATED_VERSION, version_negotiation_state_); 1422 DCHECK_EQ(NEGOTIATED_VERSION, version_negotiation_state_);
1425 1423
1426 if (peer_ip_changed_ || peer_port_changed_) { 1424 if (peer_ip_changed_ || peer_port_changed_) {
1425 PeerAddressChangeType type = DeterminePeerAddressChangeType();
1427 IPEndPoint old_peer_address = peer_address_; 1426 IPEndPoint old_peer_address = peer_address_;
1428 peer_address_ = IPEndPoint( 1427 peer_address_ = IPEndPoint(
1429 peer_ip_changed_ ? migrating_peer_ip_ : peer_address_.address().bytes(), 1428 peer_ip_changed_ ? migrating_peer_ip_ : peer_address_.address().bytes(),
1430 peer_port_changed_ ? migrating_peer_port_ : peer_address_.port()); 1429 peer_port_changed_ ? migrating_peer_port_ : peer_address_.port());
1431 1430
1432 DVLOG(1) << ENDPOINT << "Peer's ip:port changed from " 1431 DVLOG(1) << ENDPOINT << "Peer's ip:port changed from "
1433 << old_peer_address.ToString() << " to " 1432 << old_peer_address.ToString() << " to "
1434 << peer_address_.ToString() << ", migrating connection."; 1433 << peer_address_.ToString() << ", migrating connection.";
1435 1434
1436 visitor_->OnConnectionMigration(); 1435 visitor_->OnConnectionMigration();
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after
1637 << ", encryption level: " 1636 << ", encryption level: "
1638 << QuicUtils::EncryptionLevelToString(packet->encryption_level) 1637 << QuicUtils::EncryptionLevelToString(packet->encryption_level)
1639 << ", encrypted length:" << encrypted->length(); 1638 << ", encrypted length:" << encrypted->length();
1640 DVLOG(2) << ENDPOINT << "packet(" << packet_number << "): " << std::endl 1639 DVLOG(2) << ENDPOINT << "packet(" << packet_number << "): " << std::endl
1641 << QuicUtils::StringToHexASCIIDump(encrypted->AsStringPiece()); 1640 << QuicUtils::StringToHexASCIIDump(encrypted->AsStringPiece());
1642 1641
1643 // Measure the RTT from before the write begins to avoid underestimating the 1642 // Measure the RTT from before the write begins to avoid underestimating the
1644 // min_rtt_, especially in cases where the thread blocks or gets swapped out 1643 // min_rtt_, especially in cases where the thread blocks or gets swapped out
1645 // during the WritePacket below. 1644 // during the WritePacket below.
1646 QuicTime packet_send_time = clock_->Now(); 1645 QuicTime packet_send_time = clock_->Now();
1647 WriteResult result = 1646 WriteResult result = writer_->WritePacket(
1648 writer_->WritePacket(encrypted->data(), encrypted->length(), 1647 encrypted->data(), encrypted->length(), self_address().address().bytes(),
1649 self_address().address().bytes(), peer_address()); 1648 peer_address(), per_packet_options_);
1650 if (result.error_code == ERR_IO_PENDING) { 1649 if (result.error_code == ERR_IO_PENDING) {
1651 DCHECK_EQ(WRITE_STATUS_BLOCKED, result.status); 1650 DCHECK_EQ(WRITE_STATUS_BLOCKED, result.status);
1652 } 1651 }
1653 1652
1654 if (result.status == WRITE_STATUS_BLOCKED) { 1653 if (result.status == WRITE_STATUS_BLOCKED) {
1655 visitor_->OnWriteBlocked(); 1654 visitor_->OnWriteBlocked();
1656 // If the socket buffers the the data, then the packet should not 1655 // If the socket buffers the the data, then the packet should not
1657 // be queued and sent again, which would result in an unnecessary 1656 // be queued and sent again, which would result in an unnecessary
1658 // duplicate packet being sent. The helper must call OnCanWrite 1657 // duplicate packet being sent. The helper must call OnCanWrite
1659 // when the write completes, and OnWriteError if an error occurs. 1658 // when the write completes, and OnWriteError if an error occurs.
(...skipping 789 matching lines...) Expand 10 before | Expand all | Expand 10 after
2449 void QuicConnection::OnPathClosed(QuicPathId path_id) { 2448 void QuicConnection::OnPathClosed(QuicPathId path_id) {
2450 // Stop receiving packets on this path. 2449 // Stop receiving packets on this path.
2451 framer_.OnPathClosed(path_id); 2450 framer_.OnPathClosed(path_id);
2452 } 2451 }
2453 2452
2454 bool QuicConnection::ack_frame_updated() const { 2453 bool QuicConnection::ack_frame_updated() const {
2455 return received_packet_manager_.ack_frame_updated(); 2454 return received_packet_manager_.ack_frame_updated();
2456 } 2455 }
2457 2456
2458 } // namespace net 2457 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_connection.h ('k') | net/quic/quic_connection_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698