• Gerrit Renker's avatar
    dccp: Extend CCID packet dequeueing interface · e7937772
    Gerrit Renker authored
    This extends the packet dequeuing interface of dccp_write_xmit() to allow
     1. CCIDs to take care of timing when the next packet may be sent;
     2. delayed sending (as before, with an inter-packet gap up to 65.535 seconds).
    
    The main purpose is to take CCID2 out of its polling mode (when it is network-
    limited, it tries every millisecond to send, without interruption).
    The interface can also be used to support other CCIDs.
    
    The mode of operation for (2) is as follows:
     * new packet is enqueued via dccp_sendmsg() => dccp_write_xmit(),
     * ccid_hc_tx_send_packet() detects that it may not send (e.g. window full), 
     * it signals this condition via `CCID_PACKET_WILL_DEQUEUE_LATER',
     * dccp_write_xmit() returns without further action;
     * after some time the wait-condition for CCID becomes true,
     * that CCID schedules the tasklet,
     * tasklet function calls ccid_hc_tx_send_packet() via dccp_write_xmit(),
     * since the wait-condition is now true, ccid_hc_tx_packet() returns "send now",
     * packet is sent, and possibly more (since dccp_write_xmit() loops).
    
    Code reuse: the taskled function calls dccp_write_xmit(), the timer function
                reduces to a wrapper around the same code.
    
    If the tasklet finds that the socket is locked, it re-schedules the tasklet
    function (not the tasklet) after one jiffy.
    
    Changed DCCP_BUG to dccp_pr_debug when transmit_skb returns an error (e.g. when a
    local qdisc is used, NET_XMIT_DROP=1 can be returned for many packets).
    Signed-off-by: default avatarGerrit Renker <gerrit@erg.abdn.ac.uk>
    e7937772
dccp.h 15.9 KB