android_kernel_xiaomi_sm8350/net/ipv4
Ilpo Järvinen c96fd3d461 [TCP]: Enable SACK enhanced FRTO (RFC4138) by default
Most of the description that follows comes from my mail to
netdev (some editing done):

Main obstacle to FRTO use is its deployment as it has to be on
the sender side where as wireless link is often the receiver's
access link. Take initiative on behalf of unlucky receivers and
enable it by default in future Linux TCP senders. Also IETF
seems to interested in advancing FRTO from experimental [1].

How does FRTO help?
===================

FRTO detects spurious RTOs and avoids a number of unnecessary
retransmissions and a couple of other problems that can arise
due to incorrect guess made at RTO (i.e., that segments were
lost when they actually got delayed which is likely to occur
e.g. in wireless environments with link-layer retransmission).
Though FRTO cannot prevent the first (potentially unnecessary)
retransmission at RTO, I suspect that it won't cost that much
even if you have to pay for each bit (won't be that high
percentage out of all packets after all :-)). However, usually
when you have a spurious RTO, not only the first segment
unnecessarily retransmitted but the *whole window*. It goes like
this: all cumulative ACKs got delayed due to in-order delivery,
then TCP will actually send 1.5*original cwnd worth of data in
the RTO's slow-start when the delayed ACKs arrive (basically the
original cwnd worth of it unnecessarily). In case one is
interested in minimizing unnecessary retransmissions e.g. due to
cost, those rexmissions must never see daylight. Besides, in the
worst case the generated burst overloads the bottleneck buffers
which is likely to significantly delay the further progress of
the flow. In case of ll rexmissions, ACK compression often
occurs at the same time making the burst very "sharp edged" (in
that case TCP often loses most of the segments above high_seq
=> very bad performance too). When FRTO is enabled, those
unnecessary retransmissions are fully avoided except for the
first segment and the cwnd behavior after detected spurious RTO
is determined by the response (one can tune that by sysctl).

Basic version (non-SACK enhanced one), FRTO can fail to detect
spurious RTO as spurious and falls back to conservative
behavior. ACK lossage is much less significant than reordering,
usually the FRTO can detect spurious RTO if at least 2
cumulative ACKs from original window are preserved (excluding
the ACK that advances to high_seq). With SACK-enhanced version,
the detection is quite robust.

FRTO should remove the need to set a high lower bound for the
RTO estimator due to delay spikes that occur relatively common
in some environments (esp. in wireless/cellular ones).

