Skip to content

Commit 51eac7f

Browse files
lxindavem330
authored andcommitted
sctp: do asoc update earlier in sctp_sf_do_dupcook_b
The same thing should be done for sctp_sf_do_dupcook_b(). Meanwhile, SCTP_CMD_UPDATE_ASSOC cmd can be removed. v1->v2: - Fix the return value in sctp_sf_do_assoc_update(). Signed-off-by: Xin Long <[email protected]> Acked-by: Marcelo Ricardo Leitner <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 7e9269a commit 51eac7f

File tree

3 files changed

+30
-44
lines changed

3 files changed

+30
-44
lines changed

include/net/sctp/command.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,6 @@ enum sctp_verb {
6868
SCTP_CMD_ASSOC_FAILED, /* Handle association failure. */
6969
SCTP_CMD_DISCARD_PACKET, /* Discard the whole packet. */
7070
SCTP_CMD_GEN_SHUTDOWN, /* Generate a SHUTDOWN chunk. */
71-
SCTP_CMD_UPDATE_ASSOC, /* Update association information. */
7271
SCTP_CMD_PURGE_OUTQUEUE, /* Purge all data waiting to be sent. */
7372
SCTP_CMD_SETUP_T2, /* Hi-level, setup T2-shutdown parms. */
7473
SCTP_CMD_RTO_PENDING, /* Set transport's rto_pending. */

net/sctp/sm_sideeffect.c

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -826,28 +826,6 @@ static void sctp_cmd_setup_t2(struct sctp_cmd_seq *cmds,
826826
asoc->timeouts[SCTP_EVENT_TIMEOUT_T2_SHUTDOWN] = t->rto;
827827
}
828828

829-
static void sctp_cmd_assoc_update(struct sctp_cmd_seq *cmds,
830-
struct sctp_association *asoc,
831-
struct sctp_association *new)
832-
{
833-
struct net *net = asoc->base.net;
834-
struct sctp_chunk *abort;
835-
836-
if (!sctp_assoc_update(asoc, new))
837-
return;
838-
839-
abort = sctp_make_abort(asoc, NULL, sizeof(struct sctp_errhdr));
840-
if (abort) {
841-
sctp_init_cause(abort, SCTP_ERROR_RSRC_LOW, 0);
842-
sctp_add_cmd_sf(cmds, SCTP_CMD_REPLY, SCTP_CHUNK(abort));
843-
}
844-
sctp_add_cmd_sf(cmds, SCTP_CMD_SET_SK_ERR, SCTP_ERROR(ECONNABORTED));
845-
sctp_add_cmd_sf(cmds, SCTP_CMD_ASSOC_FAILED,
846-
SCTP_PERR(SCTP_ERROR_RSRC_LOW));
847-
SCTP_INC_STATS(net, SCTP_MIB_ABORTEDS);
848-
SCTP_DEC_STATS(net, SCTP_MIB_CURRESTAB);
849-
}
850-
851829
/* Helper function to change the state of an association. */
852830
static void sctp_cmd_new_state(struct sctp_cmd_seq *cmds,
853831
struct sctp_association *asoc,
@@ -1301,10 +1279,6 @@ static int sctp_cmd_interpreter(enum sctp_event_type event_type,
13011279
sctp_endpoint_add_asoc(ep, asoc);
13021280
break;
13031281

1304-
case SCTP_CMD_UPDATE_ASSOC:
1305-
sctp_cmd_assoc_update(commands, asoc, cmd->obj.asoc);
1306-
break;
1307-
13081282
case SCTP_CMD_PURGE_OUTQUEUE:
13091283
sctp_outq_teardown(&asoc->outqueue);
13101284
break;

net/sctp/sm_statefuns.c

Lines changed: 30 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1773,6 +1773,30 @@ enum sctp_disposition sctp_sf_do_5_2_3_initack(
17731773
return sctp_sf_discard_chunk(net, ep, asoc, type, arg, commands);
17741774
}
17751775

1776+
static int sctp_sf_do_assoc_update(struct sctp_association *asoc,
1777+
struct sctp_association *new,
1778+
struct sctp_cmd_seq *cmds)
1779+
{
1780+
struct net *net = asoc->base.net;
1781+
struct sctp_chunk *abort;
1782+
1783+
if (!sctp_assoc_update(asoc, new))
1784+
return 0;
1785+
1786+
abort = sctp_make_abort(asoc, NULL, sizeof(struct sctp_errhdr));
1787+
if (abort) {
1788+
sctp_init_cause(abort, SCTP_ERROR_RSRC_LOW, 0);
1789+
sctp_add_cmd_sf(cmds, SCTP_CMD_REPLY, SCTP_CHUNK(abort));
1790+
}
1791+
sctp_add_cmd_sf(cmds, SCTP_CMD_SET_SK_ERR, SCTP_ERROR(ECONNABORTED));
1792+
sctp_add_cmd_sf(cmds, SCTP_CMD_ASSOC_FAILED,
1793+
SCTP_PERR(SCTP_ERROR_RSRC_LOW));
1794+
SCTP_INC_STATS(net, SCTP_MIB_ABORTEDS);
1795+
SCTP_DEC_STATS(net, SCTP_MIB_CURRESTAB);
1796+
1797+
return -ENOMEM;
1798+
}
1799+
17761800
/* Unexpected COOKIE-ECHO handler for peer restart (Table 2, action 'A')
17771801
*
17781802
* Section 5.2.4
@@ -1853,21 +1877,8 @@ static enum sctp_disposition sctp_sf_do_dupcook_a(
18531877
sctp_add_cmd_sf(commands, SCTP_CMD_PURGE_ASCONF_QUEUE, SCTP_NULL());
18541878

18551879
/* Update the content of current association. */
1856-
if (sctp_assoc_update((struct sctp_association *)asoc, new_asoc)) {
1857-
struct sctp_chunk *abort;
1858-
1859-
abort = sctp_make_abort(asoc, NULL, sizeof(struct sctp_errhdr));
1860-
if (abort) {
1861-
sctp_init_cause(abort, SCTP_ERROR_RSRC_LOW, 0);
1862-
sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(abort));
1863-
}
1864-
sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR, SCTP_ERROR(ECONNABORTED));
1865-
sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED,
1866-
SCTP_PERR(SCTP_ERROR_RSRC_LOW));
1867-
SCTP_INC_STATS(net, SCTP_MIB_ABORTEDS);
1868-
SCTP_DEC_STATS(net, SCTP_MIB_CURRESTAB);
1880+
if (sctp_sf_do_assoc_update((struct sctp_association *)asoc, new_asoc, commands))
18691881
goto nomem;
1870-
}
18711882

