+ AsImpl::AsImpl(As* father, const char* name) : As(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);
+
+ netcard_ = new NetCardImpl(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());
+ }
+ AsImpl::~AsImpl() = default;
+
+ void AsImpl::attachHost(s4u::Host* host)
+ {
+ if (hierarchy_ == RoutingMode::unset)
+ hierarchy_ = RoutingMode::base;
+
+ host->pimpl_netcard = new NetCardImpl(host->name().c_str(), NetCard::Type::Host, this);
+ }
+
+ xbt_dynar_t AsImpl::getOneLinkRoutes()
+ {
+ return nullptr;
+ }
+
+ /** @brief Get the common ancestor and its first children in each line leading to src and dst */
+ static void find_common_ancestors(NetCard* src, NetCard* dst,
+ /* OUT */ AsImpl** common_ancestor, AsImpl** src_ancestor, AsImpl** dst_ancestor)
+ {
+#define ROUTING_HIERARCHY_MAXDEPTH 32 /* increase if it is not enough */
+ AsImpl* path_src[ROUTING_HIERARCHY_MAXDEPTH];
+ AsImpl* path_dst[ROUTING_HIERARCHY_MAXDEPTH];
+ int index_src = 0;
+ int index_dst = 0;
+ AsImpl* current_src;
+ AsImpl* current_dst;
+ AsImpl* father;
+
+ /* (1) find the path to root of src and dst*/
+ AsImpl* src_as = src->containingAS();
+ AsImpl* dst_as = dst->containingAS();
+
+ xbt_assert(src_as, "Host %s must be in an AS", src->name());
+ xbt_assert(dst_as, "Host %s must be in an AS", dst->name());
+
+ /* (2) find the path to the root routing component */
+ for (AsImpl* current = src_as; current != nullptr; current = static_cast<AsImpl*>(current->father())) {
+ xbt_assert(index_src < ROUTING_HIERARCHY_MAXDEPTH,
+ "ROUTING_HIERARCHY_MAXDEPTH should be increased for element %s", src->name());
+ path_src[index_src++] = current;
+ }
+ for (AsImpl* current = dst_as; current != nullptr; current = static_cast<AsImpl*>(current->father())) {
+ xbt_assert(index_dst < ROUTING_HIERARCHY_MAXDEPTH, "ROUTING_HIERARCHY_MAXDEPTH should be increased for path_dst");
+ path_dst[index_dst++] = current;