• G
    dccp ccid-3: Simplify computing and range-checking of t_ipi · 53ac9570
    Gerrit Renker 提交于
    This patch simplifies the computation of t_ipi, avoiding expensive computations
    to enforce the minimum sending rate.
    
    Both RFC 3448 and rfc3448bis (revision #06), as well as RFC 4342 sec 5., require
    at various stages that at least one packet must be sent per t_mbi = 64 seconds.
    This requires frequent divisions of the type X_min = s/t_mbi, which are later
    converted back into an inter-packet-interval t_ipi_max = s/X_min = t_mbi.
    
    The patch removes the expensive indirection; in the unlikely case of having
    a sending rate less than one packet per 64 seconds, it also re-adjusts X.
    
    The following cases document conformance with RFC 3448  / rfc3448bis-06:
     1) Time until receiving the first feedback packet:
       * if the sender has no initial RTT sample then X = s/1 Bps > s/t_mbi;
       * if the sender has an initial RTT sample or when the first feedback
         packet is received, X = W_init/R > s/t_mbi.
    
     2) Slow-start (p == 0 and feedback packets come in):
       * RFC 3448  (current code) enforces a minimum of s/R > s/t_mbi;
       * rfc3448bis (future code) enforces an even higher minimum of W_init/R.
    
     3) Congestion avoidance with no absence of feedback (p > 0):
       * when X_calc or X_recv/2 are too low, the minimum of X_min = s/t_mbi
         is enforced in update_x() when calling update_send_interval();
       * update_send_interval() is, as before, only called when X changes
         (i.e. either when increasing or decreasing, not when in equilibrium).
    
     4) Reduction of X without prior feedback or during slow-start (p==0):
       * both RFC 3448 and rfc3448bis here halve X directly;
       * the associated constraint X >= s/t_mbi is nforced here by send_interval().
    
     5) Reduction of X when p > 0:
       * X is modified indirectly via X_recv (RFC 3448) or X_recv_set (rfc3448bis);
       * in both cases, control goes back to section 4.3 (in both documents);
       * since p > 0, both documents use X = max(min(...), s/t_mbi), which is
         enforced in this patch by calling send_interval() from update_x().
    
    I think that this analysis is exhaustive. Should I have forgotten a case,
    the worst-case consideration arises when X sinks below s/t_mbi, and is then
    increased back up to this minimum value. Even under this assumption, the
    behaviour is correct, since all lower limits of X in RFC 3448 / rfc3448bis
    are either equal to or greater than s/t_mbi.
    
    Note on the condition X >= s/t_mbi  <==> t_ipi = s/X <= t_mbi: since X is
    scaled by 64, and all time units are in microseconds, the coded condition is:
    
        t_ipi = s * 64 * 10^6 usec / X <= 64 * 10^6 usec
    
    This simplifies to s / X <= 1 second <==> X * 1 second >= s > 0.
    (A zero `s' is not allowed by the CCID-3 code).	
    Signed-off-by: NGerrit Renker <gerrit@erg.abdn.ac.uk>
    53ac9570
ccid3.c 23.4 KB