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