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_dispatcher.h" | 5 #include "net/tools/quic/quic_dispatcher.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
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" |
11 #include "base/stl_util.h" | 11 #include "base/stl_util.h" |
12 #include "net/quic/quic_flags.h" | 12 #include "net/quic/quic_flags.h" |
13 #include "net/quic/quic_utils.h" | 13 #include "net/quic/quic_utils.h" |
14 #include "net/tools/quic/quic_per_connection_packet_writer.h" | 14 #include "net/tools/quic/quic_per_connection_packet_writer.h" |
15 #include "net/tools/quic/quic_time_wait_list_manager.h" | 15 #include "net/tools/quic/quic_time_wait_list_manager.h" |
16 | 16 |
17 namespace net { | 17 namespace net { |
18 | 18 |
19 namespace tools { | 19 namespace tools { |
20 | 20 |
21 using std::make_pair; | 21 using std::make_pair; |
22 using base::StringPiece; | 22 using base::StringPiece; |
23 | 23 |
24 // The threshold size for the session map, over which the dispatcher will start | |
25 // sending stateless rejects (SREJ), rather than stateful rejects (REJ) to | |
26 // clients who support them. If -1, stateless rejects will not be sent. If 0, | |
27 // the server will only send stateless rejects to clients who support them. | |
28 int32 FLAGS_quic_session_map_threshold_for_stateless_rejects = -1; | |
29 | |
30 namespace { | 24 namespace { |
31 | 25 |
32 // An alarm that informs the QuicDispatcher to delete old sessions. | 26 // An alarm that informs the QuicDispatcher to delete old sessions. |
33 class DeleteSessionsAlarm : public QuicAlarm::Delegate { | 27 class DeleteSessionsAlarm : public QuicAlarm::Delegate { |
34 public: | 28 public: |
35 explicit DeleteSessionsAlarm(QuicDispatcher* dispatcher) | 29 explicit DeleteSessionsAlarm(QuicDispatcher* dispatcher) |
36 : dispatcher_(dispatcher) { | 30 : dispatcher_(dispatcher) { |
37 } | 31 } |
38 | 32 |
39 QuicTime OnAlarm() override { | 33 QuicTime OnAlarm() override { |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
202 } | 196 } |
203 | 197 |
204 void QuicDispatcher::ProcessPacket(const IPEndPoint& server_address, | 198 void QuicDispatcher::ProcessPacket(const IPEndPoint& server_address, |
205 const IPEndPoint& client_address, | 199 const IPEndPoint& client_address, |
206 const QuicEncryptedPacket& packet) { | 200 const QuicEncryptedPacket& packet) { |
207 current_server_address_ = server_address; | 201 current_server_address_ = server_address; |
208 current_client_address_ = client_address; | 202 current_client_address_ = client_address; |
209 current_packet_ = &packet; | 203 current_packet_ = &packet; |
210 // ProcessPacket will cause the packet to be dispatched in | 204 // ProcessPacket will cause the packet to be dispatched in |
211 // OnUnauthenticatedPublicHeader, or sent to the time wait list manager | 205 // OnUnauthenticatedPublicHeader, or sent to the time wait list manager |
212 // in OnAuthenticatedHeader. | 206 // in OnUnauthenticatedHeader. |
213 framer_.ProcessPacket(packet); | 207 framer_.ProcessPacket(packet); |
214 // TODO(rjshade): Return a status describing if/why a packet was dropped, | 208 // TODO(rjshade): Return a status describing if/why a packet was dropped, |
215 // and log somehow. Maybe expose as a varz. | 209 // and log somehow. Maybe expose as a varz. |
216 } | 210 } |
217 | 211 |
218 bool QuicDispatcher::OnUnauthenticatedPublicHeader( | 212 bool QuicDispatcher::OnUnauthenticatedPublicHeader( |
219 const QuicPacketPublicHeader& header) { | 213 const QuicPacketPublicHeader& header) { |
220 // Port zero is only allowed for unidirectional UDP, so is disallowed by QUIC. | 214 // Port zero is only allowed for unidirectional UDP, so is disallowed by QUIC. |
221 // Given that we can't even send a reply rejecting the packet, just drop the | 215 // Given that we can't even send a reply rejecting the packet, just drop the |
222 // packet. | 216 // packet. |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
352 header.packet_number > kMaxReasonableInitialPacketNumber) { | 346 header.packet_number > kMaxReasonableInitialPacketNumber) { |
353 return kFateTimeWait; | 347 return kFateTimeWait; |
354 } | 348 } |
355 | 349 |
356 return kFateProcess; | 350 return kFateProcess; |
357 } | 351 } |
358 | 352 |
359 void QuicDispatcher::CleanUpSession(SessionMap::iterator it, | 353 void QuicDispatcher::CleanUpSession(SessionMap::iterator it, |
360 bool should_close_statelessly) { | 354 bool should_close_statelessly) { |
361 QuicConnection* connection = it->second->connection(); | 355 QuicConnection* connection = it->second->connection(); |
362 QuicEncryptedPacket* connection_close_packet = | 356 |
363 connection->ReleaseConnectionClosePacket(); | |
364 write_blocked_list_.erase(connection); | 357 write_blocked_list_.erase(connection); |
365 DCHECK(!should_close_statelessly || !connection_close_packet); | 358 if (should_close_statelessly) { |
| 359 DCHECK(connection->termination_packets() != nullptr && |
| 360 !connection->termination_packets()->empty()); |
| 361 } |
366 time_wait_list_manager_->AddConnectionIdToTimeWait( | 362 time_wait_list_manager_->AddConnectionIdToTimeWait( |
367 it->first, connection->version(), should_close_statelessly, | 363 it->first, connection->version(), should_close_statelessly, |
368 connection_close_packet); | 364 connection->termination_packets()); |
369 session_map_.erase(it); | 365 session_map_.erase(it); |
370 } | 366 } |
371 | 367 |
372 void QuicDispatcher::DeleteSessions() { | 368 void QuicDispatcher::DeleteSessions() { |
373 STLDeleteElements(&closed_session_list_); | 369 STLDeleteElements(&closed_session_list_); |
374 } | 370 } |
375 | 371 |
376 void QuicDispatcher::OnCanWrite() { | 372 void QuicDispatcher::OnCanWrite() { |
377 // The socket is now writable. | 373 // The socket is now writable. |
378 writer_->SetWritable(); | 374 writer_->SetWritable(); |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
453 QuicConnectionId connection_id, | 449 QuicConnectionId connection_id, |
454 const IPEndPoint& client_address) { | 450 const IPEndPoint& client_address) { |
455 // The QuicServerSession takes ownership of |connection| below. | 451 // The QuicServerSession takes ownership of |connection| below. |
456 QuicConnection* connection = new QuicConnection( | 452 QuicConnection* connection = new QuicConnection( |
457 connection_id, client_address, helper_.get(), connection_writer_factory_, | 453 connection_id, client_address, helper_.get(), connection_writer_factory_, |
458 /* owns_writer= */ true, Perspective::IS_SERVER, supported_versions_); | 454 /* owns_writer= */ true, Perspective::IS_SERVER, supported_versions_); |
459 | 455 |
460 QuicServerSession* session = | 456 QuicServerSession* session = |
461 new QuicServerSession(config_, connection, this, crypto_config_); | 457 new QuicServerSession(config_, connection, this, crypto_config_); |
462 session->Initialize(); | 458 session->Initialize(); |
463 if (FLAGS_quic_session_map_threshold_for_stateless_rejects != -1 && | |
464 session_map_.size() >= | |
465 static_cast<size_t>( | |
466 FLAGS_quic_session_map_threshold_for_stateless_rejects)) { | |
467 session->set_use_stateless_rejects_if_peer_supported(true); | |
468 } | |
469 return session; | 459 return session; |
470 } | 460 } |
471 | 461 |
472 QuicTimeWaitListManager* QuicDispatcher::CreateQuicTimeWaitListManager() { | 462 QuicTimeWaitListManager* QuicDispatcher::CreateQuicTimeWaitListManager() { |
473 // TODO(rjshade): The QuicTimeWaitListManager should take ownership of the | 463 // TODO(rjshade): The QuicTimeWaitListManager should take ownership of the |
474 // per-connection packet writer. | 464 // per-connection packet writer. |
475 time_wait_list_writer_.reset( | 465 time_wait_list_writer_.reset( |
476 packet_writer_factory_->Create(writer_.get(), nullptr)); | 466 packet_writer_factory_->Create(writer_.get(), nullptr)); |
477 return new QuicTimeWaitListManager(time_wait_list_writer_.get(), this, | 467 return new QuicTimeWaitListManager(time_wait_list_writer_.get(), this, |
478 helper_.get()); | 468 helper_.get()); |
(...skipping 15 matching lines...) Expand all Loading... |
494 // send it to the time wait manager in OnUnathenticatedHeader. | 484 // send it to the time wait manager in OnUnathenticatedHeader. |
495 return true; | 485 return true; |
496 } | 486 } |
497 | 487 |
498 void QuicDispatcher::SetLastError(QuicErrorCode error) { | 488 void QuicDispatcher::SetLastError(QuicErrorCode error) { |
499 last_error_ = error; | 489 last_error_ = error; |
500 } | 490 } |
501 | 491 |
502 } // namespace tools | 492 } // namespace tools |
503 } // namespace net | 493 } // namespace net |
OLD | NEW |