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