Skip to content

Commit

Permalink
sctp: update mid instead of ssn when doing stream and asoc reset
Browse files Browse the repository at this point in the history
When using idata and doing stream and asoc reset, setting ssn with
0 could only clear the 1st 16 bits of mid.

So to make this work for both data and idata, it sets mid with 0
instead of ssn, and also mid_uo for unordered idata also need to
be cleared, as said in section 2.3.2 of RFC8260.

Signed-off-by: Xin Long <lucien.xin@gmail.com>
Acked-by: Marcelo R. Leitner <marcelo.leitner@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Xin Long authored and David S. Miller committed Dec 15, 2017
1 parent ef4775e commit 107e242
Showing 1 changed file with 25 additions and 15 deletions.
40 changes: 25 additions & 15 deletions net/sctp/stream.c
Original file line number Diff line number Diff line change
Expand Up @@ -216,11 +216,13 @@ void sctp_stream_clear(struct sctp_stream *stream)
{
int i;

for (i = 0; i < stream->outcnt; i++)
stream->out[i].ssn = 0;
for (i = 0; i < stream->outcnt; i++) {
stream->out[i].mid = 0;
stream->out[i].mid_uo = 0;
}

for (i = 0; i < stream->incnt; i++)
stream->in[i].ssn = 0;
stream->in[i].mid = 0;
}

void sctp_stream_update(struct sctp_stream *stream, struct sctp_stream *new)
Expand Down Expand Up @@ -607,10 +609,10 @@ struct sctp_chunk *sctp_process_strreset_outreq(
}

for (i = 0; i < nums; i++)
stream->in[ntohs(str_p[i])].ssn = 0;
stream->in[ntohs(str_p[i])].mid = 0;
} else {
for (i = 0; i < stream->incnt; i++)
stream->in[i].ssn = 0;
stream->in[i].mid = 0;
}

result = SCTP_STRRESET_PERFORMED;
Expand Down Expand Up @@ -783,10 +785,12 @@ struct sctp_chunk *sctp_process_strreset_tsnreq(
/* G5: The next expected and outgoing SSNs MUST be reset to 0 for all
* incoming and outgoing streams.
*/
for (i = 0; i < stream->outcnt; i++)
stream->out[i].ssn = 0;
for (i = 0; i < stream->outcnt; i++) {
stream->out[i].mid = 0;
stream->out[i].mid_uo = 0;
}
for (i = 0; i < stream->incnt; i++)
stream->in[i].ssn = 0;
stream->in[i].mid = 0;

result = SCTP_STRRESET_PERFORMED;

Expand Down Expand Up @@ -976,11 +980,15 @@ struct sctp_chunk *sctp_process_strreset_resp(

if (result == SCTP_STRRESET_PERFORMED) {
if (nums) {
for (i = 0; i < nums; i++)
stream->out[ntohs(str_p[i])].ssn = 0;
for (i = 0; i < nums; i++) {
stream->out[ntohs(str_p[i])].mid = 0;
stream->out[ntohs(str_p[i])].mid_uo = 0;
}
} else {
for (i = 0; i < stream->outcnt; i++)
stream->out[i].ssn = 0;
for (i = 0; i < stream->outcnt; i++) {
stream->out[i].mid = 0;
stream->out[i].mid_uo = 0;
}
}

flags = SCTP_STREAM_RESET_OUTGOING_SSN;
Expand Down Expand Up @@ -1041,10 +1049,12 @@ struct sctp_chunk *sctp_process_strreset_resp(
asoc->ctsn_ack_point = asoc->next_tsn - 1;
asoc->adv_peer_ack_point = asoc->ctsn_ack_point;

for (i = 0; i < stream->outcnt; i++)
stream->out[i].ssn = 0;
for (i = 0; i < stream->outcnt; i++) {
stream->out[i].mid = 0;
stream->out[i].mid_uo = 0;
}
for (i = 0; i < stream->incnt; i++)
stream->in[i].ssn = 0;
stream->in[i].mid = 0;
}

for (i = 0; i < stream->outcnt; i++)
Expand Down

0 comments on commit 107e242

Please sign in to comment.