diff --git a/net/sctp/outqueue.c b/net/sctp/outqueue.c index 247ebc9..0fdf544 100644 --- a/net/sctp/outqueue.c +++ b/net/sctp/outqueue.c @@ -604,6 +604,7 @@ static int sctp_outq_flush_rtx(struct sctp_outq *q, struct sctp_packet *pkt, if (fast_rtx && !chunk->fast_retransmit) continue; +again: /* Attempt to append this chunk to the packet. */ status = sctp_packet_append_chunk(pkt, chunk); @@ -617,20 +618,14 @@ static int sctp_outq_flush_rtx(struct sctp_outq *q, struct sctp_packet *pkt, */ if (rtx_timeout || fast_rtx) done = 1; + else { + /* Bundle this chunk in the next round. */ + goto again; + } - /* Bundle next chunk in the next round. */ break; case SCTP_XMIT_RWND_FULL: - /* Send this packet. */ - error = sctp_packet_transmit(pkt); - - /* Stop sending DATA as there is no more room - * at the receiver. - */ - done = 1; - break; - case SCTP_XMIT_NAGLE_DELAY: /* Send this packet. */ error = sctp_packet_transmit(pkt); @@ -929,7 +924,6 @@ static int sctp_outq_flush(struct sctp_outq *q, int rtx_timeout) } /* Finally, transmit new packets. */ - start_timer = 0; while ((chunk = sctp_outq_dequeue_data(q)) != NULL) { /* RFC 2960 6.5 Every DATA chunk MUST carry a valid * stream identifier. @@ -1028,7 +1022,7 @@ static int sctp_outq_flush(struct sctp_outq *q, int rtx_timeout) list_add_tail(&chunk->transmitted_list, &transport->transmitted); - sctp_transport_reset_timers(transport, start_timer-1); + sctp_transport_reset_timers(transport, 0); q->empty = 0;