| // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef NET_SOCKET_DATAGRAM_CLIENT_SOCKET_H_ |
| #define NET_SOCKET_DATAGRAM_CLIENT_SOCKET_H_ |
| |
| #include "net/base/datagram_buffer.h" |
| #include "net/base/net_export.h" |
| #include "net/base/network_change_notifier.h" |
| #include "net/socket/datagram_socket.h" |
| #include "net/socket/socket.h" |
| |
| namespace net { |
| |
| class IPEndPoint; |
| class SocketTag; |
| |
| class NET_EXPORT_PRIVATE DatagramClientSocket : public DatagramSocket, |
| public Socket { |
| public: |
| ~DatagramClientSocket() override {} |
| |
| // Initialize this socket as a client socket to server at |address|. |
| // Returns a network error code. |
| virtual int Connect(const IPEndPoint& address) = 0; |
| |
| // Binds this socket to |network| and initializes socket as a client socket |
| // to server at |address|. All data traffic on the socket will be sent and |
| // received via |network|. This call will fail if |network| has disconnected. |
| // Communication using this socket will fail if |network| disconnects. |
| // Returns a net error code. |
| virtual int ConnectUsingNetwork(NetworkChangeNotifier::NetworkHandle network, |
| const IPEndPoint& address) = 0; |
| |
| // Same as ConnectUsingNetwork, except that the current default network is |
| // used. Returns a net error code. |
| virtual int ConnectUsingDefaultNetwork(const IPEndPoint& address) = 0; |
| |
| // Returns the network that either ConnectUsingNetwork() or |
| // ConnectUsingDefaultNetwork() bound this socket to. Returns |
| // NetworkChangeNotifier::kInvalidNetworkHandle if not explicitly bound via |
| // ConnectUsingNetwork() or ConnectUsingDefaultNetwork(). |
| virtual NetworkChangeNotifier::NetworkHandle GetBoundNetwork() const = 0; |
| |
| // Apply |tag| to this socket. |
| virtual void ApplySocketTag(const SocketTag& tag) = 0; |
| |
| // Enables experimental optimization for receiving data from a socket. |
| // By default, this method is no-op. |
| virtual void EnableRecvOptimization() {} |
| |
| // As Write, but internally this can delay writes and batch them up |
| // for writing in a separate task. This is to increase throughput |
| // in bulk transfer scenarios (in QUIC) where a substantial |
| // proportion of CPU time is spend in kernel UDP writes, and total |
| // CPU time of the net IO thread saturates single core capacity. |
| // The batching is required to allow overlapped computation time |
| // between user and kernel packet processing. |
| // |
| // Returns the number of bytes written or a net error code. A |
| // return value of zero is possible, because with batching enabled, |
| // the underlying socket write may be delayed so as to accumulate |
| // multiple buffers. The return value may also be larger than the |
| // number of bytes in |buffers| due to completion of previous |
| // writes. [ Writing the batch to the socket typically happens on a |
| // different thread/cpu core. ] |
| // |
| // As with |Write|, a return value of ERR_IO_PENDING indicates the |
| // caller should suspend further writes until the callback fires. |
| // |
| // If a socket write returns an error, it will be surfaced either as |
| // the return value from the next call to |WriteAsync|, or via the |
| // callback. |
| // |
| // Not all platforms will implement this, see |write_async_enabled()| |
| // below. |
| virtual int WriteAsync( |
| DatagramBuffers buffers, |
| CompletionOnceCallback callback, |
| const NetworkTrafficAnnotationTag& traffic_annotation) = 0; |
| |
| // |buffer| is copied to an internal |DatagramBuffer|, caller |
| // |retains ownership of |buffer|. |
| virtual int WriteAsync( |
| const char* buffer, |
| size_t buf_len, |
| CompletionOnceCallback callback, |
| const NetworkTrafficAnnotationTag& traffic_annotation) = 0; |
| |
| // With WriteAsync, the caller may wish to try unwritten buffers on |
| // a new socket, e.g. with QUIC connection migration. |
| virtual DatagramBuffers GetUnwrittenBuffers() = 0; |
| |
| // Enable |WriteAsync()|. May be a noop, see |WriteAsyncEnabled()| |
| // below. Must be called right after construction and before other |
| // calls. This is intended to support rollout of |WriteAsync| for |
| // QUIC via a Finch trial, using the kWRBA client connection option. |
| virtual void SetWriteAsyncEnabled(bool enabled) = 0; |
| |
| // Needed with |WriteAsync()| enabled, for socket's |
| // |DatagramBufferPool|. Must be called right after construction |
| // and before other calls. |
| virtual void SetMaxPacketSize(size_t max_packet_size) = 0; |
| |
| // This is true if the |SetWriteAsyncEnabled(true)| has been called |
| // *and* the platform supports |WriteAsync()|. |
| virtual bool WriteAsyncEnabled() = 0; |
| |
| // In |WriteAsync()|, allow socket writing to happen on a separate |
| // core when advantageous. This can increase maximum single-stream |
| // throughput. Must be called right after construction and before |
| // other calls. This is intended to support QUIC Finch trials, using |
| // the kMLTC client connection option. |
| virtual void SetWriteMultiCoreEnabled(bool enabled) = 0; |
| |
| // In |WriteAsync()|, use |sendmmsg()| on platforms that support it. |
| // This can increase maximum single-stream throughput. Must be |
| // called right after construction and before other calls. This is |
| // intended to support QUIC Finch trials, using the kMMSG client |
| // connection option. |
| virtual void SetSendmmsgEnabled(bool enabled) = 0; |
| |
| // This is to (de-)activate batching in |WriteAsync|, e.g. in |
| // |QuicChromiumClientSession| based on whether there are large |
| // upload stream(s) active. |
| virtual void SetWriteBatchingActive(bool active) = 0; |
| }; |
| |
| } // namespace net |
| |
| #endif // NET_SOCKET_DATAGRAM_CLIENT_SOCKET_H_ |