• Xin Long's avatar
    sctp: do state transition when a probe succeeds on HB ACK recv path · b87641af
    Xin Long authored
    As described in rfc8899#section-5.2, when a probe succeeds, there might
    be the following state transitions:
    
      - Base -> Search, occurs when probe succeeds with BASE_PLPMTU,
        pl.pmtu is not changing,
        pl.probe_size increases by SCTP_PL_BIG_STEP,
    
      - Error -> Search, occurs when probe succeeds with BASE_PLPMTU,
        pl.pmtu is changed from SCTP_MIN_PLPMTU to SCTP_BASE_PLPMTU,
        pl.probe_size increases by SCTP_PL_BIG_STEP.
    
      - Search -> Search Complete, occurs when probe succeeds with the probe
        size SCTP_MAX_PLPMTU less than pl.probe_high,
        pl.pmtu is not changing, but update *pathmtu* with it,
        pl.probe_size is set back to pl.pmtu to double check it.
    
      - Search Complete -> Search, occurs when probe succeeds with the probe
        size equal to pl.pmtu,
        pl.pmtu is not changing,
        pl.probe_size increases by SCTP_PL_MIN_STEP.
    
    So search process can be described as:
    
     1. When it just enters 'Search' state, *pathmtu* is not updated with
        pl.pmtu, and probe_size increases by a big step (SCTP_PL_BIG_STEP)
        each round.
    
     2. Until pl.probe_high is set when a probe fails, and probe_size
        decreases back to pl.pmtu, as described in the last patch.
    
     3. When the probe with the new size succeeds, probe_size changes to
        increase by a small step (SCTP_PL_MIN_STEP) due to pl.probe_high
        is set.
    
     4. Until probe_size is next to pl.probe_high, the searching finishes and
        it goes to 'Complete' state and updates *pathmtu* with pl.pmtu, and
        then probe_size is set to pl.pmtu to confirm by once more probe.
    
     5. This probe occurs after "30 * probe_inteval", a much longer time than
        that in Search state. Once it is done it goes to 'Search' state again
        with probe_size increased by SCTP_PL_MIN_STEP.
    
    As we can see above, during the searching, pl.pmtu changes while *pathmtu*
    doesn't. *pathmtu* is only updated when the search finishes by which it
    gets an optimal value for it. A big step is used at the beginning until
    it gets close to the optimal value, then it changes to a small step until
    it has this optimal value.
    
    The small step is also used in 'Complete' until it goes to 'Search' state
    again and the probe with 'pmtu + the small step' succeeds, which means a
    higher size could be used. Then probe_size changes to increase by a big
    step again until it gets close to the next optimal value.
    
    Note that anytime when black hole is detected, it goes directly to 'Base'
    state with pl.pmtu set to SCTP_BASE_PLPMTU, as described in the last patch.
    Signed-off-by: default avatarXin Long <lucien.xin@gmail.com>
    Acked-by: default avatarMarcelo Ricardo Leitner <marcelo.leitner@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    b87641af
sm_statefuns.c 207 KB