Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[sonar] Declare functions "const" in src/kernel/.
[simgrid.git] / src / surf / network_ns3.cpp
index 74d8e40..7c6fc97 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2019. The SimGrid Team. All rights reserved.          */
+/* Copyright (c) 2007-2020. 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. */
@@ -79,7 +79,7 @@ static void clusterCreation_cb(simgrid::kernel::routing::ClusterCreationArgs con
     xbt_assert(host_src, "Cannot find a ns-3 host of name %s", host_id.c_str());
 
     // Any ns-3 route is symmetrical
-    ns3_add_link(host_src, host_dst, cluster.bw, cluster.lat);
+    ns3_add_direct_route(host_src, host_dst, cluster.bw, cluster.lat, cluster.sharing_policy);
 
     delete host_dst;
   }
@@ -89,14 +89,15 @@ 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,
+                             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)
 {
   if (link_list.size() == 1) {
     auto* link = static_cast<simgrid::kernel::resource::LinkNS3*>(link_list[0]);
 
-    XBT_DEBUG("Route from '%s' to '%s' with link '%s' %s", src->get_cname(), dst->get_cname(), link->get_cname(),
+    XBT_DEBUG("Route from '%s' to '%s' with link '%s' %s %s", src->get_cname(), dst->get_cname(), link->get_cname(),
+              (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);
@@ -109,7 +110,7 @@ static void routeCreation_cb(bool symmetrical, simgrid::kernel::routing::NetPoin
     xbt_assert(host_src != nullptr, "Network element %s does not seem to be ns-3-ready", src->get_cname());
     xbt_assert(host_dst != nullptr, "Network element %s does not seem to be ns-3-ready", dst->get_cname());
 
-    ns3_add_link(host_src, host_dst, link->get_bandwidth(), link->get_latency());
+    ns3_add_direct_route(host_src, host_dst, link->get_bandwidth(), link->get_latency(), link->get_sharing_policy());
   } else {
     static bool warned_about_long_routes = false;
 
@@ -176,10 +177,10 @@ NetworkNS3Model::~NetworkNS3Model() {
 }
 
 LinkImpl* NetworkNS3Model::create_link(const std::string& name, const std::vector<double>& bandwidths, double latency,
-                                       s4u::Link::SharingPolicy)
+                                       s4u::Link::SharingPolicy policy)
 {
   xbt_assert(bandwidths.size() == 1, "ns-3 links must use only 1 bandwidth.");
-  return new LinkNS3(this, name, bandwidths[0], latency);
+  return new LinkNS3(this, name, bandwidths[0], latency, policy);
 }
 
 Action* NetworkNS3Model::communicate(s4u::Host* src, s4u::Host* dst, double size, double rate)
@@ -243,10 +244,10 @@ void NetworkNS3Model::update_actions_state(double now, double delta)
 
       std::vector<LinkImpl*> route = std::vector<LinkImpl*>();
 
-      action->src_->route_to(action->dst_, route, nullptr);
+      action->get_src().route_to(&action->get_dst(), route, nullptr);
       for (auto const& link : route)
-        TRACE_surf_resource_set_utilization("LINK", "bandwidth_used", link->get_cname(), action->get_category(),
-                                            (data_delta_sent) / delta, now - delta, delta);
+        instr::resource_set_utilization("LINK", "bandwidth_used", link->get_cname(), action->get_category(),
+                                        (data_delta_sent) / delta, now - delta, delta);
 
       action->last_sent_ = sgFlow->sent_bytes_;
     }
@@ -255,7 +256,7 @@ void NetworkNS3Model::update_actions_state(double now, double delta)
       socket_to_destroy.push_back(ns3_socket);
       XBT_DEBUG("Destroy socket %p of action %p", ns3_socket.c_str(), action);
       action->set_remains(0);
-      action->finish(kernel::resource::Action::State::FINISHED);
+      action->finish(Action::State::FINISHED);
     } else {
       XBT_DEBUG("Socket %p sent %u bytes out of %u (%u remaining)", ns3_socket.c_str(), sgFlow->sent_bytes_,
                 sgFlow->total_bytes_, sgFlow->remaining_);
@@ -279,12 +280,15 @@ void NetworkNS3Model::update_actions_state(double now, double delta)
  * Resource *
  ************/
 
-LinkNS3::LinkNS3(NetworkNS3Model* model, const std::string& name, double bandwidth, double latency)
-    : LinkImpl(model, name, nullptr)
+LinkNS3::LinkNS3(NetworkNS3Model* model, const std::string& name, double bandwidth, double latency,
+                 s4u::Link::SharingPolicy policy)
+    : LinkImpl(model, name, nullptr), sharing_policy_(policy)
 {
   bandwidth_.peak = bandwidth;
   latency_.peak   = latency;
 
+  /* If wifi, create the wifizone now. If not, don't do anything: the links will be created in routeCreate_cb */
+
   s4u::Link::on_creation(*this->get_iface());
 }
 
@@ -308,9 +312,8 @@ void LinkNS3::set_latency_profile(profile::Profile*)
  **********/
 
 NetworkNS3Action::NetworkNS3Action(Model* model, double totalBytes, s4u::Host* src, s4u::Host* dst)
-    : NetworkAction(model, totalBytes, false), src_(src), dst_(dst)
+    : NetworkAction(model, *src, *dst, totalBytes, false)
 {
-  
   // If there is no other started actions, we need to move NS-3 forward to be sync with SimGrid
   if (model->get_started_action_set()->size()==1){
     while(double_positive(surf_get_clock() - ns3::Simulator::Now().GetSeconds(), sg_surf_precision)){
@@ -355,7 +358,7 @@ NetworkNS3Action::NetworkNS3Action(Model* model, double totalBytes, s4u::Host* s
   }
   xbt_assert(port_number <= 65000, "Too many connections! Port number is saturated.");
 
-  s4u::Link::on_communicate(*this, src, dst);
+  s4u::Link::on_communicate(*this);
 }
 
 void NetworkNS3Action::suspend() {
@@ -366,7 +369,7 @@ void NetworkNS3Action::resume() {
   THROW_UNIMPLEMENTED;
 }
 
-std::list<LinkImpl*> NetworkNS3Action::links() const
+std::list<LinkImpl*> NetworkNS3Action::get_links() const
 {
   THROW_UNIMPLEMENTED;
 }
@@ -425,7 +428,8 @@ void ns3_initialize(std::string TcpProtocol)
   }
 }
 
-void ns3_add_cluster(const char* id, double bw, double lat) {
+void ns3_add_cluster(const char* /*id*/, double bw, double lat)
+{
   ns3::NodeContainer Nodes;
 
   for (unsigned int i = number_of_clusters_nodes; i < Cluster_nodes.GetN(); i++) {
@@ -467,10 +471,11 @@ static std::string transformIpv4Address(ns3::Ipv4Address from)
   return sstream.str();
 }
 
-void ns3_add_link(NetPointNs3* src, NetPointNs3* dst, double bw, double lat) {
-  ns3::PointToPointHelper pointToPoint;
-
+void ns3_add_direct_route(NetPointNs3* src, NetPointNs3* dst, double bw, double lat,
+                          simgrid::s4u::Link::SharingPolicy policy)
+{
   ns3::Ipv4AddressHelper address;
+  ns3::NetDeviceContainer netA;
 
   int srcNum = src->node_num;
   int dstNum = dst->node_num;
@@ -478,13 +483,18 @@ void ns3_add_link(NetPointNs3* src, NetPointNs3* dst, double bw, double lat) {
   ns3::Ptr<ns3::Node> a = src->ns3_node_;
   ns3::Ptr<ns3::Node> b = dst->ns3_node_;
 
-  XBT_DEBUG("\tAdd PTP from %d to %d bw:'%f Bps' lat:'%fs'", srcNum, dstNum, bw, lat);
-  pointToPoint.SetDeviceAttribute("DataRate",
-                                  ns3::DataRateValue(ns3::DataRate(bw * 8))); // ns-3 takes bps, but we provide Bps
-  pointToPoint.SetChannelAttribute("Delay", ns3::TimeValue(ns3::Seconds(lat)));
+  if (policy == simgrid::s4u::Link::SharingPolicy::WIFI) {
+    /* Install a ns3::WifiHelper */
+  } else {
+    ns3::PointToPointHelper pointToPoint;
 
-  ns3::NetDeviceContainer netA;
-  netA.Add(pointToPoint.Install (a, b));
+    XBT_DEBUG("\tAdd PTP from %d to %d bw:'%f Bps' lat:'%fs'", srcNum, dstNum, bw, lat);
+    pointToPoint.SetDeviceAttribute("DataRate",
+                                    ns3::DataRateValue(ns3::DataRate(bw * 8))); // ns-3 takes bps, but we provide Bps
+    pointToPoint.SetChannelAttribute("Delay", ns3::TimeValue(ns3::Seconds(lat)));
+
+    netA.Add(pointToPoint.Install(a, b));
+  }
 
   std::string addr = simgrid::xbt::string_printf("%d.%d.0.0", number_of_networks, number_of_links);
   address.SetBase(addr.c_str(), "255.255.0.0");