linux/net/sctp
Andrei Pelinescu-Onciul 5fdd4baef6 sctp: on T3_RTX retransmit all the in-flight chunks
When retransmitting due to T3 timeout, retransmit all the
in-flight chunks for the corresponding  transport/path, including
chunks sent less then 1 rto ago.
This is the correct behaviour according to rfc4960 section 6.3.3
E3 and
"Note: Any DATA chunks that were sent to the address for which the
 T3-rtx timer expired but did not fit in one MTU (rule E3 above)
 should be marked for retransmission and sent as soon as cwnd
 allows (normally, when a SACK arrives). ".

This fixes problems when more then one path is present and the T3
retransmission of the first chunk that timeouts stops the T3 timer
for the initial active path, leaving all the other in-flight
chunks waiting forever or until a new chunk is transmitted on the
same path and timeouts (and this will happen only if the cwnd
allows sending new chunks, but since cwnd was dropped to MTU by
the timeout => it will wait until the first heartbeat).

Example: 10 packets in flight, sent at 0.1 s intervals on the
primary path. The primary path is down and the first packet
timeouts. The first packet is retransmitted on another path, the
T3 timer for the primary path is stopped and cwnd is set to MTU.
All the other 9 in-flight packets will not be retransmitted
(unless more new packets are sent on the primary path which depend
on cwnd allowing it, and even in this case the 9 packets will be
retransmitted only after a new packet timeouts which even in the
best case would be more then RTO).

This commit reverts d0ce92910b and
also removes the now unused transport->last_rto, introduced in
 b6157d8e03.

p.s  The problem is not only when multiple paths are there.  It
can happen in a single homed environment.  If the application
stops sending data, it possible to have a hung association.

Signed-off-by: Andrei Pelinescu-Onciul <andrei@iptel.org>
Signed-off-by: Vlad Yasevich <vladislav.yasevich@hp.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2009-11-29 00:14:02 -08:00
..
associola.c sctp: Set source addresses on the association before adding transports 2009-11-13 19:56:50 -08:00
auth.c
bind_addr.c sctp: Sysctl configuration for IPv4 Address Scoping 2009-09-04 18:21:01 -04:00
chunk.c sctp: Don't do NAGLE delay on large writes that were fragmented small 2009-09-04 18:20:59 -04:00
command.c
debug.c net: mark read-only arrays as const 2009-08-05 10:42:58 -07:00
endpointola.c
input.c
inqueue.c
ipv6.c net: constify struct inet6_protocol 2009-09-14 17:03:05 -07:00
Kconfig
Makefile
objcnt.c
output.c sctp: remove dup code in net/sctp/output.c 2009-09-04 18:21:02 -04:00
outqueue.c sctp: on T3_RTX retransmit all the in-flight chunks 2009-11-29 00:14:02 -08:00
primitive.c
proc.c sctp: use proc_create() 2009-09-04 18:20:58 -04:00
protocol.c mm: replace various uses of num_physpages by totalram_pages 2009-09-22 07:17:38 -07:00
sm_make_chunk.c sctp: update the route for non-active transports after addresses are added 2009-09-04 18:20:55 -04:00
sm_sideeffect.c sctp: on T3_RTX retransmit all the in-flight chunks 2009-11-29 00:14:02 -08:00
sm_statefuns.c sctp: Set source addresses on the association before adding transports 2009-11-13 19:56:50 -08:00
sm_statetable.c
socket.c sctp: Fix regression introduced by new sctp_connectx api 2009-11-13 19:56:51 -08:00
ssnmap.c
sysctl.c sctp: Sysctl configuration for IPv4 Address Scoping 2009-09-04 18:21:01 -04:00
transport.c sctp: on T3_RTX retransmit all the in-flight chunks 2009-11-29 00:14:02 -08:00
tsnmap.c
ulpevent.c
ulpqueue.c