Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Update copyright lines for 2023.
[simgrid.git] / src / surf / network_ns3.cpp
index 835e03f..6e84927 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2022. The SimGrid Team. All rights reserved.          */
+/* Copyright (c) 2007-2023. The SimGrid Team. All rights reserved.          */
 
 /* 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. */
@@ -98,8 +98,11 @@ static void zoneCreation_cb(simgrid::s4u::NetZone const& zone)
 
 #if NS3_MINOR_VERSION < 32
   wifi.SetStandard(ns3::WIFI_PHY_STANDARD_80211n_5GHZ);
-#else
+#elif NS3_MINOR_VERSION < 36
   wifi.SetStandard(ns3::WIFI_STANDARD_80211n_5GHZ);
+#else
+  wifi.SetStandard(ns3::WIFI_STANDARD_80211n);
+  wifiPhy.Set ("ChannelSettings", ns3::StringValue ("{0, 0, BAND_5GHZ, 0}"));
 #endif
 
   std::string ssid = wifizone->get_name();
@@ -140,9 +143,9 @@ static void zoneCreation_cb(simgrid::s4u::NetZone const& zone)
   ns3::Ptr<ns3::Node> station_ns3_node = nullptr;
   double distance;
   double angle    = 0;
-  auto nb_stations = wifizone->get_all_hosts().size() - 1;
+  auto nb_stations = static_cast<double>(wifizone->get_all_hosts().size() - 1);
   double step     = 2 * M_PI / nb_stations;
-  for (auto station_host : wifizone->get_all_hosts()) {
+  for (const auto* station_host : wifizone->get_all_hosts()) {
     station_netpoint_ns3 = station_host->get_netpoint()->extension<NetPointNs3>();
     if (station_netpoint_ns3 == access_point_netpoint_ns3)
       continue;
@@ -218,7 +221,8 @@ static void clusterCreation_cb(simgrid::kernel::routing::ClusterCreationArgs con
   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");
@@ -293,10 +297,10 @@ static simgrid::config::Flag<std::string> ns3_seed(
         return;
       if (strcasecmp(val.c_str(), "time") == 0) {
         std::default_random_engine prng(time(nullptr));
-        ns3::RngSeedManager::SetSeed(prng());
-        ns3::RngSeedManager::SetRun(prng());
+        ns3::RngSeedManager::SetSeed(static_cast<uint32_t>(prng()));
+        ns3::RngSeedManager::SetRun(static_cast<uint64_t>(prng()));
       } else {
-        int v = static_cast<int>(xbt_str_parse_int(
+        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::RngSeedManager::SetSeed(v);
         ns3::RngSeedManager::SetRun(v);
@@ -304,8 +308,7 @@ static simgrid::config::Flag<std::string> ns3_seed(
     });
 
 namespace simgrid {
-namespace kernel {
-namespace resource {
+namespace kernel::resource {
 
 NetworkNS3Model::NetworkNS3Model(const std::string& name) : NetworkModel(name)
 {
@@ -318,8 +321,7 @@ NetworkNS3Model::NetworkNS3Model(const std::string& name) : NetworkModel(name)
   ns3::Config::SetDefault("ns3::TcpSocket::DelAckCount", ns3::UintegerValue(1));
   ns3::Config::SetDefault("ns3::TcpSocketBase::Timestamp", ns3::BooleanValue(false));
 
-  auto const& TcpProtocol = ns3_tcp_model.get();
-  if (TcpProtocol == "default") {
+  if (auto const& TcpProtocol = ns3_tcp_model.get(); TcpProtocol == "default") {
     /* nothing to do */
 
   } else if (TcpProtocol == "Reno" || TcpProtocol == "NewReno" || TcpProtocol == "Tahoe") {
@@ -366,7 +368,7 @@ StandardLinkImpl* NetworkNS3Model::create_wifi_link(const std::string& name, con
   return link;
 }
 
-Action* NetworkNS3Model::communicate(s4u::Host* src, s4u::Host* dst, double size, double rate)
+Action* NetworkNS3Model::communicate(s4u::Host* src, s4u::Host* dst, double size, double rate, bool /*streamed*/)
 {
   xbt_assert(rate == -1,
              "Communication over ns-3 links cannot specify a specific rate. Please use -1 as a value instead of %f.",
@@ -408,10 +410,7 @@ void NetworkNS3Model::update_actions_state(double now, double delta)
 {
   static std::vector<std::string> socket_to_destroy;
 
-  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
@@ -447,7 +446,7 @@ void NetworkNS3Model::update_actions_state(double now, double delta)
   }
 
   while (not socket_to_destroy.empty()) {
-    ns3_socket = socket_to_destroy.back();
+    std::string ns3_socket = socket_to_destroy.back();
     socket_to_destroy.pop_back();
     SgFlow* flow = flow_from_sock.at(ns3_socket);
     if (XBT_LOG_ISENABLED(res_ns3, xbt_log_priority_debug)) {
@@ -504,8 +503,7 @@ NetworkNS3Action::NetworkNS3Action(Model* model, double totalBytes, s4u::Host* s
   // ns-3 fails when src = dst, so avoid the problem by considering that communications are infinitely fast on the
   // loopback that does not exists
   if (src == dst) {
-    static bool warned = false;
-    if (not warned) {
+    if (static bool warned = false; not warned) {
       XBT_WARN("Sending from a host %s to itself is not supported by ns-3. Every such communication finishes "
                "immediately upon startup.",
                src->get_cname());
@@ -541,8 +539,8 @@ NetworkNS3Action::NetworkNS3Action(Model* model, double totalBytes, s4u::Host* s
   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);
@@ -571,8 +569,7 @@ void NetworkNS3Action::update_remains_lazy(double /*now*/)
   THROW_IMPOSSIBLE;
 }
 
-} // namespace resource
-} // namespace kernel
+} // namespace kernel::resource
 
 ns3::Ptr<ns3::Node> get_ns3node_from_sghost(const simgrid::s4u::Host* host)
 {
@@ -614,8 +611,9 @@ void ns3_add_direct_route(const simgrid::kernel::routing::NetPoint* src, const s
   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_));