xref: /aosp_15_r20/external/cronet/net/socket/socket_options.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2017 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #ifndef NET_SOCKET_SOCKET_OPTIONS_H_
6*6777b538SAndroid Build Coastguard Worker #define NET_SOCKET_SOCKET_OPTIONS_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <stdint.h>
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #include "net/base/net_export.h"
11*6777b538SAndroid Build Coastguard Worker #include "net/socket/socket_descriptor.h"
12*6777b538SAndroid Build Coastguard Worker 
13*6777b538SAndroid Build Coastguard Worker namespace net {
14*6777b538SAndroid Build Coastguard Worker 
15*6777b538SAndroid Build Coastguard Worker // This function enables/disables buffering in the kernel. By default, on Linux,
16*6777b538SAndroid Build Coastguard Worker // TCP sockets will wait up to 200ms for more data to complete a packet before
17*6777b538SAndroid Build Coastguard Worker // transmitting. After calling this function, the kernel will not wait. See
18*6777b538SAndroid Build Coastguard Worker // TCP_NODELAY in `man 7 tcp`.
19*6777b538SAndroid Build Coastguard Worker //
20*6777b538SAndroid Build Coastguard Worker // For Windows:
21*6777b538SAndroid Build Coastguard Worker //
22*6777b538SAndroid Build Coastguard Worker // The Nagle implementation on Windows is governed by RFC 896.  The idea
23*6777b538SAndroid Build Coastguard Worker // behind Nagle is to reduce small packets on the network.  When Nagle is
24*6777b538SAndroid Build Coastguard Worker // enabled, if a partial packet has been sent, the TCP stack will disallow
25*6777b538SAndroid Build Coastguard Worker // further *partial* packets until an ACK has been received from the other
26*6777b538SAndroid Build Coastguard Worker // side.  Good applications should always strive to send as much data as
27*6777b538SAndroid Build Coastguard Worker // possible and avoid partial-packet sends.  However, in most real world
28*6777b538SAndroid Build Coastguard Worker // applications, there are edge cases where this does not happen, and two
29*6777b538SAndroid Build Coastguard Worker // partial packets may be sent back to back.  For a browser, it is NEVER
30*6777b538SAndroid Build Coastguard Worker // a benefit to delay for an RTT before the second packet is sent.
31*6777b538SAndroid Build Coastguard Worker //
32*6777b538SAndroid Build Coastguard Worker // As a practical example in Chromium today, consider the case of a small
33*6777b538SAndroid Build Coastguard Worker // POST.  I have verified this:
34*6777b538SAndroid Build Coastguard Worker //     Client writes 649 bytes of header  (partial packet #1)
35*6777b538SAndroid Build Coastguard Worker //     Client writes 50 bytes of POST data (partial packet #2)
36*6777b538SAndroid Build Coastguard Worker // In the above example, with Nagle, a RTT delay is inserted between these
37*6777b538SAndroid Build Coastguard Worker // two sends due to nagle.  RTTs can easily be 100ms or more.  The best
38*6777b538SAndroid Build Coastguard Worker // fix is to make sure that for POSTing data, we write as much data as
39*6777b538SAndroid Build Coastguard Worker // possible and minimize partial packets.  We will fix that.  But disabling
40*6777b538SAndroid Build Coastguard Worker // Nagle also ensure we don't run into this delay in other edge cases.
41*6777b538SAndroid Build Coastguard Worker // See also:
42*6777b538SAndroid Build Coastguard Worker //    http://technet.microsoft.com/en-us/library/bb726981.aspx
43*6777b538SAndroid Build Coastguard Worker //
44*6777b538SAndroid Build Coastguard Worker // SetTCPNoDelay() sets the TCP_NODELAY option. Use |no_delay| to enable or
45*6777b538SAndroid Build Coastguard Worker // disable it. On error returns a net error code, on success returns OK.
46*6777b538SAndroid Build Coastguard Worker int SetTCPNoDelay(SocketDescriptor fd, bool no_delay);
47*6777b538SAndroid Build Coastguard Worker 
48*6777b538SAndroid Build Coastguard Worker // SetReuseAddr() sets the SO_REUSEADDR socket option. Use |reuse| to enable or
49*6777b538SAndroid Build Coastguard Worker // disable it. On error returns a net error code, on success returns OK.
50*6777b538SAndroid Build Coastguard Worker int SetReuseAddr(SocketDescriptor fd, bool reuse);
51*6777b538SAndroid Build Coastguard Worker 
52*6777b538SAndroid Build Coastguard Worker // SetSocketReceiveBufferSize() sets the SO_RCVBUF socket option. On error
53*6777b538SAndroid Build Coastguard Worker // returns a net error code, on success returns OK.
54*6777b538SAndroid Build Coastguard Worker int SetSocketReceiveBufferSize(SocketDescriptor fd, int32_t size);
55*6777b538SAndroid Build Coastguard Worker 
56*6777b538SAndroid Build Coastguard Worker // SetSocketSendBufferSize() sets the SO_SNDBUF socket option. On error
57*6777b538SAndroid Build Coastguard Worker // returns a net error code, on success returns OK.
58*6777b538SAndroid Build Coastguard Worker int SetSocketSendBufferSize(SocketDescriptor fd, int32_t size);
59*6777b538SAndroid Build Coastguard Worker 
60*6777b538SAndroid Build Coastguard Worker // SetIPv6Only() sets the IPV6_V6ONLY socket option. On error
61*6777b538SAndroid Build Coastguard Worker // returns a net error code, on success returns OK.
62*6777b538SAndroid Build Coastguard Worker int SetIPv6Only(SocketDescriptor fd, bool ipv6_only);
63*6777b538SAndroid Build Coastguard Worker 
64*6777b538SAndroid Build Coastguard Worker }  // namespace net
65*6777b538SAndroid Build Coastguard Worker 
66*6777b538SAndroid Build Coastguard Worker #endif  // NET_SOCKET_SOCKET_OPTIONS_H_
67