[1] http://www1.ietf.org/mail-archive/web/tcpm/current/msg02862.html

Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
Signed-off-by: David S. Miller <davem@davemloft.net>
2007-10-10 16:52:12 -07:00
..
ipvs [NET]: Make the device list and device lookups per namespace. 2007-10-10 16:49:10 -07:00
netfilter [NET]: Make the device list and device lookups per namespace. 2007-10-10 16:49:10 -07:00
af_inet.c [IPV4]: Add ICMPMsgStats MIB (RFC 4293) 2007-10-10 16:51:28 -07:00
ah4.c [IPSEC] AH4: Update IPv4 options handling to conform to RFC 4302. 2007-08-26 18:35:33 -07:00
arp.c [NET]: Make the device list and device lookups per namespace. 2007-10-10 16:49:10 -07:00
cipso_ipv4.c [CIPSO]: remove duplicated code in the cipso_v4_*_getattr() functions 2007-10-10 16:51:17 -07:00
datagram.c [IPV4]: Fix "ipOutNoRoutes" counter error for TCP and UDP 2007-06-03 18:08:50 -07:00
devinet.c [NET]: Make the device list and device lookups per namespace. 2007-10-10 16:49:10 -07:00
esp4.c [XFRM]: Add module alias for transformation type. 2007-07-10 22:15:43 -07:00
fib_frontend.c [NETLINK]: Introduce nested and byteorder flag to netlink attribute 2007-10-10 16:49:16 -07:00
fib_hash.c [NET]: Make /proc/net per network namespace 2007-10-10 16:49:06 -07:00
fib_lookup.h [RTNETLINK]: Fix sending netlink message when replace route. 2007-05-24 16:36:53 -07:00
fib_rules.c [IPV4/IPV6/DECNET]: Small cleanup for fib rules. 2007-10-10 16:51:22 -07:00
fib_semantics.c [NETLINK]: Introduce nested and byteorder flag to netlink attribute 2007-10-10 16:49:16 -07:00
fib_trie.c [NET]: Make /proc/net per network namespace 2007-10-10 16:49:06 -07:00
icmp.c [IPV4]: Add ICMPMsgStats MIB (RFC 4293) 2007-10-10 16:51:28 -07:00
igmp.c [NET]: Make the device list and device lookups per namespace. 2007-10-10 16:49:10 -07:00
inet_connection_sock.c [TCP]: Use default 32768-61000 outgoing port range in all cases. 2007-06-03 18:08:43 -07:00
inet_diag.c [NETLINK]: Avoid pointer in netlink_run_queue 2007-10-10 16:51:24 -07:00
inet_hashtables.c [NET] IPV4: Fix whitespace errors. 2007-02-10 23:19:39 -08:00
inet_lro.c [NET]: Generic Large Receive Offload for TCP traffic 2007-10-10 16:47:46 -07:00
inet_timewait_sock.c [NET]: DIV_ROUND_UP cleanup (part two) 2007-10-10 16:48:37 -07:00
inetpeer.c [IPV4]: Fix inetpeer gcc-4.2 warnings 2007-07-20 19:39:17 -07:00
ip_forward.c [IPV4] IPSEC: Omit redirect for tunnelled packet. 2007-10-10 16:48:33 -07:00
ip_fragment.c [NET]: Make the device list and device lookups per namespace. 2007-10-10 16:49:10 -07:00
ip_gre.c [NET]: Nuke SET_MODULE_OWNER macro. 2007-10-10 16:51:13 -07:00
ip_input.c [NET]: Make packet reception network namespace safe 2007-10-10 16:49:08 -07:00
ip_options.c [IPV4] ip_options.c: kmalloc + memset conversion to kzalloc 2007-07-31 14:06:45 -07:00
ip_output.c [IPV4]: Add ICMPMsgStats MIB (RFC 4293) 2007-10-10 16:51:28 -07:00
ip_sockglue.c [NET]: Make the device list and device lookups per namespace. 2007-10-10 16:49:10 -07:00
ipcomp.c [XFRM]: Add module alias for transformation type. 2007-07-10 22:15:43 -07:00
ipconfig.c [NET]: Make the device list and device lookups per namespace. 2007-10-10 16:49:10 -07:00
ipip.c [NET]: Nuke SET_MODULE_OWNER macro. 2007-10-10 16:51:13 -07:00
ipmr.c [NET]: Make the device list and device lookups per namespace. 2007-10-10 16:49:10 -07:00
Kconfig [NET]: Generic Large Receive Offload for TCP traffic 2007-10-10 16:47:46 -07:00
Makefile [NET]: Generic Large Receive Offload for TCP traffic 2007-10-10 16:47:46 -07:00
netfilter.c [SK_BUFF]: Introduce ip_hdr(), remove skb->nh.iph 2007-04-25 22:25:10 -07:00
proc.c [IPV4]: Add ICMPMsgStats MIB (RFC 4293) 2007-10-10 16:51:28 -07:00
protocol.c [IPV4]: align inet_protos[] on SMP 2007-04-25 22:28:20 -07:00
raw.c [IPV4]: Add ICMPMsgStats MIB (RFC 4293) 2007-10-10 16:51:28 -07:00
route.c [IPV4]: Convert rt_check_expire() from softirq processing to workqueue. 2007-10-10 16:49:25 -07:00
syncookies.c [SK_BUFF]: Introduce tcp_hdr(), remove skb->h.th 2007-04-25 22:25:26 -07:00
sysctl_net_ipv4.c [IPV4]: Convert IPv4 devconf to an array 2007-06-07 13:39:13 -07:00
tcp_bic.c [TCP]: Remove num_acked>0 checks from cong.ctrl mods pkts_acked 2007-10-10 16:47:55 -07:00
tcp_cong.c [TCP]: remove unused argument to cong_avoid op 2007-07-18 01:46:58 -07:00
tcp_cubic.c [TCP]: Remove num_acked>0 checks from cong.ctrl mods pkts_acked 2007-10-10 16:47:55 -07:00
tcp_diag.c [TCP]: Return useful listenq info in tcp_info and INET_DIAG_INFO. 2007-10-10 16:51:35 -07:00
tcp_highspeed.c [TCP]: remove unused argument to cong_avoid op 2007-07-18 01:46:58 -07:00
tcp_htcp.c [TCP]: H-TCP maxRTT estimation at startup 2007-08-07 18:29:05 -07:00
tcp_hybla.c [TCP]: remove unused argument to cong_avoid op 2007-07-18 01:46:58 -07:00
tcp_illinois.c [TCP]: congestion control API pass RTT in microseconds 2007-07-31 02:27:57 -07:00
tcp_input.c [TCP]: Enable SACK enhanced FRTO (RFC4138) by default 2007-10-10 16:52:12 -07:00
tcp_ipv4.c [NET]: Make /proc/net per network namespace 2007-10-10 16:49:06 -07:00
tcp_lp.c [TCP]: congestion control API pass RTT in microseconds 2007-07-31 02:27:57 -07:00
tcp_minisocks.c [TCP]: Move sack_ok access to obviously named funcs & cleanup 2007-10-10 16:48:00 -07:00
tcp_output.c [TCP]: clear_all_retrans_hints prefixed by tcp_ 2007-10-10 16:52:09 -07:00
tcp_probe.c [NET]: Make /proc/net per network namespace 2007-10-10 16:49:06 -07:00
tcp_scalable.c [TCP]: remove unused argument to cong_avoid op 2007-07-18 01:46:58 -07:00
tcp_timer.c [TCP]: Move sack_ok access to obviously named funcs & cleanup 2007-10-10 16:48:00 -07:00
tcp_vegas.c [TCP]: congestion control API pass RTT in microseconds 2007-07-31 02:27:57 -07:00
tcp_vegas.h [TCP]: congestion control API pass RTT in microseconds 2007-07-31 02:27:57 -07:00
tcp_veno.c [TCP]: congestion control API pass RTT in microseconds 2007-07-31 02:27:57 -07:00
tcp_westwood.c [TCP]: congestion control API pass RTT in microseconds 2007-07-31 02:27:57 -07:00
tcp_yeah.c [TCP]: congestion control API pass RTT in microseconds 2007-07-31 02:27:57 -07:00
tcp.c [TCP]: Return useful listenq info in tcp_info and INET_DIAG_INFO. 2007-10-10 16:51:35 -07:00
tunnel4.c [IPSEC]: Changing API of xfrm4_tunnel_register. 2007-02-13 12:54:47 -08:00
udp_impl.h [UDP]: Randomize port selection. 2007-10-10 16:48:31 -07:00
udp.c [NET]: Make /proc/net per network namespace 2007-10-10 16:49:06 -07:00
udplite.c [UDP]: Randomize port selection. 2007-10-10 16:48:31 -07:00
xfrm4_input.c [UDP]: Cleanup UDP encapsulation code 2007-07-10 22:16:53 -07:00
xfrm4_mode_beet.c [XFRM]: beet: fix worst case header_len calculation 2007-04-25 22:28:39 -07:00
xfrm4_mode_transport.c [SK_BUFF]: unions of just one member don't get anything done, kill them 2007-04-25 22:26:20 -07:00
xfrm4_mode_tunnel.c [IPSEC]: Fix panic when using inter address familiy IPsec on loopback. 2007-05-31 01:23:28 -07:00
xfrm4_output.c [SK_BUFF]: Introduce ip_hdr(), remove skb->nh.iph 2007-04-25 22:25:10 -07:00
xfrm4_policy.c [NET]: cleanup extra semicolons 2007-04-25 22:29:24 -07:00
xfrm4_state.c [IPSEC]: exporting xfrm_state_afinfo 2007-02-08 12:39:00 -08:00
xfrm4_tunnel.c [XFRM]: Add module alias for transformation type. 2007-07-10 22:15:43 -07:00