freebsd-skq/sys
hiren ce99ff4570 One of the ways to detect loss is to count duplicate acks coming back from the
other end till it reaches predetermined threshold which is 3 for us right now.
Once that happens, we trigger fast-retransmit to do loss recovery.

Main problem with the current implementation is that we don't honor SACK
information well to detect whether an incoming ack is a dupack or not. RFC6675
has latest recommendations for that. According to it, dupack is a segment that
arrives carrying a SACK block that identifies previously unknown information
between snd_una and snd_max even if it carries new data, changes the advertised
window, or moves the cumulative acknowledgment point.

With the prevalence of Selective ACK (SACK) these days, improper handling can
lead to delayed loss recovery.

With the fix, new behavior looks like following:

0) th_ack < snd_una --> ignore
Old acks are ignored.
1) th_ack == snd_una, !sack_changed --> ignore
Acks with SACK enabled but without any new SACK info in them are ignored.
2) th_ack == snd_una, window == old_window --> increment
Increment on a good dupack.
3) th_ack == snd_una, window != old_window, sack_changed --> increment
When SACK enabled, it's okay to have advertized window changed if the ack has
new SACK info.
4) th_ack > snd_una --> reset to 0
Reset to 0 when left edge moves.
5) th_ack > snd_una, sack_changed --> increment
Increment if left edge moves but there is new SACK info.

Here, sack_changed is the indicator that incoming ack has previously unknown
SACK info in it.

Note: This fix is not fully compliant to RFC6675. That may require a few
changes to current implementation in order to keep per-sackhole dupack counter
and change to the way we mark/handle sack holes.

PR:			203663
Reviewed by:		jtl
MFC after:		3 weeks
Sponsored by:		Limelight Networks
Differential Revision:	https://reviews.freebsd.org/D4225
2015-12-08 21:21:48 +00:00
..
amd64 Merge common parts of i386 and amd64 md_var.h and smp.h into 2015-12-07 17:41:20 +00:00
arm Add helper functions proc_readmem() and proc_writemem(). 2015-12-07 21:33:15 +00:00
arm64 Add support for usermode (vdso-like) gettimeofday(2) and 2015-12-07 12:20:26 +00:00
boot DIRDEPS_BUILD: Update dependencies. 2015-12-07 23:53:01 +00:00
bsm
cam The ccb_xflags enumeration was removed from FreeBSD/head in 2015-12-07 21:04:27 +00:00
cddl MFV r289003: 2015-12-07 21:49:32 +00:00
compat Add some structures and defines which will be used when decoding small 2015-12-03 12:51:54 +00:00
conf Merge helper fib* functions used for basic lookups. 2015-12-08 10:50:03 +00:00
contrib Add initial ar9300 HAL support for the spectral scan mode. 2015-12-02 05:36:45 +00:00
crypto const'ify an arg that we don't update... 2015-07-29 23:37:15 +00:00
ddb Add helper to catch single step debug event and distinguish it from bkpt 2015-11-27 19:03:59 +00:00
dev sfxge: [3/6] rework MCDI response handling 2015-12-08 06:25:52 +00:00
fs The cdevpriv_dtr_t typedef was not able to be used in a function prototype 2015-12-02 18:27:30 +00:00
gdb
geom Fix a style issue in g_disk_limit(). 2015-12-04 03:44:12 +00:00
gnu Fixing a memory leak on module unloading. 2015-09-11 22:43:35 +00:00
i386 Merge common parts of i386 and amd64 md_var.h and smp.h into 2015-12-07 17:41:20 +00:00
isa
kern Don't use 0 for pointer comparison 2015-12-08 18:38:33 +00:00
kgssapi
libkern libkern: ffs, fls: s/4/3/ the 3rd BSD clause 2015-10-22 21:04:47 +00:00
mips Add helper functions proc_readmem() and proc_writemem(). 2015-12-07 21:33:15 +00:00
modules ahci_generic.c needs ofw_bus_if.h, add it to the module. 2015-12-08 20:05:27 +00:00
net Merge helper fib* functions used for basic lookups. 2015-12-08 10:50:03 +00:00
net80211 [net80211] decode WPA cipher config '0' as "clear cipher config". 2015-11-26 01:54:58 +00:00
netgraph Move iflladdr_event eventhandler invocation to if_setlladdr. 2015-11-14 13:34:03 +00:00
netinet One of the ways to detect loss is to count duplicate acks coming back from the 2015-12-08 21:21:48 +00:00
netinet6 Merge helper fib* functions used for basic lookups. 2015-12-08 10:50:03 +00:00
netipsec Overhaul if_enc(4) and make it loadable in run-time. 2015-11-25 07:31:59 +00:00
netnatm
netpfil Merge helper fib* functions used for basic lookups. 2015-12-08 10:50:03 +00:00
netsmb The problem report was for a crash that happened when smbfs was 2015-11-18 23:04:01 +00:00
nfs Add kernel support to the NFS server for the "-manage-gids" 2015-11-30 21:54:27 +00:00
nfsclient
nfsserver
nlm
ofed Fix i386 build WITH_OFED=YES. Remove some redundant KASSERTs. 2015-12-04 18:20:55 +00:00
opencrypto Remove unneeded includes of opt_kdtrace.h. 2015-11-22 02:01:01 +00:00
pc98 Add asynchronous command support to the pass(4) driver, and the new 2015-12-03 20:54:55 +00:00
powerpc Bump MAXCPU. We already run on hardware with 32 threads and the same hardware 2015-12-03 16:24:55 +00:00
rpc Improve locking of sg_threadcount. 2015-11-19 08:04:05 +00:00
security fd: make 'rights' a manadatory argument to fget* functions 2015-07-05 19:05:16 +00:00
sparc64 Remove sv_prepsyscall, sv_sigsize and sv_sigtbl members of the struct 2015-11-28 08:49:07 +00:00
sys Add helper functions proc_readmem() and proc_writemem(). 2015-12-07 21:33:15 +00:00
teken Sync HPA and VPA implementations with CUP. 2015-08-24 07:49:27 +00:00
tests Style 9 changes. 2015-11-12 10:31:14 +00:00
tools Rename the /usr/share/doc/legal files to driver.LICENSE to work around 2015-10-16 00:38:05 +00:00
ufs Update ctime when atime or birthtime are updated. 2015-12-07 12:09:04 +00:00
vm vm_fault_hold: handle vm_page_rename failure 2015-12-06 17:46:12 +00:00
x86 Merge common parts of i386 and amd64 md_var.h and smp.h into 2015-12-07 17:41:20 +00:00
xdr
xen xen/intr: fix the event channel enabled per-cpu mask 2015-11-05 14:33:46 +00:00
Makefile