+ if (route.gw_dst_ != dst)
+ get_global_route_with_netzones(route.gw_dst_, dst, links, latency, netzones);
+}
+
+void NetZoneImpl::get_graph(const s_xbt_graph_t* graph, std::map<std::string, xbt_node_t, std::less<>>* nodes,
+ std::map<std::string, xbt_edge_t, std::less<>>* edges)
+{
+ std::vector<NetPoint*> vertices = get_vertices();
+
+ for (auto const* my_src : vertices) {
+ for (auto const* my_dst : vertices) {
+ if (my_src == my_dst)
+ continue;
+
+ Route route;
+
+ get_local_route(my_src, my_dst, &route, nullptr);
+
+ XBT_DEBUG("get_route_and_latency %s -> %s", my_src->get_cname(), my_dst->get_cname());
+
+ xbt_node_t current;
+ xbt_node_t previous;
+ const char* previous_name;
+ const char* current_name;
+
+ if (route.gw_src_) {
+ previous = new_xbt_graph_node(graph, route.gw_src_->get_cname(), nodes);
+ previous_name = route.gw_src_->get_cname();
+ } else {
+ previous = new_xbt_graph_node(graph, my_src->get_cname(), nodes);
+ previous_name = my_src->get_cname();
+ }
+
+ for (auto const& link : route.link_list_) {
+ const char* link_name = link->get_cname();
+ current = new_xbt_graph_node(graph, link_name, nodes);
+ current_name = link_name;
+ new_xbt_graph_edge(graph, previous, current, edges);
+ XBT_DEBUG(" %s -> %s", previous_name, current_name);
+ previous = current;
+ previous_name = current_name;
+ }
+
+ if (route.gw_dst_) {
+ current = new_xbt_graph_node(graph, route.gw_dst_->get_cname(), nodes);
+ current_name = route.gw_dst_->get_cname();
+ } else {
+ current = new_xbt_graph_node(graph, my_dst->get_cname(), nodes);
+ current_name = my_dst->get_cname();
+ }
+ new_xbt_graph_edge(graph, previous, current, edges);
+ XBT_DEBUG(" %s -> %s", previous_name, current_name);
+ }
+ }
+}
+
+void NetZoneImpl::set_gateway(const std::string& name, NetPoint* router)
+{
+ xbt_enforce(not sealed_, "Impossible to create gateway: %s. NetZone %s already sealed", name.c_str(), get_cname());
+ if (auto gateway_it = gateways_.find(name); gateway_it != gateways_.end())
+ xbt_die("Impossible to create a gateway named %s. It already exists", name.c_str());
+ else
+ gateways_[name] = router;
+}
+
+NetPoint* NetZoneImpl::get_gateway() const
+{
+ xbt_enforce(not gateways_.empty(), "No default gateway has been defined for NetZone '%s'. Try to seal it first", get_cname());
+ xbt_enforce(gateways_.size() < 2, "NetZone '%s' has more than one gateway, please provide a gateway name", get_cname());
+ auto gateway_it = gateways_.find("default");
+ xbt_enforce(gateway_it != gateways_.end(), "NetZone '%s' hasno default gateway, please define one", get_cname());
+ return gateway_it->second;