X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/a75e2b2d988881f95b2d2c65fa887d391be19a96..e33b2e471987e6c6483b5d1dafc1ac5b0da2cd31:/src/surf/network_ns3.cpp diff --git a/src/surf/network_ns3.cpp b/src/surf/network_ns3.cpp index a6ef627b70..ace2e772fc 100644 --- a/src/surf/network_ns3.cpp +++ b/src/surf/network_ns3.cpp @@ -7,6 +7,7 @@ #include #include "xbt/config.hpp" +#include "xbt/str.h" #include "xbt/string.hpp" #include "xbt/utility.hpp" @@ -70,7 +71,7 @@ NetPointNs3::NetPointNs3() : ns3_node_(ns3::CreateObject(0)) stack.Install(ns3_node_); } -WifiZone::WifiZone(std::string name_, simgrid::s4u::Host* host_, ns3::Ptr ap_node_, +WifiZone::WifiZone(const std::string& name_, simgrid::s4u::Host* host_, ns3::Ptr ap_node_, ns3::Ptr channel_, int mcs_, int nss_, int network_, int link_) : name(name_) , host(host_) @@ -93,7 +94,7 @@ bool WifiZone::is_ap(ns3::Ptr node) return false; } -WifiZone* WifiZone::by_name(std::string name) +WifiZone* WifiZone::by_name(const std::string& name) { WifiZone* zone; try { @@ -210,7 +211,24 @@ void surf_network_model_init_NS3() } static simgrid::config::Flag - ns3_tcp_model("ns3/TcpModel", "The ns-3 tcp model can be : NewReno or Reno or Tahoe", "default"); + ns3_tcp_model("ns3/TcpModel", "The ns-3 tcp model can be: NewReno or Reno or Tahoe", "default"); +static simgrid::config::Flag ns3_seed( + "ns3/seed", + "The random seed provided to ns-3. Either 'time' to seed with time(), blank to not set (default), or a number.", "", + [](std::string val) { + 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()); + } 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."); + ns3::RngSeedManager::SetSeed(v); + ns3::RngSeedManager::SetRun(v); + } + }); namespace simgrid { namespace kernel { @@ -377,8 +395,8 @@ LinkNS3::LinkNS3(NetworkNS3Model* model, const std::string& name, double bandwid ns3::NetDeviceContainer netA; WifiZone* zone = WifiZone::by_name(name); - xbt_assert(zone != 0, "Link name '%s' does not match the 'wifi_link' property of a host.", name.c_str()); - NetPointNs3* netpoint_ns3 = zone->get_host()->get_netpoint()->extension(); + xbt_assert(zone != nullptr, "Link name '%s' does not match the 'wifi_link' property of a host.", name.c_str()); + auto* netpoint_ns3 = zone->get_host()->get_netpoint()->extension(); wifi.SetRemoteStationManager("ns3::ConstantRateWifiManager", "ControlMode", ns3::StringValue("HtMcs0"), "DataMode", ns3::StringValue("HtMcs" + std::to_string(zone->get_mcs()))); @@ -407,7 +425,7 @@ LinkNS3::LinkNS3(NetworkNS3Model* model, const std::string& name, double bandwid zone->set_network(number_of_networks); zone->set_link(number_of_links); - netpoint_ns3->ipv4_address_ = transformIpv4Address(addresses.GetAddress(addresses.GetN() - 1)); + netpoint_ns3->ipv4_address_ = transformIpv4Address(addresses.GetAddress(1)); if (number_of_links == 255) { xbt_assert(number_of_networks < 255, "Number of links and networks exceed 255*255"); @@ -572,7 +590,7 @@ void ns3_add_direct_route(simgrid::kernel::routing::NetPoint* src, simgrid::kern zone->add_sta_node(); XBT_DEBUG("\tInterface stack '%s'", addr.c_str()); auto addresses = address.Assign(netA); - host_dst->ipv4_address_ = transformIpv4Address(addresses.GetAddress(addresses.GetN() - 1)); + host_dst->ipv4_address_ = transformIpv4Address(addresses.GetAddress(1)); } else { ns3::PointToPointHelper pointToPoint;