1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file.
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef NET_SOCKET_CLIENT_SOCKET_H_
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define NET_SOCKET_CLIENT_SOCKET_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
9731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "net/base/net_log.h"
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/socket/socket.h"
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace net {
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass AddressList;
15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass IPEndPoint;
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass ClientSocket : public Socket {
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public:
193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual ~ClientSocket() {}
203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Called to establish a connection.  Returns OK if the connection could be
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // established synchronously.  Otherwise, ERR_IO_PENDING is returned and the
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // given callback will run asynchronously when the connection is established
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // or when an error occurs.  The result is some other error code if the
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // connection could not be established.
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // The socket's Read and Write methods may not be called until Connect
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // succeeds.
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // It is valid to call Connect on an already connected socket, in which case
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // OK is simply returned.
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Connect may also be called again after a call to the Disconnect method.
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //
357b9ca917061470268bf3395c8925d4b9cc52d8e1Kristian Monsen  virtual int Connect(CompletionCallback* callback
367b9ca917061470268bf3395c8925d4b9cc52d8e1Kristian Monsen#ifdef ANDROID
377b9ca917061470268bf3395c8925d4b9cc52d8e1Kristian Monsen                      , bool wait_for_connect
38e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma                      , bool valid_uid
39e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma                      , uid_t calling_uid
407b9ca917061470268bf3395c8925d4b9cc52d8e1Kristian Monsen#endif
417b9ca917061470268bf3395c8925d4b9cc52d8e1Kristian Monsen                     ) = 0;
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Called to disconnect a socket.  Does nothing if the socket is already
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // disconnected.  After calling Disconnect it is possible to call Connect
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // again to establish a new connection.
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // If IO (Connect, Read, or Write) is pending when the socket is
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // disconnected, the pending IO is cancelled, and the completion callback
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // will not be called.
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual void Disconnect() = 0;
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Called to test if the connection is still alive.  Returns false if a
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // connection wasn't established or the connection is dead.
54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual bool IsConnected() const = 0;
55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Called to test if the connection is still alive and idle.  Returns false
57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // if a connection wasn't established, the connection is dead, or some data
58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // have been received.
59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual bool IsConnectedAndIdle() const = 0;
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Copies the peer address to |address| and returns a network error code.
62731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // ERR_SOCKET_NOT_CONNECTED will be returned if the socket is not connected.
63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // TODO(sergeyu): Use IPEndPoint instead of AddressList.
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual int GetPeerAddress(AddressList* address) const = 0;
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Copies the local address to |address| and returns a network error code.
67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // ERR_SOCKET_NOT_CONNECTED will be returned if the socket is not connected.
68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual int GetLocalAddress(IPEndPoint* address) const = 0;
69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Gets the NetLog for this socket.
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual const BoundNetLog& NetLog() const = 0;
723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Set the annotation to indicate this socket was created for speculative
743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // reasons.  This call is generally forwarded to a basic TCPClientSocket*,
753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // where a UseHistory can be updated.
763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void SetSubresourceSpeculation() = 0;
773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void SetOmniboxSpeculation() = 0;
783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Returns true if the underlying transport socket ever had any reads or
803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // writes.  ClientSockets layered on top of transport sockets should forward
813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // this call to the transport socket.
823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool WasEverUsed() const = 0;
833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
84513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Returns true if the underlying transport socket is using TCP FastOpen.
85513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // TCP FastOpen is an experiment with sending data in the TCP SYN packet.
86513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual bool UsingTCPFastOpen() const = 0;
87513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick protected:
893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // The following class is only used to gather statistics about the history of
903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // a socket.  It is only instantiated and used in basic sockets, such as
913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // TCPClientSocket* instances.  Other classes that are derived from
923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // ClientSocket should forward any potential settings to their underlying
933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // transport sockets.
943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  class UseHistory {
953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick   public:
963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    UseHistory();
973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    ~UseHistory();
983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
99513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // Resets the state of UseHistory and emits histograms for the
100513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // current state.
101513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    void Reset();
102513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    void set_was_ever_connected();
1043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    void set_was_used_to_convey_data();
1053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // The next two setters only have any impact if the socket has not yet been
1073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // used to transmit data.  If called later, we assume that the socket was
1083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // reused from the pool, and was NOT constructed to service a speculative
1093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // request.
1103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    void set_subresource_speculation();
1113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    void set_omnibox_speculation();
1123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    bool was_used_to_convey_data() const;
1143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick   private:
1163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // Summarize the statistics for this socket.
1173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    void EmitPreconnectionHistograms() const;
1183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // Indicate if this was ever connected.
1193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    bool was_ever_connected_;
1203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // Indicate if this socket was ever used to transmit or receive data.
1213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    bool was_used_to_convey_data_;
1223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // Indicate if this socket was first created for speculative use, and
1243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // identify the motivation.
1253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    bool omnibox_speculation_;
1263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    bool subresource_speculation_;
1273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    DISALLOW_COPY_AND_ASSIGN(UseHistory);
1283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  };
129731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
130731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Logs a SOCKET_BYTES_RECEIVED or SOCKET_BYTES_SENT event to the NetLog.
131731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Determines whether to log the received bytes or not, based on the current
132731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // logging level.
133731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  void LogByteTransfer(const BoundNetLog& net_log, NetLog::EventType event_type,
134731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                       int byte_count, char* bytes) const;
135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace net
138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif  // NET_SOCKET_CLIENT_SOCKET_H_
140