18721883
repl = sctp_make_cookie_ack(asoc, chunk);
18731884
if (!repl)
@@ -1940,14 +1951,16 @@ static enum sctp_disposition sctp_sf_do_dupcook_b(
19401951
if (!sctp_auth_chunk_verify(net, chunk, new_asoc))
19411952
return SCTP_DISPOSITION_DISCARD;
19421953

1943-
/* Update the content of current association. */
1944-
sctp_add_cmd_sf(commands, SCTP_CMD_UPDATE_ASSOC, SCTP_ASOC(new_asoc));
19451954
sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE,
19461955
SCTP_STATE(SCTP_STATE_ESTABLISHED));
19471956
SCTP_INC_STATS(net, SCTP_MIB_CURRESTAB);
19481957
sctp_add_cmd_sf(commands, SCTP_CMD_HB_TIMERS_START, SCTP_NULL());
19491958

1950-
repl = sctp_make_cookie_ack(new_asoc, chunk);
1959+
/* Update the content of current association. */
1960+
if (sctp_sf_do_assoc_update((struct sctp_association *)asoc, new_asoc, commands))
1961+
goto nomem;
1962+
1963+
repl = sctp_make_cookie_ack(asoc, chunk);
19511964
if (!repl)
19521965
goto nomem;
19531966

0 commit comments

Comments
 (0)