linux/net/dccp
Gerrit Renker b1fcf55eea dccp: Refine the wait-for-ccid mechanism
This extends the existing wait-for-ccid routine so that it may be used with
different types of CCID, addressing the following problems:

 1) The queue-drain mechanism only works with rate-based CCIDs. If CCID-2 for
    example has a full TX queue and becomes network-limited just as the
    application wants to close, then waiting for CCID-2 to become unblocked
    could lead to an indefinite  delay (i.e., application "hangs").
 2) Since each TX CCID in turn uses a feedback mechanism, there may be changes
    in its sending policy while the queue is being drained. This can lead to
    further delays during which the application will not be able to terminate.
 3) The minimum wait time for CCID-3/4 can be expected to be the queue length
    times the current inter-packet delay. For example if tx_qlen=100 and a delay
    of 15 ms is used for each packet, then the application would have to wait
    for a minimum of 1.5 seconds before being allowed to exit.
 4) There is no way for the user/application to control this behaviour. It would
    be good to use the timeout argument of dccp_close() as an upper bound. Then
    the maximum time that an application is willing to wait for its CCIDs to can
    be set via the SO_LINGER option.

These problems are addressed by giving the CCID a grace period of up to the
`timeout' value.

The wait-for-ccid function is, as before, used when the application
 (a) has read all the data in its receive buffer and
 (b) if SO_LINGER was set with a non-zero linger time, or
 (c) the socket is either in the OPEN (active close) or in the PASSIVE_CLOSEREQ
     state (client application closes after receiving CloseReq).

In addition, there is a catch-all case of __skb_queue_purge() after waiting for
the CCID. This is necessary since the write queue may still have data when
 (a) the host has been passively-closed,
 (b) abnormal termination (unread data, zero linger time),
 (c) wait-for-ccid could not finish within the given time limit.

Signed-off-by: Gerrit Renker <gerrit@erg.abdn.ac.uk>
Signed-off-by: David S. Miller <davem@davemloft.net>
2010-10-28 10:27:01 -07:00
..
ccids dccp: Return-value convention of hc_tx_send_packet() 2010-10-28 10:27:00 -07:00
ackvec.c net: dccp: fix sign bug 2010-07-18 15:07:14 -07:00
ackvec.h
ccid.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
ccid.h dccp: Return-value convention of hc_tx_send_packet() 2010-10-28 10:27:00 -07:00
dccp.h dccp: Refine the wait-for-ccid mechanism 2010-10-28 10:27:01 -07:00
diag.c
feat.c dccp: Kill dead code and add static markers. 2010-10-06 23:12:07 -07:00
feat.h dccp: Kill dead code and add static markers. 2010-10-06 23:12:07 -07:00
input.c dccp: cosmetics - warning format 2010-10-12 06:57:43 +02:00
ipv4.c tproxy: fix hash locking issue when using port redirection in __inet_inherit_port() 2010-10-21 13:06:43 +02:00
ipv6.c tproxy: fix hash locking issue when using port redirection in __inet_inherit_port() 2010-10-21 13:06:43 +02:00
ipv6.h
Kconfig
Makefile
minisocks.c dccp: fix the adjustments to AWL and SWL 2010-10-12 06:57:40 +02:00
options.c dccp: schedule an Ack when receiving timestamps 2010-10-12 06:57:43 +02:00
output.c dccp: Refine the wait-for-ccid mechanism 2010-10-28 10:27:01 -07:00
probe.c llseek: automatically add .llseek fop 2010-10-15 15:53:27 +02:00
proto.c dccp: Refine the wait-for-ccid mechanism 2010-10-28 10:27:01 -07:00
sysctl.c
timer.c dccp: Refine the wait-for-ccid mechanism 2010-10-28 10:27:01 -07:00