X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/5aede30a76a1ec2fe6686ddfe8f1c9f7771af026..390ee57ed79bf7577c2bce6df6a25aba57ff476e:/src/surf/network_ns3.cpp diff --git a/src/surf/network_ns3.cpp b/src/surf/network_ns3.cpp index 48d8d1e83d..5797b32474 100644 --- a/src/surf/network_ns3.cpp +++ b/src/surf/network_ns3.cpp @@ -14,12 +14,14 @@ #include "ns3/ns3_simulator.h" #include "network_ns3.hpp" -#include "src/surf/HostImpl.hpp" -#include "src/surf/surf_private.h" #include "simgrid/sg_config.h" #include "src/instr/instr_private.h" // TRACE_is_enabled(). FIXME: remove by subscribing tracing to the surf signals +#include "src/kernel/routing/NetCard.hpp" +#include "src/surf/HostImpl.hpp" +#include "src/surf/surf_private.h" #include "simgrid/s4u/As.hpp" +#include "simgrid/s4u/engine.hpp" XBT_LOG_NEW_DEFAULT_SUBCATEGORY(ns3, surf, "Logging specific to the SURF network NS3 module"); @@ -99,53 +101,53 @@ static void parse_ns3_add_cluster(sg_platf_cluster_cbarg_t cluster) xbt_free(bw); } +static void routeCreation_cb(bool symmetrical, simgrid::kernel::routing::NetCard* src, + simgrid::kernel::routing::NetCard* dst, simgrid::kernel::routing::NetCard* gw_src, + simgrid::kernel::routing::NetCard* gw_dst, std::vector* link_list) +{ + if (link_list->size() == 1) { + simgrid::surf::LinkNS3* link = static_cast(link_list->at(0)); + + XBT_DEBUG("Route from '%s' to '%s' with link '%s' %s", src->cname(), dst->cname(), link->getName(), + (symmetrical ? "(symmetrical)" : "(not symmetrical)")); + char* link_bdw = bprintf("%fBps", link->bandwidth()); + char* link_lat = bprintf("%fs", link->latency()); + + // XBT_DEBUG("src (%s), dst (%s), src_id = %d, dst_id = %d",src,dst, src_id, dst_id); + XBT_DEBUG("\tLink (%s) bdw:%s lat:%s", link->getName(), link_bdw, link_lat); + + // create link ns3 + HostNs3* host_src = nullptr; + HostNs3* host_dst = nullptr; + if (src->isHost()) + host_src = sg_host_by_name(src->cname())->extension(); + else + host_src = static_cast(xbt_lib_get_or_null(as_router_lib, src->cname(), NS3_ASR_LEVEL)); + + if (dst->isHost()) + host_dst = sg_host_by_name(dst->cname())->extension(); + else + host_dst = static_cast(xbt_lib_get_or_null(as_router_lib, dst->cname(), NS3_ASR_LEVEL)); + + xbt_assert(host_src != nullptr, "Network element %s does not seem to be NS3-ready", src->cname()); + xbt_assert(host_dst != nullptr, "Network element %s does not seem to be NS3-ready", dst->cname()); + + ns3_add_link(host_src->node_num, host_dst->node_num, link_bdw, link_lat); + if (symmetrical) + ns3_add_link(host_dst->node_num, host_src->node_num, link_bdw, link_lat); + + xbt_free(link_bdw); + xbt_free(link_lat); + } +} + /* Create the ns3 topology based on routing strategy */ -static void create_ns3_topology(void) +static void postparse_cb(void) { XBT_DEBUG("Starting topology generation"); xbt_dynar_shrink(IPV4addr,0); - //get the onelinks from the parsed platform - xbt_dynar_t onelink_routes = routing_platf->getOneLinkRoutes(); - - std::unordered_set already_seen = std::unordered_set(); - - XBT_DEBUG("There is %ld one-link routes",onelink_routes->used); - simgrid::kernel::routing::Onelink *onelink; - unsigned int iter; - xbt_dynar_foreach(onelink_routes, iter, onelink) { - const char* src = onelink->src_->name().c_str(); - const char* dst = onelink->dst_->name().c_str(); - simgrid::surf::LinkNS3 *link = static_cast(onelink->link_); - - if (strcmp(src,dst) && (already_seen.find(link) == already_seen.end())) { - already_seen.insert(link); - XBT_DEBUG("Route from '%s' to '%s' with link '%s'", src, dst, link->getName()); - char* link_bdw = bprintf("%fBps", link->bandwidth()); - char* link_lat = bprintf("%fs", link->latency()); - - // XBT_DEBUG("src (%s), dst (%s), src_id = %d, dst_id = %d",src,dst, src_id, dst_id); - XBT_DEBUG("\tLink (%s) bdw:%s lat:%s", link->getName(), link_bdw, link_lat); - - //create link ns3 - HostNs3* host_src = ns3_find_host(src); - if (!host_src) - host_src = static_cast(xbt_lib_get_or_null(as_router_lib, src, NS3_ASR_LEVEL)); - HostNs3* host_dst = ns3_find_host(dst); - if(!host_dst) - host_dst = static_cast(xbt_lib_get_or_null(as_router_lib, dst, NS3_ASR_LEVEL)); - - if (!host_src || !host_dst) - xbt_die("\tns3_add_link from %d to %d",host_src->node_num,host_dst->node_num); - - ns3_add_link(host_src->node_num, host_dst->node_num, link_bdw, link_lat); - - xbt_free(link_bdw); - xbt_free(link_lat); - } - } - ns3::GlobalRouteManager::BuildGlobalRoutingDatabase(); ns3::GlobalRouteManager::InitializeRoutes(); } @@ -174,11 +176,11 @@ namespace surf { NetworkNS3Model::NetworkNS3Model() : NetworkModel() { ns3_initialize(ns3_tcp_model.get().c_str()); - routing_model_create(nullptr); simgrid::s4u::Host::onCreation.connect(ns3_add_host); simgrid::kernel::routing::netcardCreatedCallbacks.connect(ns3_add_netcard); simgrid::surf::on_cluster.connect (&parse_ns3_add_cluster); - simgrid::surf::on_postparse.connect(&create_ns3_topology); + simgrid::surf::on_postparse.connect(&postparse_cb); + simgrid::s4u::As::onRouteCreation.connect(&routeCreation_cb); HostNs3::EXTENSION_ID = simgrid::s4u::Host::extension_create(); @@ -193,10 +195,10 @@ NetworkNS3Model::~NetworkNS3Model() { xbt_dict_free(&flowFromSock); } -Link* NetworkNS3Model::createLink(const char *name, double bandwidth, double latency, e_surf_link_sharing_policy_t policy, - xbt_dict_t properties){ - - return new LinkNS3(this, name, properties, bandwidth, latency); +Link* NetworkNS3Model::createLink(const char* name, double bandwidth, double latency, + e_surf_link_sharing_policy_t policy) +{ + return new LinkNS3(this, name, bandwidth, latency); } Action* NetworkNS3Model::communicate(s4u::Host* src, s4u::Host* dst, double size, double rate) @@ -253,7 +255,7 @@ void NetworkNS3Model::updateActionsState(double now, double delta) std::vector route = std::vector(); - routing_platf->getRouteAndLatency(action->src_->pimpl_netcard, action->dst_->pimpl_netcard, &route, nullptr); + action->src_->routeTo(action->dst_, &route, nullptr); for (auto link : route) TRACE_surf_link_set_utilization (link->getName(), action->getCategory(), (data_delta_sent)/delta, now-delta, delta); @@ -283,8 +285,8 @@ void NetworkNS3Model::updateActionsState(double now, double delta) * Resource * ************/ -LinkNS3::LinkNS3(NetworkNS3Model *model, const char *name, xbt_dict_t props, double bandwidth, double latency) - : Link(model, name, props) +LinkNS3::LinkNS3(NetworkNS3Model* model, const char* name, double bandwidth, double latency) + : Link(model, name, nullptr) { bandwidth_.peak = bandwidth; latency_.peak = latency; @@ -314,11 +316,11 @@ void LinkNS3::setLatencyTrace(tmgr_trace_t trace) { NetworkNS3Action::NetworkNS3Action(Model* model, double size, s4u::Host* src, s4u::Host* dst) : NetworkAction(model, size, false) { - XBT_DEBUG("Communicate from %s to %s", src->name().c_str(), dst->name().c_str()); + XBT_DEBUG("Communicate from %s to %s", src->cname(), dst->cname()); src_ = src; dst_ = dst; - ns3_create_flow(src->name().c_str(), dst->name().c_str(), surf_get_clock(), size, this); + ns3_create_flow(src, dst, surf_get_clock(), size, this); Link::onCommunicate(this, src, dst); } @@ -353,17 +355,19 @@ int NetworkNS3Action::unref() } } -void ns3_simulator(double maxSeconds){ +void ns3_simulator(double maxSeconds) +{ if (maxSeconds > 0.0) // If there is a maximum amount of time to run ns3::Simulator::Stop(ns3::Seconds(maxSeconds)); - XBT_DEBUG("Start simulator for at most %fs",maxSeconds); + XBT_DEBUG("Start simulator for at most %fs (current time: %f)", maxSeconds, surf_get_clock()); ns3::Simulator::Run (); } -void ns3_create_flow(const char* a,const char *b,double startTime,u_int32_t TotalBytes,simgrid::surf::NetworkNS3Action * action) +void ns3_create_flow(simgrid::s4u::Host* src, simgrid::s4u::Host* dst, double startTime, u_int32_t TotalBytes, + simgrid::surf::NetworkNS3Action* action) { - int node1 = ns3_find_host(a)->node_num; - int node2 = ns3_find_host(b)->node_num; + int node1 = src->extension()->node_num; + int node2 = dst->extension()->node_num; ns3::Ptr src_node = nodes.Get(node1); ns3::Ptr dst_node = nodes.Get(node2);