44 auto ipv4 = node->GetObject<ns3::Ipv4>();
46 return ns3::Ipv4Address::GetAny();
47 for (uint32_t i = 0; i < ipv4->GetNInterfaces(); ++i) {
48 for (uint32_t j = 0; j < ipv4->GetNAddresses(i); ++j) {
49 auto ifaddr = ipv4->GetAddress(i, j).GetLocal();
50 if (ifaddr != ns3::Ipv4Address(
"127.0.0.1") && ifaddr != ns3::Ipv4Address::GetZero()) {
55 return ns3::Ipv4Address::GetAny();
59 double initCwndPkts) {
61 double cwndNeeded = (rateMbps * 1e6 * rttSec) / (
double(mssBytes) * 8.0);
62 if (cwndNeeded <= 0.0)
64 double nDoublings = std::ceil(std::log2(std::max(1.0, cwndNeeded / initCwndPkts)));
66 return (nDoublings + 3.0) * rttSec;
71 NS_LOG_INFO(
"Installing " << spec.
flows.size() <<
" congestion flows");
73 for (
const auto& fraw : spec.
flows) {
77 std::string srcKind = f.
source;
78 std::transform(proto.begin(), proto.end(), proto.begin(),
79 [](
unsigned char c) { return std::tolower(c); });
80 std::transform(srcKind.begin(), srcKind.end(), srcKind.begin(),
81 [](
unsigned char c) { return std::tolower(c); });
84 if (proto !=
"udp" && proto !=
"tcp") {
85 NS_LOG_WARN(
"Unknown protocol '" << f.
protocol <<
"'; defaulting to UDP");
88 if (srcKind !=
"onoff" && srcKind !=
"bulk") {
89 NS_LOG_WARN(
"Unknown source '" << f.
source <<
"'; defaulting to onoff");
92 if (proto ==
"udp" && srcKind ==
"bulk") {
93 NS_LOG_WARN(
"UDP does not support BulkSend; falling back to OnOff for flow to port "
100 if (!srcNode || !dstNode) {
101 NS_LOG_ERROR(
"TrafficFlow refers to unknown nodes: " << f.
src <<
" -> " << f.
dst);
107 auto key = std::make_tuple(dstNode, f.
dstPort, proto);
109 Address bind = InetSocketAddress(Ipv4Address::GetAny(), f.
dstPort);
110 if (proto ==
"tcp") {
111 PacketSinkHelper sink(
"ns3::TcpSocketFactory", bind);
112 sink.Install(dstNode);
114 PacketSinkHelper sink(
"ns3::UdpSocketFactory", bind);
115 sink.Install(dstNode);
123 InetSocketAddress dst(dstAddr, f.
dstPort);
126 Time tStart = Seconds(std::max(0.0, f.
start_s));
127 Time tStop = (f.
stop_s > 0.0) ? Seconds(f.
stop_s) : Time();
129 if (srcKind ==
"onoff") {
131 std::ostringstream rate;
133 const char* factory = (proto ==
"tcp") ?
"ns3::TcpSocketFactory" :
"ns3::UdpSocketFactory";
134 OnOffHelper onoff(factory, dst);
135 onoff.SetAttribute(
"DataRate", StringValue(rate.str()));
136 onoff.SetAttribute(
"PacketSize", UintegerValue(f.
packetSize));
137 onoff.SetAttribute(
"OnTime", StringValue(
"ns3::ConstantRandomVariable[Constant=1]"));
138 onoff.SetAttribute(
"OffTime", StringValue(
"ns3::ConstantRandomVariable[Constant=0]"));
140 auto apps = onoff.Install(srcNode);
145 NS_LOG_INFO(
"Installed OnOff "
146 << proto <<
" " << f.
src <<
" -> " << f.
dst <<
":" << f.
dstPort
148 <<
" start=" << tStart.GetSeconds() <<
"s"
149 << (f.
stop_s > 0.0 ? (
" stop=" + std::to_string(tStop.GetSeconds()) +
"s") :
""));
152 BulkSendHelper bulk(
"ns3::TcpSocketFactory", dst);
153 bulk.SetAttribute(
"MaxBytes", UintegerValue(0));
154 bulk.SetAttribute(
"SendSize", UintegerValue(f.
packetSize));
156 auto apps = bulk.Install(srcNode);
161 NS_LOG_INFO(
"Installed BulkSend TCP "
163 <<
" start=" << tStart.GetSeconds() <<
"s"
164 << (f.
stop_s > 0.0 ? (
" stop=" + std::to_string(tStop.GetSeconds()) +
"s") :
"")
165 <<
" (ignores rateMbps by design)");