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