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