X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/7ac1fa0456cc8bbe1401ed3fd94b845a0a3698f3..9bcd28fb0c558fbaa23ee46416f96baef5279045:/src/surf/network_ns3.cpp diff --git a/src/surf/network_ns3.cpp b/src/surf/network_ns3.cpp index 08a88e1a14..835e03f07e 100644 --- a/src/surf/network_ns3.cpp +++ b/src/surf/network_ns3.cpp @@ -5,6 +5,7 @@ #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,10 +81,21 @@ 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 @@ -139,7 +140,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 = 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 +203,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_); @@ -238,9 +238,10 @@ 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*/, +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 */ @@ -254,11 +255,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 +292,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(prng()); + ns3::RngSeedManager::SetRun(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."); + int 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 +318,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 */ @@ -419,19 +418,18 @@ void NetworkNS3Model::update_actions_state(double now, double delta) // 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_; } @@ -531,7 +529,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()); @@ -576,7 +574,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_; @@ -597,8 +595,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;