Deleted Added
full compact
sctp_timer.c (210493) sctp_timer.c (210599)
1/*-
2 * Copyright (c) 2001-2007, by Cisco Systems, Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 *
7 * a) Redistributions of source code must retain the above copyright notice,
8 * this list of conditions and the following disclaimer.

--- 17 unchanged lines hidden (view full) ---

26 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
28 * THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31/* $KAME: sctp_timer.c,v 1.29 2005/03/06 16:04:18 itojun Exp $ */
32
33#include <sys/cdefs.h>
1/*-
2 * Copyright (c) 2001-2007, by Cisco Systems, Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 *
7 * a) Redistributions of source code must retain the above copyright notice,
8 * this list of conditions and the following disclaimer.

--- 17 unchanged lines hidden (view full) ---

26 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
28 * THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31/* $KAME: sctp_timer.c,v 1.29 2005/03/06 16:04:18 itojun Exp $ */
32
33#include <sys/cdefs.h>
34__FBSDID("$FreeBSD: head/sys/netinet/sctp_timer.c 210493 2010-07-26 09:20:55Z rrs $");
34__FBSDID("$FreeBSD: head/sys/netinet/sctp_timer.c 210599 2010-07-29 11:37:04Z rrs $");
35
36#define _IP_VHL
37#include <netinet/sctp_os.h>
38#include <netinet/sctp_pcb.h>
39#ifdef INET6
40#endif
41#include <netinet/sctp_var.h>
42#include <netinet/sctp_sysctl.h>

--- 497 unchanged lines hidden (view full) ---

