Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Fix sonar issues in ns3 bindings.
authorArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Fri, 18 Feb 2022 13:03:45 +0000 (14:03 +0100)
committerArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Fri, 18 Feb 2022 15:11:14 +0000 (16:11 +0100)
include/simgrid/plugins/ns3.hpp
src/surf/network_ns3.cpp
src/surf/network_ns3.hpp
src/surf/ns3/ns3_simulator.cpp
src/surf/ns3/ns3_simulator.hpp

index da8775b..94e1a40 100644 (file)
@@ -14,7 +14,7 @@
 
 namespace simgrid {
 /** Returns the ns3 node from a simgrid host */
-XBT_PUBLIC ns3::Ptr<ns3::Node> get_ns3node_from_sghost(simgrid::s4u::Host* host);
+XBT_PUBLIC ns3::Ptr<ns3::Node> get_ns3node_from_sghost(const simgrid::s4u::Host* host);
 }; // namespace simgrid
 
 #endif
index 08a88e1..835e03f 100644 (file)
@@ -5,6 +5,7 @@
 
 #include "simgrid/plugins/ns3.hpp"
 
+#include <random>
 #include <string>
 #include <unordered_set>
 
@@ -55,17 +56,6 @@ static ns3::InternetStackHelper stack;
 static int number_of_links    = 1;
 static int number_of_networks = 1;
 
-/* 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)
@@ -75,7 +65,7 @@ static std::string transformIpv4Address(ns3::Ipv4Address from)
   return sstream.str();
 }
 
-NetPointNs3::NetPointNs3() : ns3_node_(ns3::CreateObject<ns3::Node>(0))
+NetPointNs3::NetPointNs3()
 {
   stack.Install(ns3_node_);
 }
@@ -91,10 +81,21 @@ static void resumeWifiDevice(ns3::Ptr<ns3::WifiNetDevice> device)
 
 static void zoneCreation_cb(simgrid::s4u::NetZone const& zone)
 {
-  simgrid::kernel::routing::WifiZone* wifizone = dynamic_cast<simgrid::kernel::routing::WifiZone*>(zone.get_impl());
+  auto const* wifizone = dynamic_cast<simgrid::kernel::routing::WifiZone*>(zone.get_impl());
   if (wifizone == nullptr)
     return;
 
+  /* 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;
+
 #if NS3_MINOR_VERSION < 32
   wifi.SetStandard(ns3::WIFI_PHY_STANDARD_80211n_5GHZ);
 #else
@@ -139,7 +140,7 @@ static void zoneCreation_cb(simgrid::s4u::NetZone const& zone)
   ns3::Ptr<ns3::Node> station_ns3_node = nullptr;
   double distance;
   double angle    = 0;
-  int nb_stations = wifizone->get_all_hosts().size() - 1;
+  auto nb_stations = wifizone->get_all_hosts().size() - 1;
   double step     = 2 * M_PI / nb_stations;
   for (auto station_host : wifizone->get_all_hosts()) {
     station_netpoint_ns3 = station_host->get_netpoint()->extension<NetPointNs3>();
@@ -202,12 +203,11 @@ static void clusterCreation_cb(simgrid::kernel::routing::ClusterCreationArgs con
   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);
     xbt_assert(dst != nullptr, "No router named %s", cluster.router_id.c_str());
 
-    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_);
@@ -238,9 +238,10 @@ static void clusterCreation_cb(simgrid::kernel::routing::ClusterCreationArgs con
   }
 }
 
-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*/,
+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)
 {
   /* ignoring routes from StarZone, not supported */
@@ -254,11 +255,9 @@ static void routeCreation_cb(bool symmetrical, simgrid::kernel::routing::NetPoin
               (link->get_sharing_policy() == simgrid::s4u::Link::SharingPolicy::WIFI ? "(wifi)" : "(wired)"),
               (symmetrical ? "(symmetrical)" : "(not symmetrical)"));
 
-    //   XBT_DEBUG("src (%s), dst (%s), src_id = %d, dst_id = %d",src,dst, src_id, dst_id);
     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());
   } else {
     static bool warned_about_long_routes = false;
 
@@ -293,12 +292,12 @@ static simgrid::config::Flag<std::string> ns3_seed(
       if (val.length() == 0)
         return;
       if (strcasecmp(val.c_str(), "time") == 0) {
-        std::srand(time(NULL));
-        ns3::RngSeedManager::SetSeed(std::rand());
-        ns3::RngSeedManager::SetRun(std::rand());
+        std::default_random_engine prng(time(nullptr));
+        ns3::RngSeedManager::SetSeed(prng());
+        ns3::RngSeedManager::SetRun(prng());
       } else {
-        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.");
+        int 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);
       }
@@ -319,7 +318,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 TcpProtocol = ns3_tcp_model.get();
+  auto const& TcpProtocol = ns3_tcp_model.get();
   if (TcpProtocol == "default") {
     /* nothing to do */
 
@@ -419,19 +418,18 @@ void NetworkNS3Model::update_actions_state(double now, double delta)
     // 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
-    int remains = action->get_cost() - sgFlow->sent_bytes_;
+    double remains = action->get_cost() - sgFlow->sent_bytes_;
     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_;
 
-      std::vector<StandardLinkImpl*> route = std::vector<StandardLinkImpl*>();
-
+      std::vector<StandardLinkImpl*> route;
       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(),
-                                        (data_delta_sent) / delta, now - delta, delta);
+                                        data_delta_sent / delta, now - delta, delta);
 
       action->last_sent_ = sgFlow->sent_bytes_;
     }
