sctp: Fix bundling of SHUTDOWN with COOKIE-ACK
When we start shutdown in sctp_sf_do_dupcook_a(), we want to bundle the SHUTDOWN with the COOKIE-ACK to ensure that the peer receives them at the same time and in the correct order. This bundling was broken by commit4ff40b8626
("sctp: set chunk transport correctly when it's a new asoc"), which assigns a transport for the COOKIE-ACK, but not for the SHUTDOWN. Fix this by passing a reference to the COOKIE-ACK chunk as an argument to sctp_sf_do_9_2_start_shutdown() and onward to sctp_make_shutdown(). This way the SHUTDOWN chunk is assigned the same transport as the COOKIE-ACK chunk, which allows them to be bundled. In sctp_sf_do_9_2_start_shutdown(), the void *arg parameter was previously unused. Now that we're taking it into use, it must be a valid pointer to a chunk, or NULL. There is only one call site where it's not, in sctp_sf_autoclose_timer_expire(). Fix that too. Fixes:4ff40b8626
("sctp: set chunk transport correctly when it's a new asoc") Signed-off-by: Jere Leppänen <jere.leppanen@nokia.com> Acked-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
72579e14a1
Коммит
145cb2f717
|
@ -1865,7 +1865,7 @@ static enum sctp_disposition sctp_sf_do_dupcook_a(
|
||||||
*/
|
*/
|
||||||
sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(repl));
|
sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(repl));
|
||||||
return sctp_sf_do_9_2_start_shutdown(net, ep, asoc,
|
return sctp_sf_do_9_2_start_shutdown(net, ep, asoc,
|
||||||
SCTP_ST_CHUNK(0), NULL,
|
SCTP_ST_CHUNK(0), repl,
|
||||||
commands);
|
commands);
|
||||||
} else {
|
} else {
|
||||||
sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE,
|
sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE,
|
||||||
|
@ -5470,7 +5470,7 @@ enum sctp_disposition sctp_sf_do_9_2_start_shutdown(
|
||||||
* in the Cumulative TSN Ack field the last sequential TSN it
|
* in the Cumulative TSN Ack field the last sequential TSN it
|
||||||
* has received from the peer.
|
* has received from the peer.
|
||||||
*/
|
*/
|
||||||
reply = sctp_make_shutdown(asoc, NULL);
|
reply = sctp_make_shutdown(asoc, arg);
|
||||||
if (!reply)
|
if (!reply)
|
||||||
goto nomem;
|
goto nomem;
|
||||||
|
|
||||||
|
@ -6068,7 +6068,7 @@ enum sctp_disposition sctp_sf_autoclose_timer_expire(
|
||||||
disposition = SCTP_DISPOSITION_CONSUME;
|
disposition = SCTP_DISPOSITION_CONSUME;
|
||||||
if (sctp_outq_is_empty(&asoc->outqueue)) {
|
if (sctp_outq_is_empty(&asoc->outqueue)) {
|
||||||
disposition = sctp_sf_do_9_2_start_shutdown(net, ep, asoc, type,
|
disposition = sctp_sf_do_9_2_start_shutdown(net, ep, asoc, type,
|
||||||
arg, commands);
|
NULL, commands);
|
||||||
}
|
}
|
||||||
|
|
||||||
return disposition;
|
return disposition;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче