linux/net
Ilpo Järvinen e56d6cd605 [TCP]: Process DSACKs that reside within a SACK block
DSACK inside another SACK block were missed if start_seq of DSACK
was larger than SACK block's because sorting prioritizes full
processing of the SACK block before DSACK. After SACK block
sorting situation is like this:

             SSSSSSSSS
                  D
                        SSSSSS
                               SSSSSSS

Because write_queue is walked in-order, when the first SACK block
has been processed, TCP is already past the skb for which the
DSACK arrived and we haven't taught it to backtrack (nor should
we), so TCP just continues processing by going to the next SACK
block after the DSACK (if any).

Whenever such DSACK is present, do an embedded checking during
the previous SACK block.

If the DSACK is below snd_una, there won't be overlapping SACK
block, and thus no problem in that case. Also if start_seq of
the DSACK is equal to the actual block, it will be processed
first.

Tested this by using netem to duplicate 15% of packets, and
by printing SACK block when found_dup_sack is true and the 
selected skb in the dup_sack = 1 branch (if taken):

  SACK block 0: 4344-5792 (relative to snd_una 2019137317)
  SACK block 1: 4344-5792 (relative to snd_una 2019137317) 

equal start seqnos => next_dup = 0, dup_sack = 1 won't occur...

  SACK block 0: 5792-7240 (relative to snd_una 2019214061)
  SACK block 1: 2896-7240 (relative to snd_una 2019214061)
  DSACK skb match 5792-7240 (relative to snd_una)

...and next_dup = 1 case (after the not shown start_seq sort),
went to dup_sack = 1 branch.

Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
Signed-off-by: David S. Miller <davem@davemloft.net>
2007-11-01 00:09:37 -07:00
..
9p [9P]: Fix missing unlock before return in p9_mux_poll_start 2007-10-23 21:27:54 -07:00
802 [NET]: Move hardware header operations out of netdevice. 2007-10-10 16:52:52 -07:00
8021q [8021Q]: transfer dev_id from real device 2007-10-10 16:54:56 -07:00
appletalk [NET]: sparse warning fixes 2007-10-10 16:54:48 -07:00
atm [BR2684]: get rid of broken header code. 2007-10-17 19:39:22 -07:00
ax25 Convert files to UTF-8 and some cleanups 2007-10-19 23:21:04 +02:00
bluetooth [Bluetooth] Convert RFCOMM to use kthread API 2007-10-22 02:59:49 -07:00
bridge Convert files to UTF-8 and some cleanups 2007-10-19 23:21:04 +02:00
core [NET]: Fix incorrect sg_mark_end() calls. 2007-10-30 21:29:29 -07:00
dccp [CCID2/3]: Initialisation assignments of 0 are redundant 2007-10-24 10:53:01 -02:00
decnet [NETFILTER]: Replace sk_buff ** with sk_buff * 2007-10-15 12:26:29 -07:00
econet [NET]: Wrap netdevice hardware header creation. 2007-10-10 16:52:50 -07:00
ethernet [NET]: Validate device addr prior to interface-up 2007-10-23 21:27:50 -07:00
ieee80211 SG: Change sg_set_page() to take length and offset argument 2007-10-24 11:20:47 +02:00
ipv4 [TCP]: Process DSACKs that reside within a SACK block 2007-11-01 00:09:37 -07:00
ipv6 [NET]: Fix incorrect sg_mark_end() calls. 2007-10-30 21:29:29 -07:00
ipx [NET]: Make the device list and device lookups per namespace. 2007-10-10 16:49:10 -07:00
irda [IRDA]: Make ircomm_tty static. 2007-10-26 03:56:43 -07:00
iucv Fix misspellings of "system", "controller", "interrupt" and "necessary". 2007-10-19 23:10:43 +02:00
key [AF_KEY]: suppress a warning for 64k pages. 2007-10-30 23:57:05 -07:00
lapb [PATCH] remove many unneeded #includes of sched.h 2007-02-14 08:09:54 -08:00
llc Use helpers to obtain task pid in printks 2007-10-19 11:53:43 -07:00
mac80211 [PATCH] mac80211: fix printk warning on 64-bit 2007-10-26 00:14:29 -04:00
netfilter Kbuild/doc: fix links to Documentation files 2007-10-30 14:26:30 -07:00
netlabel [NetLabel]: correct usage of RCU locking 2007-10-26 04:29:08 -07:00
netlink [NET]: Marking struct pernet_operations __net_initdata was inappropriate 2007-10-26 22:54:53 -07:00
netrom [NET]: Move hardware header operations out of netdevice. 2007-10-10 16:52:52 -07:00
packet [PACKET]: Kill unused pg_vec_endpage() function 2007-10-18 21:58:19 -07:00
rfkill get rid of input BIT* duplicate defines 2007-10-19 11:53:42 -07:00
rose [NET]: Move hardware header operations out of netdevice. 2007-10-10 16:52:52 -07:00
rxrpc [NET]: Fix incorrect sg_mark_end() calls. 2007-10-30 21:29:29 -07:00
sched [NET_CLS_ACT]: Use skb_act_clone 2007-10-26 02:47:54 -07:00
sctp SCTP endianness annotations regression 2007-10-29 07:41:32 -07:00
sunrpc [NET]: Fix incorrect sg_mark_end() calls. 2007-10-30 21:29:29 -07:00
tipc [NET]: Wrap netdevice hardware header creation. 2007-10-10 16:52:50 -07:00
unix pid namespaces: changes to show virtual ids to user 2007-10-19 11:53:40 -07:00
wanrouter [NET]: Make /proc/net per network namespace 2007-10-10 16:49:06 -07:00
wireless Driver core: change add_uevent_var to use a struct 2007-10-12 14:51:01 -07:00
x25 [NET]: Make the device list and device lookups per namespace. 2007-10-10 16:49:10 -07:00
xfrm [IPSEC]: Fix scatterlist handling in skb_icv_walk(). 2007-10-26 00:39:27 -07:00
compat.c O_CLOEXEC for SCM_RIGHTS 2007-07-16 09:05:45 -07:00
Kconfig [NET]: Add network namespace clone & unshare support. 2007-10-10 16:52:46 -07:00
Makefile 9p: Reorganization of 9p file system code 2007-07-14 15:13:40 -05:00
nonet.c
socket.c [NET]: Fix error reporting in sys_socketpair(). 2007-10-29 22:37:34 -07:00
sysctl_net.c Remove obsolete #include <linux/config.h> 2006-06-30 19:25:36 +02:00
TUNABLE