svn commit: r231352 - in stable/8/sys: netinet netinet6
Michael Tuexen
tuexen at FreeBSD.org
Fri Feb 10 07:19:37 UTC 2012
Author: tuexen
Date: Fri Feb 10 07:19:36 2012
New Revision: 231352
URL: http://svn.freebsd.org/changeset/base/231352
Log:
MFC r216669:
Improve plausibility check in sctp_handle_sack().
Allow cmt_on_off to support values 0 (no CMT), 1 (CMT), and 2 (CMT/RP).
Modified:
stable/8/sys/netinet/sctp_cc_functions.c
stable/8/sys/netinet/sctp_indata.c
stable/8/sys/netinet/sctp_input.c
stable/8/sys/netinet/sctp_output.c
stable/8/sys/netinet/sctp_sysctl.h
stable/8/sys/netinet/sctp_timer.c
stable/8/sys/netinet/sctp_usrreq.c
stable/8/sys/netinet6/sctp6_usrreq.c
Directory Properties:
stable/8/sys/ (props changed)
stable/8/sys/amd64/include/xen/ (props changed)
stable/8/sys/boot/ (props changed)
stable/8/sys/cddl/contrib/opensolaris/ (props changed)
stable/8/sys/contrib/dev/acpica/ (props changed)
stable/8/sys/contrib/pf/ (props changed)
stable/8/sys/dev/e1000/ (props changed)
Modified: stable/8/sys/netinet/sctp_cc_functions.c
==============================================================================
--- stable/8/sys/netinet/sctp_cc_functions.c Fri Feb 10 07:03:45 2012 (r231351)
+++ stable/8/sys/netinet/sctp_cc_functions.c Fri Feb 10 07:19:36 2012 (r231352)
@@ -76,12 +76,12 @@ sctp_cwnd_update_after_fr(struct sctp_tc
struct sctp_nets *net;
/*-
- * CMT fast recovery code. Need to debug. ((sctp_cmt_on_off == 1) &&
+ * CMT fast recovery code. Need to debug. ((sctp_cmt_on_off > 0) &&
* (net->fast_retran_loss_recovery == 0)))
*/
TAILQ_FOREACH(net, &asoc->nets, sctp_next) {
if ((asoc->fast_retran_loss_recovery == 0) ||
- (asoc->sctp_cmt_on_off == 1)) {
+ (asoc->sctp_cmt_on_off > 0)) {
/* out of a RFC2582 Fast recovery window? */
if (net->net_ack > 0) {
/*
@@ -242,7 +242,7 @@ sctp_cwnd_update_after_sack(struct sctp_
*
* Should we stop any running T3 timer here?
*/
- if ((asoc->sctp_cmt_on_off == 1) &&
+ if ((asoc->sctp_cmt_on_off > 0) &&
(asoc->sctp_cmt_pf > 0) &&
((net->dest_state & SCTP_ADDR_PF) == SCTP_ADDR_PF)) {
net->dest_state &= ~SCTP_ADDR_PF;
@@ -262,10 +262,9 @@ sctp_cwnd_update_after_sack(struct sctp_
* CMT fast recovery code
*/
/*
- * if (sctp_cmt_on_off == 1 &&
- * net->fast_retran_loss_recovery &&
- * net->will_exit_fast_recovery == 0) { @@@ Do something }
- * else if (sctp_cmt_on_off == 0 &&
+ * if (sctp_cmt_on_off > 0 && net->fast_retran_loss_recovery
+ * && net->will_exit_fast_recovery == 0) { @@@ Do something
+ * } else if (sctp_cmt_on_off == 0 &&
* asoc->fast_retran_loss_recovery && will_exit == 0) {
*/
#endif
@@ -284,7 +283,7 @@ sctp_cwnd_update_after_sack(struct sctp_
* moved.
*/
if (accum_moved ||
- ((asoc->sctp_cmt_on_off == 1) && net->new_pseudo_cumack)) {
+ ((asoc->sctp_cmt_on_off > 0) && net->new_pseudo_cumack)) {
/* If the cumulative ack moved we can proceed */
if (net->cwnd <= net->ssthresh) {
/* We are in slow start */
@@ -705,12 +704,12 @@ sctp_hs_cwnd_update_after_fr(struct sctp
struct sctp_nets *net;
/*
- * CMT fast recovery code. Need to debug. ((sctp_cmt_on_off == 1) &&
+ * CMT fast recovery code. Need to debug. ((sctp_cmt_on_off > 0) &&
* (net->fast_retran_loss_recovery == 0)))
*/
TAILQ_FOREACH(net, &asoc->nets, sctp_next) {
if ((asoc->fast_retran_loss_recovery == 0) ||
- (asoc->sctp_cmt_on_off == 1)) {
+ (asoc->sctp_cmt_on_off > 0)) {
/* out of a RFC2582 Fast recovery window? */
if (net->net_ack > 0) {
/*
@@ -863,7 +862,7 @@ sctp_hs_cwnd_update_after_sack(struct sc
*
* Should we stop any running T3 timer here?
*/
- if ((asoc->sctp_cmt_on_off == 1) &&
+ if ((asoc->sctp_cmt_on_off > 0) &&
(asoc->sctp_cmt_pf > 0) &&
((net->dest_state & SCTP_ADDR_PF) == SCTP_ADDR_PF)) {
net->dest_state &= ~SCTP_ADDR_PF;
@@ -883,10 +882,9 @@ sctp_hs_cwnd_update_after_sack(struct sc
* CMT fast recovery code
*/
/*
- * if (sctp_cmt_on_off == 1 &&
- * net->fast_retran_loss_recovery &&
- * net->will_exit_fast_recovery == 0) { @@@ Do something }
- * else if (sctp_cmt_on_off == 0 &&
+ * if (sctp_cmt_on_off > 0 && net->fast_retran_loss_recovery
+ * && net->will_exit_fast_recovery == 0) { @@@ Do something
+ * } else if (sctp_cmt_on_off == 0 &&
* asoc->fast_retran_loss_recovery && will_exit == 0) {
*/
#endif
@@ -905,7 +903,7 @@ sctp_hs_cwnd_update_after_sack(struct sc
* moved.
*/
if (accum_moved ||
- ((asoc->sctp_cmt_on_off == 1) && net->new_pseudo_cumack)) {
+ ((asoc->sctp_cmt_on_off > 0) && net->new_pseudo_cumack)) {
/* If the cumulative ack moved we can proceed */
if (net->cwnd <= net->ssthresh) {
/* We are in slow start */
@@ -1349,7 +1347,7 @@ sctp_htcp_cwnd_update_after_sack(struct
*
* Should we stop any running T3 timer here?
*/
- if ((asoc->sctp_cmt_on_off == 1) &&
+ if ((asoc->sctp_cmt_on_off > 0) &&
(asoc->sctp_cmt_pf > 0) &&
((net->dest_state & SCTP_ADDR_PF) == SCTP_ADDR_PF)) {
net->dest_state &= ~SCTP_ADDR_PF;
@@ -1369,10 +1367,9 @@ sctp_htcp_cwnd_update_after_sack(struct
* CMT fast recovery code
*/
/*
- * if (sctp_cmt_on_off == 1 &&
- * net->fast_retran_loss_recovery &&
- * net->will_exit_fast_recovery == 0) { @@@ Do something }
- * else if (sctp_cmt_on_off == 0 &&
+ * if (sctp_cmt_on_off > 0 && net->fast_retran_loss_recovery
+ * && net->will_exit_fast_recovery == 0) { @@@ Do something
+ * } else if (sctp_cmt_on_off == 0 &&
* asoc->fast_retran_loss_recovery && will_exit == 0) {
*/
#endif
@@ -1391,7 +1388,7 @@ sctp_htcp_cwnd_update_after_sack(struct
* moved.
*/
if (accum_moved ||
- ((asoc->sctp_cmt_on_off == 1) && net->new_pseudo_cumack)) {
+ ((asoc->sctp_cmt_on_off > 0) && net->new_pseudo_cumack)) {
htcp_cong_avoid(stcb, net);
measure_achieved_throughput(stcb, net);
} else {
@@ -1427,12 +1424,12 @@ sctp_htcp_cwnd_update_after_fr(struct sc
struct sctp_nets *net;
/*
- * CMT fast recovery code. Need to debug. ((sctp_cmt_on_off == 1) &&
+ * CMT fast recovery code. Need to debug. ((sctp_cmt_on_off > 0) &&
* (net->fast_retran_loss_recovery == 0)))
*/
TAILQ_FOREACH(net, &asoc->nets, sctp_next) {
if ((asoc->fast_retran_loss_recovery == 0) ||
- (asoc->sctp_cmt_on_off == 1)) {
+ (asoc->sctp_cmt_on_off > 0)) {
/* out of a RFC2582 Fast recovery window? */
if (net->net_ack > 0) {
/*
Modified: stable/8/sys/netinet/sctp_indata.c
==============================================================================
--- stable/8/sys/netinet/sctp_indata.c Fri Feb 10 07:03:45 2012 (r231351)
+++ stable/8/sys/netinet/sctp_indata.c Fri Feb 10 07:19:36 2012 (r231352)
@@ -2476,7 +2476,7 @@ sctp_sack_check(struct sctp_tcb *stcb, i
(stcb->asoc.data_pkts_seen >= stcb->asoc.sack_freq) /* hit limit of pkts */
) {
- if ((stcb->asoc.sctp_cmt_on_off == 1) &&
+ if ((stcb->asoc.sctp_cmt_on_off > 0) &&
(SCTP_BASE_SYSCTL(sctp_cmt_use_dac)) &&
(stcb->asoc.send_sack == 0) &&
(stcb->asoc.numduptsns == 0) &&
@@ -3242,7 +3242,7 @@ sctp_strike_gap_ack_chunks(struct sctp_t
}
/* CMT DAC algo: finding out if SACK is a mixed SACK */
- if ((asoc->sctp_cmt_on_off == 1) &&
+ if ((asoc->sctp_cmt_on_off > 0) &&
SCTP_BASE_SYSCTL(sctp_cmt_use_dac)) {
TAILQ_FOREACH(net, &asoc->nets, sctp_next) {
if (net->saw_newack)
@@ -3353,7 +3353,7 @@ sctp_strike_gap_ack_chunks(struct sctp_t
if (tp1->sent < SCTP_DATAGRAM_RESEND) {
tp1->sent++;
}
- if ((asoc->sctp_cmt_on_off == 1) &&
+ if ((asoc->sctp_cmt_on_off > 0) &&
SCTP_BASE_SYSCTL(sctp_cmt_use_dac)) {
/*
* CMT DAC algorithm: If SACK flag is set to
@@ -3419,7 +3419,7 @@ sctp_strike_gap_ack_chunks(struct sctp_t
tp1->sent++;
}
strike_flag = 1;
- if ((asoc->sctp_cmt_on_off == 1) &&
+ if ((asoc->sctp_cmt_on_off > 0) &&
SCTP_BASE_SYSCTL(sctp_cmt_use_dac)) {
/*
* CMT DAC algorithm: If
@@ -3480,7 +3480,7 @@ sctp_strike_gap_ack_chunks(struct sctp_t
if (tp1->sent < SCTP_DATAGRAM_RESEND) {
tp1->sent++;
}
- if ((asoc->sctp_cmt_on_off == 1) &&
+ if ((asoc->sctp_cmt_on_off > 0) &&
SCTP_BASE_SYSCTL(sctp_cmt_use_dac)) {
/*
* CMT DAC algorithm: If SACK flag is set to
@@ -3560,7 +3560,7 @@ sctp_strike_gap_ack_chunks(struct sctp_t
SCTP_STAT_INCR(sctps_sendmultfastretrans);
}
sctp_ucount_incr(stcb->asoc.sent_queue_retran_cnt);
- if (asoc->sctp_cmt_on_off == 1) {
+ if (asoc->sctp_cmt_on_off > 0) {
/*
* CMT: Using RTX_SSTHRESH policy for CMT.
* If CMT is being used, then pick dest with
@@ -4776,7 +4776,7 @@ sctp_handle_sack(struct mbuf *m, int off
/*******************************************/
/* cancel ALL T3-send timer if accum moved */
/*******************************************/
- if (asoc->sctp_cmt_on_off == 1) {
+ if (asoc->sctp_cmt_on_off > 0) {
TAILQ_FOREACH(net, &asoc->nets, sctp_next) {
if (net->new_pseudo_cumack)
sctp_timer_stop(SCTP_TIMER_TYPE_SEND, stcb->sctp_ep,
@@ -4797,10 +4797,7 @@ sctp_handle_sack(struct mbuf *m, int off
/********************************************/
asoc->last_acked_seq = cum_ack;
- tp1 = TAILQ_FIRST(&asoc->sent_queue);
- if (tp1 == NULL)
- goto done_with_it;
- do {
+ TAILQ_FOREACH_SAFE(tp1, &asoc->sent_queue, sctp_next, tp2) {
if (compare_with_wrap(tp1->rec.data.TSN_seq, cum_ack,
MAX_TSN)) {
break;
@@ -4810,26 +4807,17 @@ sctp_handle_sack(struct mbuf *m, int off
printf("Warning, tp1->sent == %d and its now acked?\n",
tp1->sent);
}
- tp2 = TAILQ_NEXT(tp1, sctp_next);
TAILQ_REMOVE(&asoc->sent_queue, tp1, sctp_next);
if (tp1->pr_sctp_on) {
if (asoc->pr_sctp_cnt != 0)
asoc->pr_sctp_cnt--;
}
- if (TAILQ_EMPTY(&asoc->sent_queue) &&
- (asoc->total_flight > 0)) {
-#ifdef INVARIANTS
- panic("Warning flight size is postive and should be 0");
-#else
- SCTP_PRINTF("Warning flight size incorrect should be 0 is %d\n",
- asoc->total_flight);
-#endif
- asoc->total_flight = 0;
- }
+ asoc->sent_queue_cnt--;
if (tp1->data) {
/* sa_ignore NO_NULL_CHK */
sctp_free_bufspace(stcb, asoc, tp1, 1);
sctp_m_freem(tp1->data);
+ tp1->data = NULL;
if (asoc->peer_supports_prsctp && PR_SCTP_BUF_ENABLED(tp1->flags)) {
asoc->sent_queue_cnt_removeable--;
}
@@ -4842,14 +4830,18 @@ sctp_handle_sack(struct mbuf *m, int off
0,
SCTP_LOG_FREE_SENT);
}
- tp1->data = NULL;
- asoc->sent_queue_cnt--;
sctp_free_a_chunk(stcb, tp1);
wake_him++;
- tp1 = tp2;
- } while (tp1 != NULL);
-
-done_with_it:
+ }
+ if (TAILQ_EMPTY(&asoc->sent_queue) && (asoc->total_flight > 0)) {
+#ifdef INVARIANTS
+ panic("Warning flight size is postive and should be 0");
+#else
+ SCTP_PRINTF("Warning flight size incorrect should be 0 is %d\n",
+ asoc->total_flight);
+#endif
+ asoc->total_flight = 0;
+ }
/* sa_ignore NO_NULL_CHK */
if ((wake_him) && (stcb->sctp_socket)) {
#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING)
@@ -5077,7 +5069,7 @@ done_with_it:
* to be done. Setting this_sack_lowest_newack to the cum_ack will
* automatically ensure that.
*/
- if ((asoc->sctp_cmt_on_off == 1) &&
+ if ((asoc->sctp_cmt_on_off > 0) &&
SCTP_BASE_SYSCTL(sctp_cmt_use_dac) &&
(cmt_dac_flag == 0)) {
this_sack_lowest_newack = cum_ack;
Modified: stable/8/sys/netinet/sctp_input.c
==============================================================================
--- stable/8/sys/netinet/sctp_input.c Fri Feb 10 07:03:45 2012 (r231351)
+++ stable/8/sys/netinet/sctp_input.c Fri Feb 10 07:19:36 2012 (r231352)
@@ -623,7 +623,7 @@ sctp_handle_heartbeat_ack(struct sctp_he
* timer is running, for the destination, stop the timer because a
* PF-heartbeat was received.
*/
- if ((stcb->asoc.sctp_cmt_on_off == 1) &&
+ if ((stcb->asoc.sctp_cmt_on_off > 0) &&
(stcb->asoc.sctp_cmt_pf > 0) &&
((net->dest_state & SCTP_ADDR_PF) == SCTP_ADDR_PF)) {
if (SCTP_OS_TIMER_PENDING(&net->rxt_timer.timer)) {
Modified: stable/8/sys/netinet/sctp_output.c
==============================================================================
--- stable/8/sys/netinet/sctp_output.c Fri Feb 10 07:03:45 2012 (r231351)
+++ stable/8/sys/netinet/sctp_output.c Fri Feb 10 07:19:36 2012 (r231352)
@@ -3686,7 +3686,7 @@ sctp_lowlevel_chunk_output(struct sctp_i
* Stop any running T3
* timers here?
*/
- if ((stcb->asoc.sctp_cmt_on_off == 1) &&
+ if ((stcb->asoc.sctp_cmt_on_off > 0) &&
(stcb->asoc.sctp_cmt_pf > 0)) {
net->dest_state &= ~SCTP_ADDR_PF;
SCTPDBG(SCTP_DEBUG_OUTPUT1, "Destination %p moved from PF to unreachable.\n",
@@ -7325,7 +7325,7 @@ sctp_fill_outqueue(struct sctp_tcb *stcb
(net == stcb->asoc.primary_destination)) {
/* ran dry for primary network net */
SCTP_STAT_INCR(sctps_primary_randry);
- } else if (stcb->asoc.sctp_cmt_on_off == 1) {
+ } else if (stcb->asoc.sctp_cmt_on_off > 0) {
/* ran dry with CMT on */
SCTP_STAT_INCR(sctps_cmt_randry);
}
@@ -7526,7 +7526,7 @@ sctp_med_chunk_output(struct sctp_inpcb
*reason_code = 8;
return (0);
}
- if (asoc->sctp_cmt_on_off == 1) {
+ if (asoc->sctp_cmt_on_off > 0) {
/* get the last start point */
start_at = asoc->last_net_cmt_send_started;
if (start_at == NULL) {
@@ -8028,7 +8028,7 @@ again_one_more_time:
}
}
/* JRI: if dest is in PF state, do not send data to it */
- if ((asoc->sctp_cmt_on_off == 1) &&
+ if ((asoc->sctp_cmt_on_off > 0) &&
(asoc->sctp_cmt_pf > 0) &&
(net->dest_state & SCTP_ADDR_PF)) {
goto no_data_fill;
@@ -8036,7 +8036,7 @@ again_one_more_time:
if (net->flight_size >= net->cwnd) {
goto no_data_fill;
}
- if ((asoc->sctp_cmt_on_off == 1) &&
+ if ((asoc->sctp_cmt_on_off > 0) &&
(SCTP_BASE_SYSCTL(sctp_buffer_splitting) & SCTP_RECV_BUFFER_SPLITTING) &&
(net->flight_size > max_rwnd_per_dest)) {
goto no_data_fill;
@@ -8047,7 +8047,7 @@ again_one_more_time:
* net. For now, this is better than nothing and it disabled
* by default...
*/
- if ((asoc->sctp_cmt_on_off == 1) &&
+ if ((asoc->sctp_cmt_on_off > 0) &&
(SCTP_BASE_SYSCTL(sctp_buffer_splitting) & SCTP_SEND_BUFFER_SPLITTING) &&
(max_send_per_dest > 0) &&
(net->flight_size > max_send_per_dest)) {
@@ -8268,7 +8268,7 @@ no_data_fill:
* restart it.
*/
sctp_timer_start(SCTP_TIMER_TYPE_SEND, inp, stcb, net);
- } else if ((asoc->sctp_cmt_on_off == 1) &&
+ } else if ((asoc->sctp_cmt_on_off > 0) &&
(asoc->sctp_cmt_pf > 0) &&
pf_hbflag &&
((net->dest_state & SCTP_ADDR_PF) == SCTP_ADDR_PF) &&
@@ -9576,7 +9576,7 @@ sctp_chunk_output(struct sctp_inpcb *inp
*/
if (net->ref_count > 1)
sctp_move_chunks_from_net(stcb, net);
- } else if ((asoc->sctp_cmt_on_off == 1) &&
+ } else if ((asoc->sctp_cmt_on_off > 0) &&
(asoc->sctp_cmt_pf > 0) &&
((net->dest_state & SCTP_ADDR_PF) == SCTP_ADDR_PF)) {
/*
@@ -10073,7 +10073,7 @@ sctp_send_sack(struct sctp_tcb *stcb)
else
flags = 0;
- if ((asoc->sctp_cmt_on_off == 1) &&
+ if ((asoc->sctp_cmt_on_off > 0) &&
SCTP_BASE_SYSCTL(sctp_cmt_use_dac)) {
/*-
* CMT DAC algorithm: If 2 (i.e., 0x10) packets have been
Modified: stable/8/sys/netinet/sctp_sysctl.h
==============================================================================
--- stable/8/sys/netinet/sctp_sysctl.h Fri Feb 10 07:03:45 2012 (r231351)
+++ stable/8/sys/netinet/sctp_sysctl.h Fri Feb 10 07:19:36 2012 (r231352)
@@ -325,9 +325,9 @@ struct sctp_sysctl {
#define SCTPCTL_OUTGOING_STREAMS_DEFAULT SCTP_OSTREAM_INITIAL
/* cmt_on_off: CMT on/off flag */
-#define SCTPCTL_CMT_ON_OFF_DESC "CMT on/off flag"
+#define SCTPCTL_CMT_ON_OFF_DESC "CMT settings"
#define SCTPCTL_CMT_ON_OFF_MIN 0
-#define SCTPCTL_CMT_ON_OFF_MAX 1
+#define SCTPCTL_CMT_ON_OFF_MAX 2
#define SCTPCTL_CMT_ON_OFF_DEFAULT 0
/* EY - nr_sack_on_off: NR_SACK on/off flag */
Modified: stable/8/sys/netinet/sctp_timer.c
==============================================================================
--- stable/8/sys/netinet/sctp_timer.c Fri Feb 10 07:03:45 2012 (r231351)
+++ stable/8/sys/netinet/sctp_timer.c Fri Feb 10 07:19:36 2012 (r231352)
@@ -215,7 +215,7 @@ sctp_threshold_management(struct sctp_in
* not in PF state.
*/
/* Stop any running T3 timers here? */
- if ((stcb->asoc.sctp_cmt_on_off == 1) &&
+ if ((stcb->asoc.sctp_cmt_on_off > 0) &&
(stcb->asoc.sctp_cmt_pf > 0)) {
net->dest_state &= ~SCTP_ADDR_PF;
SCTPDBG(SCTP_DEBUG_TIMER4, "Destination %p moved from PF to unreachable.\n",
@@ -850,7 +850,7 @@ start_again:
/*
* CMT: Do not allow FRs on retransmitted TSNs.
*/
- if (stcb->asoc.sctp_cmt_on_off == 1) {
+ if (stcb->asoc.sctp_cmt_on_off > 0) {
chk->no_fr_allowed = 1;
}
#ifdef THIS_SHOULD_NOT_BE_DONE
@@ -1005,7 +1005,7 @@ sctp_t3rxt_timer(struct sctp_inpcb *inp,
* addition, find an alternate destination with PF-based
* find_alt_net().
*/
- if ((stcb->asoc.sctp_cmt_on_off == 1) &&
+ if ((stcb->asoc.sctp_cmt_on_off > 0) &&
(stcb->asoc.sctp_cmt_pf > 0)) {
if ((net->dest_state & SCTP_ADDR_PF) != SCTP_ADDR_PF) {
net->dest_state |= SCTP_ADDR_PF;
@@ -1014,7 +1014,7 @@ sctp_t3rxt_timer(struct sctp_inpcb *inp,
net);
}
alt = sctp_find_alternate_net(stcb, net, 2);
- } else if (stcb->asoc.sctp_cmt_on_off == 1) {
+ } else if (stcb->asoc.sctp_cmt_on_off > 0) {
/*
* CMT: Using RTX_SSTHRESH policy for CMT. If CMT is being
* used, then pick dest with largest ssthresh for any
@@ -1129,7 +1129,7 @@ sctp_t3rxt_timer(struct sctp_inpcb *inp,
net->dest_state |= SCTP_ADDR_WAS_PRIMARY;
}
}
- } else if ((stcb->asoc.sctp_cmt_on_off == 1) &&
+ } else if ((stcb->asoc.sctp_cmt_on_off > 0) &&
(stcb->asoc.sctp_cmt_pf > 0) &&
((net->dest_state & SCTP_ADDR_PF) == SCTP_ADDR_PF)) {
/*
Modified: stable/8/sys/netinet/sctp_usrreq.c
==============================================================================
--- stable/8/sys/netinet/sctp_usrreq.c Fri Feb 10 07:03:45 2012 (r231351)
+++ stable/8/sys/netinet/sctp_usrreq.c Fri Feb 10 07:19:36 2012 (r231352)
@@ -292,7 +292,7 @@ sctp_notify(struct sctp_inpcb *inp,
* PF state.
*/
/* Stop any running T3 timers here? */
- if ((stcb->asoc.sctp_cmt_on_off == 1) &&
+ if ((stcb->asoc.sctp_cmt_on_off > 0) &&
(stcb->asoc.sctp_cmt_pf > 0)) {
net->dest_state &= ~SCTP_ADDR_PF;
SCTPDBG(SCTP_DEBUG_TIMER4, "Destination %p moved from PF to unreachable.\n",
@@ -2840,17 +2840,17 @@ sctp_setopt(struct socket *so, int optna
SCTP_CHECK_AND_CAST(av, optval, struct sctp_assoc_value, optsize);
SCTP_FIND_STCB(inp, stcb, av->assoc_id);
if (stcb) {
- if (av->assoc_value != 0)
- stcb->asoc.sctp_cmt_on_off = 1;
- else
- stcb->asoc.sctp_cmt_on_off = 0;
+ stcb->asoc.sctp_cmt_on_off = av->assoc_value;
+ if (stcb->asoc.sctp_cmt_on_off > 2) {
+ stcb->asoc.sctp_cmt_on_off = 2;
+ }
SCTP_TCB_UNLOCK(stcb);
} else {
SCTP_INP_WLOCK(inp);
- if (av->assoc_value != 0)
- inp->sctp_cmt_on_off = 1;
- else
- inp->sctp_cmt_on_off = 0;
+ inp->sctp_cmt_on_off = av->assoc_value;
+ if (inp->sctp_cmt_on_off > 2) {
+ inp->sctp_cmt_on_off = 2;
+ }
SCTP_INP_WUNLOCK(inp);
}
} else {
Modified: stable/8/sys/netinet6/sctp6_usrreq.c
==============================================================================
--- stable/8/sys/netinet6/sctp6_usrreq.c Fri Feb 10 07:03:45 2012 (r231351)
+++ stable/8/sys/netinet6/sctp6_usrreq.c Fri Feb 10 07:19:36 2012 (r231352)
@@ -426,7 +426,7 @@ sctp6_notify(struct sctp_inpcb *inp,
* PF state.
*/
/* Stop any running T3 timers here? */
- if ((stcb->asoc.sctp_cmt_on_off == 1) &&
+ if ((stcb->asoc.sctp_cmt_on_off > 0) &&
(stcb->asoc.sctp_cmt_pf > 0)) {
net->dest_state &= ~SCTP_ADDR_PF;
SCTPDBG(SCTP_DEBUG_TIMER4, "Destination %p moved from PF to unreachable.\n",
More information about the svn-src-all
mailing list