| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/quic/quic_connection.h" | 5 #include "net/quic/quic_connection.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 62 return delta <= kMaxPacketGap; | 62 return delta <= kMaxPacketGap; |
| 63 } | 63 } |
| 64 | 64 |
| 65 } // namespace | 65 } // namespace |
| 66 | 66 |
| 67 #define ENDPOINT (is_server_ ? "Server: " : " Client: ") | 67 #define ENDPOINT (is_server_ ? "Server: " : " Client: ") |
| 68 | 68 |
| 69 QuicConnection::QuicConnection(QuicGuid guid, | 69 QuicConnection::QuicConnection(QuicGuid guid, |
| 70 IPEndPoint address, | 70 IPEndPoint address, |
| 71 QuicConnectionHelperInterface* helper, | 71 QuicConnectionHelperInterface* helper, |
| 72 bool is_server) | 72 bool is_server, |
| 73 : framer_(kQuicVersion1, | 73 QuicVersion version) |
| 74 : framer_(version, |
| 74 helper->GetClock()->ApproximateNow(), | 75 helper->GetClock()->ApproximateNow(), |
| 75 is_server), | 76 is_server), |
| 76 helper_(helper), | 77 helper_(helper), |
| 77 encryption_level_(ENCRYPTION_NONE), | 78 encryption_level_(ENCRYPTION_NONE), |
| 78 clock_(helper->GetClock()), | 79 clock_(helper->GetClock()), |
| 79 random_generator_(helper->GetRandomGenerator()), | 80 random_generator_(helper->GetRandomGenerator()), |
| 80 guid_(guid), | 81 guid_(guid), |
| 81 peer_address_(address), | 82 peer_address_(address), |
| 82 largest_seen_packet_with_ack_(0), | 83 largest_seen_packet_with_ack_(0), |
| 83 peer_largest_observed_packet_(0), | 84 peer_largest_observed_packet_(0), |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 126 STLDeleteValues(&unacked_packets_); | 127 STLDeleteValues(&unacked_packets_); |
| 127 STLDeleteValues(&group_map_); | 128 STLDeleteValues(&group_map_); |
| 128 for (QueuedPacketList::iterator it = queued_packets_.begin(); | 129 for (QueuedPacketList::iterator it = queued_packets_.begin(); |
| 129 it != queued_packets_.end(); ++it) { | 130 it != queued_packets_.end(); ++it) { |
| 130 delete it->packet; | 131 delete it->packet; |
| 131 } | 132 } |
| 132 DLOG(INFO) << ENDPOINT << "write_blocked: " << write_blocked_; | 133 DLOG(INFO) << ENDPOINT << "write_blocked: " << write_blocked_; |
| 133 } | 134 } |
| 134 | 135 |
| 135 bool QuicConnection::SelectMutualVersion( | 136 bool QuicConnection::SelectMutualVersion( |
| 136 const QuicTagVector& available_versions) { | 137 const QuicVersionVector& available_versions) { |
| 137 // TODO(satyamshekhar): Make this generic. | 138 // Try to find the highest mutual version by iterating over supported |
| 138 if (std::find(available_versions.begin(), available_versions.end(), | 139 // versions, starting with the highest, and breaking out of the loop once we |
| 139 kQuicVersion1) == available_versions.end()) { | 140 // find a matching version in the provided available_versions vector. |
| 140 return false; | 141 for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) { |
| 142 const QuicVersion& version = kSupportedQuicVersions[i]; |
| 143 if (std::find(available_versions.begin(), available_versions.end(), |
| 144 version) != available_versions.end()) { |
| 145 framer_.set_version(version); |
| 146 return true; |
| 147 } |
| 141 } | 148 } |
| 142 | 149 |
| 143 // Right now we only support kQuicVersion1 so it's okay not to | 150 return false; |
| 144 // update the framer version. When we start supporting more | |
| 145 // versions please update. | |
| 146 return true; | |
| 147 } | 151 } |
| 148 | 152 |
| 149 void QuicConnection::OnError(QuicFramer* framer) { | 153 void QuicConnection::OnError(QuicFramer* framer) { |
| 150 // Packets that we cannot decrypt are dropped. | 154 // Packets that we cannot decrypt are dropped. |
| 151 // TODO(rch): add stats to measure this. | 155 // TODO(rch): add stats to measure this. |
| 152 if (!connected_ || framer->error() == QUIC_DECRYPTION_FAILURE) { | 156 if (!connected_ || framer->error() == QUIC_DECRYPTION_FAILURE) { |
| 153 return; | 157 return; |
| 154 } | 158 } |
| 155 SendConnectionClose(framer->error()); | 159 SendConnectionClose(framer->error()); |
| 156 } | 160 } |
| 157 | 161 |
| 158 void QuicConnection::OnPacket() { | 162 void QuicConnection::OnPacket() { |
| 159 } | 163 } |
| 160 | 164 |
| 161 void QuicConnection::OnPublicResetPacket( | 165 void QuicConnection::OnPublicResetPacket( |
| 162 const QuicPublicResetPacket& packet) { | 166 const QuicPublicResetPacket& packet) { |
| 163 if (debug_visitor_) { | 167 if (debug_visitor_) { |
| 164 debug_visitor_->OnPublicResetPacket(packet); | 168 debug_visitor_->OnPublicResetPacket(packet); |
| 165 } | 169 } |
| 166 CloseConnection(QUIC_PUBLIC_RESET, true); | 170 CloseConnection(QUIC_PUBLIC_RESET, true); |
| 167 } | 171 } |
| 168 | 172 |
| 169 bool QuicConnection::OnProtocolVersionMismatch(QuicTag received_version) { | 173 bool QuicConnection::OnProtocolVersionMismatch(QuicVersion received_version) { |
| 170 // TODO(satyamshekhar): Implement no server state in this mode. | 174 // TODO(satyamshekhar): Implement no server state in this mode. |
| 171 if (!is_server_) { | 175 if (!is_server_) { |
| 172 LOG(DFATAL) << ENDPOINT << "Framer called OnProtocolVersionMismatch. " | 176 LOG(DFATAL) << ENDPOINT << "Framer called OnProtocolVersionMismatch. " |
| 173 << "Closing connection."; | 177 << "Closing connection."; |
| 174 CloseConnection(QUIC_INTERNAL_ERROR, false); | 178 CloseConnection(QUIC_INTERNAL_ERROR, false); |
| 175 return false; | 179 return false; |
| 176 } | 180 } |
| 177 DCHECK_NE(version(), received_version); | 181 DCHECK_NE(version(), received_version); |
| 178 | 182 |
| 179 if (debug_visitor_) { | 183 if (debug_visitor_) { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 198 | 202 |
| 199 case NEGOTIATED_VERSION: | 203 case NEGOTIATED_VERSION: |
| 200 // Might be old packets that were sent by the client before the version | 204 // Might be old packets that were sent by the client before the version |
| 201 // was negotiated. Drop these. | 205 // was negotiated. Drop these. |
| 202 return false; | 206 return false; |
| 203 | 207 |
| 204 default: | 208 default: |
| 205 DCHECK(false); | 209 DCHECK(false); |
| 206 } | 210 } |
| 207 | 211 |
| 208 // Right now we only support kQuicVersion1 so it's okay not to | |
| 209 // update the framer version. When we start supporting more | |
| 210 // versions please update. | |
| 211 version_negotiation_state_ = NEGOTIATED_VERSION; | 212 version_negotiation_state_ = NEGOTIATED_VERSION; |
| 213 |
| 214 // Store the new version. |
| 215 framer_.set_version(received_version); |
| 216 |
| 212 // TODO(satyamshekhar): Store the sequence number of this packet and close the | 217 // TODO(satyamshekhar): Store the sequence number of this packet and close the |
| 213 // connection if we ever received a packet with incorrect version and whose | 218 // connection if we ever received a packet with incorrect version and whose |
| 214 // sequence number is greater. | 219 // sequence number is greater. |
| 215 return true; | 220 return true; |
| 216 } | 221 } |
| 217 | 222 |
| 218 // Handles version negotiation for client connection. | 223 // Handles version negotiation for client connection. |
| 219 void QuicConnection::OnVersionNegotiationPacket( | 224 void QuicConnection::OnVersionNegotiationPacket( |
| 220 const QuicVersionNegotiationPacket& packet) { | 225 const QuicVersionNegotiationPacket& packet) { |
| 221 if (is_server_) { | 226 if (is_server_) { |
| (...skipping 468 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 690 SendAck(); | 695 SendAck(); |
| 691 } else if (!last_stream_frames_.empty()) { | 696 } else if (!last_stream_frames_.empty()) { |
| 692 // TODO(alyssar) this case should really be "if the packet contained any | 697 // TODO(alyssar) this case should really be "if the packet contained any |
| 693 // non-ack frame", rather than "if the packet contained a stream frame" | 698 // non-ack frame", rather than "if the packet contained a stream frame" |
| 694 helper_->SetAckAlarm(congestion_manager_.DefaultRetransmissionTime()); | 699 helper_->SetAckAlarm(congestion_manager_.DefaultRetransmissionTime()); |
| 695 } | 700 } |
| 696 send_ack_in_response_to_packet_ = !send_ack_in_response_to_packet_; | 701 send_ack_in_response_to_packet_ = !send_ack_in_response_to_packet_; |
| 697 } | 702 } |
| 698 | 703 |
| 699 void QuicConnection::SendVersionNegotiationPacket() { | 704 void QuicConnection::SendVersionNegotiationPacket() { |
| 700 QuicTagVector supported_versions; | 705 QuicVersionVector supported_versions; |
| 701 supported_versions.push_back(kQuicVersion1); | 706 for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) { |
| 707 supported_versions.push_back(kSupportedQuicVersions[i]); |
| 708 } |
| 702 QuicEncryptedPacket* encrypted = | 709 QuicEncryptedPacket* encrypted = |
| 703 packet_creator_.SerializeVersionNegotiationPacket(supported_versions); | 710 packet_creator_.SerializeVersionNegotiationPacket(supported_versions); |
| 704 // TODO(satyamshekhar): implement zero server state negotiation. | 711 // TODO(satyamshekhar): implement zero server state negotiation. |
| 705 int error; | 712 int error; |
| 706 helper_->WritePacketToWire(*encrypted, &error); | 713 helper_->WritePacketToWire(*encrypted, &error); |
| 707 delete encrypted; | 714 delete encrypted; |
| 708 } | 715 } |
| 709 | 716 |
| 710 QuicConsumedData QuicConnection::SendStreamData(QuicStreamId id, | 717 QuicConsumedData QuicConnection::SendStreamData(QuicStreamId id, |
| 711 base::StringPiece data, | 718 base::StringPiece data, |
| (...skipping 852 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1564 if (connection_timeout < timeout) { | 1571 if (connection_timeout < timeout) { |
| 1565 timeout = connection_timeout; | 1572 timeout = connection_timeout; |
| 1566 } | 1573 } |
| 1567 } | 1574 } |
| 1568 | 1575 |
| 1569 helper_->SetTimeoutAlarm(timeout); | 1576 helper_->SetTimeoutAlarm(timeout); |
| 1570 return false; | 1577 return false; |
| 1571 } | 1578 } |
| 1572 | 1579 |
| 1573 } // namespace net | 1580 } // namespace net |
| OLD | NEW |