Changeset View
Changeset View
Standalone View
Standalone View
sys/netinet/tcp_stacks/rack.c
Context not available. | |||||
#define RACK_REXMTVAL(tp) max(rack_rto_min, ((tp)->t_srtt + ((tp)->t_rttvar << 2))) | #define RACK_REXMTVAL(tp) max(rack_rto_min, ((tp)->t_srtt + ((tp)->t_rttvar << 2))) | ||||
#define RACK_TCPT_RANGESET(tv, value, tvmin, tvmax) do { \ | #define RACK_TCPT_RANGESET(tv, value, tvmin, tvmax, slop) do { \ | ||||
(tv) = (value) + TICKS_2_USEC(tcp_rexmit_slop); \ | (tv) = (value) + slop; \ | ||||
if ((u_long)(tv) < (u_long)(tvmin)) \ | if ((u_long)(tv) < (u_long)(tvmin)) \ | ||||
(tv) = (tvmin); \ | (tv) = (tvmin); \ | ||||
if ((u_long)(tv) > (u_long)(tvmax)) \ | if ((u_long)(tv) > (u_long)(tvmax)) \ | ||||
Context not available. | |||||
/* Lets capture all the things that make up t_rtxcur */ | /* Lets capture all the things that make up t_rtxcur */ | ||||
log.u_bbr.applimited = rack_rto_min; | log.u_bbr.applimited = rack_rto_min; | ||||
log.u_bbr.epoch = rack_rto_max; | log.u_bbr.epoch = rack_rto_max; | ||||
log.u_bbr.lt_epoch = rtt; | log.u_bbr.lt_epoch = rack->r_ctl.timer_slop; | ||||
log.u_bbr.lost = rack_rto_min; | log.u_bbr.lost = rack_rto_min; | ||||
log.u_bbr.pkt_epoch = TICKS_2_USEC(tcp_rexmit_slop); | log.u_bbr.pkt_epoch = TICKS_2_USEC(tcp_rexmit_slop); | ||||
log.u_bbr.rttProp = RACK_REXMTVAL(rack->rc_tp); | log.u_bbr.rttProp = RACK_REXMTVAL(rack->rc_tp); | ||||
Context not available. | |||||
t = (tp->t_srtt + (tp->t_rttvar << 2)); | t = (tp->t_srtt + (tp->t_rttvar << 2)); | ||||
RACK_TCPT_RANGESET(tt, t * tcp_backoff[tp->t_rxtshift], | RACK_TCPT_RANGESET(tt, t * tcp_backoff[tp->t_rxtshift], | ||||
rack_persist_min, rack_persist_max); | rack_persist_min, rack_persist_max, rack->r_ctl.timer_slop); | ||||
if (tp->t_rxtshift < TCP_MAXRXTSHIFT) | if (tp->t_rxtshift < TCP_MAXRXTSHIFT) | ||||
tp->t_rxtshift++; | tp->t_rxtshift++; | ||||
rack->r_ctl.rc_hpts_flags |= PACE_TMR_PERSIT; | rack->r_ctl.rc_hpts_flags |= PACE_TMR_PERSIT; | ||||
Context not available. | |||||
rack_timer_cancel(tp, rack, cts, __LINE__); | rack_timer_cancel(tp, rack, cts, __LINE__); | ||||
tp->t_rxtshift = 0; | tp->t_rxtshift = 0; | ||||
RACK_TCPT_RANGESET(tp->t_rxtcur, RACK_REXMTVAL(tp), | RACK_TCPT_RANGESET(tp->t_rxtcur, RACK_REXMTVAL(tp), | ||||
rack_rto_min, rack_rto_max); | rack_rto_min, rack_rto_max, rack->r_ctl.timer_slop); | ||||
rack->rc_in_persist = 1; | rack->rc_in_persist = 1; | ||||
} | } | ||||
} | } | ||||
Context not available. | |||||
rack->r_ctl.rc_went_idle_time = 0; | rack->r_ctl.rc_went_idle_time = 0; | ||||
tp->t_rxtshift = 0; | tp->t_rxtshift = 0; | ||||
RACK_TCPT_RANGESET(tp->t_rxtcur, RACK_REXMTVAL(tp), | RACK_TCPT_RANGESET(tp->t_rxtcur, RACK_REXMTVAL(tp), | ||||
rack_rto_min, rack_rto_max); | rack_rto_min, rack_rto_max, rack->r_ctl.timer_slop); | ||||
rack->r_ctl.rc_agg_delayed = 0; | rack->r_ctl.rc_agg_delayed = 0; | ||||
rack->r_early = 0; | rack->r_early = 0; | ||||
rack->r_late = 0; | rack->r_late = 0; | ||||
Context not available. | |||||
rexmt = max(rack_rto_min, (tp->t_srtt + (tp->t_rttvar << 2))) * tcp_backoff[tp->t_rxtshift]; | rexmt = max(rack_rto_min, (tp->t_srtt + (tp->t_rttvar << 2))) * tcp_backoff[tp->t_rxtshift]; | ||||
RACK_TCPT_RANGESET(tp->t_rxtcur, rexmt, | RACK_TCPT_RANGESET(tp->t_rxtcur, rexmt, | ||||
max(rack_rto_min, rexmt), rack_rto_max); | max(rack_rto_min, rexmt), rack_rto_max, rack->r_ctl.timer_slop); | ||||
/* | /* | ||||
* We enter the path for PLMTUD if connection is established or, if | * We enter the path for PLMTUD if connection is established or, if | ||||
* connection is FIN_WAIT_1 status, reason for the last is that if | * connection is FIN_WAIT_1 status, reason for the last is that if | ||||
Context not available. | |||||
*/ | */ | ||||
tp->t_rxtshift = 0; | tp->t_rxtshift = 0; | ||||
RACK_TCPT_RANGESET(tp->t_rxtcur, RACK_REXMTVAL(tp), | RACK_TCPT_RANGESET(tp->t_rxtcur, RACK_REXMTVAL(tp), | ||||
max(rack_rto_min, rtt + 2), rack_rto_max); | max(rack_rto_min, rtt + 2), rack_rto_max, rack->r_ctl.timer_slop); | ||||
rack_log_rtt_sample(rack, rtt); | rack_log_rtt_sample(rack, rtt); | ||||
tp->t_softerror = 0; | tp->t_softerror = 0; | ||||
} | } | ||||
Context not available. | |||||
*/ | */ | ||||
tp->t_rxtshift = 0; | tp->t_rxtshift = 0; | ||||
RACK_TCPT_RANGESET(tp->t_rxtcur, RACK_REXMTVAL(tp), | RACK_TCPT_RANGESET(tp->t_rxtcur, RACK_REXMTVAL(tp), | ||||
rack_rto_min, rack_rto_max); | rack_rto_min, rack_rto_max, rack->r_ctl.timer_slop); | ||||
tp->t_softerror = 0; | tp->t_softerror = 0; | ||||
if (to && (to->to_flags & TOF_TS) && | if (to && (to->to_flags & TOF_TS) && | ||||
(ack_type == CUM_ACKED) && | (ack_type == CUM_ACKED) && | ||||
Context not available. | |||||
if (rack->rc_in_persist) { | if (rack->rc_in_persist) { | ||||
tp->t_rxtshift = 0; | tp->t_rxtshift = 0; | ||||
RACK_TCPT_RANGESET(tp->t_rxtcur, RACK_REXMTVAL(tp), | RACK_TCPT_RANGESET(tp->t_rxtcur, RACK_REXMTVAL(tp), | ||||
rack_rto_min, rack_rto_max); | rack_rto_min, rack_rto_max, rack->r_ctl.timer_slop); | ||||
} | } | ||||
if ((th->th_ack == tp->snd_una) && (tiwin == tp->snd_wnd)) { | if ((th->th_ack == tp->snd_una) && (tiwin == tp->snd_wnd)) { | ||||
rack_strike_dupack(rack); | rack_strike_dupack(rack); | ||||
Context not available. | |||||
/* assure we are not backed off */ | /* assure we are not backed off */ | ||||
tp->t_rxtshift = 0; | tp->t_rxtshift = 0; | ||||
RACK_TCPT_RANGESET(tp->t_rxtcur, RACK_REXMTVAL(tp), | RACK_TCPT_RANGESET(tp->t_rxtcur, RACK_REXMTVAL(tp), | ||||
rack_rto_min, rack_rto_max); | rack_rto_min, rack_rto_max, rack->r_ctl.timer_slop); | ||||
rack->rc_tlp_in_progress = 0; | rack->rc_tlp_in_progress = 0; | ||||
rack->r_ctl.rc_tlp_cnt_out = 0; | rack->r_ctl.rc_tlp_cnt_out = 0; | ||||
/* | /* | ||||
Context not available. | |||||
m_freem(mfree); | m_freem(mfree); | ||||
tp->t_rxtshift = 0; | tp->t_rxtshift = 0; | ||||
RACK_TCPT_RANGESET(tp->t_rxtcur, RACK_REXMTVAL(tp), | RACK_TCPT_RANGESET(tp->t_rxtcur, RACK_REXMTVAL(tp), | ||||
rack_rto_min, rack_rto_max); | rack_rto_min, rack_rto_max, rack->r_ctl.timer_slop); | ||||
rack->rc_tlp_in_progress = 0; | rack->rc_tlp_in_progress = 0; | ||||
rack->r_ctl.rc_tlp_cnt_out = 0; | rack->r_ctl.rc_tlp_cnt_out = 0; | ||||
/* | /* | ||||
Context not available. | |||||
rack->r_ctl.rc_lowest_us_rtt = 0xffffffff; | rack->r_ctl.rc_lowest_us_rtt = 0xffffffff; | ||||
rack->r_ctl.rc_highest_us_rtt = 0; | rack->r_ctl.rc_highest_us_rtt = 0; | ||||
rack->r_ctl.bw_rate_cap = rack_bw_rate_cap; | rack->r_ctl.bw_rate_cap = rack_bw_rate_cap; | ||||
rack->r_ctl.timer_slop = TICKS_2_USEC(tcp_rexmit_slop); | |||||
if (rack_use_cmp_acks) | if (rack_use_cmp_acks) | ||||
rack->r_use_cmp_ack = 1; | rack->r_use_cmp_ack = 1; | ||||
if (rack_disable_prr) | if (rack_disable_prr) | ||||
Context not available. | |||||
/* Clear out shifts and such */ | /* Clear out shifts and such */ | ||||
tp->t_rxtshift = 0; | tp->t_rxtshift = 0; | ||||
RACK_TCPT_RANGESET(tp->t_rxtcur, RACK_REXMTVAL(tp), | RACK_TCPT_RANGESET(tp->t_rxtcur, RACK_REXMTVAL(tp), | ||||
rack_rto_min, rack_rto_max); | rack_rto_min, rack_rto_max, rack->r_ctl.timer_slop); | ||||
rack->rc_tlp_in_progress = 0; | rack->rc_tlp_in_progress = 0; | ||||
rack->r_ctl.rc_tlp_cnt_out = 0; | rack->r_ctl.rc_tlp_cnt_out = 0; | ||||
/* Send recover and snd_nxt must be dragged along */ | /* Send recover and snd_nxt must be dragged along */ | ||||
Context not available. | |||||
rack->r_ctl.rc_saved_beta.beta = optval; | rack->r_ctl.rc_saved_beta.beta = optval; | ||||
} | } | ||||
break; | break; | ||||
case TCP_RACK_TIMER_SLOP: | |||||
RACK_OPTS_INC(tcp_rack_timer_slop); | |||||
rack->r_ctl.timer_slop = optval; | |||||
if (rack->rc_tp->t_srtt) { | |||||
/* | |||||
* If we have an SRTT lets update t_rxtcur | |||||
* to have the new slop. | |||||
*/ | |||||
RACK_TCPT_RANGESET(tp->t_rxtcur, RACK_REXMTVAL(tp), | |||||
rack_rto_min, rack_rto_max, | |||||
rack->r_ctl.timer_slop); | |||||
} | |||||
break; | |||||
case TCP_RACK_PACING_BETA_ECN: | case TCP_RACK_PACING_BETA_ECN: | ||||
RACK_OPTS_INC(tcp_rack_beta_ecn); | RACK_OPTS_INC(tcp_rack_beta_ecn); | ||||
if (strcmp(tp->cc_algo->name, CCALGONAME_NEWRENO) != 0) { | if (strcmp(tp->cc_algo->name, CCALGONAME_NEWRENO) != 0) { | ||||
Context not available. | |||||
case TCP_DEFER_OPTIONS: /* URL:defer */ | case TCP_DEFER_OPTIONS: /* URL:defer */ | ||||
case TCP_RACK_PACING_BETA: /* URL:pacing_beta */ | case TCP_RACK_PACING_BETA: /* URL:pacing_beta */ | ||||
case TCP_RACK_PACING_BETA_ECN: /* URL:pacing_beta_ecn */ | case TCP_RACK_PACING_BETA_ECN: /* URL:pacing_beta_ecn */ | ||||
case TCP_RACK_TIMER_SLOP: /* URL:timer_slop */ | |||||
break; | break; | ||||
default: | default: | ||||
/* Filter off all unknown options to the base stack */ | /* Filter off all unknown options to the base stack */ | ||||
Context not available. | |||||
case TCP_SHARED_CWND_TIME_LIMIT: | case TCP_SHARED_CWND_TIME_LIMIT: | ||||
optval = rack->r_limit_scw; | optval = rack->r_limit_scw; | ||||
break; | break; | ||||
case TCP_RACK_TIMER_SLOP: | |||||
optval = rack->r_ctl.timer_slop; | |||||
break; | |||||
default: | default: | ||||
return (tcp_default_ctloutput(so, sopt, inp, tp)); | return (tcp_default_ctloutput(so, sopt, inp, tp)); | ||||
break; | break; | ||||
Context not available. |