diff options
Diffstat (limited to 'sys/netinet/sctp_output.c')
-rw-r--r-- | sys/netinet/sctp_output.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/sys/netinet/sctp_output.c b/sys/netinet/sctp_output.c index 78b9a3e..e71e5ac 100644 --- a/sys/netinet/sctp_output.c +++ b/sys/netinet/sctp_output.c @@ -7164,7 +7164,6 @@ sctp_chunk_output(struct sctp_inpcb *inp, un_sent = (stcb->asoc.total_output_queue_size - stcb->asoc.total_flight); - if ((un_sent <= 0) && (TAILQ_EMPTY(&asoc->control_send_queue)) && (asoc->sent_queue_retran_cnt == 0)) { @@ -7184,7 +7183,17 @@ sctp_chunk_output(struct sctp_inpcb *inp, * Ok, it is retransmission time only, we send out only ONE * packet with a single call off to the retran code. */ - if (from_where != SCTP_OUTPUT_FROM_HB_TMR) { + if (from_where == SCTP_OUTPUT_FROM_COOKIE_ACK) { + /* + * Special hook for handling cookiess discarded by + * peer that carried data. Send cookie-ack only and + * then the next call with get the retran's. + */ + (void)sctp_med_chunk_output(inp, stcb, asoc, &num_out, &reason_code, 1, + &cwnd_full, from_where, + &now, &now_filled, frag_point); + return (0); + } else if (from_where != SCTP_OUTPUT_FROM_HB_TMR) { /* if its not from a HB then do it */ ret = sctp_chunk_retransmission(inp, stcb, asoc, &num_out, &now, &now_filled); } else { |