rtt-qcn implementation
This commit is contained in:
parent
f76561ba1c
commit
9e641a5716
|
@ -266,8 +266,27 @@ RdmaHw::GetTypeId(void)
|
|||
"Swift's target endpoint delay (ns)",
|
||||
UintegerValue(1000000),
|
||||
MakeUintegerAccessor(&RdmaHw::swift_target_endpoint_delay),
|
||||
MakeUintegerChecker<uint64_t>());
|
||||
|
||||
MakeUintegerChecker<uint64_t>())
|
||||
.AddAttribute("RttQcnTmin",
|
||||
"RTT-QCN's max RTT value to generate no ECN",
|
||||
UintegerValue(3000),
|
||||
MakeUintegerAccessor(&RdmaHw::rtt_qcn_tmin),
|
||||
MakeUintegerChecker<uint32_t>())
|
||||
.AddAttribute("RttQcnTmax",
|
||||
"RTT-QCN's min RTT value to generate full ECN",
|
||||
UintegerValue(5000),
|
||||
MakeUintegerAccessor(&RdmaHw::rtt_qcn_tmax),
|
||||
MakeUintegerChecker<uint32_t>())
|
||||
.AddAttribute("RttQcnAlpha",
|
||||
"Additive increase when cwnd < mss",
|
||||
DoubleValue(0.5),
|
||||
MakeDoubleAccessor(&RdmaHw::rtt_qcn_alpha),
|
||||
MakeDoubleChecker<double>())
|
||||
.AddAttribute("RttQcnBeta",
|
||||
"Multiplicative decrease when cwnd < mss",
|
||||
DoubleValue(0.25),
|
||||
MakeDoubleAccessor(&RdmaHw::rtt_qcn_beta),
|
||||
MakeDoubleChecker<double>());
|
||||
return tid;
|
||||
}
|
||||
|
||||
|
@ -668,6 +687,9 @@ RdmaHw::ReceiveAck(Ptr<Packet> p, CustomHeader& ch)
|
|||
case CC_MODE::SWIFT:
|
||||
HandleAckSwift(qp, p, ch);
|
||||
break;
|
||||
case CC_MODE::RTT_QCN:
|
||||
HandleAckRttQcn(qp, p, ch);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -2022,7 +2044,7 @@ RdmaHw::UpdateRateHpPint(Ptr<RdmaQueuePair> qp, Ptr<Packet> p, CustomHeader& ch,
|
|||
********************/
|
||||
|
||||
void
|
||||
RdmaHw::HandleAckSwift(Ptr<RdmaQueuePair> qp, Ptr<Packet> p, CustomHeader& ch)
|
||||
RdmaHw::HandleAckSwift(Ptr<RdmaQueuePair> qp, Ptr<Packet> p, CustomHeader& ch) const
|
||||
{
|
||||
auto ih = ch.ack.ih.swift;
|
||||
// std::cout << "[SWIFT] Hops: " << ih.nhop << ", Remote Delay: " << ih.remote_delay <<
|
||||
|
@ -2090,11 +2112,11 @@ RdmaHw::GetCwndSwift(Ptr<RdmaQueuePair> qp,
|
|||
{
|
||||
// num_acked is actually the number of packets IN EVERY ACK
|
||||
// so that we can assure incrementing approx. swift_ai per RTT
|
||||
cwnd = cwnd + (double)swift_ai * (1000.0 / cwnd);
|
||||
cwnd = cwnd + (double)swift_ai * (m_mtu / cwnd);
|
||||
}
|
||||
else
|
||||
{
|
||||
cwnd = cwnd + swift_ai * 1000;
|
||||
cwnd = cwnd + swift_ai * m_mtu;
|
||||
}
|
||||
}
|
||||
else if (canDecrease)
|
||||
|
@ -2106,4 +2128,57 @@ RdmaHw::GetCwndSwift(Ptr<RdmaQueuePair> qp,
|
|||
return cwnd;
|
||||
}
|
||||
|
||||
void
|
||||
RdmaHw::HandleAckRttQcn(Ptr<RdmaQueuePair> qp, Ptr<Packet> p, CustomHeader& ch) const
|
||||
{
|
||||
auto rtt = Simulator::Now().GetTimeStep() - ch.ack.ih.GetTs();
|
||||
auto ecn = false;
|
||||
if (rtt <= rtt_qcn_tmin)
|
||||
{
|
||||
ecn = false;
|
||||
}
|
||||
else if (rtt <= rtt_qcn_tmax)
|
||||
{
|
||||
auto thresh = (rtt - rtt_qcn_tmin) * 1000.0 / (rtt_qcn_tmax - rtt_qcn_tmin);
|
||||
auto rand_num = rand() % 1000;
|
||||
if (rand_num <= thresh)
|
||||
{
|
||||
ecn = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ecn = true;
|
||||
}
|
||||
|
||||
// window in mtu (1000), not in bytes / seq#
|
||||
auto cwnd = qp->m_win;
|
||||
if (cwnd < m_mtu)
|
||||
{
|
||||
if (ecn)
|
||||
{
|
||||
cwnd += rtt_qcn_alpha * m_mtu;
|
||||
}
|
||||
else
|
||||
{
|
||||
cwnd *= 1 - rtt_qcn_beta;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (ecn)
|
||||
{
|
||||
cwnd += m_mtu * 1.0 / cwnd;
|
||||
}
|
||||
else
|
||||
{
|
||||
cwnd -= 0.5 * m_mtu;
|
||||
}
|
||||
}
|
||||
std::cout << "[RTT-QCN] node: " << m_node->GetId() << ", cwnd: " << qp->m_win << "->" << cwnd
|
||||
<< ", RTT: " << rtt << ", ecn: " << ecn << std::endl;
|
||||
|
||||
qp->m_win = cwnd;
|
||||
}
|
||||
|
||||
} // namespace ns3
|
||||
|
|
|
@ -217,7 +217,7 @@ class RdmaHw : public Object
|
|||
double swift_max_cwnd; // max cwnd Swift can exceed (not fs)
|
||||
double swift_target_endpoint_delay; // target endpoint delay
|
||||
|
||||
void HandleAckSwift(Ptr<RdmaQueuePair> qp, Ptr<Packet> p, CustomHeader& ch);
|
||||
void HandleAckSwift(Ptr<RdmaQueuePair> qp, Ptr<Packet> p, CustomHeader& ch) const;
|
||||
void UpdateRateSwift(Ptr<RdmaQueuePair> qp, Ptr<Packet> p, CustomHeader& ch, bool fast_react);
|
||||
void FastReactSwift(Ptr<RdmaQueuePair> qp, Ptr<Packet> p, CustomHeader& ch);
|
||||
uint64_t TargetFabDelaySwift(Ptr<RdmaQueuePair> qp, Ptr<Packet> p, CustomHeader& ch) const;
|
||||
|
@ -226,6 +226,15 @@ class RdmaHw : public Object
|
|||
CustomHeader& ch,
|
||||
uint64_t target_delay,
|
||||
uint64_t curr_delay) const;
|
||||
|
||||
/*********************
|
||||
* RTT-QCN
|
||||
********************/
|
||||
uint64_t rtt_qcn_tmin; // max rtt value to generate no ecn
|
||||
uint64_t rtt_qcn_tmax; // min rtt value to always generate ecn
|
||||
double rtt_qcn_alpha; // additive increase when cwnd < 1; use original value, don't multiply by mtu
|
||||
double rtt_qcn_beta; // multiplicative decrease when cwnd > 1; use original value, don't multiply by mtu
|
||||
void HandleAckRttQcn(Ptr<RdmaQueuePair> qp, Ptr<Packet> p, CustomHeader& ch) const;
|
||||
};
|
||||
|
||||
enum CC_MODE
|
||||
|
@ -238,7 +247,8 @@ enum CC_MODE
|
|||
DCTCP = 8,
|
||||
HPCC_PINT = 10,
|
||||
PATCHED_TIMELY = 11,
|
||||
SWIFT = 12
|
||||
SWIFT = 12,
|
||||
RTT_QCN = 13
|
||||
};
|
||||
|
||||
} /* namespace ns3 */
|
||||
|
|
|
@ -29,7 +29,7 @@ class RdmaQueuePair : public Object
|
|||
uint64_t snd_nxt, snd_una; // next seq to send, the highest unacked seq
|
||||
uint16_t m_pg;
|
||||
uint16_t m_ipid;
|
||||
uint32_t m_win; // bound of on-the-fly packets
|
||||
uint32_t m_win; // bound of on-the-fly packets (bytes?)
|
||||
uint64_t m_baseRtt; // base RTT of this qp
|
||||
DataRate m_max_rate; // max rate
|
||||
bool m_var_win; // variable window size
|
||||
|
|
Loading…
Reference in New Issue