15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NET_SOCKET_STREAM_SOCKET_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NET_SOCKET_STREAM_SOCKET_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_log.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/next_proto.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/socket.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AddressList;
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class IPEndPoint;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SSLInfo;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NET_EXPORT_PRIVATE StreamSocket : public Socket {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~StreamSocket() {}
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called to establish a connection.  Returns OK if the connection could be
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // established synchronously.  Otherwise, ERR_IO_PENDING is returned and the
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // given callback will run asynchronously when the connection is established
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // or when an error occurs.  The result is some other error code if the
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // connection could not be established.
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The socket's Read and Write methods may not be called until Connect
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // succeeds.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // It is valid to call Connect on an already connected socket, in which case
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // OK is simply returned.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Connect may also be called again after a call to the Disconnect method.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int Connect(const CompletionCallback& callback) = 0;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called to disconnect a socket.  Does nothing if the socket is already
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // disconnected.  After calling Disconnect it is possible to call Connect
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // again to establish a new connection.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If IO (Connect, Read, or Write) is pending when the socket is
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // disconnected, the pending IO is cancelled, and the completion callback
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // will not be called.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Disconnect() = 0;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called to test if the connection is still alive.  Returns false if a
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // connection wasn't established or the connection is dead.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsConnected() const = 0;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called to test if the connection is still alive and idle.  Returns false
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // if a connection wasn't established, the connection is dead, or some data
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // have been received.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsConnectedAndIdle() const = 0;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Copies the peer address to |address| and returns a network error code.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ERR_SOCKET_NOT_CONNECTED will be returned if the socket is not connected.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int GetPeerAddress(IPEndPoint* address) const = 0;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Copies the local address to |address| and returns a network error code.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ERR_SOCKET_NOT_CONNECTED will be returned if the socket is not bound.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int GetLocalAddress(IPEndPoint* address) const = 0;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets the NetLog for this socket.
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual const BoundNetLog& NetLog() const = 0;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the annotation to indicate this socket was created for speculative
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // reasons.  This call is generally forwarded to a basic TCPClientSocket*,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // where a UseHistory can be updated.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetSubresourceSpeculation() = 0;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetOmniboxSpeculation() = 0;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
73effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Returns true if the socket ever had any reads or writes.  StreamSockets
74effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // layered on top of transport sockets should return if their own Read() or
75effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Write() methods had been called, not the underlying transport's.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool WasEverUsed() const = 0;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // TODO(jri): Clean up -- remove this method.
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the underlying transport socket is using TCP FastOpen.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TCP FastOpen is an experiment with sending data in the TCP SYN packet.
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool UsingTCPFastOpen() const = 0;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // TODO(jri): Clean up -- rename to a more general EnableAutoConnectOnWrite.
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Enables use of TCP FastOpen for the underlying transport socket.
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void EnableTCPFastOpenIfSupported() {}
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if NPN was negotiated during the connection of this socket.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool WasNpnNegotiated() const = 0;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the protocol negotiated via NPN for this socket, or
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // kProtoUnknown will be returned if NPN is not applicable.
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual NextProto GetNegotiatedProtocol() const = 0;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets the SSL connection information of the socket.  Returns false if
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SSL was not used by this socket.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool GetSSLInfo(SSLInfo* ssl_info) = 0;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The following class is only used to gather statistics about the history of
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a socket.  It is only instantiated and used in basic sockets, such as
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TCPClientSocket* instances.  Other classes that are derived from
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // StreamSocket should forward any potential settings to their underlying
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // transport sockets.
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class UseHistory {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UseHistory();
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~UseHistory();
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Resets the state of UseHistory and emits histograms for the
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // current state.
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void Reset();
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void set_was_ever_connected();
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void set_was_used_to_convey_data();
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The next two setters only have any impact if the socket has not yet been
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // used to transmit data.  If called later, we assume that the socket was
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // reused from the pool, and was NOT constructed to service a speculative
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // request.
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void set_subresource_speculation();
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void set_omnibox_speculation();
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool was_used_to_convey_data() const;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Summarize the statistics for this socket.
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void EmitPreconnectionHistograms() const;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Indicate if this was ever connected.
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool was_ever_connected_;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Indicate if this socket was ever used to transmit or receive data.
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool was_used_to_convey_data_;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Indicate if this socket was first created for speculative use, and
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // identify the motivation.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool omnibox_speculation_;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool subresource_speculation_;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(UseHistory);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // NET_SOCKET_STREAM_SOCKET_H_
144