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 toy server, which listens on a specified address for QUIC traffic and
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// handles incoming responses.
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifndef NET_TOOLS_QUIC_QUIC_SERVER_H_
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define NET_TOOLS_QUIC_QUIC_SERVER_H_
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/basictypes.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/base/ip_endpoint.h"
140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "net/quic/crypto/quic_crypto_server_config.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/quic/quic_config.h"
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/quic/quic_framer.h"
174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "net/tools/epoll_server/epoll_server.h"
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace net {
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace tools {
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)namespace test {
241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class QuicServerPeer;
251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}  // namespace test
261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class ProcessPacketInterface;
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class QuicDispatcher;
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class QuicServer : public EpollCallbackInterface {
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QuicServer();
331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  QuicServer(const QuicConfig& config,
34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)             const QuicVersionVector& supported_versions);
3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~QuicServer();
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Start listening on the specified address.
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool Listen(const IPEndPoint& address);
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Wait up to 50ms, and handle any events which occur.
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void WaitForEvents();
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Server deletion is imminent.  Start cleaning up the epoll server.
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void Shutdown();
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // From EpollCallbackInterface
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void OnRegistration(EpollServer* eps,
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              int fd,
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              int event_mask) OVERRIDE {}
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void OnModification(int fd, int event_mask) OVERRIDE {}
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void OnEvent(int fd, EpollEvent* event) OVERRIDE;
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void OnUnregistration(int fd, bool replaced) OVERRIDE {}
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Reads a packet from the given fd, and then passes it off to
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // the QuicDispatcher.  Returns true if a packet is read, false
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // otherwise.
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // If packets_dropped is non-null, the socket is configured to track
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // dropped packets, and some packets are read, it will be set to the number of
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // dropped packets.
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static bool ReadAndDispatchSinglePacket(int fd, int port,
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                          ProcessPacketInterface* processor,
63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                          uint32* packets_dropped);
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void OnShutdown(EpollServer* eps, int fd) OVERRIDE {}
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void SetStrikeRegisterNoStartupPeriod() {
6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    crypto_config_.set_strike_register_no_startup_period();
6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // SetProofSource sets the ProofSource that will be used to verify the
72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // server's certificate, and takes ownership of |source|.
73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void SetProofSource(ProofSource* source) {
74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    crypto_config_.SetProofSource(source);
75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool overflow_supported() { return overflow_supported_; }
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  uint32 packets_dropped() { return packets_dropped_; }
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int port() { return port_; }
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) protected:
84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual QuicDispatcher* CreateQuicDispatcher();
85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const QuicConfig& config() const { return config_; }
87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const QuicCryptoServerConfig& crypto_config() const {
88f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return crypto_config_;
89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const QuicVersionVector& supported_versions() const {
91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return supported_versions_;
92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EpollServer* epoll_server() { return &epoll_server_; }
94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  friend class net::tools::test::QuicServerPeer;
971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
9890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Initialize the internal state of the server.
9990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void Initialize();
10090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Accepts data from the framer and demuxes clients to sessions.
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<QuicDispatcher> dispatcher_;
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Frames incoming packets and hands them to the dispatcher.
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EpollServer epoll_server_;
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The port the server is listening on.
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int port_;
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Listening connection.  Also used for outbound client communication.
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int fd_;
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // If overflow_supported_ is true this will be the number of packets dropped
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // during the lifetime of the server.  This may overflow if enough packets
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // are dropped.
115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  uint32 packets_dropped_;
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // True if the kernel supports SO_RXQ_OVFL, the number of packets dropped
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // because the socket would otherwise overflow.
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool overflow_supported_;
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // If true, use recvmmsg for reading.
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool use_recvmmsg_;
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // config_ contains non-crypto parameters that are negotiated in the crypto
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // handshake.
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QuicConfig config_;
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // crypto_config_ contains crypto parameters for the handshake.
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QuicCryptoServerConfig crypto_config_;
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // This vector contains QUIC versions which we currently support.
1311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // This should be ordered such that the highest supported version is the first
1321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // element, with subsequent elements in descending order (versions can be
1331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // skipped as necessary).
1341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  QuicVersionVector supported_versions_;
1351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
136e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Size of flow control receive window to advertise to clients on new
137e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // connections.
138e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  uint32 server_initial_flow_control_receive_window_;
139e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(QuicServer);
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace tools
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace net
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif  // NET_TOOLS_QUIC_QUIC_SERVER_H_
147