| 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/tools/quic/quic_time_wait_list_manager.h" | 5 #include "net/tools/quic/quic_time_wait_list_manager.h" |
| 6 | 6 |
| 7 #include <errno.h> | 7 #include <errno.h> |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 | 10 |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 140 if (!WriteToWire(queued_packet)) { | 140 if (!WriteToWire(queued_packet)) { |
| 141 return; | 141 return; |
| 142 } | 142 } |
| 143 pending_packets_queue_.pop_front(); | 143 pending_packets_queue_.pop_front(); |
| 144 } | 144 } |
| 145 } | 145 } |
| 146 | 146 |
| 147 void QuicTimeWaitListManager::ProcessPacket( | 147 void QuicTimeWaitListManager::ProcessPacket( |
| 148 const QuicSocketAddress& server_address, | 148 const QuicSocketAddress& server_address, |
| 149 const QuicSocketAddress& client_address, | 149 const QuicSocketAddress& client_address, |
| 150 QuicConnectionId connection_id, | 150 QuicConnectionId connection_id) { |
| 151 QuicPacketNumber packet_number, | |
| 152 const QuicEncryptedPacket& /*packet*/) { | |
| 153 DCHECK(IsConnectionIdInTimeWait(connection_id)); | 151 DCHECK(IsConnectionIdInTimeWait(connection_id)); |
| 154 QUIC_DLOG(INFO) << "Processing " << connection_id << " in time wait state."; | 152 QUIC_DLOG(INFO) << "Processing " << connection_id << " in time wait state."; |
| 155 // TODO(satyamshekhar): Think about handling packets from different client | 153 // TODO(satyamshekhar): Think about handling packets from different client |
| 156 // addresses. | 154 // addresses. |
| 157 ConnectionIdMap::iterator it = connection_id_map_.find(connection_id); | 155 ConnectionIdMap::iterator it = connection_id_map_.find(connection_id); |
| 158 DCHECK(it != connection_id_map_.end()); | 156 DCHECK(it != connection_id_map_.end()); |
| 159 // Increment the received packet count. | 157 // Increment the received packet count. |
| 160 ConnectionIdData* connection_data = &it->second; | 158 ConnectionIdData* connection_data = &it->second; |
| 161 ++(connection_data->num_packets); | 159 ++(connection_data->num_packets); |
| 162 | 160 |
| 163 if (!ShouldSendResponse(connection_data->num_packets)) { | 161 if (!ShouldSendResponse(connection_data->num_packets)) { |
| 164 return; | 162 return; |
| 165 } | 163 } |
| 166 | 164 |
| 167 if (!connection_data->termination_packets.empty()) { | 165 if (!connection_data->termination_packets.empty()) { |
| 168 if (connection_data->connection_rejected_statelessly) { | 166 if (connection_data->connection_rejected_statelessly) { |
| 169 QUIC_DVLOG(3) | 167 QUIC_DVLOG(3) |
| 170 << "Time wait list sending previous stateless reject response " | 168 << "Time wait list sending previous stateless reject response " |
| 171 << "for connection " << connection_id; | 169 << "for connection " << connection_id; |
| 172 } | 170 } |
| 173 for (const auto& packet : connection_data->termination_packets) { | 171 for (const auto& packet : connection_data->termination_packets) { |
| 174 SendOrQueuePacket(QuicMakeUnique<QueuedPacket>( | 172 SendOrQueuePacket(QuicMakeUnique<QueuedPacket>( |
| 175 server_address, client_address, packet->Clone())); | 173 server_address, client_address, packet->Clone())); |
| 176 } | 174 } |
| 177 return; | 175 return; |
| 178 } | 176 } |
| 179 | 177 |
| 180 SendPublicReset(server_address, client_address, connection_id, packet_number); | 178 SendPublicReset(server_address, client_address, connection_id); |
| 181 } | 179 } |
| 182 | 180 |
| 183 void QuicTimeWaitListManager::SendVersionNegotiationPacket( | 181 void QuicTimeWaitListManager::SendVersionNegotiationPacket( |
| 184 QuicConnectionId connection_id, | 182 QuicConnectionId connection_id, |
| 185 const QuicVersionVector& supported_versions, | 183 const QuicVersionVector& supported_versions, |
| 186 const QuicSocketAddress& server_address, | 184 const QuicSocketAddress& server_address, |
| 187 const QuicSocketAddress& client_address) { | 185 const QuicSocketAddress& client_address) { |
| 188 SendOrQueuePacket(QuicMakeUnique<QueuedPacket>( | 186 SendOrQueuePacket(QuicMakeUnique<QueuedPacket>( |
| 189 server_address, client_address, QuicFramer::BuildVersionNegotiationPacket( | 187 server_address, client_address, QuicFramer::BuildVersionNegotiationPacket( |
| 190 connection_id, supported_versions))); | 188 connection_id, supported_versions))); |
| 191 } | 189 } |
| 192 | 190 |
| 193 // Returns true if the number of packets received for this connection_id is a | 191 // Returns true if the number of packets received for this connection_id is a |
| 194 // power of 2 to throttle the number of public reset packets we send to a | 192 // power of 2 to throttle the number of public reset packets we send to a |
| 195 // client. | 193 // client. |
| 196 bool QuicTimeWaitListManager::ShouldSendResponse(int received_packet_count) { | 194 bool QuicTimeWaitListManager::ShouldSendResponse(int received_packet_count) { |
| 197 return (received_packet_count & (received_packet_count - 1)) == 0; | 195 return (received_packet_count & (received_packet_count - 1)) == 0; |
| 198 } | 196 } |
| 199 | 197 |
| 200 void QuicTimeWaitListManager::SendPublicReset( | 198 void QuicTimeWaitListManager::SendPublicReset( |
| 201 const QuicSocketAddress& server_address, | 199 const QuicSocketAddress& server_address, |
| 202 const QuicSocketAddress& client_address, | 200 const QuicSocketAddress& client_address, |
| 203 QuicConnectionId connection_id, | 201 QuicConnectionId connection_id) { |
| 204 QuicPacketNumber rejected_packet_number) { | |
| 205 QuicPublicResetPacket packet; | 202 QuicPublicResetPacket packet; |
| 206 packet.public_header.connection_id = connection_id; | 203 packet.public_header.connection_id = connection_id; |
| 207 packet.public_header.reset_flag = true; | 204 packet.public_header.reset_flag = true; |
| 208 packet.public_header.version_flag = false; | 205 packet.public_header.version_flag = false; |
| 209 packet.rejected_packet_number = rejected_packet_number; | |
| 210 // TODO(satyamshekhar): generate a valid nonce for this connection_id. | 206 // TODO(satyamshekhar): generate a valid nonce for this connection_id. |
| 211 packet.nonce_proof = 1010101; | 207 packet.nonce_proof = 1010101; |
| 212 packet.client_address = client_address; | 208 packet.client_address = client_address; |
| 213 // Takes ownership of the packet. | 209 // Takes ownership of the packet. |
| 214 SendOrQueuePacket(QuicMakeUnique<QueuedPacket>(server_address, client_address, | 210 SendOrQueuePacket(QuicMakeUnique<QueuedPacket>(server_address, client_address, |
| 215 BuildPublicReset(packet))); | 211 BuildPublicReset(packet))); |
| 216 } | 212 } |
| 217 | 213 |
| 218 std::unique_ptr<QuicEncryptedPacket> QuicTimeWaitListManager::BuildPublicReset( | 214 std::unique_ptr<QuicEncryptedPacket> QuicTimeWaitListManager::BuildPublicReset( |
| 219 const QuicPublicResetPacket& packet) { | 215 const QuicPublicResetPacket& packet) { |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 320 version(version_), | 316 version(version_), |
| 321 time_added(time_added_), | 317 time_added(time_added_), |
| 322 connection_rejected_statelessly(connection_rejected_statelessly) {} | 318 connection_rejected_statelessly(connection_rejected_statelessly) {} |
| 323 | 319 |
| 324 QuicTimeWaitListManager::ConnectionIdData::ConnectionIdData( | 320 QuicTimeWaitListManager::ConnectionIdData::ConnectionIdData( |
| 325 ConnectionIdData&& other) = default; | 321 ConnectionIdData&& other) = default; |
| 326 | 322 |
| 327 QuicTimeWaitListManager::ConnectionIdData::~ConnectionIdData() {} | 323 QuicTimeWaitListManager::ConnectionIdData::~ConnectionIdData() {} |
| 328 | 324 |
| 329 } // namespace net | 325 } // namespace net |
| OLD | NEW |