Compare commits

...

4 Commits

Author SHA1 Message Date
cyp0633 d169825d31
update evaluation scripts 2024-04-08 22:18:18 +08:00
cyp0633 a548d5d88a
fix rtt-qcn logic error 2024-04-08 22:08:32 +08:00
cyp0633 de9a22c612
some rtt-qcn evaluation stuff 2024-04-08 20:55:59 +08:00
cyp0633 9e641a5716
rtt-qcn implementation 2024-04-08 20:55:43 +08:00
18 changed files with 223 additions and 34 deletions

View File

@ -53,6 +53,11 @@ SWIFT_MIN_CWND 0.001
SWIFT_MAX_CWND 20000
SWIFT_TARGET_ENDPOINT_DELAY 1000000
RTT_QCN_T_MIN 5000
RTT_QCN_T_MAX 7000
RTT_QCN_ALPHA 0.5
RTT_QCN_BETA 0.25
ACK_HIGH_PRIO 0
LINK_DOWN 0 0 0

View File

@ -53,6 +53,11 @@ SWIFT_MIN_CWND 0.001
SWIFT_MAX_CWND 20000
SWIFT_TARGET_ENDPOINT_DELAY 1000000
RTT_QCN_T_MIN 5000
RTT_QCN_T_MAX 7000
RTT_QCN_ALPHA 0.5
RTT_QCN_BETA 0.25
ACK_HIGH_PRIO 0
LINK_DOWN 0 0 0

View File

@ -53,6 +53,11 @@ SWIFT_MIN_CWND 0.001
SWIFT_MAX_CWND 800000
SWIFT_TARGET_ENDPOINT_DELAY 1000000
RTT_QCN_T_MIN 5000
RTT_QCN_T_MAX 7000
RTT_QCN_ALPHA 0.5
RTT_QCN_BETA 0.25
ACK_HIGH_PRIO 0
LINK_DOWN 0 0 0

View File

@ -23,8 +23,8 @@ plt.rcParams.update({'font.size': 18})
algs=list(["dcqcn", "powerInt", "hpcc", "powerDelay", "timely", "dctcp","patchedTimely","swift"])
algnames={"dcqcn":"DCQCN","powerInt":"PowerTCP","hpcc":"HPCC","powerDelay":r'$\theta-PowerTCP$',"timely":"TIMELY","DCTCP":"DCTCP","patchedTimely":"Patched TIMELY","swift":"Swift"}
algs=list(["dcqcn", "powerInt", "hpcc", "powerDelay", "timely", "dctcp","patchedTimely","swift","rttqcn"])
algnames={"dcqcn":"DCQCN","powerInt":"PowerTCP","hpcc":"HPCC","powerDelay":r'$\theta-PowerTCP$',"timely":"TIMELY","DCTCP":"DCTCP","patchedTimely":"Patched TIMELY","swift":"Swift","rttqcn":"RTT-QCN"}
#%%

View File

@ -23,8 +23,8 @@ plt.rcParams.update({'font.size': 18})
algs=list(["dcqcn", "powerInt", "hpcc", "powerDelay", "timely", "dctcp","patchedTimely","swift"])
algnames={"dcqcn":"DCQCN","powerInt":"PowerTCP","hpcc":"HPCC","powerDelay":r'$\theta-PowerTCP$',"timely":"TIMELY","DCTCP":"DCTCP","patchedTimely":"Patched TIMELY","swift":"Swift"}
algs=list(["dcqcn", "powerInt", "hpcc", "powerDelay", "timely", "dctcp","patchedTimely","swift","rttqcn"])
algnames={"dcqcn":"DCQCN","powerInt":"PowerTCP","hpcc":"HPCC","powerDelay":r'$\theta-PowerTCP$',"timely":"TIMELY","DCTCP":"DCTCP","patchedTimely":"Patched TIMELY","swift":"Swift","rttqcn":"RTT-QCN"}
######## FAIRNESS #############

View File