@@ -531,7 +529,7 @@ NetworkNS3Action::NetworkNS3Action(Model* model, double totalBytes, s4u::Host* s
   ns3::Ptr<ns3::Node> src_node = get_ns3node_from_sghost(src);
   ns3::Ptr<ns3::Node> dst_node = get_ns3node_from_sghost(dst);
 
-  std::string& addr = dst->get_netpoint()->extension<NetPointNs3>()->ipv4_address_;
+  const std::string& addr = dst->get_netpoint()->extension<NetPointNs3>()->ipv4_address_;
   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());
 
@@ -576,7 +574,7 @@ void NetworkNS3Action::update_remains_lazy(double /*now*/)
 } // namespace resource
 } // namespace kernel
 
-ns3::Ptr<ns3::Node> get_ns3node_from_sghost(simgrid::s4u::Host* host)
+ns3::Ptr<ns3::Node> get_ns3node_from_sghost(const simgrid::s4u::Host* host)
 {
   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_;
@@ -597,8 +595,8 @@ void ns3_simulator(double maxSeconds)
     id.Cancel();
 }
 
-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::Ipv4AddressHelper address;
   ns3::NetDeviceContainer netA;
index 09f681f..02036a3 100644 (file)
@@ -17,7 +17,7 @@ namespace resource {
 class NetworkNS3Model : public NetworkModel {
 public:
   explicit NetworkNS3Model(const std::string& name);
-  ~NetworkNS3Model();
+  ~NetworkNS3Model() override;
   StandardLinkImpl* create_link(const std::string& name, const std::vector<double>& bandwidth) override;
   StandardLinkImpl* create_wifi_link(const std::string& name, const std::vector<double>& bandwidth) override;
   Action* communicate(s4u::Host* src, s4u::Host* dst, double size, double rate) override;
index 04a5656..5b4f136 100644 (file)
@@ -25,10 +25,8 @@ static void datasent_cb(ns3::Ptr<ns3::Socket> socket, uint32_t dataSent);
 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(res_ns3);
 
 SgFlow::SgFlow(uint32_t totalBytes, simgrid::kernel::resource::NetworkNS3Action* action)
+    : total_bytes_(totalBytes), remaining_(totalBytes), action_(action)
 {
-  total_bytes_ = totalBytes;
-  remaining_  = totalBytes;
-  action_     = action;
 }
 
 static SgFlow* getFlowFromSocket(ns3::Ptr<ns3::Socket> socket)
@@ -56,10 +54,10 @@ static void receive_callback(ns3::Ptr<ns3::Socket> socket)
   }
 }
 
-static void send_cb(ns3::Ptr<ns3::Socket> sock, uint32_t txSpace)
+static void send_cb(ns3::Ptr<ns3::Socket> sock, uint32_t /*txSpace*/)
 {
   SgFlow* flow = getFlowFromSocket(sock);
-  ns3::ApplicationContainer* sink = getSinkFromSocket(sock);
+  const ns3::ApplicationContainer* sink = getSinkFromSocket(sock);
   XBT_DEBUG("Asked to write on F[%p, total: %u, remain: %u]", flow, flow->total_bytes_, flow->remaining_);
 
   if (flow->remaining_ == 0) // all data was already buffered (and socket was already closed)
@@ -119,7 +117,7 @@ static void normalClose_callback(ns3::Ptr<ns3::Socket> socket)
   receive_callback(socket);
 }
 
-static void errorClose_callback(ns3::Ptr<ns3::Socket> socket)
+XBT_ATTRIB_NORETURN static void errorClose_callback(ns3::Ptr<ns3::Socket> socket)
 {
   SgFlow* flow = getFlowFromSocket(socket);
   XBT_DEBUG("errorClose_cb of F[%p, %p, %u]", flow, flow->action_, flow->total_bytes_);
@@ -132,7 +130,7 @@ static void succeededConnect_callback(ns3::Ptr<ns3::Socket> socket)
   XBT_DEBUG("succeededConnect_cb of F[%p, %p, %u]", flow, flow->action_, flow->total_bytes_);
 }
 
-static void failedConnect_callback(ns3::Ptr<ns3::Socket> socket)
+XBT_ATTRIB_NORETURN static void failedConnect_callback(ns3::Ptr<ns3::Socket> socket)
 {
   SgFlow* mysocket = getFlowFromSocket(socket);
   XBT_DEBUG("failedConnect_cb of F[%p, %p, %u]", mysocket, mysocket->action_, mysocket->total_bytes_);
index f1183c9..f4cd203 100644 (file)
@@ -20,13 +20,13 @@ public:
   static simgrid::xbt::Extension<simgrid::kernel::routing::NetPoint, NetPointNs3> EXTENSION_ID;
 
   explicit NetPointNs3();
-  ns3::Ptr<ns3::Node> ns3_node_;
+  ns3::Ptr<ns3::Node> ns3_node_ = ns3::CreateObject<ns3::Node>(0);
   std::string ipv4_address_;
 };
 
 XBT_PRIVATE void ns3_simulator(double max_seconds);
-XBT_PRIVATE void ns3_add_direct_route(simgrid::kernel::routing::NetPoint* src, simgrid::kernel::routing::NetPoint* dst,
-                                      double bw, double lat, const std::string& link_name,
+XBT_PRIVATE 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);
 
 class XBT_PRIVATE SgFlow {
@@ -36,8 +36,8 @@ public:
   // private:
   std::uint32_t buffered_bytes_ = 0;
   std::uint32_t sent_bytes_     = 0;
-  std::uint32_t remaining_;
   std::uint32_t total_bytes_;
+  std::uint32_t remaining_;
   bool finished_ = false;
   simgrid::kernel::resource::NetworkNS3Action* action_;
 };