Commit d5ccd496601b8776a516d167a6485754575dc38f

Authored by Max Matveev
Committed by David S. Miller
1 parent fb82fd204b

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: