in simulation/src/point-to-point/model/rdma-hw.cc [1124:1183]
void RdmaHw::UpdateRateTimely(Ptr<RdmaQueuePair> qp, Ptr<Packet> p, CustomHeader &ch, bool us){
uint64_t next_seq = qp->snd_nxt;
uint64_t rtt = Simulator::Now().GetTimeStep() - ch.ack.ih.ts;
bool print = !us;
if (qp->tmly.m_lastUpdateSeq != 0){ // not first RTT
int64_t new_rtt_diff = (int64_t)rtt - (int64_t)qp->tmly.lastRtt;
double rtt_diff = (1 - m_tmly_alpha) * qp->tmly.rttDiff + m_tmly_alpha * new_rtt_diff;
double gradient = rtt_diff / m_tmly_minRtt;
bool inc = false;
double c = 0;
#if PRINT_LOG
if (print)
printf("%lu node:%u rtt:%lu rttDiff:%.0lf gradient:%.3lf rate:%.3lf", Simulator::Now().GetTimeStep(), m_node->GetId(), rtt, rtt_diff, gradient, qp->tmly.m_curRate.GetBitRate() * 1e-9);
#endif
if (rtt < m_tmly_TLow){
inc = true;
}else if (rtt > m_tmly_THigh){
c = 1 - m_tmly_beta * (1 - (double)m_tmly_THigh / rtt);
inc = false;
}else if (gradient <= 0){
inc = true;
}else{
c = 1 - m_tmly_beta * gradient;
if (c < 0)
c = 0;
inc = false;
}
if (inc){
if (qp->tmly.m_incStage < 5){
qp->m_rate = qp->tmly.m_curRate + m_rai;
}else{
qp->m_rate = qp->tmly.m_curRate + m_rhai;
}
if (qp->m_rate > qp->m_max_rate)
qp->m_rate = qp->m_max_rate;
if (!us){
qp->tmly.m_curRate = qp->m_rate;
qp->tmly.m_incStage++;
qp->tmly.rttDiff = rtt_diff;
}
}else{
qp->m_rate = std::max(m_minRate, qp->tmly.m_curRate * c);
if (!us){
qp->tmly.m_curRate = qp->m_rate;
qp->tmly.m_incStage = 0;
qp->tmly.rttDiff = rtt_diff;
}
}
#if PRINT_LOG
if (print){
printf(" %c %.3lf\n", inc? '^':'v', qp->m_rate.GetBitRate() * 1e-9);
}
#endif
}
if (!us && next_seq > qp->tmly.m_lastUpdateSeq){
qp->tmly.m_lastUpdateSeq = next_seq;
// update
qp->tmly.lastRtt = rtt;
}
}