OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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_dispatcher.h" | 5 #include "net/quic/quic_dispatcher.h" |
6 | 6 |
7 #include <errno.h> | 7 #include <errno.h> |
8 | 8 |
9 #include "base/debug/stack_trace.h" | 9 #include "base/debug/stack_trace.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
180 PacketWriterFactory* packet_writer_factory, | 180 PacketWriterFactory* packet_writer_factory, |
181 QuicConnectionHelperInterface* helper) | 181 QuicConnectionHelperInterface* helper) |
182 : config_(config), | 182 : config_(config), |
183 crypto_config_(crypto_config), | 183 crypto_config_(crypto_config), |
184 helper_(helper), | 184 helper_(helper), |
185 delete_sessions_alarm_( | 185 delete_sessions_alarm_( |
186 helper_->CreateAlarm(new DeleteSessionsAlarm(this))), | 186 helper_->CreateAlarm(new DeleteSessionsAlarm(this))), |
187 packet_writer_factory_(packet_writer_factory), | 187 packet_writer_factory_(packet_writer_factory), |
188 connection_writer_factory_(this), | 188 connection_writer_factory_(this), |
189 supported_versions_(supported_versions), | 189 supported_versions_(supported_versions), |
190 current_packet_(NULL), | 190 current_packet_(nullptr), |
191 framer_(supported_versions, /*unused*/ QuicTime::Zero(), true), | 191 framer_(supported_versions, /*unused*/ QuicTime::Zero(), true), |
192 framer_visitor_(new QuicFramerVisitor(this)) { | 192 framer_visitor_(new QuicFramerVisitor(this)) { |
193 framer_.set_visitor(framer_visitor_.get()); | 193 framer_.set_visitor(framer_visitor_.get()); |
194 } | 194 } |
195 | 195 |
196 QuicDispatcher::~QuicDispatcher() { | 196 QuicDispatcher::~QuicDispatcher() { |
197 STLDeleteValues(&session_map_); | 197 STLDeleteValues(&session_map_); |
198 STLDeleteElements(&closed_session_list_); | 198 STLDeleteElements(&closed_session_list_); |
199 } | 199 } |
200 | 200 |
201 void QuicDispatcher::Initialize(QuicServerPacketWriter* writer) { | 201 void QuicDispatcher::Initialize(QuicServerPacketWriter* writer) { |
202 DCHECK(writer_ == NULL); | 202 DCHECK(writer_ == nullptr); |
203 writer_.reset(writer); | 203 writer_.reset(writer); |
204 time_wait_list_manager_.reset(CreateQuicTimeWaitListManager()); | 204 time_wait_list_manager_.reset(CreateQuicTimeWaitListManager()); |
205 } | 205 } |
206 | 206 |
207 void QuicDispatcher::ProcessPacket(const IPEndPoint& server_address, | 207 void QuicDispatcher::ProcessPacket(const IPEndPoint& server_address, |
208 const IPEndPoint& client_address, | 208 const IPEndPoint& client_address, |
209 const QuicEncryptedPacket& packet) { | 209 const QuicEncryptedPacket& packet) { |
210 current_server_address_ = server_address; | 210 current_server_address_ = server_address; |
211 current_client_address_ = client_address; | 211 current_client_address_ = client_address; |
212 current_packet_ = &packet; | 212 current_packet_ = &packet; |
213 // ProcessPacket will cause the packet to be dispatched in | 213 // ProcessPacket will cause the packet to be dispatched in |
214 // OnUnauthenticatedPublicHeader, or sent to the time wait list manager | 214 // OnUnauthenticatedPublicHeader, or sent to the time wait list manager |
215 // in OnAuthenticatedHeader. | 215 // in OnAuthenticatedHeader. |
216 framer_.ProcessPacket(packet); | 216 framer_.ProcessPacket(packet); |
217 // TODO(rjshade): Return a status describing if/why a packet was dropped, | 217 // TODO(rjshade): Return a status describing if/why a packet was dropped, |
218 // and log somehow. Maybe expose as a varz. | 218 // and log somehow. Maybe expose as a varz. |
219 } | 219 } |
220 | 220 |
221 bool QuicDispatcher::OnUnauthenticatedPublicHeader( | 221 bool QuicDispatcher::OnUnauthenticatedPublicHeader( |
222 const QuicPacketPublicHeader& header) { | 222 const QuicPacketPublicHeader& header) { |
223 QuicSession* session = NULL; | 223 QuicSession* session = nullptr; |
224 | 224 |
225 QuicConnectionId connection_id = header.connection_id; | 225 QuicConnectionId connection_id = header.connection_id; |
226 SessionMap::iterator it = session_map_.find(connection_id); | 226 SessionMap::iterator it = session_map_.find(connection_id); |
227 if (it == session_map_.end()) { | 227 if (it == session_map_.end()) { |
228 if (header.reset_flag) { | 228 if (header.reset_flag) { |
229 return false; | 229 return false; |
230 } | 230 } |
231 if (time_wait_list_manager_->IsConnectionIdInTimeWait(connection_id)) { | 231 if (time_wait_list_manager_->IsConnectionIdInTimeWait(connection_id)) { |
232 return HandlePacketForTimeWait(header); | 232 return HandlePacketForTimeWait(header); |
233 } | 233 } |
234 | 234 |
235 // Ensure the packet has a version negotiation bit set before creating a new | 235 // Ensure the packet has a version negotiation bit set before creating a new |
236 // session for it. All initial packets for a new connection are required to | 236 // session for it. All initial packets for a new connection are required to |
237 // have the flag set. Otherwise it may be a stray packet. | 237 // have the flag set. Otherwise it may be a stray packet. |
238 if (header.version_flag) { | 238 if (header.version_flag) { |
239 session = CreateQuicSession(connection_id, current_server_address_, | 239 session = CreateQuicSession(connection_id, current_server_address_, |
240 current_client_address_); | 240 current_client_address_); |
241 } | 241 } |
242 | 242 |
243 if (session == NULL) { | 243 if (session == nullptr) { |
244 DVLOG(1) << "Failed to create session for " << connection_id; | 244 DVLOG(1) << "Failed to create session for " << connection_id; |
245 // Add this connection_id fo the time-wait state, to safely reject future | 245 // Add this connection_id fo the time-wait state, to safely reject future |
246 // packets. | 246 // packets. |
247 | 247 |
248 if (header.version_flag && | 248 if (header.version_flag && |
249 !framer_.IsSupportedVersion(header.versions.front())) { | 249 !framer_.IsSupportedVersion(header.versions.front())) { |
250 // TODO(ianswett): Produce a no-version version negotiation packet. | 250 // TODO(ianswett): Produce a no-version version negotiation packet. |
251 return false; | 251 return false; |
252 } | 252 } |
253 | 253 |
254 // Use the version in the packet if possible, otherwise assume the latest. | 254 // Use the version in the packet if possible, otherwise assume the latest. |
255 QuicVersion version = header.version_flag ? header.versions.front() : | 255 QuicVersion version = header.version_flag ? header.versions.front() : |
256 supported_versions_.front(); | 256 supported_versions_.front(); |
257 time_wait_list_manager_->AddConnectionIdToTimeWait( | 257 time_wait_list_manager_->AddConnectionIdToTimeWait(connection_id, version, |
258 connection_id, version, NULL); | 258 nullptr); |
259 DCHECK(time_wait_list_manager_->IsConnectionIdInTimeWait(connection_id)); | 259 DCHECK(time_wait_list_manager_->IsConnectionIdInTimeWait(connection_id)); |
260 return HandlePacketForTimeWait(header); | 260 return HandlePacketForTimeWait(header); |
261 } | 261 } |
262 DVLOG(1) << "Created new session for " << connection_id; | 262 DVLOG(1) << "Created new session for " << connection_id; |
263 session_map_.insert(make_pair(connection_id, session)); | 263 session_map_.insert(make_pair(connection_id, session)); |
264 } else { | 264 } else { |
265 session = it->second; | 265 session = it->second; |
266 } | 266 } |
267 | 267 |
268 session->connection()->ProcessUdpPacket( | 268 session->connection()->ProcessUdpPacket( |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
399 // be parsed correctly. | 399 // be parsed correctly. |
400 framer_.set_version(time_wait_list_manager_->GetQuicVersionFromConnectionId( | 400 framer_.set_version(time_wait_list_manager_->GetQuicVersionFromConnectionId( |
401 header.connection_id)); | 401 header.connection_id)); |
402 | 402 |
403 // Continue parsing the packet to extract the sequence number. Then | 403 // Continue parsing the packet to extract the sequence number. Then |
404 // send it to the time wait manager in OnUnathenticatedHeader. | 404 // send it to the time wait manager in OnUnathenticatedHeader. |
405 return true; | 405 return true; |
406 } | 406 } |
407 | 407 |
408 } // namespace net | 408 } // namespace net |
OLD | NEW |