• Daniel Borkmann's avatar
    net: sctp: improve timer slack calculation for transport HBs · 8f61059a
    Daniel Borkmann authored
    RFC4960, section 8.3 says:
    
      On an idle destination address that is allowed to heartbeat,
      it is recommended that a HEARTBEAT chunk is sent once per RTO
      of that destination address plus the protocol parameter
      'HB.interval', with jittering of +/- 50% of the RTO value,
      and exponential backoff of the RTO if the previous HEARTBEAT
      is unanswered.
    
    Currently, we calculate jitter via sctp_jitter() function first,
    and then add its result to the current RTO for the new timeout:
    
      TMO = RTO + (RAND() % RTO) - (RTO / 2)
                  `------------------------^-=> sctp_jitter()
    
    Instead, we can just simplify all this by directly calculating:
    
      TMO = (RTO / 2) + (RAND() % RTO)
    
    With the help of prandom_u32_max(), we don't need to open code
    our own global PRNG, but can instead just make use of the per
    CPU implementation of prandom with better quality numbers. Also,
    we can now spare us the conditional for divide by zero check
    since no div or mod operation needs to be used. Note that
    prandom_u32_max() won't emit the same result as a mod operation,
    but we really don't care here as we only want to have a random
    number scaled into RTO interval.
    
    Note, exponential RTO backoff is handeled elsewhere, namely in
    sctp_do_8_2_transport_strike().
    Signed-off-by: default avatarDaniel Borkmann <dborkman@redhat.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    8f61059a
transport.c 19.7 KB