Commit 52a39589 authored by Xin Long's avatar Xin Long Committed by David S. Miller

sctp: set sender next_tsn for the old result with ctsn_ack_point plus 1

When doing asoc reset, if the sender of the response has already sent some
chunk and increased asoc->next_tsn before the duplicate request comes, the
response will use the old result with an incorrect sender next_tsn.

Better than asoc->next_tsn, asoc->ctsn_ack_point can't be changed after
the sender of the response has performed the asoc reset and before the
peer has confirmed it, and it's value is still asoc->next_tsn original
value minus 1.

This patch sets sender next_tsn for the old result with ctsn_ack_point
plus 1 when processing the duplicate request, to make sure the sender
next_tsn value peer gets will be always right.

Fixes: 692787ce ("sctp: implement receiver-side procedures for the SSN/TSN Reset Request Parameter")
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>
parent 159f2a74
...@@ -725,7 +725,7 @@ struct sctp_chunk *sctp_process_strreset_tsnreq( ...@@ -725,7 +725,7 @@ struct sctp_chunk *sctp_process_strreset_tsnreq(
i = asoc->strreset_inseq - request_seq - 1; i = asoc->strreset_inseq - request_seq - 1;
result = asoc->strreset_result[i]; result = asoc->strreset_result[i];
if (result == SCTP_STRRESET_PERFORMED) { if (result == SCTP_STRRESET_PERFORMED) {
next_tsn = asoc->next_tsn; next_tsn = asoc->ctsn_ack_point + 1;
init_tsn = init_tsn =
sctp_tsnmap_get_ctsn(&asoc->peer.tsn_map) + 1; sctp_tsnmap_get_ctsn(&asoc->peer.tsn_map) + 1;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment