diff options
Diffstat (limited to 'net/sctp')
-rw-r--r-- | net/sctp/outqueue.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/net/sctp/outqueue.c b/net/sctp/outqueue.c index 16d451a62b3f..e333d5833616 100644 --- a/net/sctp/outqueue.c +++ b/net/sctp/outqueue.c | |||
@@ -598,11 +598,23 @@ static int sctp_outq_flush_rtx(struct sctp_outq *q, struct sctp_packet *pkt, | |||
598 | if (fast_rtx && !chunk->fast_retransmit) | 598 | if (fast_rtx && !chunk->fast_retransmit) |
599 | continue; | 599 | continue; |
600 | 600 | ||
601 | redo: | ||
601 | /* Attempt to append this chunk to the packet. */ | 602 | /* Attempt to append this chunk to the packet. */ |
602 | status = sctp_packet_append_chunk(pkt, chunk); | 603 | status = sctp_packet_append_chunk(pkt, chunk); |
603 | 604 | ||
604 | switch (status) { | 605 | switch (status) { |
605 | case SCTP_XMIT_PMTU_FULL: | 606 | case SCTP_XMIT_PMTU_FULL: |
607 | if (!pkt->has_data && !pkt->has_cookie_echo) { | ||
608 | /* If this packet did not contain DATA then | ||
609 | * retransmission did not happen, so do it | ||
610 | * again. We'll ignore the error here since | ||
611 | * control chunks are already freed so there | ||
612 | * is nothing we can do. | ||
613 | */ | ||
614 | sctp_packet_transmit(pkt); | ||
615 | goto redo; | ||
616 | } | ||
617 | |||
606 | /* Send this packet. */ | 618 | /* Send this packet. */ |
607 | error = sctp_packet_transmit(pkt); | 619 | error = sctp_packet_transmit(pkt); |
608 | 620 | ||