/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
-#include "xbt/log.h"
-
+#include "src/kernel/routing/NetZoneImpl.hpp"
+#include "simgrid/s4u/engine.hpp"
#include "simgrid/s4u/host.hpp"
#include "src/kernel/routing/NetCard.hpp"
-#include "src/kernel/routing/NetZoneImpl.hpp"
#include "src/surf/cpu_interface.hpp"
#include "src/surf/network_interface.hpp"
+#include "xbt/log.h"
+
XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(surf_route);
namespace simgrid {
std::vector<Link*> links;
};
-AsImpl::AsImpl(As* father, const char* name) : As(father, name)
+NetZoneImpl::NetZoneImpl(NetZone* father, const char* name) : NetZone(father, name)
{
- xbt_assert(nullptr == xbt_lib_get_or_null(as_router_lib, name, ROUTING_ASR_LEVEL),
- "Refusing to create a second AS called '%s'.", name);
+ xbt_assert(nullptr == simgrid::s4u::Engine::instance()->netcardByNameOrNull(name),
+ "Refusing to create a second NetZone called '%s'.", name);
- netcard_ = new NetCard(name, NetCard::Type::As, static_cast<AsImpl*>(father));
- xbt_lib_set(as_router_lib, name, ROUTING_ASR_LEVEL, static_cast<void*>(netcard_));
- XBT_DEBUG("AS '%s' created with the id '%d'", name, netcard_->id());
+ netcard_ = new NetCard(name, NetCard::Type::NetZone, static_cast<NetZoneImpl*>(father));
+ XBT_DEBUG("NetZone '%s' created with the id '%d'", name, netcard_->id());
}
-AsImpl::~AsImpl()
+NetZoneImpl::~NetZoneImpl()
{
for (auto& kv : bypassRoutes_)
delete kv.second;
+
+ xbt_dict_remove(netcards_dict, name_);
}
-simgrid::s4u::Host* AsImpl::createHost(const char* name, std::vector<double>* speedPerPstate, int coreAmount)
+simgrid::s4u::Host* NetZoneImpl::createHost(const char* name, std::vector<double>* speedPerPstate, int coreAmount)
{
simgrid::s4u::Host* res = new simgrid::s4u::Host(name);
return res;
}
-void AsImpl::addBypassRoute(sg_platf_route_cbarg_t e_route)
+void NetZoneImpl::addBypassRoute(sg_platf_route_cbarg_t e_route)
{
/* Argument validity checks */
if (e_route->gw_dst) {
* / \
* src_ancestor dst_ancestor <- must be different in the recursive case
* | |
- * ... ... <-- possibly long pathes (one hop or more)
+ * ... ... <-- possibly long paths (one hop or more)
* | |
* src dst
* @endverbatim
* @endverbatim
*/
static void find_common_ancestors(NetCard* src, NetCard* dst,
- /* OUT */ AsImpl** common_ancestor, AsImpl** src_ancestor, AsImpl** dst_ancestor)
+ /* OUT */ NetZoneImpl** common_ancestor, NetZoneImpl** src_ancestor,
+ NetZoneImpl** dst_ancestor)
{
/* Deal with the easy base case */
- if (src->containingAS() == dst->containingAS()) {
- *common_ancestor = src->containingAS();
+ if (src->netzone() == dst->netzone()) {
+ *common_ancestor = src->netzone();
*src_ancestor = *common_ancestor;
*dst_ancestor = *common_ancestor;
return;
/* engage the full recursive search */
/* (1) find the path to root of src and dst*/
- AsImpl* src_as = src->containingAS();
- AsImpl* dst_as = dst->containingAS();
+ NetZoneImpl* src_as = src->netzone();
+ NetZoneImpl* dst_as = dst->netzone();
xbt_assert(src_as, "Host %s must be in an AS", src->cname());
xbt_assert(dst_as, "Host %s must be in an AS", dst->cname());
/* (2) find the path to the root routing component */
- std::vector<AsImpl*> path_src;
- AsImpl* current = src->containingAS();
+ std::vector<NetZoneImpl*> path_src;
+ NetZoneImpl* current = src->netzone();
while (current != nullptr) {
path_src.push_back(current);
- current = static_cast<AsImpl*>(current->father());
+ current = static_cast<NetZoneImpl*>(current->father());
}
- std::vector<AsImpl*> path_dst;
- current = dst->containingAS();
+ std::vector<NetZoneImpl*> path_dst;
+ current = dst->netzone();
while (current != nullptr) {
path_dst.push_back(current);
- current = static_cast<AsImpl*>(current->father());
+ current = static_cast<NetZoneImpl*>(current->father());
}
/* (3) find the common father.
*
* This works because all SimGrid platform have a unique root element (that is the last element of both paths).
*/
- AsImpl* father = nullptr; // the AS we dropped on the previous loop iteration
+ NetZoneImpl* father = nullptr; // the netzone we dropped on the previous loop iteration
while (path_src.size() > 1 && path_dst.size() > 1 &&
path_src.at(path_src.size() - 1) == path_dst.at(path_dst.size() - 1)) {
father = path_src.at(path_src.size() - 1);
}
/* PRECONDITION: this is the common ancestor of src and dst */
-bool AsImpl::getBypassRoute(routing::NetCard* src, routing::NetCard* dst,
- /* OUT */ std::vector<surf::Link*>* links, double* latency)
+bool NetZoneImpl::getBypassRoute(routing::NetCard* src, routing::NetCard* dst,
+ /* OUT */ std::vector<surf::Link*>* links, double* latency)
{
// If never set a bypass route return nullptr without any further computations
if (bypassRoutes_.empty())
return false;
/* Base case, no recursion is needed */
- if (dst->containingAS() == this && src->containingAS() == this) {
+ if (dst->netzone() == this && src->netzone() == this) {
if (bypassRoutes_.find({src, dst}) != bypassRoutes_.end()) {
BypassRoute* bypassedRoute = bypassRoutes_.at({src, dst});
for (surf::Link* link : bypassedRoute->links) {
/* Engage recursive search */
/* (1) find the path to the root routing component */
- std::vector<AsImpl*> path_src;
- As* current = src->containingAS();
+ std::vector<NetZoneImpl*> path_src;
+ NetZone* current = src->netzone();
while (current != nullptr) {
- path_src.push_back(static_cast<AsImpl*>(current));
+ path_src.push_back(static_cast<NetZoneImpl*>(current));
current = current->father_;
}
- std::vector<AsImpl*> path_dst;
- current = dst->containingAS();
+ std::vector<NetZoneImpl*> path_dst;
+ current = dst->netzone();
while (current != nullptr) {
- path_dst.push_back(static_cast<AsImpl*>(current));
+ path_dst.push_back(static_cast<NetZoneImpl*>(current));
current = current->father_;
}
return false;
}
-void AsImpl::getGlobalRoute(routing::NetCard* src, routing::NetCard* dst,
- /* OUT */ std::vector<surf::Link*>* links, double* latency)
+void NetZoneImpl::getGlobalRoute(routing::NetCard* src, routing::NetCard* dst,
+ /* OUT */ std::vector<surf::Link*>* links, double* latency)
{
s_sg_platf_route_cbarg_t route;
memset(&route, 0, sizeof(route));
XBT_DEBUG("Resolve route from '%s' to '%s'", src->cname(), dst->cname());
/* Find how src and dst are interconnected */
- AsImpl *common_ancestor, *src_ancestor, *dst_ancestor;
+ NetZoneImpl *common_ancestor, *src_ancestor, *dst_ancestor;
find_common_ancestors(src, dst, &common_ancestor, &src_ancestor, &dst_ancestor);
XBT_DEBUG("elements_father: common ancestor '%s' src ancestor '%s' dst ancestor '%s'", common_ancestor->name(),
src_ancestor->name(), dst_ancestor->name());