#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"
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++;
}
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());
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);
}
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_);
}
}
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);
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());
}
// initialize the NS3 interface and environment
-void ns3_initialize(const char* TcpProtocol){
-// tcpModel are:
-// "ns3::TcpNewReno"
-// "ns3::TcpReno"
-// "ns3::TcpTahoe"
+void ns3_initialize(std::string TcpProtocol)
+{
+ // tcpModel are:
+ // "ns3::TcpNewReno"
+ // "ns3::TcpReno"
+ // "ns3::TcpTahoe"
ns3::Config::SetDefault ("ns3::TcpSocket::SegmentSize", ns3::UintegerValue (1000));
ns3::Config::SetDefault ("ns3::TcpSocket::DelAckCount", ns3::UintegerValue (1));
ns3::Config::SetDefault ("ns3::TcpSocketBase::Timestamp", ns3::BooleanValue (false));
- if (not strcmp(TcpProtocol, "default"))
- return;
+ if (TcpProtocol == "default") {
+ /* nothing to do */
- if (not strcmp(TcpProtocol, "Reno")) {
- XBT_INFO("Switching Tcp protocol to '%s'",TcpProtocol);
+ } else if (TcpProtocol == "Reno") {
+ XBT_INFO("Switching Tcp protocol to '%s'", TcpProtocol.c_str());
ns3::Config::SetDefault ("ns3::TcpL4Protocol::SocketType", ns3::StringValue("ns3::TcpReno"));
- return;
- }
- if (not strcmp(TcpProtocol, "NewReno")) {
- XBT_INFO("Switching Tcp protocol to '%s'",TcpProtocol);
+
+ } else if (TcpProtocol == "NewReno") {
+ XBT_INFO("Switching Tcp protocol to '%s'", TcpProtocol.c_str());
ns3::Config::SetDefault ("ns3::TcpL4Protocol::SocketType", ns3::StringValue("ns3::TcpNewReno"));
- return;
- }
- if (not strcmp(TcpProtocol, "Tahoe")) {
- XBT_INFO("Switching Tcp protocol to '%s'",TcpProtocol);
+
+ } else if (TcpProtocol == "Tahoe") {
+ XBT_INFO("Switching Tcp protocol to '%s'", TcpProtocol.c_str());
ns3::Config::SetDefault ("ns3::TcpL4Protocol::SocketType", ns3::StringValue("ns3::TcpTahoe"));
- return;
- }
- xbt_die("The ns3/TcpModel must be: NewReno or Reno or Tahoe");
+ } else {
+ xbt_die("The ns3/TcpModel must be: NewReno or Reno or Tahoe");
+ }
}
void ns3_add_cluster(const char* id, 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.SetChannelAttribute("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)));
ns3::NetDeviceContainer netA;