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 | |
| 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>
| -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 | ||
