diff options
author | Michio Honda <micchie@sfc.wide.ad.jp> | 2011-06-16 22:22:35 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-11-08 15:11:30 -0500 |
commit | 34d2d89f2d7da3b72b3157e778bbf709047ded97 (patch) | |
tree | d782069c43150d842a274489f9c4b1a35e8e0981 /net/sctp | |
parent | ddc4bbee6ef1ed20314be3888dd39ceefe233e79 (diff) |
sctp: fasthandoff with ASCONF at server-node
Retransmit chunks to newly confirmed destination when ASCONF and
HEARTBEAT negotiation has success with a single-homed peer.
Signed-off-by: Michio Honda <micchie@sfc.wide.ad.jp>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sctp')
-rw-r--r-- | net/sctp/sm_sideeffect.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/net/sctp/sm_sideeffect.c b/net/sctp/sm_sideeffect.c index 76388b083f28..1ff51c9d18d5 100644 --- a/net/sctp/sm_sideeffect.c +++ b/net/sctp/sm_sideeffect.c | |||
@@ -666,6 +666,7 @@ static void sctp_cmd_transport_on(sctp_cmd_seq_t *cmds, | |||
666 | struct sctp_chunk *chunk) | 666 | struct sctp_chunk *chunk) |
667 | { | 667 | { |
668 | sctp_sender_hb_info_t *hbinfo; | 668 | sctp_sender_hb_info_t *hbinfo; |
669 | int was_unconfirmed = 0; | ||
669 | 670 | ||
670 | /* 8.3 Upon the receipt of the HEARTBEAT ACK, the sender of the | 671 | /* 8.3 Upon the receipt of the HEARTBEAT ACK, the sender of the |
671 | * HEARTBEAT should clear the error counter of the destination | 672 | * HEARTBEAT should clear the error counter of the destination |
@@ -692,9 +693,11 @@ static void sctp_cmd_transport_on(sctp_cmd_seq_t *cmds, | |||
692 | /* Mark the destination transport address as active if it is not so | 693 | /* Mark the destination transport address as active if it is not so |
693 | * marked. | 694 | * marked. |
694 | */ | 695 | */ |
695 | if ((t->state == SCTP_INACTIVE) || (t->state == SCTP_UNCONFIRMED)) | 696 | if ((t->state == SCTP_INACTIVE) || (t->state == SCTP_UNCONFIRMED)) { |
697 | was_unconfirmed = 1; | ||
696 | sctp_assoc_control_transport(asoc, t, SCTP_TRANSPORT_UP, | 698 | sctp_assoc_control_transport(asoc, t, SCTP_TRANSPORT_UP, |
697 | SCTP_HEARTBEAT_SUCCESS); | 699 | SCTP_HEARTBEAT_SUCCESS); |
700 | } | ||
698 | 701 | ||
699 | /* The receiver of the HEARTBEAT ACK should also perform an | 702 | /* The receiver of the HEARTBEAT ACK should also perform an |
700 | * RTT measurement for that destination transport address | 703 | * RTT measurement for that destination transport address |
@@ -712,6 +715,9 @@ static void sctp_cmd_transport_on(sctp_cmd_seq_t *cmds, | |||
712 | /* Update the heartbeat timer. */ | 715 | /* Update the heartbeat timer. */ |
713 | if (!mod_timer(&t->hb_timer, sctp_transport_timeout(t))) | 716 | if (!mod_timer(&t->hb_timer, sctp_transport_timeout(t))) |
714 | sctp_transport_hold(t); | 717 | sctp_transport_hold(t); |
718 | |||
719 | if (was_unconfirmed && asoc->peer.transport_count == 1) | ||
720 | sctp_transport_immediate_rtx(t); | ||
715 | } | 721 | } |
716 | 722 | ||
717 | 723 | ||