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