提交 d4d6fb57 编写于 作者: V Vlad Yasevich

sctp: Try not to change a_rwnd when faking a SACK from SHUTDOWN.

We currently set a_rwnd to 0 when faking a SACK from SHUTDOWN.
This results in an hung association if the remote only uses
SHUTDOWNs (which it's allowed to do) to acknowlege DATA when
closing.  The reason for that is that we simply honor the a_rwnd
from the sack, but since we faked it to be 0, we enter 0-window
probing.  The fix is to use the peers old rwnd and add our flight
size to it.
Signed-off-by: NVlad Yasevich <vladislav.yasevich@hp.com>
上级 4d3c46e6
...@@ -1533,7 +1533,8 @@ static int sctp_cmd_interpreter(sctp_event_t event_type, ...@@ -1533,7 +1533,8 @@ static int sctp_cmd_interpreter(sctp_event_t event_type,
case SCTP_CMD_PROCESS_CTSN: case SCTP_CMD_PROCESS_CTSN:
/* Dummy up a SACK for processing. */ /* Dummy up a SACK for processing. */
sackh.cum_tsn_ack = cmd->obj.be32; sackh.cum_tsn_ack = cmd->obj.be32;
sackh.a_rwnd = 0; sackh.a_rwnd = asoc->peer.rwnd +
asoc->outqueue.outstanding_bytes;
sackh.num_gap_ack_blocks = 0; sackh.num_gap_ack_blocks = 0;
sackh.num_dup_tsns = 0; sackh.num_dup_tsns = 0;
sctp_add_cmd_sf(commands, SCTP_CMD_PROCESS_SACK, sctp_add_cmd_sf(commands, SCTP_CMD_PROCESS_SACK,
...@@ -1632,9 +1633,9 @@ static int sctp_cmd_interpreter(sctp_event_t event_type, ...@@ -1632,9 +1633,9 @@ static int sctp_cmd_interpreter(sctp_event_t event_type,
*/ */
if (asoc && SCTP_EVENT_T_CHUNK == event_type && chunk) { if (asoc && SCTP_EVENT_T_CHUNK == event_type && chunk) {
if (chunk->end_of_packet || chunk->singleton) if (chunk->end_of_packet || chunk->singleton)
sctp_outq_uncork(&asoc->outqueue); error = sctp_outq_uncork(&asoc->outqueue);
} else if (local_cork) } else if (local_cork)
sctp_outq_uncork(&asoc->outqueue); error = sctp_outq_uncork(&asoc->outqueue);
return error; return error;
nomem: nomem:
error = -ENOMEM; error = -ENOMEM;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册