X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/09af10ff2dab85bca012b8767af7ea1047efbba7..50102ec1c30562e20d450afa7015374387bf1904:/src/surf/network_ns3.cpp diff --git a/src/surf/network_ns3.cpp b/src/surf/network_ns3.cpp index 1a704b8eab..c5e05259f3 100644 --- a/src/surf/network_ns3.cpp +++ b/src/surf/network_ns3.cpp @@ -327,7 +327,7 @@ void NetworkNS3Model::update_actions_state(double now, double delta) ns3_socket = elm.first; SgFlow* sgFlow = elm.second; NetworkNS3Action * action = sgFlow->action_; - XBT_DEBUG("Processing socket %p (action %p)",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. @@ -349,7 +349,7 @@ void NetworkNS3Model::update_actions_state(double now, double delta) action->last_sent_ = sgFlow->sent_bytes_; } - if(sgFlow->finished_){ + if ((sgFlow->finished_) && (remains <= 0)) { // finished_ should not become true before remains gets to 0, but it sometimes does. Let's play safe, here. socket_to_destroy.push_back(ns3_socket); XBT_DEBUG("Destroy socket %s of action %p", ns3_socket.c_str(), action); action->set_remains(0); @@ -460,6 +460,20 @@ void LinkNS3::set_latency_profile(profile::Profile*) NetworkNS3Action::NetworkNS3Action(Model* model, double totalBytes, s4u::Host* src, s4u::Host* dst) : NetworkAction(model, *src, *dst, totalBytes, false) { + // ns-3 fails when src = dst, so avoid the problem by considering that communications are infinitely fast on the + // loopback that does not exists + if (src == dst) { + static bool warned = false; + if (not warned) { + XBT_WARN("Sending from a host %s to itself is not supported by ns-3. Every such communication finishes " + "immediately upon startup.", + src->get_cname()); + warned = true; + } + finish(Action::State::FINISHED); + return; + } + // If there is no other started actions, we need to move NS-3 forward to be sync with SimGrid if (model->get_started_action_set()->size()==1){ while(double_positive(surf_get_clock() - ns3::Simulator::Now().GetSeconds(), sg_surf_precision)){ @@ -468,9 +482,7 @@ NetworkNS3Action::NetworkNS3Action(Model* model, double totalBytes, s4u::Host* s } } - XBT_DEBUG("Communicate from %s to %s", src->get_cname(), dst->get_cname()); - - static int port_number = 1025; // Port number is limited from 1025 to 65 000 + static uint16_t port_number = 1; ns3::Ptr src_node = src->get_netpoint()->extension()->ns3_node_; ns3::Ptr dst_node = dst->get_netpoint()->extension()->ns3_node_; @@ -479,25 +491,23 @@ NetworkNS3Action::NetworkNS3Action(Model* model, double totalBytes, s4u::Host* s 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()); - XBT_DEBUG("ns3: Create flow of %.0f Bytes from %s to %s with Interface %s", totalBytes, src->get_cname(), - dst->get_cname(), addr.c_str()); ns3::PacketSinkHelper sink("ns3::TcpSocketFactory", ns3::InetSocketAddress(ns3::Ipv4Address::GetAny(), port_number)); ns3::ApplicationContainer apps = 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()); + flow_from_sock.insert({transform_socket_ptr(sock), new SgFlow(totalBytes, this)}); sink_from_sock.insert({transform_socket_ptr(sock), apps}); sock->Bind(ns3::InetSocketAddress(port_number)); - ns3::Simulator::ScheduleNow(&start_flow, sock, addr.c_str(), port_number); - port_number++; - if(port_number > 65000){ - port_number = 1025; + port_number = 1 + (port_number % UINT16_MAX); + if (port_number == 1) XBT_WARN("Too many connections! Port number is saturated. Trying to use the oldest ports."); - } s4u::Link::on_communicate(*this); }