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 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
80 guid_(guid), | 80 guid_(guid), |
81 peer_address_(address), | 81 peer_address_(address), |
82 largest_seen_packet_with_ack_(0), | 82 largest_seen_packet_with_ack_(0), |
83 peer_largest_observed_packet_(0), | 83 peer_largest_observed_packet_(0), |
84 least_packet_awaited_by_peer_(1), | 84 least_packet_awaited_by_peer_(1), |
85 peer_least_packet_awaiting_ack_(0), | 85 peer_least_packet_awaiting_ack_(0), |
86 handling_retransmission_timeout_(false), | 86 handling_retransmission_timeout_(false), |
87 write_blocked_(false), | 87 write_blocked_(false), |
88 debug_visitor_(NULL), | 88 debug_visitor_(NULL), |
89 packet_creator_(guid_, &framer_, random_generator_, is_server), | 89 packet_creator_(guid_, &framer_, random_generator_, is_server), |
90 packet_generator_(this, &packet_creator_), | 90 packet_generator_(this, NULL, &packet_creator_), |
91 idle_network_timeout_( | 91 idle_network_timeout_( |
92 QuicTime::Delta::FromSeconds(kDefaultInitialTimeoutSecs)), | 92 QuicTime::Delta::FromSeconds(kDefaultInitialTimeoutSecs)), |
93 overall_connection_timeout_(QuicTime::Delta::Infinite()), | 93 overall_connection_timeout_(QuicTime::Delta::Infinite()), |
94 creation_time_(clock_->ApproximateNow()), | 94 creation_time_(clock_->ApproximateNow()), |
95 time_of_last_received_packet_(clock_->ApproximateNow()), | 95 time_of_last_received_packet_(clock_->ApproximateNow()), |
96 time_of_last_sent_packet_(clock_->ApproximateNow()), | 96 time_of_last_sent_packet_(clock_->ApproximateNow()), |
97 time_largest_observed_(QuicTime::Zero()), | 97 time_largest_observed_(QuicTime::Zero()), |
98 congestion_manager_(clock_, kTCP), | 98 congestion_manager_(clock_, kTCP), |
99 version_negotiation_state_(START_NEGOTIATION), | 99 version_negotiation_state_(START_NEGOTIATION), |
100 quic_version_(kQuicVersion1), | 100 quic_version_(kQuicVersion1), |
(...skipping 1003 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1104 DVLOG(2) << ENDPOINT << "packet(" << sequence_number << "): " << std::endl | 1104 DVLOG(2) << ENDPOINT << "packet(" << sequence_number << "): " << std::endl |
1105 << QuicUtils::StringToHexASCIIDump(packet->AsStringPiece()); | 1105 << QuicUtils::StringToHexASCIIDump(packet->AsStringPiece()); |
1106 | 1106 |
1107 DCHECK(encrypted->length() <= kMaxPacketSize) | 1107 DCHECK(encrypted->length() <= kMaxPacketSize) |
1108 << "Packet " << sequence_number << " will not be read; too large: " | 1108 << "Packet " << sequence_number << " will not be read; too large: " |
1109 << packet->length() << " " << encrypted->length() << " " | 1109 << packet->length() << " " << encrypted->length() << " " |
1110 << outgoing_ack_ << " forced: " << (forced == FORCE ? "yes" : "no"); | 1110 << outgoing_ack_ << " forced: " << (forced == FORCE ? "yes" : "no"); |
1111 | 1111 |
1112 int error; | 1112 int error; |
1113 QuicTime now = clock_->Now(); | 1113 QuicTime now = clock_->Now(); |
1114 if (helper_->WritePacketToWire(*encrypted, &error) == -1) { | 1114 if (WritePacketToWire(sequence_number, level, *encrypted, &error) == -1) { |
1115 if (helper_->IsWriteBlocked(error)) { | 1115 if (helper_->IsWriteBlocked(error)) { |
1116 // TODO(satyashekhar): It might be more efficient (fewer system calls), if | 1116 // TODO(satyashekhar): It might be more efficient (fewer system calls), if |
1117 // all connections share this variable i.e this becomes a part of | 1117 // all connections share this variable i.e this becomes a part of |
1118 // PacketWriterInterface. | 1118 // PacketWriterInterface. |
1119 write_blocked_ = true; | 1119 write_blocked_ = true; |
1120 // If the socket buffers the the data, then the packet should not | 1120 // If the socket buffers the the data, then the packet should not |
1121 // be queued and sent again, which would result in an unnecessary | 1121 // be queued and sent again, which would result in an unnecessary |
1122 // duplicate packet being sent. | 1122 // duplicate packet being sent. |
1123 return helper_->IsWriteBlockedDataBuffered(); | 1123 return helper_->IsWriteBlockedDataBuffered(); |
1124 } | 1124 } |
(...skipping 24 matching lines...) Expand all Loading... |
1149 | 1149 |
1150 if (retransmission == IS_RETRANSMISSION) { | 1150 if (retransmission == IS_RETRANSMISSION) { |
1151 stats_.bytes_retransmitted += encrypted->length(); | 1151 stats_.bytes_retransmitted += encrypted->length(); |
1152 ++stats_.packets_retransmitted; | 1152 ++stats_.packets_retransmitted; |
1153 } | 1153 } |
1154 | 1154 |
1155 delete packet; | 1155 delete packet; |
1156 return true; | 1156 return true; |
1157 } | 1157 } |
1158 | 1158 |
| 1159 int QuicConnection::WritePacketToWire(QuicPacketSequenceNumber sequence_number, |
| 1160 EncryptionLevel level, |
| 1161 const QuicEncryptedPacket& packet, |
| 1162 int* error) { |
| 1163 int bytes_written = helper_->WritePacketToWire(packet, error); |
| 1164 if (debug_visitor_) { |
| 1165 // WritePacketToWire returned -1, then |error| will be populated with |
| 1166 // a NetErrorCode, which we want to pass along to the visitor. |
| 1167 debug_visitor_->OnPacketSent(sequence_number, level, packet, |
| 1168 bytes_written == -1 ? *error : bytes_written); |
| 1169 } |
| 1170 return bytes_written; |
| 1171 } |
| 1172 |
1159 bool QuicConnection::OnSerializedPacket( | 1173 bool QuicConnection::OnSerializedPacket( |
1160 const SerializedPacket& serialized_packet) { | 1174 const SerializedPacket& serialized_packet) { |
1161 if (serialized_packet.retransmittable_frames != NULL) { | 1175 if (serialized_packet.retransmittable_frames != NULL) { |
1162 DCHECK(unacked_packets_.empty() || | 1176 DCHECK(unacked_packets_.empty() || |
1163 unacked_packets_.rbegin()->first < | 1177 unacked_packets_.rbegin()->first < |
1164 serialized_packet.sequence_number); | 1178 serialized_packet.sequence_number); |
1165 // Retransmitted frames will be sent with the same encryption level as the | 1179 // Retransmitted frames will be sent with the same encryption level as the |
1166 // original. | 1180 // original. |
1167 serialized_packet.retransmittable_frames->set_encryption_level( | 1181 serialized_packet.retransmittable_frames->set_encryption_level( |
1168 encryption_level_); | 1182 encryption_level_); |
(...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1553 if (connection_timeout < timeout) { | 1567 if (connection_timeout < timeout) { |
1554 timeout = connection_timeout; | 1568 timeout = connection_timeout; |
1555 } | 1569 } |
1556 } | 1570 } |
1557 | 1571 |
1558 helper_->SetTimeoutAlarm(timeout); | 1572 helper_->SetTimeoutAlarm(timeout); |
1559 return false; | 1573 return false; |
1560 } | 1574 } |
1561 | 1575 |
1562 } // namespace net | 1576 } // namespace net |
OLD | NEW |