diff options
Diffstat (limited to 'net/sctp/associola.c')
-rw-r--r-- | net/sctp/associola.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/net/sctp/associola.c b/net/sctp/associola.c index 1f05b942564e..caba989f4e76 100644 --- a/net/sctp/associola.c +++ b/net/sctp/associola.c | |||
@@ -584,6 +584,33 @@ void sctp_assoc_rm_peer(struct sctp_association *asoc, | |||
584 | asoc->addip_last_asconf->transport == peer) | 584 | asoc->addip_last_asconf->transport == peer) |
585 | asoc->addip_last_asconf->transport = NULL; | 585 | asoc->addip_last_asconf->transport = NULL; |
586 | 586 | ||
587 | /* If we have something on the transmitted list, we have to | ||
588 | * save it off. The best place is the active path. | ||
589 | */ | ||
590 | if (!list_empty(&peer->transmitted)) { | ||
591 | struct sctp_transport *active = asoc->peer.active_path; | ||
592 | struct sctp_chunk *ch; | ||
593 | |||
594 | /* Reset the transport of each chunk on this list */ | ||
595 | list_for_each_entry(ch, &peer->transmitted, | ||
596 | transmitted_list) { | ||
597 | ch->transport = NULL; | ||
598 | ch->rtt_in_progress = 0; | ||
599 | } | ||
600 | |||
601 | list_splice_tail_init(&peer->transmitted, | ||
602 | &active->transmitted); | ||
603 | |||
604 | /* Start a T3 timer here in case it wasn't running so | ||
605 | * that these migrated packets have a chance to get | ||
606 | * retrnasmitted. | ||
607 | */ | ||
608 | if (!timer_pending(&active->T3_rtx_timer)) | ||
609 | if (!mod_timer(&active->T3_rtx_timer, | ||
610 | jiffies + active->rto)) | ||
611 | sctp_transport_hold(active); | ||
612 | } | ||
613 | |||
587 | asoc->peer.transport_count--; | 614 | asoc->peer.transport_count--; |
588 | 615 | ||
589 | sctp_transport_free(peer); | 616 | sctp_transport_free(peer); |