X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/f512dd4db06628537e631d87f7c72b417a0a4adf..0c07b616d38841a028f8a34fe66394e232008b5e:/src/kernel/routing/AsVivaldi.cpp diff --git a/src/kernel/routing/AsVivaldi.cpp b/src/kernel/routing/AsVivaldi.cpp index f54e508fd3..216b7880a6 100644 --- a/src/kernel/routing/AsVivaldi.cpp +++ b/src/kernel/routing/AsVivaldi.cpp @@ -57,6 +57,22 @@ AsVivaldi::AsVivaldi(As* father, const char* name) : AsCluster(father, name) { } +void AsVivaldi::setPeerLink(NetCard* netcard, double bw_in, double bw_out, double latency, const char* coord) +{ + xbt_assert(netcard->containingAS() == this, "Cannot add a peer link to a netcard that is not in this AS"); + + new simgrid::kernel::routing::vivaldi::Coords(netcard, coord); + + char* link_up = bprintf("link_%s_UP", netcard->cname()); + char* link_down = bprintf("link_%s_DOWN", netcard->cname()); + Link* linkUp = surf_network_model->createLink(link_up, bw_out, latency, SURF_LINK_SHARED); + Link* linkDown = surf_network_model->createLink(link_down, bw_in, latency, SURF_LINK_SHARED); + privateLinks_.insert({netcard->id(), {linkUp, linkDown}}); + + free(link_up); + free(link_down); +} + void AsVivaldi::getLocalRoute(NetCard* src, NetCard* dst, sg_platf_route_cbarg_t route, double* lat) { XBT_DEBUG("vivaldi getLocalRoute from '%s'[%d] '%s'[%d]", src->cname(), src->id(), dst->cname(), dst->id()); @@ -71,20 +87,20 @@ void AsVivaldi::getLocalRoute(NetCard* src, NetCard* dst, sg_platf_route_cbarg_t } /* Retrieve the private links */ - if (privateLinks_.size() > src->id()) { - s_surf_parsing_link_up_down_t info = privateLinks_.at(src->id()); - if (info.linkUp) { - route->link_list->push_back(info.linkUp); + if (privateLinks_.find(src->id()) != privateLinks_.end()) { + std::pair info = privateLinks_.at(src->id()); + if (info.first) { + route->link_list->push_back(info.first); if (lat) - *lat += info.linkUp->latency(); + *lat += info.first->latency(); } } - if (privateLinks_.size() > dst->id()) { - s_surf_parsing_link_up_down_t info = privateLinks_.at(dst->id()); - if (info.linkDown) { - route->link_list->push_back(info.linkDown); + if (privateLinks_.find(dst->id()) != privateLinks_.end()) { + std::pair info = privateLinks_.at(dst->id()); + if (info.second) { + route->link_list->push_back(info.second); if (lat) - *lat += info.linkDown->latency(); + *lat += info.second->latency(); } }