| 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 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 291 } | 285 } |
| 292 | 286 |
| 293 // Packet's connection ID is unknown. | 287 // Packet's connection ID is unknown. |
| 294 // Apply the validity checks. | 288 // Apply the validity checks. |
| 295 QuicPacketFate fate = ValidityChecks(header); | 289 QuicPacketFate fate = ValidityChecks(header); |
| 296 switch (fate) { | 290 switch (fate) { |
| 297 case kFateProcess: { | 291 case kFateProcess: { |
| 298 // Create a session and process the packet. | 292 // Create a session and process the packet. |
| 299 QuicServerSession* session = | 293 QuicServerSession* session = |
| 300 CreateQuicSession(connection_id, current_client_address_); | 294 CreateQuicSession(connection_id, current_client_address_); |
| 295 if (FLAGS_enable_quic_stateless_reject_support) { |
| 296 session->set_use_stateless_rejects_if_peer_supported(true); |
| 297 } |
| 301 DVLOG(1) << "Created new session for " << connection_id; | 298 DVLOG(1) << "Created new session for " << connection_id; |
| 302 session_map_.insert(std::make_pair(connection_id, session)); | 299 session_map_.insert(std::make_pair(connection_id, session)); |
| 303 session->connection()->ProcessUdpPacket( | 300 session->connection()->ProcessUdpPacket( |
| 304 current_server_address_, current_client_address_, *current_packet_); | 301 current_server_address_, current_client_address_, *current_packet_); |
| 305 break; | 302 break; |
| 306 } | 303 } |
| 307 case kFateTimeWait: | 304 case kFateTimeWait: |
| 308 // Add this connection_id to the time-wait state, to safely reject | 305 // Add this connection_id to the time-wait state, to safely reject |
| 309 // future packets. | 306 // future packets. |
| 310 DVLOG(1) << "Adding connection ID " << connection_id | 307 DVLOG(1) << "Adding connection ID " << connection_id |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 455 QuicConnectionId connection_id, | 452 QuicConnectionId connection_id, |
| 456 const IPEndPoint& client_address) { | 453 const IPEndPoint& client_address) { |
| 457 // The QuicServerSession takes ownership of |connection| below. | 454 // The QuicServerSession takes ownership of |connection| below. |
| 458 QuicConnection* connection = new QuicConnection( | 455 QuicConnection* connection = new QuicConnection( |
| 459 connection_id, client_address, helper_.get(), connection_writer_factory_, | 456 connection_id, client_address, helper_.get(), connection_writer_factory_, |
| 460 /* owns_writer= */ true, Perspective::IS_SERVER, supported_versions_); | 457 /* owns_writer= */ true, Perspective::IS_SERVER, supported_versions_); |
| 461 | 458 |
| 462 QuicServerSession* session = | 459 QuicServerSession* session = |
| 463 new QuicServerSession(config_, connection, this, crypto_config_); | 460 new QuicServerSession(config_, connection, this, crypto_config_); |
| 464 session->Initialize(); | 461 session->Initialize(); |
| 465 if (FLAGS_quic_session_map_threshold_for_stateless_rejects != -1 && | |
| 466 session_map_.size() >= | |
| 467 static_cast<size_t>( | |
| 468 FLAGS_quic_session_map_threshold_for_stateless_rejects)) { | |
| 469 session->set_use_stateless_rejects_if_peer_supported(true); | |
| 470 } | |
| 471 return session; | 462 return session; |
| 472 } | 463 } |
| 473 | 464 |
| 474 QuicTimeWaitListManager* QuicDispatcher::CreateQuicTimeWaitListManager() { | 465 QuicTimeWaitListManager* QuicDispatcher::CreateQuicTimeWaitListManager() { |
| 475 // TODO(rjshade): The QuicTimeWaitListManager should take ownership of the | 466 // TODO(rjshade): The QuicTimeWaitListManager should take ownership of the |
| 476 // per-connection packet writer. | 467 // per-connection packet writer. |
| 477 time_wait_list_writer_.reset( | 468 time_wait_list_writer_.reset( |
| 478 packet_writer_factory_->Create(writer_.get(), nullptr)); | 469 packet_writer_factory_->Create(writer_.get(), nullptr)); |
| 479 return new QuicTimeWaitListManager(time_wait_list_writer_.get(), this, | 470 return new QuicTimeWaitListManager(time_wait_list_writer_.get(), this, |
| 480 helper_.get()); | 471 helper_.get()); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 496 // send it to the time wait manager in OnUnathenticatedHeader. | 487 // send it to the time wait manager in OnUnathenticatedHeader. |
| 497 return true; | 488 return true; |
| 498 } | 489 } |
| 499 | 490 |
| 500 void QuicDispatcher::SetLastError(QuicErrorCode error) { | 491 void QuicDispatcher::SetLastError(QuicErrorCode error) { |
| 501 last_error_ = error; | 492 last_error_ = error; |
| 502 } | 493 } |
| 503 | 494 |
| 504 } // namespace tools | 495 } // namespace tools |
| 505 } // namespace net | 496 } // namespace net |
| OLD | NEW |