if (!tp->reord_seen) { /* If reordering has not been observed, be aggressive during *therecoveryorstartingtherecoverybyDUPACKthreshold.
*/ if (inet_csk(sk)->icsk_ca_state >= TCP_CA_Recovery) return0;
if (tp->sacked_out >= tp->reordering &&
!(READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_recovery) &
TCP_RACK_NO_DUPTHRESH)) return0;
}
/* To be more reordering resilient, allow min_rtt/4 settling delay. *Usemin_rttinsteadofthesmoothedRTTbecausereorderingis *oftenapathpropertyandlessrelatedtoqueuingordelayedACKs. *UponreceivingDSACKs,linearlyincreasethewindowuptothe *smoothedRTT.
*/ return min((tcp_min_rtt(tp) >> 2) * tp->rack.reo_wnd_steps,
tp->srtt_us >> 3);
}
/* Skip ones marked lost but not yet retransmitted */ if ((scb->sacked & TCPCB_LOST) &&
!(scb->sacked & TCPCB_SACKED_RETRANS)) continue;
if (!tcp_skb_sent_after(tp->rack.mstamp,
tcp_skb_timestamp_us(skb),
tp->rack.end_seq, scb->end_seq)) break;
/* A packet is lost if it has not been s/acked beyond *therecentRTTplusthereorderingwindow.
*/
remaining = tcp_rack_skb_timeout(tp, skb, reo_wnd); if (remaining <= 0) {
tcp_mark_skb_lost(sk, skb);
list_del_init(&skb->tcp_tsorted_anchor);
} else { /* Record maximum wait time */
*reo_timeout = max_t(u32, *reo_timeout, remaining);
}
}
}
/* Reset the advanced flag to avoid unnecessary queue scanning */
tp->rack.advanced = 0;
tcp_rack_detect_loss(sk, &timeout); if (timeout) {
timeout = usecs_to_jiffies(timeout + TCP_TIMEOUT_MIN_US);
inet_csk_reset_xmit_timer(sk, ICSK_TIME_REO_TIMEOUT,
timeout, inet_csk(sk)->icsk_rto);
} return !!timeout;
}
/* Record the most recently (re)sent time among the (s)acked packets *Thisis"Step3:AdvanceRACK.xmit_timeandupdateRACK.RTT"from *draft-cheng-tcpm-rack-00.txt
*/ void tcp_rack_advance(struct tcp_sock *tp, u8 sacked, u32 end_seq,
u64 xmit_time)
{
u32 rtt_us;
/* We have waited long enough to accommodate reordering. Mark the expired *packetslostandretransmitthem.
*/ void tcp_rack_reo_timeout(struct sock *sk)
{ struct tcp_sock *tp = tcp_sk(sk);
u32 timeout, prior_inflight;
u32 lost = tp->lost;
prior_inflight = tcp_packets_in_flight(tp);
tcp_rack_detect_loss(sk, &timeout); if (prior_inflight != tcp_packets_in_flight(tp)) { if (inet_csk(sk)->icsk_ca_state != TCP_CA_Recovery) {
tcp_enter_recovery(sk, false); if (!inet_csk(sk)->icsk_ca_ops->cong_control)
tcp_cwnd_reduction(sk, 1, tp->lost - lost, 0);
}
tcp_xmit_retransmit_queue(sk);
} if (inet_csk(sk)->icsk_pending != ICSK_TIME_RETRANS)
tcp_rearm_rto(sk);
}
/* Updates the RACK's reo_wnd based on DSACK and no. of recoveries. * *IfaDSACKisreceivedthatseemslikeitmayhavebeenduetoreordering *triggeringfastrecovery,incrementreo_wndbymin_rtt/4(upperbounded *bysrtt),sincethereispossibilitythatspuriousretransmissionwas *duetoreorderingdelaylongerthanreo_wnd. * *Persistthecurrentreo_wndvalueforTCP_RACK_RECOVERY_THRESH(16) *no.ofsuccessfulrecoveries(accountsforfullDSACK-basedloss *recoveryundo).Afterthat,resetittodefault(min_rtt/4). * *Atmax,reo_wndisincrementedonlyonceperrtt.Sothatthenew *DSACKonwhichwearereacting,isduetothespuriousretx(approx) *afterthereo_wndhasbeenupdatedlasttime. * *reo_wndistrackedintermsofsteps(ofmin_rtt/4),ratherthan *absolutevaluetoaccountforchangeinrtt.
*/ void tcp_rack_update_reo_wnd(struct sock *sk, struct rate_sample *rs)
{ struct tcp_sock *tp = tcp_sk(sk);
if ((READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_recovery) &
TCP_RACK_STATIC_REO_WND) ||
!rs->prior_delivered) return;
/* Disregard DSACK if a rtt has not passed since we adjusted reo_wnd */ if (before(rs->prior_delivered, tp->rack.last_delivered))
tp->rack.dsack_seen = 0;
/* Adjust the reo_wnd if update is pending */ if (tp->rack.dsack_seen) {
tp->rack.reo_wnd_steps = min_t(u32, 0xFF,
tp->rack.reo_wnd_steps + 1);
tp->rack.dsack_seen = 0;
tp->rack.last_delivered = tp->delivered;
tp->rack.reo_wnd_persist = TCP_RACK_RECOVERY_THRESH;
} elseif (!tp->rack.reo_wnd_persist) {
tp->rack.reo_wnd_steps = 1;
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.