• D
    net: sctp: improve sctp_select_active_and_retran_path selection · a7288c4d
    Daniel Borkmann 提交于
    In function sctp_select_active_and_retran_path(), we walk the
    transport list in order to look for the two most recently used
    ACTIVE transports (trans_pri, trans_sec). In case we didn't find
    anything ACTIVE, we currently just camp on a possibly PF or
    INACTIVE transport that is primary path; this behavior actually
    dates back to linux-history tree of the very early days of
    lksctp, and can yield a behavior that chooses suboptimal
    transport paths.
    
    Instead, be a bit more clever by reusing and extending the
    recently introduced sctp_trans_elect_best() handler. In case
    both transports are evaluated to have the same score resulting
    from their states, break the tie by looking at: 1) transport
    patch error count 2) last_time_heard value from each transport.
    
    This is analogous to Nishida's Quick Failover draft [1],
    section 5.1, 3:
    
      The sender SHOULD avoid data transmission to PF destinations.
      When all destinations are in either PF or Inactive state,
      the sender MAY either move the destination from PF to active
      state (and transmit data to the active destination) or the
      sender MAY transmit data to a PF destination. In the former
      scenario, (i) the sender MUST NOT notify the ULP about the
      state transition, and (ii) MUST NOT clear the destination's
      error counter. It is recommended that the sender picks the
      PF destination with least error count (fewest consecutive
      timeouts) for data transmission. In case of a tie (multiple PF
      destinations with same error count), the sender MAY choose the
      last active destination.
    
    Thus for sctp_select_active_and_retran_path(), we keep track of
    the best, if any, transport that is in PF state and in case no
    ACTIVE transport has been found (hence trans_{pri,sec} is NULL),
    we select the best out of the three: current primary_path and
    retran_path as well as a possible PF transport.
    
    The secondary may still camp on the original primary_path as
    before. The change in sctp_trans_elect_best() with a more fine
    grained tie selection also improves at the same time path selection
    for sctp_assoc_update_retran_path() in case of non-ACTIVE states.
    
      [1] http://tools.ietf.org/html/draft-nishida-tsvwg-sctp-failover-05Signed-off-by: NDaniel Borkmann <dborkman@redhat.com>
    Signed-off-by: NDavid S. Miller <davem@davemloft.net>
    a7288c4d
associola.c 48.1 KB