X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/5d71ff352093c45c115ab45ca55b1b91cedcd2b5..79b3fb5610812a6434ca06222ce71b65e31555ee:/src/surf/network_ns3.cpp diff --git a/src/surf/network_ns3.cpp b/src/surf/network_ns3.cpp index c6e2ccef03..0dc2149118 100644 --- a/src/surf/network_ns3.cpp +++ b/src/surf/network_ns3.cpp @@ -69,11 +69,11 @@ static void clusterCreation_cb(simgrid::kernel::routing::ClusterCreationArgs con for (int const& i : *cluster.radicals) { // Routers don't create a router on the other end of the private link by themselves. // We just need this router to be given an ID so we create a temporary NetPointNS3 so that it gets one - NetPointNs3* host_dst = new NetPointNs3(); + auto* host_dst = new NetPointNs3(); // Create private link - std::string host_id = cluster.prefix + std::to_string(i) + cluster.suffix; - NetPointNs3* host_src = simgrid::s4u::Host::by_name(host_id)->pimpl_netpoint->extension(); + std::string host_id = cluster.prefix + std::to_string(i) + cluster.suffix; + auto* host_src = simgrid::s4u::Host::by_name(host_id)->pimpl_netpoint->extension(); xbt_assert(host_src, "Cannot find a ns-3 host of name %s", host_id.c_str()); // Any ns-3 route is symmetrical @@ -92,7 +92,7 @@ static void routeCreation_cb(bool symmetrical, simgrid::kernel::routing::NetPoin std::vector const& link_list) { if (link_list.size() == 1) { - simgrid::kernel::resource::LinkNS3* link = static_cast(link_list[0]); + auto* link = static_cast(link_list[0]); XBT_DEBUG("Route from '%s' to '%s' with link '%s' %s", src->get_cname(), dst->get_cname(), link->get_cname(), (symmetrical ? "(symmetrical)" : "(not symmetrical)")); @@ -101,8 +101,8 @@ static void routeCreation_cb(bool symmetrical, simgrid::kernel::routing::NetPoin XBT_DEBUG("\tLink (%s) bw:%fbps lat:%fs", link->get_cname(), link->get_bandwidth(), link->get_latency()); // create link ns3 - NetPointNs3* host_src = src->extension(); - NetPointNs3* host_dst = dst->extension(); + auto* host_src = src->extension(); + auto* host_dst = dst->extension(); 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()); @@ -157,7 +157,7 @@ NetworkNS3Model::NetworkNS3Model() : NetworkModel(Model::UpdateAlgo::FULL) NetPointNs3::EXTENSION_ID = routing::NetPoint::extension_create(); - ns3_initialize(ns3_tcp_model.get().c_str()); + ns3_initialize(ns3_tcp_model.get()); routing::NetPoint::on_creation.connect([](routing::NetPoint& pt) { pt.extension_set(new NetPointNs3()); @@ -173,32 +173,39 @@ NetworkNS3Model::~NetworkNS3Model() { IPV4addr.clear(); } -LinkImpl* NetworkNS3Model::create_link(const std::string& name, std::vector bandwidths, double latency, - s4u::Link::SharingPolicy policy) +LinkImpl* NetworkNS3Model::create_link(const std::string& name, const std::vector& bandwidths, double latency, + s4u::Link::SharingPolicy) { - xbt_assert(bandwidths.size() == 1, "Non WIFI links must use only 1 bandwidth."); + xbt_assert(bandwidths.size() == 1, "ns-3 links must use only 1 bandwidth."); return new LinkNS3(this, name, bandwidths[0], latency); } Action* NetworkNS3Model::communicate(s4u::Host* src, s4u::Host* dst, double size, double rate) { + xbt_assert(rate == -1, + "Communication over ns-3 links cannot specify a specific rate. Please use -1 as a value instead of %f.", + rate); return new NetworkNS3Action(this, size, src, dst); } double NetworkNS3Model::next_occuring_event(double now) { - double time_to_next_flow_completion; + double time_to_next_flow_completion = 0.0; XBT_DEBUG("ns3_next_occuring_event"); //get the first relevant value from the running_actions list - if (not get_started_action_set()->size() || now == 0.0) + if (get_started_action_set()->empty() || now == 0.0) return -1.0; - else - do { - ns3_simulator(now); - time_to_next_flow_completion = ns3::Simulator::Now().GetSeconds() - surf_get_clock(); - } while(double_equals(time_to_next_flow_completion, 0, sg_surf_precision)); + XBT_DEBUG("doing a ns3 simulation for a duration of %f", now); + ns3_simulator(now); + time_to_next_flow_completion = ns3::Simulator::Now().GetSeconds() - surf_get_clock(); + // NS-3 stops as soon as a flow ends, + // but it does not process the other flows that may finish at the same (simulated) time. + // If another flow ends at the same time, time_to_next_flow_completion = 0 + if(double_equals(time_to_next_flow_completion, 0, sg_surf_precision)) + time_to_next_flow_completion = 0.0; + XBT_DEBUG("min : %f", now); XBT_DEBUG("ns3 time : %f", ns3::Simulator::Now().GetSeconds()); XBT_DEBUG("surf time : %f", surf_get_clock()); @@ -221,12 +228,18 @@ void NetworkNS3Model::update_actions_state(double now, double delta) } std::string ns3_socket; - for (auto elm : flow_from_sock) { + for (const auto& elm : flow_from_sock) { ns3_socket = elm.first; SgFlow* sgFlow = elm.second; NetworkNS3Action * action = sgFlow->action_; XBT_DEBUG("Processing socket %p (action %p)",sgFlow,action); - action->set_remains(action->get_cost() - sgFlow->sent_bytes_); + // Because NS3 stops as soon as a flow is finished, the other flows that ends at the same time may remains in an inconsistant 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_; + 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_; @@ -244,6 +257,7 @@ void NetworkNS3Model::update_actions_state(double now, double delta) if(sgFlow->finished_){ 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); } else { XBT_DEBUG("Socket %p sent %u bytes out of %u (%u remaining)", ns3_socket.c_str(), sgFlow->sent_bytes_, @@ -278,15 +292,15 @@ LinkNS3::LinkNS3(NetworkNS3Model* model, const std::string& name, double bandwid LinkNS3::~LinkNS3() = default; -void LinkNS3::apply_event(profile::Event* event, double value) +void LinkNS3::apply_event(profile::Event*, double) { THROW_UNIMPLEMENTED; } -void LinkNS3::set_bandwidth_profile(profile::Profile* profile) +void LinkNS3::set_bandwidth_profile(profile::Profile*) { xbt_die("The ns-3 network model doesn't support bandwidth profiles"); } -void LinkNS3::set_latency_profile(profile::Profile* profile) +void LinkNS3::set_latency_profile(profile::Profile*) { xbt_die("The ns-3 network model doesn't support latency profiles"); }