Commit d5ccd496601b8776a516d167a6485754575dc38f
Committed by
David S. Miller
1 parent
fb82fd204b
Exists in
master
and in
4 other branches
sctp: deal with multiple COOKIE_ECHO chunks
Attempt to reduce the number of IP packets emitted in response to single SCTP packet (2e3216cd) introduced a complication - if a packet contains two COOKIE_ECHO chunks and nothing else then SCTP state machine corks the socket while processing first COOKIE_ECHO and then loses the association and forgets to uncork the socket. To deal with the issue add new SCTP command which can be used to set association explictly. Use this new command when processing second COOKIE_ECHO chunk to restore the context for SCTP state machine. Signed-off-by: Max Matveev <makc@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Showing 3 changed files with 12 additions and 0 deletions Side-by-side Diff
include/net/sctp/command.h
... | ... | @@ -109,6 +109,7 @@ |
109 | 109 | SCTP_CMD_SEND_MSG, /* Send the whole use message */ |
110 | 110 | SCTP_CMD_SEND_NEXT_ASCONF, /* Send the next ASCONF after ACK */ |
111 | 111 | SCTP_CMD_PURGE_ASCONF_QUEUE, /* Purge all asconf queues.*/ |
112 | + SCTP_CMD_SET_ASOC, /* Restore association context */ | |
112 | 113 | SCTP_CMD_LAST |
113 | 114 | } sctp_verb_t; |
114 | 115 |
net/sctp/sm_sideeffect.c
... | ... | @@ -1689,6 +1689,11 @@ |
1689 | 1689 | case SCTP_CMD_PURGE_ASCONF_QUEUE: |
1690 | 1690 | sctp_asconf_queue_teardown(asoc); |
1691 | 1691 | break; |
1692 | + | |
1693 | + case SCTP_CMD_SET_ASOC: | |
1694 | + asoc = cmd->obj.asoc; | |
1695 | + break; | |
1696 | + | |
1692 | 1697 | default: |
1693 | 1698 | pr_warn("Impossible command: %u, %p\n", |
1694 | 1699 | cmd->verb, cmd->obj.ptr); |
net/sctp/sm_statefuns.c
... | ... | @@ -2047,6 +2047,12 @@ |
2047 | 2047 | sctp_add_cmd_sf(commands, SCTP_CMD_NEW_ASOC, SCTP_ASOC(new_asoc)); |
2048 | 2048 | sctp_add_cmd_sf(commands, SCTP_CMD_DELETE_TCB, SCTP_NULL()); |
2049 | 2049 | |
2050 | + /* Restore association pointer to provide SCTP command interpeter | |
2051 | + * with a valid context in case it needs to manipulate | |
2052 | + * the queues */ | |
2053 | + sctp_add_cmd_sf(commands, SCTP_CMD_SET_ASOC, | |
2054 | + SCTP_ASOC((struct sctp_association *)asoc)); | |
2055 | + | |
2050 | 2056 | return retval; |
2051 | 2057 | |
2052 | 2058 | nomem: |