diff options
author | Sridhar Samudrala <sri@us.ibm.com> | 2006-07-21 17:48:50 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2006-07-21 17:48:50 -0400 |
commit | ad8fec1720e000ba2384de6408076a60fc92a981 (patch) | |
tree | 52fd2f7af583b95db6db369c6b3ea3d6adc26d69 /net/sctp/sm_sideeffect.c | |
parent | cfdeef3282705a4b872d3559c4e7d2561251363c (diff) |
[SCTP]: Verify all the paths to a peer via heartbeat before using them.
This patch implements Path Initialization procedure as described in
Sec 2.36 of RFC4460.
Signed-off-by: Sridhar Samudrala <sri@us.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sctp/sm_sideeffect.c')
-rw-r--r-- | net/sctp/sm_sideeffect.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/net/sctp/sm_sideeffect.c b/net/sctp/sm_sideeffect.c index c5beb2ad7ef7..9c10bdec1afe 100644 --- a/net/sctp/sm_sideeffect.c +++ b/net/sctp/sm_sideeffect.c | |||
@@ -430,7 +430,11 @@ static void sctp_do_8_2_transport_strike(struct sctp_association *asoc, | |||
430 | /* The check for association's overall error counter exceeding the | 430 | /* The check for association's overall error counter exceeding the |
431 | * threshold is done in the state function. | 431 | * threshold is done in the state function. |
432 | */ | 432 | */ |
433 | asoc->overall_error_count++; | 433 | /* When probing UNCONFIRMED addresses, the association overall |
434 | * error count is NOT incremented | ||
435 | */ | ||
436 | if (transport->state != SCTP_UNCONFIRMED) | ||
437 | asoc->overall_error_count++; | ||
434 | 438 | ||
435 | if (transport->state != SCTP_INACTIVE && | 439 | if (transport->state != SCTP_INACTIVE && |
436 | (transport->error_count++ >= transport->pathmaxrxt)) { | 440 | (transport->error_count++ >= transport->pathmaxrxt)) { |
@@ -610,7 +614,7 @@ static void sctp_cmd_transport_on(sctp_cmd_seq_t *cmds, | |||
610 | /* Mark the destination transport address as active if it is not so | 614 | /* Mark the destination transport address as active if it is not so |
611 | * marked. | 615 | * marked. |
612 | */ | 616 | */ |
613 | if (t->state == SCTP_INACTIVE) | 617 | if ((t->state == SCTP_INACTIVE) || (t->state == SCTP_UNCONFIRMED)) |
614 | sctp_assoc_control_transport(asoc, t, SCTP_TRANSPORT_UP, | 618 | sctp_assoc_control_transport(asoc, t, SCTP_TRANSPORT_UP, |
615 | SCTP_HEARTBEAT_SUCCESS); | 619 | SCTP_HEARTBEAT_SUCCESS); |
616 | 620 | ||
@@ -620,6 +624,10 @@ static void sctp_cmd_transport_on(sctp_cmd_seq_t *cmds, | |||
620 | */ | 624 | */ |
621 | hbinfo = (sctp_sender_hb_info_t *) chunk->skb->data; | 625 | hbinfo = (sctp_sender_hb_info_t *) chunk->skb->data; |
622 | sctp_transport_update_rto(t, (jiffies - hbinfo->sent_at)); | 626 | sctp_transport_update_rto(t, (jiffies - hbinfo->sent_at)); |
627 | |||
628 | /* Update the heartbeat timer. */ | ||
629 | if (!mod_timer(&t->hb_timer, sctp_transport_timeout(t))) | ||
630 | sctp_transport_hold(t); | ||
623 | } | 631 | } |
624 | 632 | ||
625 | /* Helper function to do a transport reset at the expiry of the hearbeat | 633 | /* Helper function to do a transport reset at the expiry of the hearbeat |