/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
#include "simgrid/plugins/ns3.hpp"
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
#include "simgrid/plugins/ns3.hpp"
-/* wifi globals */
-static ns3::WifiHelper wifi;
-#if NS3_MINOR_VERSION < 33
-static ns3::YansWifiPhyHelper wifiPhy = ns3::YansWifiPhyHelper::Default();
-#else
-static ns3::YansWifiPhyHelper wifiPhy;
-#endif
-static ns3::YansWifiChannelHelper wifiChannel = ns3::YansWifiChannelHelper::Default();
-static ns3::WifiMacHelper wifiMac;
-static ns3::MobilityHelper mobility;
-
simgrid::xbt::Extension<simgrid::kernel::routing::NetPoint, NetPointNs3> NetPointNs3::EXTENSION_ID;
static std::string transformIpv4Address(ns3::Ipv4Address from)
simgrid::xbt::Extension<simgrid::kernel::routing::NetPoint, NetPointNs3> NetPointNs3::EXTENSION_ID;
static std::string transformIpv4Address(ns3::Ipv4Address from)
+ /* wifi globals */
+ static ns3::WifiHelper wifi;
+#if NS3_MINOR_VERSION < 33
+ static ns3::YansWifiPhyHelper wifiPhy = ns3::YansWifiPhyHelper::Default();
+#else
+ static ns3::YansWifiPhyHelper wifiPhy;
+#endif
+ static ns3::YansWifiChannelHelper wifiChannel = ns3::YansWifiChannelHelper::Default();
+ static ns3::WifiMacHelper wifiMac;
+ static ns3::MobilityHelper mobility;
+
double step = 2 * M_PI / nb_stations;
for (auto station_host : wifizone->get_all_hosts()) {
station_netpoint_ns3 = station_host->get_netpoint()->extension<NetPointNs3>();
double step = 2 * M_PI / nb_stations;
for (auto station_host : wifizone->get_all_hosts()) {
station_netpoint_ns3 = station_host->get_netpoint()->extension<NetPointNs3>();
for (int const& i : cluster.radicals) {
// Create private link
std::string host_id = cluster.prefix + std::to_string(i) + cluster.suffix;
for (int const& i : cluster.radicals) {
// Create private link
std::string host_id = cluster.prefix + std::to_string(i) + cluster.suffix;
- auto* src = simgrid::s4u::Host::by_name(host_id)->get_netpoint();
- auto* dst = simgrid::s4u::Engine::get_instance()->netpoint_by_name_or_null(cluster.router_id);
+ auto const* src = simgrid::s4u::Host::by_name(host_id)->get_netpoint();
+ auto const* dst = simgrid::s4u::Engine::get_instance()->netpoint_by_name_or_null(cluster.router_id);
- ns3_add_direct_route(src, dst, cluster.bw, cluster.lat, cluster.id,
- cluster.sharing_policy); // Any ns-3 route is symmetrical
+ ns3_add_direct_route(src, dst, cluster.bw, cluster.lat, cluster.sharing_policy); // Any ns-3 route is symmetrical
// Also add the host to the list of hosts that will be connected to the backbone
Nodes.Add(src->extension<NetPointNs3>()->ns3_node_);
// Also add the host to the list of hosts that will be connected to the backbone
Nodes.Add(src->extension<NetPointNs3>()->ns3_node_);
xbt_assert(Nodes.GetN() <= 65000, "Cluster with ns-3 is limited to 65000 nodes");
ns3::CsmaHelper csma;
csma.SetChannelAttribute("DataRate",
xbt_assert(Nodes.GetN() <= 65000, "Cluster with ns-3 is limited to 65000 nodes");
ns3::CsmaHelper csma;
csma.SetChannelAttribute("DataRate",
- ns3::DataRateValue(ns3::DataRate(cluster.bb_bw * 8))); // ns-3 takes bps, but we provide Bps
+ ns3::DataRateValue(ns3::DataRate(
+ static_cast<uint64_t>(cluster.bb_bw * 8)))); // ns-3 takes bps, but we provide Bps
csma.SetChannelAttribute("Delay", ns3::TimeValue(ns3::Seconds(cluster.bb_lat)));
ns3::NetDeviceContainer devices = csma.Install(Nodes);
XBT_DEBUG("Create CSMA");
csma.SetChannelAttribute("Delay", ns3::TimeValue(ns3::Seconds(cluster.bb_lat)));
ns3::NetDeviceContainer devices = csma.Install(Nodes);
XBT_DEBUG("Create CSMA");
-static void routeCreation_cb(bool symmetrical, simgrid::kernel::routing::NetPoint* src,
- simgrid::kernel::routing::NetPoint* dst, simgrid::kernel::routing::NetPoint* /*gw_src*/,
- simgrid::kernel::routing::NetPoint* /*gw_dst*/,
- std::vector<simgrid::kernel::resource::LinkImpl*> const& link_list)
+static void routeCreation_cb(bool symmetrical, const simgrid::kernel::routing::NetPoint* src,
+ const simgrid::kernel::routing::NetPoint* dst,
+ const simgrid::kernel::routing::NetPoint* /*gw_src*/,
+ const simgrid::kernel::routing::NetPoint* /*gw_dst*/,
+ std::vector<simgrid::kernel::resource::StandardLinkImpl*> const& link_list)
(link->get_sharing_policy() == simgrid::s4u::Link::SharingPolicy::WIFI ? "(wifi)" : "(wired)"),
(symmetrical ? "(symmetrical)" : "(not symmetrical)"));
(link->get_sharing_policy() == simgrid::s4u::Link::SharingPolicy::WIFI ? "(wifi)" : "(wired)"),
(symmetrical ? "(symmetrical)" : "(not symmetrical)"));
XBT_DEBUG("\tLink (%s) bw:%fbps lat:%fs", link->get_cname(), link->get_bandwidth(), link->get_latency());
XBT_DEBUG("\tLink (%s) bw:%fbps lat:%fs", link->get_cname(), link->get_bandwidth(), link->get_latency());
- ns3_add_direct_route(src, dst, link->get_bandwidth(), link->get_latency(), link->get_name(),
- link->get_sharing_policy());
+ ns3_add_direct_route(src, dst, link->get_bandwidth(), link->get_latency(), link->get_sharing_policy());
- std::srand(time(NULL));
- ns3::RngSeedManager::SetSeed(std::rand());
- ns3::RngSeedManager::SetRun(std::rand());
+ std::default_random_engine prng(time(nullptr));
+ ns3::RngSeedManager::SetSeed(static_cast<uint32_t>(prng()));
+ ns3::RngSeedManager::SetRun(static_cast<uint64_t>(prng()));
- int v = xbt_str_parse_int(
- val.c_str(), "Invalid value for option ns3/seed. It must be either 'time', a number, or left empty.");
+ auto v = static_cast<int>(xbt_str_parse_int(
+ val.c_str(), "Invalid value for option ns3/seed. It must be either 'time', a number, or left empty."));
ns3::Config::SetDefault("ns3::TcpSocket::DelAckCount", ns3::UintegerValue(1));
ns3::Config::SetDefault("ns3::TcpSocketBase::Timestamp", ns3::BooleanValue(false));
ns3::Config::SetDefault("ns3::TcpSocket::DelAckCount", ns3::UintegerValue(1));
ns3::Config::SetDefault("ns3::TcpSocketBase::Timestamp", ns3::BooleanValue(false));
-LinkImpl* NetworkNS3Model::create_link(const std::string& name, const std::vector<double>& bandwidths)
+NetworkNS3Model::~NetworkNS3Model()
+{
+ ns3::Simulator::Destroy();
+}
+
+StandardLinkImpl* NetworkNS3Model::create_link(const std::string& name, const std::vector<double>& bandwidths)
{
xbt_assert(bandwidths.size() == 1, "ns-3 links must use only 1 bandwidth.");
auto* link = new LinkNS3(name, bandwidths[0]);
{
xbt_assert(bandwidths.size() == 1, "ns-3 links must use only 1 bandwidth.");
auto* link = new LinkNS3(name, bandwidths[0]);
{
auto* link = create_link(name, bandwidths);
link->set_sharing_policy(s4u::Link::SharingPolicy::WIFI, {});
{
auto* link = create_link(name, bandwidths);
link->set_sharing_policy(s4u::Link::SharingPolicy::WIFI, {});
- std::string ns3_socket;
- for (const auto& elm : flow_from_sock) {
- ns3_socket = elm.first;
- SgFlow* sgFlow = elm.second;
+ for (const auto& [ns3_socket, sgFlow] : flow_from_sock) {
NetworkNS3Action* action = sgFlow->action_;
XBT_DEBUG("Processing flow %p (socket %s, action %p)", sgFlow, ns3_socket.c_str(), action);
// Because NS3 stops as soon as a flow is finished, the other flows that ends at the same time may remains in an
// inconsistent state (i.e. remains_ == 0 but finished_ == false).
// However, SimGrid considers sometimes that an action with remains_ == 0 is finished.
// Thus, to avoid inconsistencies between SimGrid and NS3, set remains to 0 only when the flow is finished in NS3
NetworkNS3Action* action = sgFlow->action_;
XBT_DEBUG("Processing flow %p (socket %s, action %p)", sgFlow, ns3_socket.c_str(), action);
// Because NS3 stops as soon as a flow is finished, the other flows that ends at the same time may remains in an
// inconsistent state (i.e. remains_ == 0 but finished_ == false).
// However, SimGrid considers sometimes that an action with remains_ == 0 is finished.
// Thus, to avoid inconsistencies between SimGrid and NS3, set remains to 0 only when the flow is finished in NS3
if (remains > 0)
action->set_remains(remains);
if (TRACE_is_enabled() && action->get_state() == kernel::resource::Action::State::STARTED) {
double data_delta_sent = sgFlow->sent_bytes_ - action->last_sent_;
if (remains > 0)
action->set_remains(remains);
if (TRACE_is_enabled() && action->get_state() == kernel::resource::Action::State::STARTED) {
double data_delta_sent = sgFlow->sent_bytes_ - action->last_sent_;
action->get_src().route_to(&action->get_dst(), route, nullptr);
for (auto const& link : route)
instr::resource_set_utilization("LINK", "bandwidth_used", link->get_cname(), action->get_category(),
action->get_src().route_to(&action->get_dst(), route, nullptr);
for (auto const& link : route)
instr::resource_set_utilization("LINK", "bandwidth_used", link->get_cname(), action->get_category(),
socket_to_destroy.pop_back();
SgFlow* flow = flow_from_sock.at(ns3_socket);
if (XBT_LOG_ISENABLED(res_ns3, xbt_log_priority_debug)) {
socket_to_destroy.pop_back();
SgFlow* flow = flow_from_sock.at(ns3_socket);
if (XBT_LOG_ISENABLED(res_ns3, xbt_log_priority_debug)) {
ns3::Ptr<ns3::Node> src_node = get_ns3node_from_sghost(src);
ns3::Ptr<ns3::Node> dst_node = get_ns3node_from_sghost(dst);
ns3::Ptr<ns3::Node> src_node = get_ns3node_from_sghost(src);
ns3::Ptr<ns3::Node> dst_node = get_ns3node_from_sghost(dst);
xbt_assert(not addr.empty(), "Element %s is unknown to ns-3. Is it connected to any one-hop link?",
dst->get_netpoint()->get_cname());
xbt_assert(not addr.empty(), "Element %s is unknown to ns-3. Is it connected to any one-hop link?",
dst->get_netpoint()->get_cname());
XBT_DEBUG("Create socket %s for a flow of %.0f Bytes from %s to %s with Interface %s",
transform_socket_ptr(sock).c_str(), totalBytes, src->get_cname(), dst->get_cname(), addr.c_str());
XBT_DEBUG("Create socket %s for a flow of %.0f Bytes from %s to %s with Interface %s",
transform_socket_ptr(sock).c_str(), totalBytes, src->get_cname(), dst->get_cname(), addr.c_str());
- flow_from_sock.insert({transform_socket_ptr(sock), new SgFlow(totalBytes, this)});
- sink_from_sock.insert({transform_socket_ptr(sock), apps});
+ flow_from_sock.try_emplace(transform_socket_ptr(sock), new SgFlow(static_cast<uint32_t>(totalBytes), this));
+ sink_from_sock.try_emplace(transform_socket_ptr(sock), apps);
sock->Bind(ns3::InetSocketAddress(port_number));
ns3::Simulator::ScheduleNow(&start_flow, sock, addr.c_str(), port_number);
sock->Bind(ns3::InetSocketAddress(port_number));
ns3::Simulator::ScheduleNow(&start_flow, sock, addr.c_str(), port_number);
{
xbt_assert(host->get_netpoint()->extension<NetPointNs3>() != nullptr, "Please only use this function on ns-3 nodes");
return host->get_netpoint()->extension<NetPointNs3>()->ns3_node_;
{
xbt_assert(host->get_netpoint()->extension<NetPointNs3>() != nullptr, "Please only use this function on ns-3 nodes");
return host->get_netpoint()->extension<NetPointNs3>()->ns3_node_;
-void ns3_add_direct_route(simgrid::kernel::routing::NetPoint* src, simgrid::kernel::routing::NetPoint* dst, double bw,
- double lat, const std::string& link_name, simgrid::s4u::Link::SharingPolicy policy)
+void ns3_add_direct_route(const simgrid::kernel::routing::NetPoint* src, const simgrid::kernel::routing::NetPoint* dst,
+ double bw, double lat, simgrid::s4u::Link::SharingPolicy policy)
ns3::PointToPointHelper pointToPoint;
XBT_DEBUG("\tAdd PTP from %s to %s bw:'%f Bps' lat:'%fs'", src->get_cname(), dst->get_cname(), bw, lat);
ns3::PointToPointHelper pointToPoint;
XBT_DEBUG("\tAdd PTP from %s to %s bw:'%f Bps' lat:'%fs'", src->get_cname(), dst->get_cname(), bw, lat);
- pointToPoint.SetDeviceAttribute("DataRate",
- ns3::DataRateValue(ns3::DataRate(bw * 8))); // ns-3 takes bps, but we provide Bps
+ pointToPoint.SetDeviceAttribute(
+ "DataRate",
+ ns3::DataRateValue(ns3::DataRate(static_cast<uint64_t>(bw * 8)))); // ns-3 takes bps, but we provide Bps
pointToPoint.SetChannelAttribute("Delay", ns3::TimeValue(ns3::Seconds(lat)));
netA.Add(pointToPoint.Install(host_src->ns3_node_, host_dst->ns3_node_));
pointToPoint.SetChannelAttribute("Delay", ns3::TimeValue(ns3::Seconds(lat)));
netA.Add(pointToPoint.Install(host_src->ns3_node_, host_dst->ns3_node_));