@ -23,8 +23,8 @@ plt.rcParams.update({'font.size': 18})
algs=list(["dcqcn", "powerInt", "hpcc", "powerDelay", "timely", "dctcp","patchedTimely","swift"])
algnames={"dcqcn":"DCQCN","powerInt":"PowerTCP","hpcc":"HPCC","powerDelay":r'$\theta-PowerTCP$',"timely":"TIMELY","DCTCP":"DCTCP","patchedTimely":"Patched TIMELY","swift":"Swift"}
algs=list(["dcqcn", "powerInt", "hpcc", "powerDelay", "timely", "dctcp","patchedTimely","swift","rttqcn"])
algnames={"dcqcn":"DCQCN","powerInt":"PowerTCP","hpcc":"HPCC","powerDelay":r'$\theta-PowerTCP$',"timely":"TIMELY","DCTCP":"DCTCP","patchedTimely":"Patched TIMELY","swift":"Swift","rttqcn":"RTT-QCN"}
#%%

View File

@ -14,6 +14,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <cstdint>
#undef PGO_TRAINING
#define PATH_TO_PGO_CONFIG "path_to_pgo_config"
@ -84,6 +85,11 @@ double SwiftMinCwnd = 0.001;
double SwiftMaxCwnd = 800000;
double SwiftTargetEndpointDelay = 1000000;
uint32_t RttQcnTmin = 3000;
uint32_t RttQcnTmax = 5000;
double RttQcnAlpha = 0.5;
double RttQcnBeta = 0.25;
uint32_t ack_high_prio = 0;
uint64_t link_down_time = 0;
uint32_t link_down_A = 0, link_down_B = 0;
@ -1012,6 +1018,26 @@ main(int argc, char* argv[])
conf >> SwiftTargetEndpointDelay;
std::cout << "SWIFT_TARGET_ENDPOINT_DELAY\t\t\t\t" << SwiftTargetEndpointDelay << '\n';
}
else if (key == "RTT_QCN_T_MIN")
{
conf >> RttQcnTmin;
std::cout << "RTT_QCN_T_MIN\t\t\t\t" << RttQcnTmin << '\n';
}
else if (key == "RTT_QCN_T_MAX")
{
conf >> RttQcnTmax;
std::cout << "RTT_QCN_T_MAX\t\t\t\t" << RttQcnTmax << '\n';
}
else if (key == "RTT_QCN_ALPHA")
{
conf >> RttQcnAlpha;
std::cout << "RTT_QCN_ALPHA\t\t\t\t" << RttQcnAlpha << '\n';
}
else if (key == "RTT_QCN_BETA")
{
conf >> RttQcnBeta;
std::cout << "RTT_QCN_BETA\t\t\t\t" << RttQcnBeta << '\n';
}
fflush(stdout);
}
conf.close();
@ -1031,6 +1057,7 @@ main(int argc, char* argv[])
{
case CC_MODE::TIMELY:
case CC_MODE::PATCHED_TIMELY:
case CC_MODE::RTT_QCN:
// timely or patched timely, use ts
IntHeader::mode = IntHeader::TS;
break;
@ -1364,6 +1391,10 @@ main(int argc, char* argv[])
rdmaHw->SetAttribute("SwiftMaxCwnd", DoubleValue(SwiftMaxCwnd));
rdmaHw->SetAttribute("SwiftTargetEndpointDelay",
UintegerValue(SwiftTargetEndpointDelay));
rdmaHw->SetAttribute("RttQcnTmin", UintegerValue(RttQcnTmin));
rdmaHw->SetAttribute("RttQcnTmax", UintegerValue(RttQcnTmax));
rdmaHw->SetAttribute("RttQcnAlpha", DoubleValue(RttQcnAlpha));
rdmaHw->SetAttribute("RttQcnBeta", DoubleValue(RttQcnBeta));
rdmaHw->SetPintSmplThresh(pint_prob);
// create and install RdmaDriver
Ptr<RdmaDriver> rdma = CreateObject<RdmaDriver>();

View File

@ -83,6 +83,12 @@ double SwiftMinCwnd = 0.001;
double SwiftMaxCwnd = 800000;
double SwiftTargetEndpointDelay = 1000000;
// RTT-QCN parameters
uint32_t RttQcnTmin = 3000;
uint32_t RttQcnTmax = 5000;
double RttQcnAlpha = 0.5;
double RttQcnBeta = 0.25;
uint32_t ack_high_prio = 0;
uint64_t link_down_time = 0;
uint32_t link_down_A = 0, link_down_B = 0;
@ -997,6 +1003,26 @@ main(int argc, char* argv[])
conf >> SwiftTargetEndpointDelay;
std::cout << "SWIFT_TARGET_ENDPOINT_DELAY\t\t\t\t" << SwiftTargetEndpointDelay << '\n';
}
else if (key == "RTT_QCN_T_MIN")
{
conf >> RttQcnTmin;
std::cout << "RTT_QCN_T_MIN\t\t\t\t" << RttQcnTmin << '\n';
}
else if (key == "RTT_QCN_T_MAX")
{
conf >> RttQcnTmax;
std::cout << "RTT_QCN_T_MAX\t\t\t\t" << RttQcnTmax << '\n';
}
else if (key == "RTT_QCN_ALPHA")
{
conf >> RttQcnAlpha;
std::cout << "RTT_QCN_ALPHA\t\t\t\t" << RttQcnAlpha << '\n';
}
else if (key == "RTT_QCN_BETA")
{
conf >> RttQcnBeta;
std::cout << "RTT_QCN_BETA\t\t\t\t" << RttQcnBeta << '\n';
}
fflush(stdout);
}
conf.close();
@ -1015,6 +1041,7 @@ main(int argc, char* argv[])
{
case CC_MODE::TIMELY:
case CC_MODE::PATCHED_TIMELY:
case CC_MODE::RTT_QCN:
// timely or patched timely, use ts
IntHeader::mode = IntHeader::TS;
break;
@ -1344,7 +1371,10 @@ main(int argc, char* argv[])
rdmaHw->SetAttribute("SwiftMaxCwnd", DoubleValue(SwiftMaxCwnd));
rdmaHw->SetAttribute("SwiftTargetEndpointDelay",
UintegerValue(SwiftTargetEndpointDelay));
rdmaHw->SetAttribute("RttQcnTmin", UintegerValue(RttQcnTmin));
rdmaHw->SetAttribute("RttQcnTmax", UintegerValue(RttQcnTmax));
rdmaHw->SetAttribute("RttQcnAlpha", DoubleValue(RttQcnAlpha));
rdmaHw->SetAttribute("RttQcnBeta", DoubleValue(RttQcnBeta));
rdmaHw->SetPintSmplThresh(pint_prob);
// create and install RdmaDriver
Ptr<RdmaDriver> rdma = CreateObject<RdmaDriver>();

View File

@ -85,6 +85,12 @@ double u_target = 0.95;
uint32_t int_multi = 1;
bool rate_bound = true;
// RTT-QCN variables
uint32_t RttQcnTmin = 3000;
uint32_t RttQcnTmax = 5000;
double RttQcnAlpha = 0.5;
double RttQcnBeta = 0.25;
uint32_t ack_high_prio = 0;
uint64_t link_down_time = 0;
uint32_t link_down_A = 0, link_down_B = 0;
@ -1257,6 +1263,26 @@ main(int argc, char* argv[])
conf >> SwiftTargetEndpointDelay;
std::cout << "SWIFT_TARGET_ENDPOINT_DELAY\t\t\t\t" << SwiftTargetEndpointDelay << '\n';
}
else if (key == "RTT_QCN_T_MIN")
{
conf >> RttQcnTmin;
std::cout << "RTT_QCN_T_MIN\t\t\t\t" << RttQcnTmin << '\n';
}
else if (key == "RTT_QCN_T_MAX")
{
conf >> RttQcnTmax;
std::cout << "RTT_QCN_T_MAX\t\t\t\t" << RttQcnTmax << '\n';
}
else if (key == "RTT_QCN_ALPHA")
{
conf >> RttQcnAlpha;
std::cout << "RTT_QCN_ALPHA\t\t\t\t" << RttQcnAlpha << '\n';
}
else if (key == "RTT_QCN_BETA")
{
conf >> RttQcnBeta;
std::cout << "RTT_QCN_BETA\t\t\t\t" << RttQcnBeta << '\n';
}
fflush(stdout);
}
conf.close();
@ -1276,6 +1302,7 @@ main(int argc, char* argv[])
{
case CC_MODE::TIMELY:
case CC_MODE::PATCHED_TIMELY:
case CC_MODE::RTT_QCN:
// timely or patched timely, use ts
IntHeader::mode = IntHeader::TS;
break;
@ -1606,6 +1633,10 @@ main(int argc, char* argv[])
rdmaHw->SetAttribute("SwiftMaxCwnd", DoubleValue(SwiftMaxCwnd));
rdmaHw->SetAttribute("SwiftTargetEndpointDelay",
UintegerValue(SwiftTargetEndpointDelay));
rdmaHw->SetAttribute("RttQcnTmin", UintegerValue(RttQcnTmin));
rdmaHw->SetAttribute("RttQcnTmax", UintegerValue(RttQcnTmax));
rdmaHw->SetAttribute("RttQcnAlpha", DoubleValue(RttQcnAlpha));
rdmaHw->SetAttribute("RttQcnBeta", DoubleValue(RttQcnBeta));
rdmaHw->SetPintSmplThresh(pint_prob);
// create and install RdmaDriver
Ptr<RdmaDriver> rdma = CreateObject<RdmaDriver>();

View File

@ -5,10 +5,10 @@ RES_RESULTS=$NS3/examples/PowerTCP/results_burst
mkdir $RES_DUMP
mkdir $RES_RESULTS
algs=(0 1 2 3 4 5 6 7)
algs=(0 1 2 3 4 5 6 7 8)
algNames=("dcqcn" "powerInt" "hpcc" "powerDelay" "timely" "dctcp" "patchedTimely" "swift")
CCMODE=(1 3 3 3 7 8 11 12)
algNames=("dcqcn" "powerInt" "hpcc" "powerDelay" "timely" "dctcp" "patchedTimely" "swift" "rttqcn")
CCMODE=(1 3 3 3 7 8 11 12 13)
# at the moment, power int and delay are called from hpcc ACK function separately and hence cc mode is still 3.

View File

@ -6,10 +6,10 @@ RES_RESULTS=$NS3/examples/PowerTCP/results_fairness
mkdir $RES_DUMP
mkdir $RES_RESULTS
algs=(0 1 2 3 4 5 6 7)
algs=(0 1 2 3 4 5 6 7 8)
algNames=("dcqcn" "powerInt" "hpcc" "powerDelay" "timely" "dctcp" "patchedTimely" "swift")
CCMODE=(1 3 3 3 7 8 11 12)
algNames=("dcqcn" "powerInt" "hpcc" "powerDelay" "timely" "dctcp" "patchedTimely" "swift" "rttqcn")
CCMODE=(1 3 3 3 7 8 11 12 13)
# at the moment, power int and delay are called from hpcc ACK function separately and hence cc mode is still 3.

View File

@ -4,10 +4,10 @@ RES_RESULTS=$NS3/examples/PowerTCP/results_workload
mkdir $RES_DUMP
mkdir $RES_RESULTS
algs=(0 1 2 3 4 5 6 7)
algs=(0 1 2 3 4 5 6 7 8)
algNames=("dcqcn" "powerInt" "hpcc" "powerDelay" "timely" "dctcp" "patchedTimely" "swift")
CCMODE=(1 3 3 3 7 8 11 12)
algNames=("dcqcn" "powerInt" "hpcc" "powerDelay" "timely" "dctcp" "patchedTimely" "swift" "rttqcn")
CCMODE=(1 3 3 3 7 8 11 12 13)
# at the moment, power int and delay are called from hpcc ACK function separately and hence cc mode is still 3.

View File

@ -6,10 +6,10 @@ MIX_DUMP=$NS3/examples/PowerTCP/mix
mkdir $RES_DUMP
mkdir $MIX_DUMP
algs=(0 1 2 3 4 5 6 7)
algs=(0 1 2 3 4 5 6 7 8)
algNames=("dcqcn" "powerInt" "hpcc" "powerDelay" "timely" "dctcp" "patchedTimely" "swift")
CCMODE=(1 3 3 3 7 8 11 12)
algNames=("dcqcn" "powerInt" "hpcc" "powerDelay" "timely" "dctcp" "patchedTimely" "swift" "rttqcn")
CCMODE=(1 3 3 3 7 8 11 12 13)
# at the moment, power int and delay are called from hpcc ACK function separately and hence cc mode is still 3.
@ -51,7 +51,7 @@ for algorithm in ${algs[@]};do
delay=false
fi
if [[ ${algNames[$algorithm]} == "timely" || ${algNames[$algorithm]} == "dcqcn" ]];then
if [[ ${algNames[$algorithm]} == "timely" || ${algNames[$algorithm]} == "dcqcn" || ${algNames[$algorithm]} == "rttqcn" ]];then
window=0
else
window=1

View File

@ -6,10 +6,10 @@ MIX_DUMP=$NS3/examples/PowerTCP/mix
mkdir $RES_DUMP
mkdir $MIX_DUMP
algs=(0 1 2 3 4 5 6 7)
algs=(0 1 2 3 4 5 6 7 8)
algNames=("dcqcn" "powerInt" "hpcc" "powerDelay" "timely" "dctcp" "patchedTimely" "swift")
CCMODE=(1 3 3 3 7 8 11 12)
algNames=("dcqcn" "powerInt" "hpcc" "powerDelay" "timely" "dctcp" "patchedTimely" "swift" "rttqcn")
CCMODE=(1 3 3 3 7 8 11 12 13)
# at the moment, power int and delay are called from hpcc ACK function separately and hence cc mode is still 3.

View File

@ -7,10 +7,10 @@ MIX_DUMP=$NS3/examples/PowerTCP/mix
mkdir $RES_DUMP
mkdir $MIX_DUMP
mkdir $RES_RESULTS
algs=(0 1 2 3 4 5 6 7)
algs=(0 1 2 3 4 5 6 7 8)
algNames=("dcqcn" "powerInt" "hpcc" "powerDelay" "timely" "dctcp" "patchedTimely" "swift")
CCMODE=(1 3 3 3 7 8 11 12)
algNames=("dcqcn" "powerInt" "hpcc" "powerDelay" "timely" "dctcp" "patchedTimely" "swift" "rttqcn")
CCMODE=(1 3 3 3 7 8 11 12 13)
# at the moment, power int and delay are called from hpcc ACK function separately and hence cc mode is still 3.

View File

@ -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,54 @@ RdmaHw::GetCwndSwift(Ptr<RdmaQueuePair> qp,
return cwnd;
}
void
RdmaHw::HandleAckRttQcn(Ptr<RdmaQueuePair> qp, Ptr<Packet> p, CustomHeader& ch) const
{
uint64_t rtt = Simulator::Now().GetTimeStep() - ch.ack.ih.GetTs();
bool 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;
ecn = rand_num < thresh;
}
else
{
ecn = true;
}
// window in mtu (1000), not in bytes / seq#
auto cwnd = qp->m_win;
if (cwnd < m_mtu)
{
if (ecn)
{
cwnd *= 1 - rtt_qcn_beta;
}
else
{
cwnd += rtt_qcn_alpha * m_mtu;
}
}
else
{
if (ecn)
{
cwnd -= 0.5 * m_mtu;
}
else
{
cwnd += m_mtu * 1.0 / cwnd;
}
}
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

View File

@ -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 */

View File

@ -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