linux/net/dccp
Gerrit Renker d50ad163e6 [CCID2]: Deadlock and spurious timeouts when Ack Ratio > cwnd
This patch removes a bug in the current code. I agree with Andrea's comment
that there is a problem here but the way it is treated does not fix it.

The problem is that whenever Ack Ratio > cwnd, starvation/deadlock occurs:
 * the receiver will not send an Ack until (Ack Ratio - cwnd) data packets
   have arrived;
 * the sender will not send any data packet before the receipt of an Ack
   advances the send window.
The only way that the connection then progresses was via RTO timeout. In one
extreme case (bulk transfer), it was observed that this happened for every single
packet; i.e. hundreds of packets, each a RTO timeout of 1..3 seconds apart:
a transfer which normally would take a fraction of a second thus grew to
several minutes.

The solution taken by this approach is to observe the relation

                   "Ack Ratio <= cwnd"

by using the constraint (1) from RFC 4341, 6.1.2; i.e. set

                 Ack Ratio = ceil(cwnd / 2)

and update it whenever either Ack Ratio or cwnd change. This ensures that
the deadlock problem can not arise.

Signed-off-by: Gerrit Renker <gerrit@erg.abdn.ac.uk>
Acked-by: Ian McDonald <ian.mcdonald@jandi.co.nz>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2008-01-28 14:54:53 -08:00
..
ccids [CCID2]: Deadlock and spurious timeouts when Ack Ratio > cwnd 2008-01-28 14:54:53 -08:00
Kconfig [DCCP]: Promote CCID2 as default CCID 2008-01-28 14:54:46 -08:00
Makefile [DCCPv6]: Resolve conditional build problem 2006-12-02 21:22:28 -08:00
ackvec.c [ACKVEC]: Reduce length of identifiers 2008-01-28 14:54:51 -08:00
ackvec.h [ACKVEC]: Reduce length of identifiers 2008-01-28 14:54:51 -08:00
ccid.c [DCCP]: fix theoretical ccids_{read,write}_lock() race 2007-08-13 22:52:09 -07:00
ccid.h [DCCP] ccid: Deprecate ccid_hc_tx_insert_options 2006-12-11 14:34:49 -08:00
dccp.h [DCCP]: Factor out common code for generating Resets 2007-10-10 16:52:44 -07:00
diag.c [INET]: Let inet_diag and friends autoload 2007-10-22 02:59:54 -07:00
feat.c [DCCP]: fix memory leak and clean up style - dccp_feat_empty_confirm() 2007-08-13 22:52:10 -07:00
feat.h [NET] DCCP: Fix whitespace errors. 2007-02-10 23:19:27 -08:00
input.c [DCCP]: Honour and make use of shutdown option set by user 2008-01-28 14:54:44 -08:00
ipv4.c [DCCP]: Use DEFINE_PROTO_INUSE infrastructure. 2007-11-07 04:09:01 -08:00
ipv6.c [DCCP]: Use DEFINE_PROTO_INUSE infrastructure. 2007-11-07 04:09:01 -08:00
ipv6.h Remove obsolete #include <linux/config.h> 2006-06-30 19:25:36 +02:00
minisocks.c [DCCP]: Tidy-up -- minisock initialisation 2007-10-10 16:54:36 -07:00
options.c [DCCP]: Ignore Ack Vectors / Elapsed Time on DCCP-Request also 2008-01-28 14:54:47 -08:00
output.c [DCCP]: Wait for CCID 2007-10-10 16:54:31 -07:00
probe.c [NET]: Make /proc/net per network namespace 2007-10-10 16:49:06 -07:00
proto.c [DCCP]: Honour and make use of shutdown option set by user 2008-01-28 14:54:44 -08:00
sysctl.c [DCCP]: fix link error with !CONFIG_SYSCTL 2007-10-17 19:33:06 -07:00
timer.c [NET]: Convert init_timer into setup_timer 2008-01-28 14:53:35 -08:00