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

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

Issue 1331053003: Landing Recent QUIC changes until 8/28/2015 18:03 UTC. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@Final_0909_1
Patch Set: use iterator for begin and end methods of PacketNumberQueue Created 5 years, 3 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_logger.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 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
200 class MtuDiscoveryAckListener : public QuicAckNotifier::DelegateInterface { 200 class MtuDiscoveryAckListener : public QuicAckNotifier::DelegateInterface {
201 public: 201 public:
202 MtuDiscoveryAckListener(QuicConnection* connection, QuicByteCount probe_size) 202 MtuDiscoveryAckListener(QuicConnection* connection, QuicByteCount probe_size)
203 : connection_(connection), probe_size_(probe_size) {} 203 : connection_(connection), probe_size_(probe_size) {}
204 204
205 void OnAckNotification(int /*num_retransmittable_packets*/, 205 void OnAckNotification(int /*num_retransmittable_packets*/,
206 int /*num_retransmittable_bytes*/, 206 int /*num_retransmittable_bytes*/,
207 QuicTime::Delta /*delta_largest_observed*/) override { 207 QuicTime::Delta /*delta_largest_observed*/) override {
208 // Since the probe was successful, increase the maximum packet size to that. 208 // Since the probe was successful, increase the maximum packet size to that.
209 if (probe_size_ > connection_->max_packet_length()) { 209 if (probe_size_ > connection_->max_packet_length()) {
210 connection_->set_max_packet_length(probe_size_); 210 connection_->SetMaxPacketLength(probe_size_);
211 } 211 }
212 } 212 }
213 213
214 protected: 214 protected:
215 // MtuDiscoveryAckListener is ref counted. 215 // MtuDiscoveryAckListener is ref counted.
216 ~MtuDiscoveryAckListener() override {} 216 ~MtuDiscoveryAckListener() override {}
217 217
218 private: 218 private:
219 QuicConnection* connection_; 219 QuicConnection* connection_;
220 QuicByteCount probe_size_; 220 QuicByteCount probe_size_;
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
320 next_mtu_probe_at_(kPacketsBetweenMtuProbesBase), 320 next_mtu_probe_at_(kPacketsBetweenMtuProbesBase),
321 largest_received_packet_size_(0), 321 largest_received_packet_size_(0),
322 goaway_sent_(false), 322 goaway_sent_(false),
323 goaway_received_(false) { 323 goaway_received_(false) {
324 DVLOG(1) << ENDPOINT << "Created connection with connection_id: " 324 DVLOG(1) << ENDPOINT << "Created connection with connection_id: "
325 << connection_id; 325 << connection_id;
326 framer_.set_visitor(this); 326 framer_.set_visitor(this);
327 framer_.set_received_entropy_calculator(&received_packet_manager_); 327 framer_.set_received_entropy_calculator(&received_packet_manager_);
328 stats_.connection_creation_time = clock_->ApproximateNow(); 328 stats_.connection_creation_time = clock_->ApproximateNow();
329 sent_packet_manager_.set_network_change_visitor(this); 329 sent_packet_manager_.set_network_change_visitor(this);
330 if (perspective_ == Perspective::IS_SERVER) { 330 // Allow the packet writer to potentially reduce the packet size to a value
331 set_max_packet_length(kDefaultServerMaxPacketSize); 331 // even smaller than kDefaultMaxPacketSize.
332 } 332 SetMaxPacketLength(perspective_ == Perspective::IS_SERVER
333 ? kDefaultServerMaxPacketSize
334 : kDefaultMaxPacketSize);
333 } 335 }
334 336
335 QuicConnection::~QuicConnection() { 337 QuicConnection::~QuicConnection() {
336 if (owns_writer_) { 338 if (owns_writer_) {
337 delete writer_; 339 delete writer_;
338 } 340 }
339 STLDeleteElements(&undecryptable_packets_); 341 STLDeleteElements(&undecryptable_packets_);
340 STLDeleteValues(&group_map_); 342 STLDeleteValues(&group_map_);
341 ClearQueuedPackets(); 343 ClearQueuedPackets();
342 } 344 }
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
374 packet_generator_.set_fec_send_policy(FecSendPolicy::FEC_ALARM_TRIGGER); 376 packet_generator_.set_fec_send_policy(FecSendPolicy::FEC_ALARM_TRIGGER);
375 } 377 }
376 if (config.HasClientSentConnectionOption(kFRTT, perspective_)) { 378 if (config.HasClientSentConnectionOption(kFRTT, perspective_)) {
377 // TODO(rtenneti): Delete this code after the 0.25 RTT FEC experiment. 379 // TODO(rtenneti): Delete this code after the 0.25 RTT FEC experiment.
378 const float kFecTimeoutRttMultiplier = 0.25; 380 const float kFecTimeoutRttMultiplier = 0.25;
379 packet_generator_.set_rtt_multiplier_for_fec_timeout( 381 packet_generator_.set_rtt_multiplier_for_fec_timeout(
380 kFecTimeoutRttMultiplier); 382 kFecTimeoutRttMultiplier);
381 } 383 }
382 384
383 if (config.HasClientSentConnectionOption(kMTUH, perspective_)) { 385 if (config.HasClientSentConnectionOption(kMTUH, perspective_)) {
384 mtu_discovery_target_ = kMtuDiscoveryTargetPacketSizeHigh; 386 SetMtuDiscoveryTarget(kMtuDiscoveryTargetPacketSizeHigh);
385 } 387 }
386 if (config.HasClientSentConnectionOption(kMTUL, perspective_)) { 388 if (config.HasClientSentConnectionOption(kMTUL, perspective_)) {
387 mtu_discovery_target_ = kMtuDiscoveryTargetPacketSizeLow; 389 SetMtuDiscoveryTarget(kMtuDiscoveryTargetPacketSizeLow);
388 } 390 }
389 } 391 }
390 392
391 void QuicConnection::OnSendConnectionState( 393 void QuicConnection::OnSendConnectionState(
392 const CachedNetworkParameters& cached_network_params) { 394 const CachedNetworkParameters& cached_network_params) {
393 if (debug_visitor_ != nullptr) { 395 if (debug_visitor_ != nullptr) {
394 debug_visitor_->OnSendConnectionState(cached_network_params); 396 debug_visitor_->OnSendConnectionState(cached_network_params);
395 } 397 }
396 } 398 }
397 399
(...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after
739 if (!ValidateAckFrame(incoming_ack)) { 741 if (!ValidateAckFrame(incoming_ack)) {
740 SendConnectionClose(QUIC_INVALID_ACK_DATA); 742 SendConnectionClose(QUIC_INVALID_ACK_DATA);
741 return false; 743 return false;
742 } 744 }
743 745
744 if (FLAGS_quic_process_frames_inline) { 746 if (FLAGS_quic_process_frames_inline) {
745 ProcessAckFrame(incoming_ack); 747 ProcessAckFrame(incoming_ack);
746 if (incoming_ack.is_truncated) { 748 if (incoming_ack.is_truncated) {
747 should_last_packet_instigate_acks_ = true; 749 should_last_packet_instigate_acks_ = true;
748 } 750 }
749 if (!incoming_ack.missing_packets.empty() && 751 if (!incoming_ack.missing_packets.Empty() &&
750 GetLeastUnacked() > *incoming_ack.missing_packets.begin()) { 752 GetLeastUnacked() > incoming_ack.missing_packets.Min()) {
751 ++stop_waiting_count_; 753 ++stop_waiting_count_;
752 } else { 754 } else {
753 stop_waiting_count_ = 0; 755 stop_waiting_count_ = 0;
754 } 756 }
755 } else { 757 } else {
756 last_ack_frames_.push_back(incoming_ack); 758 last_ack_frames_.push_back(incoming_ack);
757 } 759 }
758 return connected_; 760 return connected_;
759 } 761 }
760 762
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
824 826
825 if (incoming_ack.largest_observed < sent_packet_manager_.largest_observed()) { 827 if (incoming_ack.largest_observed < sent_packet_manager_.largest_observed()) {
826 DLOG(ERROR) << ENDPOINT << "Peer's largest_observed packet decreased:" 828 DLOG(ERROR) << ENDPOINT << "Peer's largest_observed packet decreased:"
827 << incoming_ack.largest_observed << " vs " 829 << incoming_ack.largest_observed << " vs "
828 << sent_packet_manager_.largest_observed(); 830 << sent_packet_manager_.largest_observed();
829 // A new ack has a diminished largest_observed value. Error out. 831 // A new ack has a diminished largest_observed value. Error out.
830 // If this was an old packet, we wouldn't even have checked. 832 // If this was an old packet, we wouldn't even have checked.
831 return false; 833 return false;
832 } 834 }
833 835
834 if (!incoming_ack.missing_packets.empty() && 836 if (!incoming_ack.missing_packets.Empty() &&
835 *incoming_ack.missing_packets.rbegin() > incoming_ack.largest_observed) { 837 incoming_ack.missing_packets.Max() > incoming_ack.largest_observed) {
836 DLOG(ERROR) << ENDPOINT << "Peer sent missing packet: " 838 DLOG(ERROR) << ENDPOINT << "Peer sent missing packet: "
837 << *incoming_ack.missing_packets.rbegin() 839 << incoming_ack.missing_packets.Max()
838 << " which is greater than largest observed: " 840 << " which is greater than largest observed: "
839 << incoming_ack.largest_observed; 841 << incoming_ack.largest_observed;
840 return false; 842 return false;
841 } 843 }
842 844
843 if (!incoming_ack.missing_packets.empty() && 845 if (!incoming_ack.missing_packets.Empty() &&
844 *incoming_ack.missing_packets.begin() < 846 incoming_ack.missing_packets.Min() <
845 sent_packet_manager_.least_packet_awaited_by_peer()) { 847 sent_packet_manager_.least_packet_awaited_by_peer()) {
846 DLOG(ERROR) << ENDPOINT << "Peer sent missing packet: " 848 DLOG(ERROR) << ENDPOINT << "Peer sent missing packet: "
847 << *incoming_ack.missing_packets.begin() 849 << incoming_ack.missing_packets.Min()
848 << " which is smaller than least_packet_awaited_by_peer_: " 850 << " which is smaller than least_packet_awaited_by_peer_: "
849 << sent_packet_manager_.least_packet_awaited_by_peer(); 851 << sent_packet_manager_.least_packet_awaited_by_peer();
850 return false; 852 return false;
851 } 853 }
852 854
853 if (!sent_entropy_manager_.IsValidEntropy( 855 if (!sent_entropy_manager_.IsValidEntropy(
854 incoming_ack.largest_observed, 856 incoming_ack.largest_observed,
855 incoming_ack.missing_packets, 857 incoming_ack.missing_packets,
856 incoming_ack.entropy_hash)) { 858 incoming_ack.entropy_hash)) {
857 DLOG(ERROR) << ENDPOINT << "Peer sent invalid entropy."; 859 DLOG(ERROR) << ENDPOINT << "Peer sent invalid entropy.";
858 return false; 860 return false;
859 } 861 }
860 862
861 for (QuicPacketNumber revived_packet : incoming_ack.revived_packets) { 863 for (QuicPacketNumber revived_packet : incoming_ack.revived_packets) {
862 if (!ContainsKey(incoming_ack.missing_packets, revived_packet)) { 864 if (!incoming_ack.missing_packets.Contains(revived_packet)) {
863 DLOG(ERROR) << ENDPOINT 865 DLOG(ERROR) << ENDPOINT
864 << "Peer specified revived packet which was not missing."; 866 << "Peer specified revived packet which was not missing.";
865 return false; 867 return false;
866 } 868 }
867 } 869 }
868 return true; 870 return true;
869 } 871 }
870 872
871 bool QuicConnection::ValidateStopWaitingFrame( 873 bool QuicConnection::ValidateStopWaitingFrame(
872 const QuicStopWaitingFrame& stop_waiting) { 874 const QuicStopWaitingFrame& stop_waiting) {
(...skipping 25 matching lines...) Expand all
898 group->UpdateFec(last_decrypted_packet_level_, 900 group->UpdateFec(last_decrypted_packet_level_,
899 last_header_.packet_packet_number, fec); 901 last_header_.packet_packet_number, fec);
900 } 902 }
901 } 903 }
902 904
903 bool QuicConnection::OnRstStreamFrame(const QuicRstStreamFrame& frame) { 905 bool QuicConnection::OnRstStreamFrame(const QuicRstStreamFrame& frame) {
904 DCHECK(connected_); 906 DCHECK(connected_);
905 if (debug_visitor_ != nullptr) { 907 if (debug_visitor_ != nullptr) {
906 debug_visitor_->OnRstStreamFrame(frame); 908 debug_visitor_->OnRstStreamFrame(frame);
907 } 909 }
908 DVLOG(1) << ENDPOINT << "Stream reset with error " 910 DVLOG(1) << ENDPOINT
911 << "RST_STREAM_FRAME received for stream: " << frame.stream_id
912 << " with error: "
909 << QuicUtils::StreamErrorToString(frame.error_code); 913 << QuicUtils::StreamErrorToString(frame.error_code);
910 if (FLAGS_quic_process_frames_inline) { 914 if (FLAGS_quic_process_frames_inline) {
911 visitor_->OnRstStream(frame); 915 visitor_->OnRstStream(frame);
912 should_last_packet_instigate_acks_ = true; 916 should_last_packet_instigate_acks_ = true;
913 } else { 917 } else {
914 last_rst_frames_.push_back(frame); 918 last_rst_frames_.push_back(frame);
915 } 919 }
916 return connected_; 920 return connected_;
917 } 921 }
918 922
919 bool QuicConnection::OnConnectionCloseFrame( 923 bool QuicConnection::OnConnectionCloseFrame(
920 const QuicConnectionCloseFrame& frame) { 924 const QuicConnectionCloseFrame& frame) {
921 DCHECK(connected_); 925 DCHECK(connected_);
922 if (debug_visitor_ != nullptr) { 926 if (debug_visitor_ != nullptr) {
923 debug_visitor_->OnConnectionCloseFrame(frame); 927 debug_visitor_->OnConnectionCloseFrame(frame);
924 } 928 }
925 DVLOG(1) << ENDPOINT << "Connection " << connection_id() 929 DVLOG(1) << ENDPOINT << "CONNECTION_CLOSE_FRAME received for connection: "
926 << " closed with error " 930 << connection_id()
927 << QuicUtils::ErrorToString(frame.error_code) 931 << " with error: " << QuicUtils::ErrorToString(frame.error_code)
928 << " " << frame.error_details; 932 << " " << frame.error_details;
929 if (FLAGS_quic_process_frames_inline) { 933 if (FLAGS_quic_process_frames_inline) {
930 CloseConnection(frame.error_code, true); 934 CloseConnection(frame.error_code, true);
931 } else { 935 } else {
932 last_close_frames_.push_back(frame); 936 last_close_frames_.push_back(frame);
933 } 937 }
934 return connected_; 938 return connected_;
935 } 939 }
936 940
937 bool QuicConnection::OnGoAwayFrame(const QuicGoAwayFrame& frame) { 941 bool QuicConnection::OnGoAwayFrame(const QuicGoAwayFrame& frame) {
938 DCHECK(connected_); 942 DCHECK(connected_);
939 if (debug_visitor_ != nullptr) { 943 if (debug_visitor_ != nullptr) {
940 debug_visitor_->OnGoAwayFrame(frame); 944 debug_visitor_->OnGoAwayFrame(frame);
941 } 945 }
942 DVLOG(1) << ENDPOINT << "Go away received with error " 946 DVLOG(1) << ENDPOINT << "GOAWAY_FRAME received with last good stream: "
943 << QuicUtils::ErrorToString(frame.error_code) 947 << frame.last_good_stream_id
944 << " and reason:" << frame.reason_phrase; 948 << " and error: " << QuicUtils::ErrorToString(frame.error_code)
949 << " and reason: " << frame.reason_phrase;
945 950
946 goaway_received_ = true; 951 goaway_received_ = true;
947 if (FLAGS_quic_process_frames_inline) { 952 if (FLAGS_quic_process_frames_inline) {
948 visitor_->OnGoAway(frame); 953 visitor_->OnGoAway(frame);
949 should_last_packet_instigate_acks_ = true; 954 should_last_packet_instigate_acks_ = true;
950 } else { 955 } else {
951 last_goaway_frames_.push_back(frame); 956 last_goaway_frames_.push_back(frame);
952 } 957 }
953 return connected_; 958 return connected_;
954 } 959 }
955 960
956 bool QuicConnection::OnWindowUpdateFrame(const QuicWindowUpdateFrame& frame) { 961 bool QuicConnection::OnWindowUpdateFrame(const QuicWindowUpdateFrame& frame) {
957 DCHECK(connected_); 962 DCHECK(connected_);
958 if (debug_visitor_ != nullptr) { 963 if (debug_visitor_ != nullptr) {
959 debug_visitor_->OnWindowUpdateFrame(frame); 964 debug_visitor_->OnWindowUpdateFrame(frame);
960 } 965 }
961 DVLOG(1) << ENDPOINT << "WindowUpdate received for stream: " 966 DVLOG(1) << ENDPOINT
962 << frame.stream_id << " with byte offset: " << frame.byte_offset; 967 << "WINDOW_UPDATE_FRAME received for stream: " << frame.stream_id
968 << " with byte offset: " << frame.byte_offset;
963 if (FLAGS_quic_process_frames_inline) { 969 if (FLAGS_quic_process_frames_inline) {
964 visitor_->OnWindowUpdateFrame(frame); 970 visitor_->OnWindowUpdateFrame(frame);
965 should_last_packet_instigate_acks_ = true; 971 should_last_packet_instigate_acks_ = true;
966 } else { 972 } else {
967 last_window_update_frames_.push_back(frame); 973 last_window_update_frames_.push_back(frame);
968 } 974 }
969 return connected_; 975 return connected_;
970 } 976 }
971 977
972 bool QuicConnection::OnBlockedFrame(const QuicBlockedFrame& frame) { 978 bool QuicConnection::OnBlockedFrame(const QuicBlockedFrame& frame) {
973 DCHECK(connected_); 979 DCHECK(connected_);
974 if (debug_visitor_ != nullptr) { 980 if (debug_visitor_ != nullptr) {
975 debug_visitor_->OnBlockedFrame(frame); 981 debug_visitor_->OnBlockedFrame(frame);
976 } 982 }
977 DVLOG(1) << ENDPOINT << "Blocked frame received for stream: " 983 DVLOG(1) << ENDPOINT
978 << frame.stream_id; 984 << "BLOCKED_FRAME received for stream: " << frame.stream_id;
979 if (FLAGS_quic_process_frames_inline) { 985 if (FLAGS_quic_process_frames_inline) {
980 visitor_->OnBlockedFrame(frame); 986 visitor_->OnBlockedFrame(frame);
981 should_last_packet_instigate_acks_ = true; 987 should_last_packet_instigate_acks_ = true;
982 } else { 988 } else {
983 last_blocked_frames_.push_back(frame); 989 last_blocked_frames_.push_back(frame);
984 } 990 }
985 return connected_; 991 return connected_;
986 } 992 }
987 993
988 void QuicConnection::OnPacketComplete() { 994 void QuicConnection::OnPacketComplete() {
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
1184 return false; 1190 return false;
1185 } 1191 }
1186 1192
1187 void QuicConnection::UpdateStopWaitingCount() { 1193 void QuicConnection::UpdateStopWaitingCount() {
1188 if (last_ack_frames_.empty()) { 1194 if (last_ack_frames_.empty()) {
1189 return; 1195 return;
1190 } 1196 }
1191 1197
1192 // If the peer is still waiting for a packet that we are no longer planning to 1198 // If the peer is still waiting for a packet that we are no longer planning to
1193 // send, send an ack to raise the high water mark. 1199 // send, send an ack to raise the high water mark.
1194 if (!last_ack_frames_.back().missing_packets.empty() && 1200 if (!last_ack_frames_.back().missing_packets.Empty() &&
1195 GetLeastUnacked() > *last_ack_frames_.back().missing_packets.begin()) { 1201 GetLeastUnacked() > last_ack_frames_.back().missing_packets.Min()) {
1196 ++stop_waiting_count_; 1202 ++stop_waiting_count_;
1197 } else { 1203 } else {
1198 stop_waiting_count_ = 0; 1204 stop_waiting_count_ = 0;
1199 } 1205 }
1200 } 1206 }
1201 1207
1202 QuicPacketNumber QuicConnection::GetLeastUnacked() const { 1208 QuicPacketNumber QuicConnection::GetLeastUnacked() const {
1203 return sent_packet_manager_.GetLeastUnacked(); 1209 return sent_packet_manager_.GetLeastUnacked();
1204 } 1210 }
1205 1211
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after
1410 1416
1411 // Store in case we want to migrate connection in ProcessValidatedPacket. 1417 // Store in case we want to migrate connection in ProcessValidatedPacket.
1412 migrating_peer_ip_ = peer_address.address(); 1418 migrating_peer_ip_ = peer_address.address();
1413 migrating_peer_port_ = peer_address.port(); 1419 migrating_peer_port_ = peer_address.port();
1414 } 1420 }
1415 1421
1416 if (!self_address.address().empty() && !self_address_.address().empty()) { 1422 if (!self_address.address().empty() && !self_address_.address().empty()) {
1417 self_ip_changed_ = (self_address.address() != self_address_.address()); 1423 self_ip_changed_ = (self_address.address() != self_address_.address());
1418 self_port_changed_ = (self_address.port() != self_address_.port()); 1424 self_port_changed_ = (self_address.port() != self_address_.port());
1419 } 1425 }
1426
1427 // TODO(vasilvv): reset maximum packet size on connection migration. Whenever
1428 // the connection is migrated, it usually ends up being on a different path,
1429 // with possibly smaller MTU. This means the max packet size has to be reset
1430 // and MTU discovery mechanism re-initialized. The main reason the code does
1431 // not do it now is that the retransmission code currently cannot deal with
1432 // the case when it needs to resend a packet created with larger MTU (see
1433 // b/22172803).
1420 } 1434 }
1421 1435
1422 void QuicConnection::OnCanWrite() { 1436 void QuicConnection::OnCanWrite() {
1423 DCHECK(!writer_->IsWriteBlocked()); 1437 DCHECK(!writer_->IsWriteBlocked());
1424 1438
1425 WriteQueuedPackets(); 1439 WriteQueuedPackets();
1426 WritePendingRetransmissions(); 1440 WritePendingRetransmissions();
1427 1441
1428 // Sending queued packets may have caused the socket to become write blocked, 1442 // Sending queued packets may have caused the socket to become write blocked,
1429 // or the congestion manager to prohibit sending. If we've sent everything 1443 // or the congestion manager to prohibit sending. If we've sent everything
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
1484 DVLOG(1) << ENDPOINT << "time of last received packet: " 1498 DVLOG(1) << ENDPOINT << "time of last received packet: "
1485 << time_of_last_received_packet_.ToDebuggingValue(); 1499 << time_of_last_received_packet_.ToDebuggingValue();
1486 1500
1487 if (last_size_ > largest_received_packet_size_) { 1501 if (last_size_ > largest_received_packet_size_) {
1488 largest_received_packet_size_ = last_size_; 1502 largest_received_packet_size_ = last_size_;
1489 } 1503 }
1490 1504
1491 if (perspective_ == Perspective::IS_SERVER && 1505 if (perspective_ == Perspective::IS_SERVER &&
1492 encryption_level_ == ENCRYPTION_NONE && 1506 encryption_level_ == ENCRYPTION_NONE &&
1493 last_size_ > packet_generator_.GetMaxPacketLength()) { 1507 last_size_ > packet_generator_.GetMaxPacketLength()) {
1494 set_max_packet_length(last_size_); 1508 SetMaxPacketLength(last_size_);
1495 } 1509 }
1496 return true; 1510 return true;
1497 } 1511 }
1498 1512
1499 void QuicConnection::WriteQueuedPackets() { 1513 void QuicConnection::WriteQueuedPackets() {
1500 DCHECK(!writer_->IsWriteBlocked()); 1514 DCHECK(!writer_->IsWriteBlocked());
1501 1515
1502 if (pending_version_negotiation_packet_) { 1516 if (pending_version_negotiation_packet_) {
1503 SendVersionNegotiationPacket(); 1517 SendVersionNegotiationPacket();
1504 } 1518 }
(...skipping 631 matching lines...) Expand 10 before | Expand all | Expand 10 after
2136 group_map_.erase(it); 2150 group_map_.erase(it);
2137 delete fec_group; 2151 delete fec_group;
2138 it = next; 2152 it = next;
2139 } 2153 }
2140 } 2154 }
2141 2155
2142 QuicByteCount QuicConnection::max_packet_length() const { 2156 QuicByteCount QuicConnection::max_packet_length() const {
2143 return packet_generator_.GetMaxPacketLength(); 2157 return packet_generator_.GetMaxPacketLength();
2144 } 2158 }
2145 2159
2146 void QuicConnection::set_max_packet_length(QuicByteCount length) { 2160 void QuicConnection::SetMaxPacketLength(QuicByteCount length) {
2147 return packet_generator_.SetMaxPacketLength(length, /*force=*/false); 2161 return packet_generator_.SetMaxPacketLength(LimitMaxPacketSize(length),
2162 /*force=*/false);
2148 } 2163 }
2149 2164
2150 bool QuicConnection::HasQueuedData() const { 2165 bool QuicConnection::HasQueuedData() const {
2151 return pending_version_negotiation_packet_ || 2166 return pending_version_negotiation_packet_ ||
2152 !queued_packets_.empty() || packet_generator_.HasQueuedFrames(); 2167 !queued_packets_.empty() || packet_generator_.HasQueuedFrames();
2153 } 2168 }
2154 2169
2155 bool QuicConnection::CanWriteStreamData() { 2170 bool QuicConnection::CanWriteStreamData() {
2156 // Don't write stream data if there are negotiation or queued data packets 2171 // Don't write stream data if there are negotiation or queued data packets
2157 // to send. Otherwise, continue and bundle as many frames as possible. 2172 // to send. Otherwise, continue and bundle as many frames as possible.
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
2367 return false; 2382 return false;
2368 } 2383 }
2369 for (const QuicFrame& frame : retransmittable_frames->frames()) { 2384 for (const QuicFrame& frame : retransmittable_frames->frames()) {
2370 if (frame.type == CONNECTION_CLOSE_FRAME) { 2385 if (frame.type == CONNECTION_CLOSE_FRAME) {
2371 return true; 2386 return true;
2372 } 2387 }
2373 } 2388 }
2374 return false; 2389 return false;
2375 } 2390 }
2376 2391
2392 void QuicConnection::SetMtuDiscoveryTarget(QuicByteCount target) {
2393 mtu_discovery_target_ = LimitMaxPacketSize(target);
2394 }
2395
2396 QuicByteCount QuicConnection::LimitMaxPacketSize(
2397 QuicByteCount suggested_max_packet_size) {
2398 if (FLAGS_quic_allow_oversized_packets_for_test) {
2399 return suggested_max_packet_size;
2400 }
2401
2402 if (!FLAGS_quic_limit_mtu_by_writer) {
2403 return suggested_max_packet_size;
2404 }
2405
2406 if (peer_address_.address().empty()) {
2407 LOG(DFATAL) << "Attempted to use a connection without a valid peer address";
2408 return suggested_max_packet_size;
2409 }
2410
2411 const QuicByteCount writer_limit = writer_->GetMaxPacketSize(peer_address());
2412
2413 QuicByteCount max_packet_size = suggested_max_packet_size;
2414 if (max_packet_size > writer_limit) {
2415 max_packet_size = writer_limit;
2416 }
2417 if (max_packet_size > kMaxPacketSize) {
2418 max_packet_size = kMaxPacketSize;
2419 }
2420 return max_packet_size;
2421 }
2422
2377 void QuicConnection::SendMtuDiscoveryPacket(QuicByteCount target_mtu) { 2423 void QuicConnection::SendMtuDiscoveryPacket(QuicByteCount target_mtu) {
2424 // Currently, this limit is ensured by the caller.
2425 DCHECK_EQ(target_mtu, LimitMaxPacketSize(target_mtu));
2426
2378 // Create a listener for the new probe. The ownership of the listener is 2427 // Create a listener for the new probe. The ownership of the listener is
2379 // transferred to the AckNotifierManager. The notifier will get destroyed 2428 // transferred to the AckNotifierManager. The notifier will get destroyed
2380 // before the connection (because it's stored in one of the connection's 2429 // before the connection (because it's stored in one of the connection's
2381 // subfields), hence |this| pointer is guaranteed to stay valid at all times. 2430 // subfields), hence |this| pointer is guaranteed to stay valid at all times.
2382 scoped_refptr<MtuDiscoveryAckListener> last_mtu_discovery_ack_listener( 2431 scoped_refptr<MtuDiscoveryAckListener> last_mtu_discovery_ack_listener(
2383 new MtuDiscoveryAckListener(this, target_mtu)); 2432 new MtuDiscoveryAckListener(this, target_mtu));
2384 2433
2385 // Send the probe. 2434 // Send the probe.
2386 packet_generator_.GenerateMtuDiscoveryPacket( 2435 packet_generator_.GenerateMtuDiscoveryPacket(
2387 target_mtu, last_mtu_discovery_ack_listener.get()); 2436 target_mtu, last_mtu_discovery_ack_listener.get());
(...skipping 16 matching lines...) Expand all
2404 packet_number_of_last_sent_packet_ + packets_between_mtu_probes_ + 1; 2453 packet_number_of_last_sent_packet_ + packets_between_mtu_probes_ + 1;
2405 ++mtu_probe_count_; 2454 ++mtu_probe_count_;
2406 2455
2407 DVLOG(2) << "Sending a path MTU discovery packet #" << mtu_probe_count_; 2456 DVLOG(2) << "Sending a path MTU discovery packet #" << mtu_probe_count_;
2408 SendMtuDiscoveryPacket(mtu_discovery_target_); 2457 SendMtuDiscoveryPacket(mtu_discovery_target_);
2409 2458
2410 DCHECK(!mtu_discovery_alarm_->IsSet()); 2459 DCHECK(!mtu_discovery_alarm_->IsSet());
2411 } 2460 }
2412 2461
2413 } // namespace net 2462 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_connection.h ('k') | net/quic/quic_connection_logger.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698