540}
541
542
543
544static void
545sctp_backoff_on_timeout(struct sctp_tcb *stcb,
546 struct sctp_nets *net,
547 int win_probe,
35
36#define _IP_VHL
37#include <netinet/sctp_os.h>
38#include <netinet/sctp_pcb.h>
39#ifdef INET6
40#endif
41#include <netinet/sctp_var.h>
42#include <netinet/sctp_sysctl.h>

--- 497 unchanged lines hidden (view full) ---

540}
541
542
543
544static void
545sctp_backoff_on_timeout(struct sctp_tcb *stcb,
546 struct sctp_nets *net,
547 int win_probe,
548 int num_marked)
548 int num_marked, int num_abandoned)
549{
550 if (net->RTO == 0) {
551 net->RTO = stcb->asoc.minrto;
552 }
553 net->RTO <<= 1;
554 if (net->RTO > stcb->asoc.maxrto) {
555 net->RTO = stcb->asoc.maxrto;
556 }
549{
550 if (net->RTO == 0) {
551 net->RTO = stcb->asoc.minrto;
552 }
553 net->RTO <<= 1;
554 if (net->RTO > stcb->asoc.maxrto) {
555 net->RTO = stcb->asoc.maxrto;
556 }
557 if ((win_probe == 0) && num_marked) {
557 if ((win_probe == 0) && (num_marked || num_abandoned)) {
558 /* We don't apply penalty to window probe scenarios */
559 /* JRS - Use the congestion control given in the CC module */
560 stcb->asoc.cc_functions.sctp_cwnd_update_after_timeout(stcb, net);
561 }
562}
563
564#ifndef INVARIANTS
565static void

--- 41 unchanged lines hidden (view full) ---

607
608#endif
609
610static int
611sctp_mark_all_for_resend(struct sctp_tcb *stcb,
612 struct sctp_nets *net,
613 struct sctp_nets *alt,
614 int window_probe,
558 /* We don't apply penalty to window probe scenarios */
559 /* JRS - Use the congestion control given in the CC module */
560 stcb->asoc.cc_functions.sctp_cwnd_update_after_timeout(stcb, net);
561 }
562}
563
564#ifndef INVARIANTS
565static void

--- 41 unchanged lines hidden (view full) ---

607
608#endif
609
610static int
611sctp_mark_all_for_resend(struct sctp_tcb *stcb,
612 struct sctp_nets *net,
613 struct sctp_nets *alt,
614 int window_probe,
615 int *num_marked)
615 int *num_marked,
616 int *num_abandoned)
616{
617
618 /*
619 * Mark all chunks (well not all) that were sent to *net for
620 * retransmission. Move them to alt for there destination as well...
621 * We only mark chunks that have been outstanding long enough to
622 * have received feed-back.
623 */
617{
618
619 /*
620 * Mark all chunks (well not all) that were sent to *net for
621 * retransmission. Move them to alt for there destination as well...
622 * We only mark chunks that have been outstanding long enough to
623 * have received feed-back.
624 */
624 struct sctp_tmit_chunk *chk, *tp2, *could_be_sent = NULL;
625 struct sctp_tmit_chunk *chk, *tp2;
625 struct sctp_nets *lnets;
626 struct timeval now, min_wait, tv;
627 int cur_rtt;
626 struct sctp_nets *lnets;
627 struct timeval now, min_wait, tv;
628 int cur_rtt;
629 int cnt_abandoned;
628 int audit_tf, num_mk, fir;
629 unsigned int cnt_mk;
630 uint32_t orig_flight, orig_tf;
631 uint32_t tsnlast, tsnfirst;
632 int recovery_cnt = 0;
633
634
635 /* none in flight now */

--- 39 unchanged lines hidden (view full) ---

675 * Our rwnd will be incorrect here since we are not adding back the
676 * cnt * mbuf but we will fix that down below.
677 */
678 orig_flight = net->flight_size;
679 orig_tf = stcb->asoc.total_flight;
680
681 net->fast_retran_ip = 0;
682 /* Now on to each chunk */
630 int audit_tf, num_mk, fir;
631 unsigned int cnt_mk;
632 uint32_t orig_flight, orig_tf;
633 uint32_t tsnlast, tsnfirst;
634 int recovery_cnt = 0;
635
636
637 /* none in flight now */

--- 39 unchanged lines hidden (view full) ---

677 * Our rwnd will be incorrect here since we are not adding back the
678 * cnt * mbuf but we will fix that down below.
679 */
680 orig_flight = net->flight_size;
681 orig_tf = stcb->asoc.total_flight;
682
683 net->fast_retran_ip = 0;
684 /* Now on to each chunk */
685 cnt_abandoned = 0;
683 num_mk = cnt_mk = 0;
684 tsnfirst = tsnlast = 0;
685#ifndef INVARIANTS
686start_again:
687#endif
688 chk = TAILQ_FIRST(&stcb->asoc.sent_queue);
689 for (; chk != NULL; chk = tp2) {
690 tp2 = TAILQ_NEXT(chk, sctp_next);

--- 72 unchanged lines hidden (view full) ---

763 ((chk->rec.data.timetodrop.tv_sec == now.tv_sec) &&
764 (now.tv_usec > chk->rec.data.timetodrop.tv_usec))) {
765 /* Yes so drop it */
766 if (chk->data) {
767 (void)sctp_release_pr_sctp_chunk(stcb,
768 chk,
769 (SCTP_RESPONSE_TO_USER_REQ | SCTP_NOTIFY_DATAGRAM_SENT),
770 SCTP_SO_NOT_LOCKED);
686 num_mk = cnt_mk = 0;
687 tsnfirst = tsnlast = 0;
688#ifndef INVARIANTS
689start_again:
690#endif
691 chk = TAILQ_FIRST(&stcb->asoc.sent_queue);
692 for (; chk != NULL; chk = tp2) {
693 tp2 = TAILQ_NEXT(chk, sctp_next);

--- 72 unchanged lines hidden (view full) ---

766 ((chk->rec.data.timetodrop.tv_sec == now.tv_sec) &&
767 (now.tv_usec > chk->rec.data.timetodrop.tv_usec))) {
768 /* Yes so drop it */
769 if (chk->data) {
770 (void)sctp_release_pr_sctp_chunk(stcb,
771 chk,
772 (SCTP_RESPONSE_TO_USER_REQ | SCTP_NOTIFY_DATAGRAM_SENT),
773 SCTP_SO_NOT_LOCKED);
774 cnt_abandoned++;
771 }
772 continue;
773 }
774 }
775 if (stcb->asoc.peer_supports_prsctp && PR_SCTP_RTX_ENABLED(chk->flags)) {
776 /* Has it been retransmitted tv_sec times? */
777 if (chk->snd_count > chk->rec.data.timetodrop.tv_sec) {
778 if (chk->data) {
779 (void)sctp_release_pr_sctp_chunk(stcb,
780 chk,
781 (SCTP_RESPONSE_TO_USER_REQ | SCTP_NOTIFY_DATAGRAM_SENT),
782 SCTP_SO_NOT_LOCKED);
775 }
776 continue;
777 }
778 }
779 if (stcb->asoc.peer_supports_prsctp && PR_SCTP_RTX_ENABLED(chk->flags)) {
780 /* Has it been retransmitted tv_sec times? */
781 if (chk->snd_count > chk->rec.data.timetodrop.tv_sec) {
782 if (chk->data) {
783 (void)sctp_release_pr_sctp_chunk(stcb,
784 chk,
785 (SCTP_RESPONSE_TO_USER_REQ | SCTP_NOTIFY_DATAGRAM_SENT),
786 SCTP_SO_NOT_LOCKED);
787 cnt_abandoned++;
783 }
784 continue;
785 }
786 }
787 if (chk->sent < SCTP_DATAGRAM_RESEND) {
788 sctp_ucount_incr(stcb->asoc.sent_queue_retran_cnt);
789 num_mk++;
790 if (fir == 0) {

--- 45 unchanged lines hidden (view full) ---

836 }
837 }
838 /*
839 * CMT: Do not allow FRs on retransmitted TSNs.
840 */
841 if (SCTP_BASE_SYSCTL(sctp_cmt_on_off) == 1) {
842 chk->no_fr_allowed = 1;
843 }
788 }
789 continue;
790 }
791 }
792 if (chk->sent < SCTP_DATAGRAM_RESEND) {
793 sctp_ucount_incr(stcb->asoc.sent_queue_retran_cnt);
794 num_mk++;
795 if (fir == 0) {

--- 45 unchanged lines hidden (view full) ---

841 }
842 }
843 /*
844 * CMT: Do not allow FRs on retransmitted TSNs.
845 */
846 if (SCTP_BASE_SYSCTL(sctp_cmt_on_off) == 1) {
847 chk->no_fr_allowed = 1;
848 }
849#ifdef THIS_SHOULD_NOT_BE_DONE
844 } else if (chk->sent == SCTP_DATAGRAM_ACKED) {
845 /* remember highest acked one */
846 could_be_sent = chk;
850 } else if (chk->sent == SCTP_DATAGRAM_ACKED) {
851 /* remember highest acked one */
852 could_be_sent = chk;
853#endif
847 }
848 if (chk->sent == SCTP_DATAGRAM_RESEND) {
849 cnt_mk++;
850 }
851 }
852 if ((orig_flight - net->flight_size) != (orig_tf - stcb->asoc.total_flight)) {
853 /* we did not subtract the same things? */
854 audit_tf = 1;

--- 10 unchanged lines hidden (view full) ---

865 SCTPDBG(SCTP_DEBUG_TIMER1, "LAST TSN marked was %x\n",
866 tsnlast);
867 SCTPDBG(SCTP_DEBUG_TIMER1, "Num marked for retransmission was %d peer-rwd:%d\n",
868 num_mk,
869 (int)stcb->asoc.peers_rwnd);
870 }
871#endif
872 *num_marked = num_mk;
854 }
855 if (chk->sent == SCTP_DATAGRAM_RESEND) {
856 cnt_mk++;
857 }
858 }
859 if ((orig_flight - net->flight_size) != (orig_tf - stcb->asoc.total_flight)) {
860 /* we did not subtract the same things? */
861 audit_tf = 1;

--- 10 unchanged lines hidden (view full) ---

872 SCTPDBG(SCTP_DEBUG_TIMER1, "LAST TSN marked was %x\n",
873 tsnlast);
874 SCTPDBG(SCTP_DEBUG_TIMER1, "Num marked for retransmission was %d peer-rwd:%d\n",
875 num_mk,
876 (int)stcb->asoc.peers_rwnd);
877 }
878#endif
879 *num_marked = num_mk;
880 *num_abandoned = cnt_abandoned;
873 /*
874 * Now check for a ECN Echo that may be stranded And include the
875 * cnt_mk'd to have all resends in the control queue.
876 */
877 TAILQ_FOREACH(chk, &stcb->asoc.control_send_queue, sctp_next) {
878 if (chk->sent == SCTP_DATAGRAM_RESEND) {
879 cnt_mk++;
880 }

--- 4 unchanged lines hidden (view full) ---

885 if (chk->sent != SCTP_DATAGRAM_RESEND) {
886 chk->sent = SCTP_DATAGRAM_RESEND;
887 sctp_ucount_incr(stcb->asoc.sent_queue_retran_cnt);
888 cnt_mk++;
889 }
890 atomic_add_int(&alt->ref_count, 1);
891 }
892 }
881 /*
882 * Now check for a ECN Echo that may be stranded And include the
883 * cnt_mk'd to have all resends in the control queue.
884 */
885 TAILQ_FOREACH(chk, &stcb->asoc.control_send_queue, sctp_next) {
886 if (chk->sent == SCTP_DATAGRAM_RESEND) {
887 cnt_mk++;
888 }

--- 4 unchanged lines hidden (view full) ---

893 if (chk->sent != SCTP_DATAGRAM_RESEND) {
894 chk->sent = SCTP_DATAGRAM_RESEND;
895 sctp_ucount_incr(stcb->asoc.sent_queue_retran_cnt);
896 cnt_mk++;
897 }
898 atomic_add_int(&alt->ref_count, 1);
899 }
900 }
901#ifdef THIS_SHOULD_NOT_BE_DONE
893 if ((stcb->asoc.sent_queue_retran_cnt == 0) && (could_be_sent)) {
894 /* fix it so we retransmit the highest acked anyway */
895 sctp_ucount_incr(stcb->asoc.sent_queue_retran_cnt);
896 cnt_mk++;
897 could_be_sent->sent = SCTP_DATAGRAM_RESEND;
898 }
902 if ((stcb->asoc.sent_queue_retran_cnt == 0) && (could_be_sent)) {
903 /* fix it so we retransmit the highest acked anyway */
904 sctp_ucount_incr(stcb->asoc.sent_queue_retran_cnt);
905 cnt_mk++;
906 could_be_sent->sent = SCTP_DATAGRAM_RESEND;
907 }
908#endif
899 if (stcb->asoc.sent_queue_retran_cnt != cnt_mk) {
900#ifdef INVARIANTS
901 SCTP_PRINTF("Local Audit says there are %d for retran asoc cnt:%d we marked:%d this time\n",
902 cnt_mk, stcb->asoc.sent_queue_retran_cnt, num_mk);
903#endif
904#ifndef SCTP_AUDITING_ENABLED
905 stcb->asoc.sent_queue_retran_cnt = cnt_mk;
906#endif

--- 84 unchanged lines hidden (view full) ---

991}
992
993int
994sctp_t3rxt_timer(struct sctp_inpcb *inp,
995 struct sctp_tcb *stcb,
996 struct sctp_nets *net)
997{
998 struct sctp_nets *alt;
909 if (stcb->asoc.sent_queue_retran_cnt != cnt_mk) {
910#ifdef INVARIANTS
911 SCTP_PRINTF("Local Audit says there are %d for retran asoc cnt:%d we marked:%d this time\n",
912 cnt_mk, stcb->asoc.sent_queue_retran_cnt, num_mk);
913#endif
914#ifndef SCTP_AUDITING_ENABLED
915 stcb->asoc.sent_queue_retran_cnt = cnt_mk;
916#endif

--- 84 unchanged lines hidden (view full) ---

1001}
1002
1003int
1004sctp_t3rxt_timer(struct sctp_inpcb *inp,
1005 struct sctp_tcb *stcb,
1006 struct sctp_nets *net)
1007{
1008 struct sctp_nets *alt;
999 int win_probe, num_mk;
1009 int win_probe, num_mk, num_abandoned;
1000
1001 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FR_LOGGING_ENABLE) {
1002 sctp_log_fr(0, 0, 0, SCTP_FR_T3_TIMEOUT);
1003 }
1004 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_CWND_LOGGING_ENABLE) {
1005 struct sctp_nets *lnet;
1006
1007 TAILQ_FOREACH(lnet, &stcb->asoc.nets, sctp_next) {

--- 42 unchanged lines hidden (view full) ---

1050 * tracked for orig dest. Let CUCv2 track new (rtx-)
1051 * pseudo-cumack always.
1052 */
1053 net->find_pseudo_cumack = 1;
1054 net->find_rtx_pseudo_cumack = 1;
1055 } else { /* CMT is OFF */
1056 alt = sctp_find_alternate_net(stcb, net, 0);
1057 }
1010
1011 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FR_LOGGING_ENABLE) {
1012 sctp_log_fr(0, 0, 0, SCTP_FR_T3_TIMEOUT);
1013 }
1014 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_CWND_LOGGING_ENABLE) {
1015 struct sctp_nets *lnet;
1016
1017 TAILQ_FOREACH(lnet, &stcb->asoc.nets, sctp_next) {

--- 42 unchanged lines hidden (view full) ---

1060 * tracked for orig dest. Let CUCv2 track new (rtx-)
1061 * pseudo-cumack always.
1062 */
1063 net->find_pseudo_cumack = 1;
1064 net->find_rtx_pseudo_cumack = 1;
1065 } else { /* CMT is OFF */
1066 alt = sctp_find_alternate_net(stcb, net, 0);
1067 }
1058
1059 (void)sctp_mark_all_for_resend(stcb, net, alt, win_probe, &num_mk);
1068 num_mk = 0;
1069 num_abandoned = 0;
1070 (void)sctp_mark_all_for_resend(stcb, net, alt, win_probe,
1071 &num_mk, &num_abandoned);
1060 /* FR Loss recovery just ended with the T3. */
1061 stcb->asoc.fast_retran_loss_recovery = 0;
1062
1063 /* CMT FR loss recovery ended with the T3 */
1064 net->fast_retran_loss_recovery = 0;
1065
1066 /*
1067 * setup the sat loss recovery that prevents satellite cwnd advance.
1068 */
1069 stcb->asoc.sat_t3_loss_recovery = 1;
1070 stcb->asoc.sat_t3_recovery_tsn = stcb->asoc.sending_seq;
1071
1072 /* Backoff the timer and cwnd */
1072 /* FR Loss recovery just ended with the T3. */
1073 stcb->asoc.fast_retran_loss_recovery = 0;
1074
1075 /* CMT FR loss recovery ended with the T3 */
1076 net->fast_retran_loss_recovery = 0;
1077
1078 /*
1079 * setup the sat loss recovery that prevents satellite cwnd advance.
1080 */
1081 stcb->asoc.sat_t3_loss_recovery = 1;
1082 stcb->asoc.sat_t3_recovery_tsn = stcb->asoc.sending_seq;
1083
1084 /* Backoff the timer and cwnd */
1073 sctp_backoff_on_timeout(stcb, net, win_probe, num_mk);
1085 sctp_backoff_on_timeout(stcb, net, win_probe, num_mk, num_abandoned);
1074 if (win_probe == 0) {
1075 /* We don't do normal threshold management on window probes */
1076 if (sctp_threshold_management(inp, stcb, net,
1077 stcb->asoc.max_send_times)) {
1078 /* Association was destroyed */
1079 return (1);
1080 } else {
1081 if (net != stcb->asoc.primary_destination) {

--- 134 unchanged lines hidden (view full) ---

1216 return (0);
1217 }
1218 if (sctp_threshold_management(inp, stcb, net,
1219 stcb->asoc.max_init_times)) {
1220 /* Association was destroyed */
1221 return (1);
1222 }
1223 stcb->asoc.dropped_special_cnt = 0;
1086 if (win_probe == 0) {
1087 /* We don't do normal threshold management on window probes */
1088 if (sctp_threshold_management(inp, stcb, net,
1089 stcb->asoc.max_send_times)) {
1090 /* Association was destroyed */
1091 return (1);
1092 } else {
1093 if (net != stcb->asoc.primary_destination) {

--- 134 unchanged lines hidden (view full) ---

1228 return (0);
1229 }
1230 if (sctp_threshold_management(inp, stcb, net,
1231 stcb->asoc.max_init_times)) {
1232 /* Association was destroyed */
1233 return (1);
1234 }
1235 stcb->asoc.dropped_special_cnt = 0;
1224 sctp_backoff_on_timeout(stcb, stcb->asoc.primary_destination, 1, 0);
1236 sctp_backoff_on_timeout(stcb, stcb->asoc.primary_destination, 1, 0, 0);
1225 if (stcb->asoc.initial_init_rto_max < net->RTO) {
1226 net->RTO = stcb->asoc.initial_init_rto_max;
1227 }
1228 if (stcb->asoc.numnets > 1) {
1229 /* If we have more than one addr use it */
1230 struct sctp_nets *alt;
1231
1232 alt = sctp_find_alternate_net(stcb, stcb->asoc.primary_destination, 0);

--- 64 unchanged lines hidden (view full) ---

1297 /* Assoc is over */
1298 return (1);
1299 }
1300 /*
1301 * cleared theshold management now lets backoff the address & select
1302 * an alternate
1303 */
1304 stcb->asoc.dropped_special_cnt = 0;
1237 if (stcb->asoc.initial_init_rto_max < net->RTO) {
1238 net->RTO = stcb->asoc.initial_init_rto_max;
1239 }
1240 if (stcb->asoc.numnets > 1) {
1241 /* If we have more than one addr use it */
1242 struct sctp_nets *alt;
1243
1244 alt = sctp_find_alternate_net(stcb, stcb->asoc.primary_destination, 0);

--- 64 unchanged lines hidden (view full) ---

1309 /* Assoc is over */
1310 return (1);
1311 }
1312 /*
1313 * cleared theshold management now lets backoff the address & select
1314 * an alternate
1315 */
1316 stcb->asoc.dropped_special_cnt = 0;
1305 sctp_backoff_on_timeout(stcb, cookie->whoTo, 1, 0);
1317 sctp_backoff_on_timeout(stcb, cookie->whoTo, 1, 0, 0);
1306 alt = sctp_find_alternate_net(stcb, cookie->whoTo, 0);
1307 if (alt != cookie->whoTo) {
1308 sctp_free_remote_addr(cookie->whoTo);
1309 cookie->whoTo = alt;
1310 atomic_add_int(&alt->ref_count, 1);
1311 }
1312 /* Now mark the retran info */
1313 if (cookie->sent != SCTP_DATAGRAM_RESEND) {

--- 28 unchanged lines hidden (view full) ---

1342 stcb->asoc.max_send_times)) {
1343 /* Assoc is over */
1344 return (1);
1345 }
1346 /*
1347 * cleared theshold management now lets backoff the address & select
1348 * an alternate
1349 */
1318 alt = sctp_find_alternate_net(stcb, cookie->whoTo, 0);
1319 if (alt != cookie->whoTo) {
1320 sctp_free_remote_addr(cookie->whoTo);
1321 cookie->whoTo = alt;
1322 atomic_add_int(&alt->ref_count, 1);
1323 }
1324 /* Now mark the retran info */
1325 if (cookie->sent != SCTP_DATAGRAM_RESEND) {

--- 28 unchanged lines hidden (view full) ---

1354 stcb->asoc.max_send_times)) {
1355 /* Assoc is over */
1356 return (1);
1357 }
1358 /*
1359 * cleared theshold management now lets backoff the address & select
1360 * an alternate
1361 */
1350 sctp_backoff_on_timeout(stcb, strrst->whoTo, 1, 0);
1362 sctp_backoff_on_timeout(stcb, strrst->whoTo, 1, 0, 0);
1351 alt = sctp_find_alternate_net(stcb, strrst->whoTo, 0);
1352 sctp_free_remote_addr(strrst->whoTo);
1353 strrst->whoTo = alt;
1354 atomic_add_int(&alt->ref_count, 1);
1355
1356 /* See if a ECN Echo is also stranded */
1357 TAILQ_FOREACH(chk, &stcb->asoc.control_send_queue, sctp_next) {
1358 if ((chk->whoTo == net) &&

--- 62 unchanged lines hidden (view full) ---

1421 SCTPDBG(SCTP_DEBUG_TIMER1, "asconf_timer: Peer has not responded to our repeated ASCONFs\n");
1422 sctp_asconf_cleanup(stcb, net);
1423 return (0);
1424 }
1425 /*
1426 * cleared threshold management, so now backoff the net and
1427 * select an alternate
1428 */
1363 alt = sctp_find_alternate_net(stcb, strrst->whoTo, 0);
1364 sctp_free_remote_addr(strrst->whoTo);
1365 strrst->whoTo = alt;
1366 atomic_add_int(&alt->ref_count, 1);
1367
1368 /* See if a ECN Echo is also stranded */
1369 TAILQ_FOREACH(chk, &stcb->asoc.control_send_queue, sctp_next) {
1370 if ((chk->whoTo == net) &&

--- 62 unchanged lines hidden (view full) ---

1433 SCTPDBG(SCTP_DEBUG_TIMER1, "asconf_timer: Peer has not responded to our repeated ASCONFs\n");
1434 sctp_asconf_cleanup(stcb, net);
1435 return (0);
1436 }
1437 /*
1438 * cleared threshold management, so now backoff the net and
1439 * select an alternate
1440 */
1429 sctp_backoff_on_timeout(stcb, asconf->whoTo, 1, 0);
1441 sctp_backoff_on_timeout(stcb, asconf->whoTo, 1, 0, 0);
1430 alt = sctp_find_alternate_net(stcb, asconf->whoTo, 0);
1431 if (asconf->whoTo != alt) {
1432 sctp_free_remote_addr(asconf->whoTo);
1433 asconf->whoTo = alt;
1434 atomic_add_int(&alt->ref_count, 1);
1435 }
1436 /* See if an ECN Echo is also stranded */
1437 TAILQ_FOREACH(chk, &stcb->asoc.control_send_queue, sctp_next) {

--- 200 unchanged lines hidden (view full) ---

1638 /*
1639 * Invalidate the src address if we did not
1640 * get a response last time.
1641 */
1642 sctp_free_ifa(net->ro._s_addr);
1643 net->ro._s_addr = NULL;
1644 net->src_addr_selected = 0;
1645 }
1442 alt = sctp_find_alternate_net(stcb, asconf->whoTo, 0);
1443 if (asconf->whoTo != alt) {
1444 sctp_free_remote_addr(asconf->whoTo);
1445 asconf->whoTo = alt;
1446 atomic_add_int(&alt->ref_count, 1);
1447 }
1448 /* See if an ECN Echo is also stranded */
1449 TAILQ_FOREACH(chk, &stcb->asoc.control_send_queue, sctp_next) {

--- 200 unchanged lines hidden (view full) ---

1650 /*
1651 * Invalidate the src address if we did not
1652 * get a response last time.
1653 */
1654 sctp_free_ifa(net->ro._s_addr);
1655 net->ro._s_addr = NULL;
1656 net->src_addr_selected = 0;
1657 }
1646 sctp_backoff_on_timeout(stcb, net, 1, 0);
1658 sctp_backoff_on_timeout(stcb, net, 1, 0, 0);
1647 }
1648 /* Zero PBA, if it needs it */
1649 if (net->partial_bytes_acked) {
1650 net->partial_bytes_acked = 0;
1651 }
1652 }
1653 if ((stcb->asoc.total_output_queue_size > 0) &&
1654 (TAILQ_EMPTY(&stcb->asoc.send_queue)) &&

--- 235 unchanged lines hidden ---
1659 }
1660 /* Zero PBA, if it needs it */
1661 if (net->partial_bytes_acked) {
1662 net->partial_bytes_acked = 0;
1663 }
1664 }
1665 if ((stcb->asoc.total_output_queue_size > 0) &&
1666 (TAILQ_EMPTY(&stcb->asoc.send_queue)) &&

--- 235 unchanged lines hidden ---