X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/371d168e21b83e2364c2ac2dbff3847588769c2b..c5f8dbbcfb10a8a1c797d0fe1671d7f7698cf6cd:/src/kernel/resource/models/network_ns3.cpp diff --git a/src/kernel/resource/models/network_ns3.cpp b/src/kernel/resource/models/network_ns3.cpp index 9904d0483d..b2064421aa 100644 --- a/src/kernel/resource/models/network_ns3.cpp +++ b/src/kernel/resource/models/network_ns3.cpp @@ -50,7 +50,6 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(res_ns3, res_network, "Network model based on ns *****************/ extern std::map> flow_from_sock; -extern std::map> sink_from_sock; static int number_of_links = 1; static int number_of_networks = 1; @@ -288,8 +287,9 @@ static void XBT_ATTRIB_CONSTRUCTOR(800) simgrid_ns3_network_model_register() }); } -static simgrid::config::Flag - ns3_tcp_model("ns3/TcpModel", "The ns-3 tcp model can be: NewReno or Reno or Tahoe", "default"); +static simgrid::config::Flag ns3_network_model_name("ns3/NetworkModel", {"ns3/TcpModel"}, + "The ns-3 tcp model can be: NewReno or Cubic", + "default", [](const std::string&) {}); 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.", "", @@ -317,20 +317,34 @@ NetworkNS3Model::NetworkNS3Model(const std::string& name) : NetworkModel(name) "LinkEnergy plugin and ns-3 network models are not compatible. Are you looking for Ecofen, maybe?"); NetPointNs3::EXTENSION_ID = routing::NetPoint::extension_create(); + auto const& NetworkProtocol = ns3_network_model_name.get(); + + if (NetworkProtocol == "UDP") { + /*UdpClient=0 +UdpEchoClientApplication=0 +UdpEchoServerApplication=0 +UdpL4Protocol=0 +UdpServer=0 +UdpSocket=0 +UdpSocketImpl=0 +UdpTraceClient=0*/ + LogComponentEnable("UdpSocket", ns3::LOG_LEVEL_DEBUG); + LogComponentEnable("UdpL4Protocol", ns3::LOG_LEVEL_DEBUG); + } else { + ns3::Config::SetDefault("ns3::TcpSocket::SegmentSize", ns3::UintegerValue(1000)); + ns3::Config::SetDefault("ns3::TcpSocket::DelAckCount", ns3::UintegerValue(1)); + ns3::Config::SetDefault("ns3::TcpSocketBase::Timestamp", ns3::BooleanValue(false)); + } - ns3::Config::SetDefault("ns3::TcpSocket::SegmentSize", ns3::UintegerValue(1000)); - ns3::Config::SetDefault("ns3::TcpSocket::DelAckCount", ns3::UintegerValue(1)); - ns3::Config::SetDefault("ns3::TcpSocketBase::Timestamp", ns3::BooleanValue(false)); - - if (auto const& TcpProtocol = ns3_tcp_model.get(); TcpProtocol == "default") { - /* nothing to do */ + if (NetworkProtocol == "NewReno" || NetworkProtocol == "Cubic") { + XBT_INFO("Switching Tcp protocol to '%s'", NetworkProtocol.c_str()); + ns3::Config::SetDefault("ns3::TcpL4Protocol::SocketType", ns3::StringValue("ns3::Tcp" + NetworkProtocol)); - } else if (TcpProtocol == "Reno" || TcpProtocol == "NewReno" || TcpProtocol == "Tahoe") { - XBT_INFO("Switching Tcp protocol to '%s'", TcpProtocol.c_str()); - ns3::Config::SetDefault("ns3::TcpL4Protocol::SocketType", ns3::StringValue("ns3::Tcp" + TcpProtocol)); + } else if (NetworkProtocol == "UDP") { + XBT_INFO("Switching network protocol to UDP."); - } else { - xbt_die("The ns3/TcpModel must be: NewReno or Reno or Tahoe"); + } else if (NetworkProtocol != "default") { + xbt_die("The ns3/NetworkModel must be: NewReno, Cubic or UDP but it's '%s'", NetworkProtocol.c_str()); } routing::NetPoint::on_creation.connect([](routing::NetPoint& pt) { @@ -390,7 +404,7 @@ double NetworkNS3Model::next_occurring_event(double sg_time) } double ns3_time = ns3::Simulator::GetNextEventTime().GetSeconds(); - XBT_DEBUG("NS3 tells that the next occuring event is at %f (it's %f in simgrid), so NS3 returns a delta of %f.", + XBT_DEBUG("NS3 tells that the next occuring event is at %f (it's %f in SimGrid), so NS3 returns a delta of %f.", ns3_time, sg_time, ns3_time - sg_time); return ns3_time - sg_time; } @@ -493,7 +507,6 @@ void NetworkNS3Model::update_actions_state(double now, double delta) } delete flow; flow_from_sock.erase(ns3_socket); - sink_from_sock.erase(ns3_socket); } } @@ -571,17 +584,18 @@ NetworkNS3Action::NetworkNS3Action(Model* model, double totalBytes, s4u::Host* s dst->get_netpoint()->get_cname()); ns3::PacketSinkHelper sink("ns3::TcpSocketFactory", ns3::InetSocketAddress(ns3::Ipv4Address::GetAny(), port_number)); - ns3::ApplicationContainer apps = sink.Install(dst_node); + sink.Install(dst_node); ns3::Ptr sock = ns3::Socket::CreateSocket(src_node, ns3::TcpSocketFactory::GetTypeId()); - 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()); + auto sock_addr = transform_socket_ptr(sock); + XBT_DEBUG("Create socket %s for a flow of %.0f Bytes from %s to %s with Interface %s", sock_addr.c_str(), totalBytes, + src->get_cname(), dst->get_cname(), addr.c_str()); - 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); + flow_from_sock.try_emplace(sock_addr, new SgFlow(static_cast(totalBytes), this)); sock->Bind(ns3::InetSocketAddress(port_number)); + ns3::Simulator::ScheduleNow(&start_flow, sock, addr.c_str(), port_number); port_number = 1 + (port_number % UINT16_MAX); @@ -612,8 +626,9 @@ void NetworkNS3Action::update_remains_lazy(double /*now*/) 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_; + auto* netext = host->get_netpoint()->extension(); + xbt_assert(netext != nullptr, "Please only use this function on ns-3 nodes"); + return netext->ns3_node_; } } // namespace simgrid