X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/cb3b89f0092e32cae6038964a0a6d4cefa7812ed..cd7fe06b09d94fb6590a920af98c2044f6bcd6cc:/src/surf/network_ns3.cpp diff --git a/src/surf/network_ns3.cpp b/src/surf/network_ns3.cpp index 871a39ccfa..fb715bde5b 100644 --- a/src/surf/network_ns3.cpp +++ b/src/surf/network_ns3.cpp @@ -29,7 +29,7 @@ static double time_to_next_flow_completion = -1; * Crude globals * *****************/ -extern xbt_dict_t dict_socket; +extern xbt_dict_t flowFromSock; static ns3::InternetStackHelper stack; static ns3::NodeContainer nodes; @@ -65,18 +65,6 @@ static void simgrid_ns3_add_host(simgrid::s4u::Host& host) host.extension_set(NS3_EXTENSION_ID, ns3host); } -static void parse_ns3_add_link(sg_platf_link_cbarg_t link) -{ - XBT_DEBUG("NS3_ADD_LINK '%s'",link->id); - - Link *l = surf_network_model->createLink(link->id, link->bandwidth, link->latency, link->policy, link->properties); - if (link->bandwidth_trace) - l->setBandwidthTrace(link->latency_trace); - if (link->latency_trace) - l->setLatencyTrace(link->latency_trace); - if (link->state_trace) - l->setStateTrace(link->state_trace); -} static void simgrid_ns3_add_router(simgrid::surf::NetCard* router) { const char* router_id = router->name(); @@ -189,17 +177,15 @@ static void create_ns3_topology(void) //get the onelinks from the parsed platform xbt_dynar_t onelink_routes = routing_platf->getOneLinkRoutes(); - if (!onelink_routes) - xbt_die("There is no routes!"); - XBT_DEBUG("Have get_onelink_routes, found %ld routes",onelink_routes->used); + + XBT_DEBUG("There is %ld one-link routes",onelink_routes->used); //save them in trace file simgrid::surf::Onelink *onelink; unsigned int iter; xbt_dynar_foreach(onelink_routes, iter, onelink) { char *src = onelink->src_->name(); char *dst = onelink->dst_->name(); - simgrid::surf::LinkNS3 *link = - static_cast(onelink->link_); + simgrid::surf::LinkNS3 *link = static_cast(onelink->link_); if (strcmp(src,dst) && link->m_created){ XBT_DEBUG("Route from '%s' to '%s' with link '%s'", src, dst, link->getName()); @@ -229,43 +215,15 @@ static void create_ns3_topology(void) } } -static void parse_ns3_end_platform(void) -{ - ns3_end_platform(); -} - -static void define_callbacks_ns3(void) -{ - simgrid::s4u::Host::onCreation.connect(simgrid_ns3_add_host); - simgrid::surf::netcardCreatedCallbacks.connect(simgrid_ns3_add_router); - simgrid::surf::on_link.connect (parse_ns3_add_link); - simgrid::surf::on_cluster.connect (&parse_ns3_add_cluster); - simgrid::surf::asCreatedCallbacks.connect(parse_ns3_add_AS); - simgrid::surf::on_postparse.connect(&create_ns3_topology); //get_one_link_routes - simgrid::surf::on_postparse.connect(&parse_ns3_end_platform); //InitializeRoutes -} - /********* * Model * *********/ -static void free_ns3_link(void * elmts) -{ - delete static_cast(elmts); -} - -static void free_ns3_host(void * elmts) -{ - ns3_node_t host = static_cast(elmts); - free(host); -} - void surf_network_model_init_NS3() { if (surf_network_model) return; surf_network_model = new simgrid::surf::NetworkNS3Model(); - xbt_dynar_push(all_existing_models, &surf_network_model); } @@ -277,16 +235,22 @@ NetworkNS3Model::NetworkNS3Model() : NetworkModel() { xbt_die("Impossible to initialize NS3 interface"); } routing_model_create(NULL); - define_callbacks_ns3(); + simgrid::s4u::Host::onCreation.connect(simgrid_ns3_add_host); + simgrid::surf::netcardCreatedCallbacks.connect(simgrid_ns3_add_router); + simgrid::surf::on_link.connect(netlink_parse_init); + simgrid::surf::on_cluster.connect (&parse_ns3_add_cluster); + simgrid::surf::asCreatedCallbacks.connect(parse_ns3_add_AS); + simgrid::surf::on_postparse.connect(&create_ns3_topology); //get_one_link_routes + simgrid::surf::on_postparse.connect(&ns3_end_platform); //InitializeRoutes - NS3_EXTENSION_ID = simgrid::s4u::Host::extension_create(free_ns3_host); - NS3_ASR_LEVEL = xbt_lib_add_level(as_router_lib, free_ns3_host); + NS3_EXTENSION_ID = simgrid::s4u::Host::extension_create(xbt_free_f); + NS3_ASR_LEVEL = xbt_lib_add_level(as_router_lib, xbt_free_f); } NetworkNS3Model::~NetworkNS3Model() { delete ns3_sim; xbt_dynar_free_container(&IPV4addr); - xbt_dict_free(&dict_socket); + xbt_dict_free(&flowFromSock); } Link* NetworkNS3Model::createLink(const char *name, double bandwidth, double latency, e_surf_link_sharing_policy_t policy, @@ -333,31 +297,28 @@ double NetworkNS3Model::next_occuring_event(double now) void NetworkNS3Model::updateActionsState(double now, double delta) { - xbt_dict_cursor_t cursor = NULL; - char *key; - void *data; + static xbt_dynar_t socket_to_destroy = xbt_dynar_new(sizeof(char*),NULL); - static xbt_dynar_t socket_to_destroy = NULL; - if(!socket_to_destroy) socket_to_destroy = xbt_dynar_new(sizeof(char*),NULL); + /* If there are no running flows, advance the NS3 simulator and return */ + if (getRunningActionSet()->empty()) { - /* If there are no running flows, just return */ - if (!getRunningActionSet()->size()) { - while(double_positive(now-ns3::Simulator::Now().GetSeconds(), sg_surf_precision)) { + while(double_positive(now - ns3::Simulator::Now().GetSeconds(), sg_surf_precision)) ns3_simulator(now-ns3::Simulator::Now().GetSeconds()); - } + return; } - NetworkNS3Action *action; - xbt_dict_foreach(dict_socket,cursor,key,data){ - action = static_cast(ns3_get_socket_action(data)); - XBT_DEBUG("Processing socket %p (action %p)",data,action); - action->setRemains(action->getCost() - ns3_get_socket_sent(data)); + xbt_dict_cursor_t cursor = NULL; + char *ns3Socket; + SgFlow *sgFlow; + xbt_dict_foreach(flowFromSock,cursor,ns3Socket,sgFlow){ + NetworkNS3Action * action = sgFlow->action_; + XBT_DEBUG("Processing socket %p (action %p)",sgFlow,action); + action->setRemains(action->getCost() - sgFlow->sentBytes_); if (TRACE_is_enabled() && action->getState() == Action::State::running){ - double data_sent = ns3_get_socket_sent(data); - double data_delta_sent = data_sent - action->m_lastSent; + double data_delta_sent = sgFlow->sentBytes_ - action->m_lastSent; std::vector *route = new std::vector(); @@ -366,24 +327,25 @@ void NetworkNS3Model::updateActionsState(double now, double delta) TRACE_surf_link_set_utilization (link->getName(), action->getCategory(), (data_delta_sent)/delta, now-delta, delta); delete route; - action->m_lastSent = data_sent; + action->m_lastSent = sgFlow->sentBytes_; } - if(ns3_get_socket_is_finished(data) == 1){ - xbt_dynar_push(socket_to_destroy,&key); - XBT_DEBUG("Destroy socket %p of action %p", key, action); + if(sgFlow->finished_){ + xbt_dynar_push(socket_to_destroy,&ns3Socket); + XBT_DEBUG("Destroy socket %p of action %p", ns3Socket, action); action->finish(); action->setState(Action::State::done); } } while (!xbt_dynar_is_empty(socket_to_destroy)){ - xbt_dynar_pop(socket_to_destroy,&key); + xbt_dynar_pop(socket_to_destroy,&ns3Socket); - void *data = xbt_dict_get (dict_socket, key); - action = static_cast(ns3_get_socket_action(data)); - XBT_DEBUG ("Removing socket %p of action %p", key, action); - xbt_dict_remove(dict_socket, key); + if (XBT_LOG_ISENABLED(ns3, xbt_log_priority_debug)) { + SgFlow *flow = (SgFlow*)xbt_dict_get (flowFromSock, ns3Socket); + XBT_DEBUG ("Removing socket %p of action %p", ns3Socket, flow->action_); + } + xbt_dict_remove(flowFromSock, ns3Socket); } return; } @@ -448,7 +410,7 @@ int NetworkNS3Action::unref() if (action_hook.is_linked()) p_stateSet->erase(p_stateSet->iterator_to(*this)); XBT_DEBUG ("Removing action %p", this); - delete this; + delete this; return 1; } return 0; @@ -465,22 +427,6 @@ void ns3_simulator(double min){ ns3_sim->simulator_start(min); } -simgrid::surf::NetworkNS3Action* ns3_get_socket_action(void *socket){ - return ((MySocket *)socket)->action; -} - -double ns3_get_socket_remains(void *socket){ - return ((MySocket *)socket)->remaining; -} - -double ns3_get_socket_sent(void *socket){ - return ((MySocket *)socket)->sentBytes; -} - -bool ns3_get_socket_is_finished(void *socket){ - return ((MySocket *)socket)->finished; -} - int ns3_create_flow(const char* a,const char *b,double start,u_int32_t TotalBytes,simgrid::surf::NetworkNS3Action * action) { ns3_node_t node1 = ns3_find_host(a);