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 client, which connects to a specified port and sends QUIC 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// request to that endpoint. 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifndef NET_TOOLS_QUIC_QUIC_CLIENT_H_ 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define NET_TOOLS_QUIC_QUIC_CLIENT_H_ 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <string> 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/basictypes.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/command_line.h" 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/base/ip_endpoint.h" 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/quic/crypto/crypto_handshake.h" 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/quic/quic_config.h" 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/quic/quic_framer.h" 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/quic/quic_packet_creator.h" 214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "net/tools/epoll_server/epoll_server.h" 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/tools/quic/quic_client_session.h" 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/tools/quic/quic_spdy_client_stream.h" 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace net { 267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass ProofVerifier; 28e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochclass QuicServerId; 297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace tools { 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 322385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochclass QuicEpollConnectionHelper; 332385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace test { 3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class QuicClientPeer; 3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} // namespace test 3790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class QuicClient : public EpollCallbackInterface, 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public QuicDataStream::Visitor { 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) class ResponseListener { 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ResponseListener() {} 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~ResponseListener() {} 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void OnCompleteResponse(QuicStreamId id, 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const BalsaHeaders& response_headers, 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const string& response_body) = 0; 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // Create a quic client, which will have events managed by an externally owned 516d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // EpollServer. 524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) QuicClient(IPEndPoint server_address, 53e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const QuicServerId& server_id, 541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const QuicVersionVector& supported_versions, 556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) bool print_response, 566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) EpollServer* epoll_server); 57b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) QuicClient(IPEndPoint server_address, 58e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const QuicServerId& server_id, 59e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const QuicVersionVector& supported_versions, 60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool print_response, 616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const QuicConfig& config, 626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) EpollServer* epoll_server); 63b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~QuicClient(); 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Initializes the client to create a connection. Should be called exactly 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // once before calling StartConnect or Connect. Returns true if the 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // initialization succeeds, false otherwise. 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool Initialize(); 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // "Connect" to the QUIC server, including performing synchronous crypto 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // handshake. 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool Connect(); 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Start the crypto handshake. This can be done in place of the synchronous 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Connect(), but callers are responsible for making sure the crypto handshake 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // completes. 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool StartConnect(); 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Returns true if the crypto handshake has yet to establish encryption. 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Returns false if encryption is active (even if the server hasn't confirmed 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the handshake) or if the connection has been closed. 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool EncryptionBeingEstablished(); 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Disconnects from the QUIC server. 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void Disconnect(); 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Sends a request simple GET for each URL in |args|, and then waits for 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // each to complete. 90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void SendRequestsAndWaitForResponse(const 91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::CommandLine::StringVector& args); 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Returns a newly created QuicSpdyClientStream, owned by the 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // QuicClient. 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicSpdyClientStream* CreateReliableClientStream(); 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Wait for events until the stream with the given ID is closed. 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void WaitForStreamToClose(QuicStreamId id); 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Wait for events until the handshake is confirmed. 1017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) void WaitForCryptoHandshakeConfirmed(); 1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Wait up to 50ms, and handle any events which occur. 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Returns true if there are any outstanding requests. 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool WaitForEvents(); 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // From EpollCallbackInterface 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void OnRegistration(EpollServer* eps, 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int fd, 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int event_mask) OVERRIDE {} 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnModification(int fd, int event_mask) OVERRIDE {} 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnEvent(int fd, EpollEvent* event) OVERRIDE; 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // |fd_| can be unregistered without the client being disconnected. This 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // happens in b3m QuicProber where we unregister |fd_| to feed in events to 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the client from the SelectServer. 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnUnregistration(int fd, bool replaced) OVERRIDE {} 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnShutdown(EpollServer* eps, int fd) OVERRIDE {} 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // QuicDataStream::Visitor 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void OnClose(QuicDataStream* stream) OVERRIDE; 1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicClientSession* session() { return session_.get(); } 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool connected() const; 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void set_bind_to_address(IPAddressNumber address) { 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bind_to_address_ = address; 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPAddressNumber bind_to_address() const { return bind_to_address_; } 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void set_local_port(int local_port) { local_port_ = local_port; } 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const IPEndPoint& server_address() const { return server_address_; } 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const IPEndPoint& client_address() const { return client_address_; } 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int fd() { return fd_; } 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 140e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const QuicServerId& server_id() const { return server_id_; } 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 14290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // This should only be set before the initial Connect() 143e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch void set_server_id(const QuicServerId& server_id) { 144e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch server_id_ = server_id; 14590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 14690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) void SetUserAgentID(const string& user_agent_id) { 1486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) crypto_config_.set_user_agent_id(user_agent_id); 1496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 1506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // SetProofVerifier sets the ProofVerifier that will be used to verify the 1527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // server's certificate and takes ownership of |verifier|. 1537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void SetProofVerifier(ProofVerifier* verifier) { 1547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // TODO(rtenneti): We should set ProofVerifier in QuicClientSession. 1557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch crypto_config_.SetProofVerifier(verifier); 1567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // SetChannelIDSource sets a ChannelIDSource that will be called, when the 159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // server supports channel IDs, to obtain a channel ID for signing a message 160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // proving possession of the channel ID. This object takes ownership of 161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // |source|. 162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void SetChannelIDSource(ChannelIDSource* source) { 163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) crypto_config_.SetChannelIDSource(source); 164558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 165558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void SetSupportedVersions(const QuicVersionVector& versions) { 1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) supported_versions_ = versions; 1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Takes ownership of the listener. 1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void set_response_listener(ResponseListener* listener) { 1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) response_listener_.reset(listener); 1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1752385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch protected: 176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual QuicConnectionId GenerateConnectionId(); 1772385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch virtual QuicEpollConnectionHelper* CreateQuicConnectionHelper(); 1781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual QuicPacketWriter* CreateQuicPacketWriter(); 1792385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 180e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch virtual int ReadPacket(char* buffer, 181e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch int buffer_len, 182e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch IPEndPoint* server_address, 183e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch IPAddressNumber* client_ip); 184e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EpollServer* epoll_server() { return epoll_server_; } 186116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch QuicConfig* config() { return &config_; } 187116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 18990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) friend class net::tools::test::QuicClientPeer; 19090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 19103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // A packet writer factory that always returns the same writer 19203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) class DummyPacketWriterFactory : public QuicConnection::PacketWriterFactory { 19303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) public: 19403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DummyPacketWriterFactory(QuicPacketWriter* writer); 19503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual ~DummyPacketWriterFactory(); 19603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 19703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual QuicPacketWriter* Create(QuicConnection* connection) const OVERRIDE; 19803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 19903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) private: 20003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) QuicPacketWriter* writer_; 20103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) }; 20203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Used during initialization: creates the UDP socket FD, sets socket options, 204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // and binds the socket to our address. 205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool CreateUDPSocket(); 206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Read a UDP packet and hand it to the framer. 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool ReadAndProcessPacket(); 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Address of the server. 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const IPEndPoint server_address_; 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 213e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // |server_id_| is a tuple (hostname, port, is_https) of the server. 214e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch QuicServerId server_id_; 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 216b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // config_ and crypto_config_ contain configuration and cached state about 217b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // servers. 218b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) QuicConfig config_; 219b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) QuicCryptoClientConfig crypto_config_; 220b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Address of the client if the client is connected to the server. 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPEndPoint client_address_; 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If initialized, the address to bind to. 225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPAddressNumber bind_to_address_; 226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Local port to bind to. Initialize to 0. 227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int local_port_; 228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Writer used to actually send packets to the wire. Needs to outlive 2305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // |session_|. 2315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<QuicPacketWriter> writer_; 2325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Session which manages streams. 234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<QuicClientSession> session_; 235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Listens for events on the client socket. 2366d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) EpollServer* epoll_server_; 237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // UDP socket. 238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int fd_; 239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Helper to be used by created connections. 2411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_ptr<QuicEpollConnectionHelper> helper_; 2421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Listens for full responses. 2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<ResponseListener> response_listener_; 2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Tracks if the client is initialized to connect. 247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool initialized_; 248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If overflow_supported_ is true, this will be the number of packets dropped 250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // during the lifetime of the server. This may overflow if enough packets 251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // are dropped. 252a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) uint32 packets_dropped_; 253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // True if the kernel supports SO_RXQ_OVFL, the number of packets dropped 255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // because the socket would otherwise overflow. 256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool overflow_supported_; 257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // This vector contains QUIC versions which we currently support. 2591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // This should be ordered such that the highest supported version is the first 2601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // element, with subsequent elements in descending order (versions can be 2611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // skipped as necessary). We will always pick supported_versions_[0] as the 2621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // initial version to use. 2631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) QuicVersionVector supported_versions_; 264558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 2654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // If true, then the contents of each response will be printed to stdout 2664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // when the stream is closed (in OnClose). 2674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool print_response_; 2684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(QuicClient); 270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace tools 273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace net 274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif // NET_TOOLS_QUIC_QUIC_CLIENT_H_ 276