summaryrefslogtreecommitdiffstats
path: root/net/sctp
diff options
context:
space:
mode:
authorMichio Honda <micchie@sfc.wide.ad.jp>2011-06-16 22:22:35 -0400
committerDavid S. Miller <davem@davemloft.net>2011-11-08 15:11:30 -0500
commit34d2d89f2d7da3b72b3157e778bbf709047ded97 (patch)
treed782069c43150d842a274489f9c4b1a35e8e0981 /net/sctp
parentddc4bbee6ef1ed20314be3888dd39ceefe233e79 (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.c8
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