Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
directly store the ns3Node, don't rely on a num ID to find it later on
[simgrid.git] / src / surf / network_ns3.cpp
index 7c30095..8cd88b5 100644 (file)
@@ -8,6 +8,7 @@
 
 #include "xbt/config.hpp"
 #include "xbt/string.hpp"
+#include "xbt/utility.hpp"
 
 #include "ns3/core-module.h"
 #include "ns3/node.h"
@@ -18,6 +19,7 @@
 #include "src/instr/instr_private.hpp" // TRACE_is_enabled(). FIXME: remove by subscribing tracing to the surf signals
 #include "src/kernel/routing/NetPoint.hpp"
 
+#include "simgrid/plugins/energy.h"
 #include "simgrid/s4u/Engine.hpp"
 #include "simgrid/s4u/NetZone.hpp"
 
@@ -46,9 +48,9 @@ simgrid::xbt::Extension<simgrid::kernel::routing::NetPoint, NetPointNs3> NetPoin
 
 NetPointNs3::NetPointNs3()
 {
-  ns3::Ptr<ns3::Node> node = ns3::CreateObject<ns3::Node>(0);
-  stack.Install(node);
-  nodes.Add(node);
+  ns3Node_ = ns3::CreateObject<ns3::Node>(0);
+  stack.Install(ns3Node_);
+  nodes.Add(ns3Node_);
   node_num = number_of_nodes++;
 }
 
@@ -142,6 +144,9 @@ namespace simgrid {
 namespace surf {
 
 NetworkNS3Model::NetworkNS3Model() : NetworkModel() {
+  xbt_assert(not sg_link_energy_is_inited(),
+             "LinkEnergy plugin and NS3 network models are not compatible. Are you looking for Ecofen, maybe?");
+
   NetPointNs3::EXTENSION_ID = simgrid::kernel::routing::NetPoint::extension_create<NetPointNs3>();
 
   ns3_initialize(ns3_tcp_model.get().c_str());
@@ -151,6 +156,7 @@ NetworkNS3Model::NetworkNS3Model() : NetworkModel() {
     XBT_VERB("SimGrid's %s is known as node %d within NS3", pt->getCname(), pt->extension<NetPointNs3>()->node_num);
   });
   simgrid::surf::on_cluster.connect(&clusterCreation_cb);
+
   simgrid::s4u::onPlatformCreated.connect(&postparse_cb);
   simgrid::s4u::NetZone::onRouteCreation.connect(&routeCreation_cb);
 }
@@ -229,8 +235,11 @@ void NetworkNS3Model::updateActionsState(double now, double delta)
 
     if(sgFlow->finished_){
       socket_to_destroy.push_back(ns3Socket);
-      XBT_DEBUG("Destroy socket %p of action %p", ns3Socket, action);
+      XBT_DEBUG("Destroy socket %p of action %p", ns3Socket.c_str(), action);
       action->finish(Action::State::done);
+    } else {
+      XBT_DEBUG("Socket %p sent %u bytes out of %u (%u remaining)", ns3Socket.c_str(), sgFlow->sentBytes_,
+                sgFlow->totalBytes_, sgFlow->remaining_);
     }
   }
 
@@ -239,7 +248,7 @@ void NetworkNS3Model::updateActionsState(double now, double delta)
     socket_to_destroy.pop_back();
     SgFlow* flow = flowFromSock.at(ns3Socket);
     if (XBT_LOG_ISENABLED(ns3, xbt_log_priority_debug)) {
-      XBT_DEBUG ("Removing socket %p of action %p", ns3Socket, flow->action_);
+      XBT_DEBUG("Removing socket %p of action %p", ns3Socket.c_str(), flow->action_);
     }
     delete flow;
     flowFromSock.erase(ns3Socket);
@@ -312,7 +321,7 @@ int NetworkNS3Action::unref()
   refcount_--;
   if (not refcount_) {
     if (action_hook.is_linked())
-      stateSet_->erase(stateSet_->iterator_to(*this));
+      simgrid::xbt::intrusive_erase(*stateSet_, *this);
     XBT_DEBUG ("Removing action %p", this);
     delete this;
     return 1;
@@ -337,8 +346,8 @@ void ns3_create_flow(simgrid::s4u::Host* src, simgrid::s4u::Host* dst,
   unsigned int node1 = src->pimpl_netpoint->extension<NetPointNs3>()->node_num;
   unsigned int node2 = dst->pimpl_netpoint->extension<NetPointNs3>()->node_num;
 
-  ns3::Ptr<ns3::Node> src_node = nodes.Get(node1);
-  ns3::Ptr<ns3::Node> dst_node = nodes.Get(node2);
+  ns3::Ptr<ns3::Node> src_node = src->pimpl_netpoint->extension<NetPointNs3>()->ns3Node_;
+  ns3::Ptr<ns3::Node> dst_node = dst->pimpl_netpoint->extension<NetPointNs3>()->ns3Node_;
 
   xbt_assert(node2 < IPV4addr.size(), "Element %s is unknown to NS3. Is it connected to any one-hop link?",
              dst->pimpl_netpoint->getCname());
@@ -392,7 +401,7 @@ void ns3_initialize(const char* TcpProtocol){
     return;
   }
 
-  xbt_die("The ns3/TcpModel must be : NewReno or Reno or Tahoe");
+  xbt_die("The ns3/TcpModel must be: NewReno or Reno or Tahoe");
 }
 
 void ns3_add_cluster(const char* id, double bw, double lat) {
@@ -409,7 +418,7 @@ void ns3_add_cluster(const char* id, double bw, double lat) {
 
   xbt_assert(Nodes.GetN() <= 65000, "Cluster with NS3 is limited to 65000 nodes");
   ns3::CsmaHelper csma;
-  csma.SetDeviceAttribute("DataRate", ns3::DataRateValue(ns3::DataRate(bw*8)));// NS3 takes bps, but we provide Bps
+  csma.SetChannelAttribute("DataRate", ns3::DataRateValue(ns3::DataRate(bw * 8))); // NS3 takes bps, but we provide Bps
   csma.SetChannelAttribute("Delay", ns3::TimeValue(ns3::Seconds(lat)));
   ns3::NetDeviceContainer devices = csma.Install(Nodes);
   XBT_DEBUG("Create CSMA");
@@ -445,18 +454,14 @@ void ns3_add_link(NetPointNs3* src, NetPointNs3* dst, double bw, double lat) {
   int srcNum = src->node_num;
   int dstNum = dst->node_num;
 
-  ns3::Ptr<ns3::Node> a = nodes.Get(srcNum);
-  ns3::Ptr<ns3::Node> b = nodes.Get(dstNum);
+  ns3::Ptr<ns3::Node> a = src->ns3Node_;
+  ns3::Ptr<ns3::Node> b = dst->ns3Node_;
 
   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)));// NS3 takes bps, but we provide Bps
+  pointToPoint.SetDeviceAttribute("DataRate",
+                                  ns3::DataRateValue(ns3::DataRate(bw * 8))); // NS3 takes bps, but we provide Bps
   pointToPoint.SetChannelAttribute("Delay", ns3::TimeValue(ns3::Seconds(lat)));
 
-  std::string filename = simgrid::xbt::string_printf("link-%d-%d.tr", srcNum, dstNum);
-  ns3::AsciiTraceHelper ascii;
-  pointToPoint.EnableAsciiAll(ascii.CreateFileStream(filename));
-  pointToPoint.EnablePcapAll ("tcp-bulk-send", false);
-
   ns3::NetDeviceContainer netA;
   netA.Add(pointToPoint.Install (a, b));