[SCTP]: Reset some transport and association variables on restart
If the association has been restarted, we need to reset the transport congestion variables as well as accumulated error counts and CACC variables. If we do not, the association will use the wrong values and may terminate prematurely. This was found with a scenario where the peer restarted the association when lksctp was in the last HB timeout for its association. The restart happened, but the error counts have not been reset and when the timeout occurred, a newly restarted association was terminated due to excessive retransmits. Signed-off-by: Vlad Yasevich <vladislav.yasevich@hp.com> Signed-off-by: Sridhar Samudrala <sri@us.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
fb78525ae1
commit
749bf9215e
@@ -1046,6 +1046,9 @@ void sctp_assoc_update(struct sctp_association *asoc,
|
||||
trans = list_entry(pos, struct sctp_transport, transports);
|
||||
if (!sctp_assoc_lookup_paddr(new, &trans->ipaddr))
|
||||
sctp_assoc_del_peer(asoc, &trans->ipaddr);
|
||||
|
||||
if (asoc->state >= SCTP_STATE_ESTABLISHED)
|
||||
sctp_transport_reset(trans);
|
||||
}
|
||||
|
||||
/* If the case is A (association restart), use
|
||||
@@ -1069,6 +1072,12 @@ void sctp_assoc_update(struct sctp_association *asoc,
|
||||
*/
|
||||
sctp_ulpq_flush(&asoc->ulpq);
|
||||
|
||||
/* reset the overall association error count so
|
||||
* that the restarted association doesn't get torn
|
||||
* down on the next retransmission timer.
|
||||
*/
|
||||
asoc->overall_error_count = 0;
|
||||
|
||||
} else {
|
||||
/* Add any peer addresses from the new association. */
|
||||
list_for_each(pos, &new->peer.transport_addr_list) {
|
||||
|
Reference in New Issue
Block a user