1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// A server side dispatcher which dispatches a given client's data to their 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// stream. 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifndef NET_TOOLS_QUIC_QUIC_DISPATCHER_H_ 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define NET_TOOLS_QUIC_QUIC_DISPATCHER_H_ 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <list> 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/basictypes.h" 147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h" 151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/base/ip_endpoint.h" 173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "net/base/linked_hash_map.h" 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/quic/quic_blocked_writer_interface.h" 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/quic/quic_protocol.h" 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/tools/quic/quic_server_session.h" 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/tools/quic/quic_time_wait_list_manager.h" 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace net { 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class EpollServer; 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class QuicConfig; 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class QuicCryptoServerConfig; 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class QuicSession; 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace tools { 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class DeleteSessionsAlarm; 3303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class QuicEpollConnectionHelper; 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class QuicPacketWriterWrapper; 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace test { 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class QuicDispatcherPeer; 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace test 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 40116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass ProcessPacketInterface { 41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public: 42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual ~ProcessPacketInterface() {} 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void ProcessPacket(const IPEndPoint& server_address, 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const IPEndPoint& client_address, 45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const QuicEncryptedPacket& packet) = 0; 46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}; 47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass QuicDispatcher : public QuicServerSessionVisitor, 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public ProcessPacketInterface { 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 5103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Creates per-connection packet writers out of the QuicDispatcher's shared 5203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // QuicPacketWriter. The per-connection writers' IsWriteBlocked() state must 5303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // always be the same as the shared writer's IsWriteBlocked(), or else the 5403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // QuicDispatcher::OnCanWrite logic will not work. (This will hopefully be 5503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // cleaned up for bug 16950226.) 5603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) class PacketWriterFactory { 5703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) public: 5803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual ~PacketWriterFactory() {} 5903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 6003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual QuicPacketWriter* Create(QuicPacketWriter* writer, 6103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) QuicConnection* connection) = 0; 6203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) }; 6303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 6403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Creates ordinary QuicPerConnectionPacketWriter instances. 6503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) class DefaultPacketWriterFactory : public PacketWriterFactory { 6603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) public: 6703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual ~DefaultPacketWriterFactory() {} 6803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 6903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual QuicPacketWriter* Create( 7003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) QuicPacketWriter* writer, 7103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) QuicConnection* connection) OVERRIDE; 7203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) }; 7303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Ideally we'd have a linked_hash_set: the boolean is unused. 753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) typedef linked_hash_map<QuicBlockedWriterInterface*, bool> WriteBlockedList; 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Due to the way delete_sessions_closure_ is registered, the Dispatcher must 7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // live until epoll_server Shutdown. |supported_versions| specifies the list 7903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // of supported QUIC versions. Takes ownership of |packet_writer_factory|, 8003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // which is used to create per-connection writers. 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicDispatcher(const QuicConfig& config, 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const QuicCryptoServerConfig& crypto_config, 831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const QuicVersionVector& supported_versions, 8403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) PacketWriterFactory* packet_writer_factory, 85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EpollServer* epoll_server); 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~QuicDispatcher(); 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 89e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch virtual void Initialize(int fd); 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Process the incoming packet by creating a new session, passing it to 92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // an existing session, or passing it to the TimeWaitListManager. 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void ProcessPacket(const IPEndPoint& server_address, 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const IPEndPoint& client_address, 95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const QuicEncryptedPacket& packet) OVERRIDE; 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Called when the socket becomes writable to allow queued writes to happen. 98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void OnCanWrite(); 99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Returns true if there's anything in the blocked writer list. 101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual bool HasPendingWrites() const; 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Sends ConnectionClose frames to all connected clients. 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void Shutdown(); 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // QuicServerSessionVisitor interface implementation: 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Ensure that the closed connection is cleaned up asynchronously. 108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void OnConnectionClosed(QuicConnectionId connection_id, 109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) QuicErrorCode error) OVERRIDE; 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Queues the blocked writer for later resumption. 112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void OnWriteBlocked( 113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch QuicBlockedWriterInterface* blocked_writer) OVERRIDE; 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) typedef base::hash_map<QuicConnectionId, QuicSession*> SessionMap; 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Deletes all sessions on the closed session list and clears the list. 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void DeleteSessions(); 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const SessionMap& session_map() const { return session_map_; } 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Instantiates a new low-level packet writer. Caller takes ownership of the 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // returned object. 1255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual QuicPacketWriter* CreateWriter(int fd); 1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual QuicSession* CreateQuicSession(QuicConnectionId connection_id, 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const IPEndPoint& server_address, 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const IPEndPoint& client_address); 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual QuicConnection* CreateQuicConnection( 1320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch QuicConnectionId connection_id, 1330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const IPEndPoint& server_address, 134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const IPEndPoint& client_address); 1350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Called by |framer_visitor_| when the public header has been parsed. 1370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual bool OnUnauthenticatedPublicHeader( 1380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const QuicPacketPublicHeader& header); 1390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Create and return the time wait list manager for this dispatcher, which 1410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // will be owned by the dispatcher as time_wait_list_manager_ 1420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual QuicTimeWaitListManager* CreateQuicTimeWaitListManager(); 1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Replaces the packet writer with |writer|. Takes ownership of |writer|. 1455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void set_writer(QuicPacketWriter* writer) { 1465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu writer_.reset(writer); 1475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 149558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch QuicTimeWaitListManager* time_wait_list_manager() { 150558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return time_wait_list_manager_.get(); 151558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 152558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 1531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EpollServer* epoll_server() { return epoll_server_; } 1541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const QuicVersionVector& supported_versions() const { 1561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return supported_versions_; 1571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 1581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const IPEndPoint& current_server_address() { 1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return current_server_address_; 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 162e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const IPEndPoint& current_client_address() { 163e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return current_client_address_; 164e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const QuicEncryptedPacket& current_packet() { 1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return *current_packet_; 1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const QuicConfig& config() const { return config_; } 1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const QuicCryptoServerConfig& crypto_config() const { return crypto_config_; } 1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 173e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch QuicFramer* framer() { return &framer_; } 174e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 1750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch QuicEpollConnectionHelper* helper() { return helper_.get(); } 1760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu QuicPacketWriter* writer() { return writer_.get(); } 1780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 17903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const QuicConnection::PacketWriterFactory& connection_writer_factory() { 18003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return connection_writer_factory_; 18103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 18203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) class QuicFramerVisitor; 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) friend class net::tools::test::QuicDispatcherPeer; 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 18703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // An adapter that creates packet writers using the dispatcher's 18803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // PacketWriterFactory and shared writer. Essentially, it just curries the 18903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // writer argument away from QuicDispatcher::PacketWriterFactory. 19003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) class PacketWriterFactoryAdapter : 19103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) public QuicConnection::PacketWriterFactory { 19203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) public: 19303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) PacketWriterFactoryAdapter(QuicDispatcher* dispatcher); 19403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual ~PacketWriterFactoryAdapter (); 19503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 19603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual QuicPacketWriter* Create(QuicConnection* connection) const OVERRIDE; 19703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 19803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) private: 19903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) QuicDispatcher* dispatcher_; 20003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) }; 20103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Called by |framer_visitor_| when the private header has been parsed 2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // of a data packet that is destined for the time wait manager. 2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void OnUnauthenticatedHeader(const QuicPacketHeader& header); 2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Removes the session from the session map and write blocked list, and 207a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // adds the ConnectionId to the time-wait list. 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void CleanUpSession(SessionMap::iterator it); 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool HandlePacketForTimeWait(const QuicPacketPublicHeader& header); 2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const QuicConfig& config_; 2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const QuicCryptoServerConfig& crypto_config_; 2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The list of connections waiting to write. 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WriteBlockedList write_blocked_list_; 218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SessionMap session_map_; 220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Entity that manages connection_ids in time wait state. 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<QuicTimeWaitListManager> time_wait_list_manager_; 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // An alarm which deletes closed sessions. 225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<DeleteSessionsAlarm> delete_sessions_alarm_; 226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The list of closed but not-yet-deleted sessions. 228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::list<QuicSession*> closed_session_list_; 229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EpollServer* epoll_server_; // Owned by the server. 231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // The helper used for all connections. 2331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_ptr<QuicEpollConnectionHelper> helper_; 2341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // The writer to write to the socket with. 2365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<QuicPacketWriter> writer_; 2371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 23803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Used to create per-connection packet writers, not |writer_| itself. 23903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_ptr<PacketWriterFactory> packet_writer_factory_; 24003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 24103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Passed in to QuicConnection for it to create the per-connection writers 24203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) PacketWriterFactoryAdapter connection_writer_factory_; 24303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 2441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // This vector contains QUIC versions which we currently support. 2451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // This should be ordered such that the highest supported version is the first 2461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // element, with subsequent elements in descending order (versions can be 2471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // skipped as necessary). 2481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const QuicVersionVector supported_versions_; 2491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Information about the packet currently being handled. 2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPEndPoint current_client_address_; 2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPEndPoint current_server_address_; 2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const QuicEncryptedPacket* current_packet_; 2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicFramer framer_; 2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<QuicFramerVisitor> framer_visitor_; 2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(QuicDispatcher); 259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace tools 262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace net 263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif // NET_TOOLS_QUIC_QUIC_DISPATCHER_H_ 265