X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/d5e5174e32531cd3a94f8a737cf4cabd5aca9685..321102577020b194dfb7ba89e48687952816849e:/src/surf/network_ns3.cpp diff --git a/src/surf/network_ns3.cpp b/src/surf/network_ns3.cpp index 900518a179..26bb1901f0 100644 --- a/src/surf/network_ns3.cpp +++ b/src/surf/network_ns3.cpp @@ -1,10 +1,11 @@ -/* Copyright (c) 2007-2021. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2007-2022. 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. */ #include "simgrid/plugins/ns3.hpp" +#include #include #include @@ -55,17 +56,6 @@ static ns3::InternetStackHelper stack; static int number_of_links = 1; static int number_of_networks = 1; -/* wifi globals */ -static ns3::WifiHelper wifi; -#if NS3_MINOR_VERSION < 33 -static ns3::YansWifiPhyHelper wifiPhy = ns3::YansWifiPhyHelper::Default(); -#else -static ns3::YansWifiPhyHelper wifiPhy; -#endif -static ns3::YansWifiChannelHelper wifiChannel = ns3::YansWifiChannelHelper::Default(); -static ns3::WifiMacHelper wifiMac; -static ns3::MobilityHelper mobility; - simgrid::xbt::Extension NetPointNs3::EXTENSION_ID; static std::string transformIpv4Address(ns3::Ipv4Address from) @@ -75,7 +65,7 @@ static std::string transformIpv4Address(ns3::Ipv4Address from) return sstream.str(); } -NetPointNs3::NetPointNs3() : ns3_node_(ns3::CreateObject(0)) +NetPointNs3::NetPointNs3() { stack.Install(ns3_node_); } @@ -91,14 +81,28 @@ static void resumeWifiDevice(ns3::Ptr device) static void zoneCreation_cb(simgrid::s4u::NetZone const& zone) { - simgrid::kernel::routing::WifiZone* wifizone = dynamic_cast(zone.get_impl()); + auto const* wifizone = dynamic_cast(zone.get_impl()); if (wifizone == nullptr) return; + /* wifi globals */ + static ns3::WifiHelper wifi; +#if NS3_MINOR_VERSION < 33 + static ns3::YansWifiPhyHelper wifiPhy = ns3::YansWifiPhyHelper::Default(); +#else + static ns3::YansWifiPhyHelper wifiPhy; +#endif + static ns3::YansWifiChannelHelper wifiChannel = ns3::YansWifiChannelHelper::Default(); + static ns3::WifiMacHelper wifiMac; + static ns3::MobilityHelper mobility; + #if NS3_MINOR_VERSION < 32 wifi.SetStandard(ns3::WIFI_PHY_STANDARD_80211n_5GHZ); -#else +#elif NS3_MINOR_VERSION < 36 wifi.SetStandard(ns3::WIFI_STANDARD_80211n_5GHZ); +#else + wifi.SetStandard(ns3::WIFI_STANDARD_80211n); + wifiPhy.Set ("ChannelSettings", ns3::StringValue ("{0, 0, BAND_5GHZ, 0}")); #endif std::string ssid = wifizone->get_name(); @@ -139,7 +143,7 @@ static void zoneCreation_cb(simgrid::s4u::NetZone const& zone) ns3::Ptr station_ns3_node = nullptr; double distance; double angle = 0; - int nb_stations = wifizone->get_all_hosts().size() - 1; + auto nb_stations = static_cast(wifizone->get_all_hosts().size() - 1); double step = 2 * M_PI / nb_stations; for (auto station_host : wifizone->get_all_hosts()) { station_netpoint_ns3 = station_host->get_netpoint()->extension(); @@ -202,12 +206,11 @@ static void clusterCreation_cb(simgrid::kernel::routing::ClusterCreationArgs con for (int const& i : cluster.radicals) { // Create private link std::string host_id = cluster.prefix + std::to_string(i) + cluster.suffix; - auto* src = simgrid::s4u::Host::by_name(host_id)->get_netpoint(); - auto* dst = simgrid::s4u::Engine::get_instance()->netpoint_by_name_or_null(cluster.router_id); + auto const* src = simgrid::s4u::Host::by_name(host_id)->get_netpoint(); + auto const* dst = simgrid::s4u::Engine::get_instance()->netpoint_by_name_or_null(cluster.router_id); xbt_assert(dst != nullptr, "No router named %s", cluster.router_id.c_str()); - ns3_add_direct_route(src, dst, cluster.bw, cluster.lat, cluster.id, - cluster.sharing_policy); // Any ns-3 route is symmetrical + ns3_add_direct_route(src, dst, cluster.bw, cluster.lat, cluster.sharing_policy); // Any ns-3 route is symmetrical // Also add the host to the list of hosts that will be connected to the backbone Nodes.Add(src->extension()->ns3_node_); @@ -218,7 +221,8 @@ static void clusterCreation_cb(simgrid::kernel::routing::ClusterCreationArgs con xbt_assert(Nodes.GetN() <= 65000, "Cluster with ns-3 is limited to 65000 nodes"); ns3::CsmaHelper csma; csma.SetChannelAttribute("DataRate", - ns3::DataRateValue(ns3::DataRate(cluster.bb_bw * 8))); // ns-3 takes bps, but we provide Bps + ns3::DataRateValue(ns3::DataRate( + static_cast(cluster.bb_bw * 8)))); // ns-3 takes bps, but we provide Bps csma.SetChannelAttribute("Delay", ns3::TimeValue(ns3::Seconds(cluster.bb_lat))); ns3::NetDeviceContainer devices = csma.Install(Nodes); XBT_DEBUG("Create CSMA"); @@ -238,10 +242,11 @@ 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*/, - std::vector const& link_list) +static void routeCreation_cb(bool symmetrical, const simgrid::kernel::routing::NetPoint* src, + const simgrid::kernel::routing::NetPoint* dst, + const simgrid::kernel::routing::NetPoint* /*gw_src*/, + const simgrid::kernel::routing::NetPoint* /*gw_dst*/, + std::vector const& link_list) { /* ignoring routes from StarZone, not supported */ if (not src || not dst) @@ -254,11 +259,9 @@ static void routeCreation_cb(bool symmetrical, simgrid::kernel::routing::NetPoin (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); XBT_DEBUG("\tLink (%s) bw:%fbps lat:%fs", link->get_cname(), link->get_bandwidth(), link->get_latency()); - ns3_add_direct_route(src, dst, link->get_bandwidth(), link->get_latency(), link->get_name(), - link->get_sharing_policy()); + ns3_add_direct_route(src, dst, link->get_bandwidth(), link->get_latency(), link->get_sharing_policy()); } else { static bool warned_about_long_routes = false; @@ -293,12 +296,12 @@ static simgrid::config::Flag ns3_seed( if (val.length() == 0) return; if (strcasecmp(val.c_str(), "time") == 0) { - std::srand(time(NULL)); - ns3::RngSeedManager::SetSeed(std::rand()); - ns3::RngSeedManager::SetRun(std::rand()); + std::default_random_engine prng(time(nullptr)); + ns3::RngSeedManager::SetSeed(static_cast(prng())); + ns3::RngSeedManager::SetRun(static_cast(prng())); } else { - int v = xbt_str_parse_int( - val.c_str(), "Invalid value for option ns3/seed. It must be either 'time', a number, or left empty."); + auto v = static_cast(xbt_str_parse_int( + val.c_str(), "Invalid value for option ns3/seed. It must be either 'time', a number, or left empty.")); ns3::RngSeedManager::SetSeed(v); ns3::RngSeedManager::SetRun(v); } @@ -319,7 +322,7 @@ NetworkNS3Model::NetworkNS3Model(const std::string& name) : NetworkModel(name) ns3::Config::SetDefault("ns3::TcpSocket::DelAckCount", ns3::UintegerValue(1)); ns3::Config::SetDefault("ns3::TcpSocketBase::Timestamp", ns3::BooleanValue(false)); - auto TcpProtocol = ns3_tcp_model.get(); + auto const& TcpProtocol = ns3_tcp_model.get(); if (TcpProtocol == "default") { /* nothing to do */ @@ -338,6 +341,7 @@ NetworkNS3Model::NetworkNS3Model(const std::string& name) : NetworkModel(name) s4u::Engine::on_platform_created_cb([]() { /* Create the ns3 topology based on routing strategy */ + ns3::GlobalRouteManager::DeleteGlobalRoutes(); // just in case this callback is called twice ns3::GlobalRouteManager::BuildGlobalRoutingDatabase(); ns3::GlobalRouteManager::InitializeRoutes(); }); @@ -346,7 +350,12 @@ NetworkNS3Model::NetworkNS3Model(const std::string& name) : NetworkModel(name) s4u::NetZone::on_seal_cb(&zoneCreation_cb); } -LinkImpl* NetworkNS3Model::create_link(const std::string& name, const std::vector& bandwidths) +NetworkNS3Model::~NetworkNS3Model() +{ + ns3::Simulator::Destroy(); +} + +StandardLinkImpl* NetworkNS3Model::create_link(const std::string& name, const std::vector& bandwidths) { xbt_assert(bandwidths.size() == 1, "ns-3 links must use only 1 bandwidth."); auto* link = new LinkNS3(name, bandwidths[0]); @@ -354,7 +363,7 @@ LinkImpl* NetworkNS3Model::create_link(const std::string& name, const std::vecto return link; } -LinkImpl* NetworkNS3Model::create_wifi_link(const std::string& name, const std::vector& bandwidths) +StandardLinkImpl* NetworkNS3Model::create_wifi_link(const std::string& name, const std::vector& bandwidths) { auto* link = create_link(name, bandwidths); link->set_sharing_policy(s4u::Link::SharingPolicy::WIFI, {}); @@ -403,29 +412,25 @@ void NetworkNS3Model::update_actions_state(double now, double delta) { static std::vector socket_to_destroy; - std::string ns3_socket; - for (const auto& elm : flow_from_sock) { - ns3_socket = elm.first; - SgFlow* sgFlow = elm.second; + for (const auto& [ns3_socket, sgFlow] : flow_from_sock) { NetworkNS3Action* action = sgFlow->action_; XBT_DEBUG("Processing flow %p (socket %s, action %p)", sgFlow, ns3_socket.c_str(), action); // Because NS3 stops as soon as a flow is finished, the other flows that ends at the same time may remains in an // inconsistent 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_; + double 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_; - std::vector route = std::vector(); - + std::vector route; action->get_src().route_to(&action->get_dst(), route, nullptr); for (auto const& link : route) instr::resource_set_utilization("LINK", "bandwidth_used", link->get_cname(), action->get_category(), - (data_delta_sent) / delta, now - delta, delta); + data_delta_sent / delta, now - delta, delta); action->last_sent_ = sgFlow->sent_bytes_; } @@ -443,7 +448,7 @@ void NetworkNS3Model::update_actions_state(double now, double delta) } while (not socket_to_destroy.empty()) { - ns3_socket = socket_to_destroy.back(); + std::string ns3_socket = socket_to_destroy.back(); socket_to_destroy.pop_back(); SgFlow* flow = flow_from_sock.at(ns3_socket); if (XBT_LOG_ISENABLED(res_ns3, xbt_log_priority_debug)) { @@ -459,7 +464,7 @@ void NetworkNS3Model::update_actions_state(double now, double delta) * Resource * ************/ -LinkNS3::LinkNS3(const std::string& name, double bandwidth) : LinkImpl(name) +LinkNS3::LinkNS3(const std::string& name, double bandwidth) : StandardLinkImpl(name) { bandwidth_.peak = bandwidth; } @@ -525,7 +530,7 @@ NetworkNS3Action::NetworkNS3Action(Model* model, double totalBytes, s4u::Host* s ns3::Ptr src_node = get_ns3node_from_sghost(src); ns3::Ptr dst_node = get_ns3node_from_sghost(dst); - std::string& addr = dst->get_netpoint()->extension()->ipv4_address_; + const std::string& addr = dst->get_netpoint()->extension()->ipv4_address_; xbt_assert(not addr.empty(), "Element %s is unknown to ns-3. Is it connected to any one-hop link?", dst->get_netpoint()->get_cname()); @@ -537,8 +542,8 @@ NetworkNS3Action::NetworkNS3Action(Model* model, double totalBytes, s4u::Host* s XBT_DEBUG("Create socket %s for a flow of %.0f Bytes from %s to %s with Interface %s", transform_socket_ptr(sock).c_str(), totalBytes, src->get_cname(), dst->get_cname(), addr.c_str()); - flow_from_sock.insert({transform_socket_ptr(sock), new SgFlow(totalBytes, this)}); - sink_from_sock.insert({transform_socket_ptr(sock), apps}); + flow_from_sock.try_emplace(transform_socket_ptr(sock), new SgFlow(static_cast(totalBytes), this)); + sink_from_sock.try_emplace(transform_socket_ptr(sock), apps); sock->Bind(ns3::InetSocketAddress(port_number)); ns3::Simulator::ScheduleNow(&start_flow, sock, addr.c_str(), port_number); @@ -558,7 +563,7 @@ void NetworkNS3Action::resume() THROW_UNIMPLEMENTED; } -std::list NetworkNS3Action::get_links() const +std::list NetworkNS3Action::get_links() const { THROW_UNIMPLEMENTED; } @@ -570,7 +575,7 @@ void NetworkNS3Action::update_remains_lazy(double /*now*/) } // namespace resource } // namespace kernel -ns3::Ptr get_ns3node_from_sghost(simgrid::s4u::Host* host) +ns3::Ptr get_ns3node_from_sghost(const simgrid::s4u::Host* host) { xbt_assert(host->get_netpoint()->extension() != nullptr, "Please only use this function on ns-3 nodes"); return host->get_netpoint()->extension()->ns3_node_; @@ -591,8 +596,8 @@ void ns3_simulator(double maxSeconds) id.Cancel(); } -void ns3_add_direct_route(simgrid::kernel::routing::NetPoint* src, simgrid::kernel::routing::NetPoint* dst, double bw, - double lat, const std::string& link_name, simgrid::s4u::Link::SharingPolicy policy) +void ns3_add_direct_route(const simgrid::kernel::routing::NetPoint* src, const simgrid::kernel::routing::NetPoint* dst, + double bw, double lat, simgrid::s4u::Link::SharingPolicy policy) { ns3::Ipv4AddressHelper address; ns3::NetDeviceContainer netA; @@ -610,8 +615,9 @@ void ns3_add_direct_route(simgrid::kernel::routing::NetPoint* src, simgrid::kern ns3::PointToPointHelper pointToPoint; XBT_DEBUG("\tAdd PTP from %s to %s bw:'%f Bps' lat:'%fs'", src->get_cname(), dst->get_cname(), bw, lat); - pointToPoint.SetDeviceAttribute("DataRate", - ns3::DataRateValue(ns3::DataRate(bw * 8))); // ns-3 takes bps, but we provide Bps + pointToPoint.SetDeviceAttribute( + "DataRate", + ns3::DataRateValue(ns3::DataRate(static_cast(bw * 8)))); // ns-3 takes bps, but we provide Bps pointToPoint.SetChannelAttribute("Delay", ns3::TimeValue(ns3::Seconds(lat))); netA.Add(pointToPoint.Install(host_src->ns3_node_, host_dst->ns3_node_));