/* Drop a connection in the retransmit timer
* 1. If we have retransmitted more than TCP_MAXRXTSHIFT times
* 2. If the time spent in this retransmission episode is more than
/* Drop a connection in the retransmit timer
* 1. If we have retransmitted more than TCP_MAXRXTSHIFT times
* 2. If the time spent in this retransmission episode is more than
tp = tcp_drop(tp, tp->t_softerror ?
tp->t_softerror : ETIMEDOUT);
tp = tcp_drop(tp, tp->t_softerror ?
tp->t_softerror : ETIMEDOUT);
/*
* Check for potential Path MTU Discovery Black Hole
*/
if (tcp_pmtud_black_hole_detect && (tp->t_state == TCPS_ESTABLISHED)) {
/*
* Check for potential Path MTU Discovery Black Hole
*/
if (tcp_pmtud_black_hole_detect && (tp->t_state == TCPS_ESTABLISHED)) {
if ((tp->t_state == TCPS_SYN_SENT) &&
(tp->t_rxtshift == tcp_broken_peer_syn_rxmit_thres))
tp->t_flags &= ~(TF_REQ_SCALE|TF_REQ_TSTMP|TF_REQ_CC);
if ((tp->t_state == TCPS_SYN_SENT) &&
(tp->t_rxtshift == tcp_broken_peer_syn_rxmit_thres))
tp->t_flags &= ~(TF_REQ_SCALE|TF_REQ_TSTMP|TF_REQ_CC);
/*
* If losing, let the lower level know and try for
* a better route. Also, if we backed off this far,
/*
* If losing, let the lower level know and try for
* a better route. Also, if we backed off this far,
+ /* CWR notifications are to be sent on new data right after
+ * RTOs, Fast Retransmits and ECE notification receipts.
+ */
+ if ((tp->ecn_flags & TE_ECN_ON) == TE_ECN_ON) {
+ tp->ecn_flags |= TE_SENDCWR;
+ }
+fc_output:
DTRACE_TCP5(cc, void, NULL, struct inpcb *, tp->t_inpcb,
struct tcpcb *, tp, struct tcphdr *, NULL,
int32_t, TCP_CC_REXMT_TIMEOUT);
DTRACE_TCP5(cc, void, NULL, struct inpcb *, tp->t_inpcb,
struct tcpcb *, tp, struct tcphdr *, NULL,
int32_t, TCP_CC_REXMT_TIMEOUT);
if ((tp->t_rxtshift == TCP_MAXRXTSHIFT &&
(idle_time >= tcp_maxpersistidle ||
idle_time >= TCP_REXMTVAL(tp) * tcp_totbackoff)) ||
if ((tp->t_rxtshift == TCP_MAXRXTSHIFT &&
(idle_time >= tcp_maxpersistidle ||
idle_time >= TCP_REXMTVAL(tp) * tcp_totbackoff)) ||
unsigned int ifscope, nocell = 0;
if (tp->t_inpcb->inp_flags & INP_BOUND_IF)
unsigned int ifscope, nocell = 0;
if (tp->t_inpcb->inp_flags & INP_BOUND_IF)
+ /* If we are measuring inter packet arrival jitter for
+ * throttling a connection, this delayed ack might be
+ * the reason for accumulating some jitter. So let's
+ * restart the measurement.
+ */
+ CLEAR_IAJ_STATE(tp);
+