+ if ((not src && not dst) || (dst && src && src != dst))
+ throw std::invalid_argument(xbt::string_printf(
+ "Cannot add route from %s to %s. In a StarZone, route must be: i) from source netpoint to everyone, ii) from "
+ "everyone to a single netpoint or iii) loopback, same source and destination",
+ src_name, dst_name));
+
+ if (symmetrical && not src)
+ throw std::invalid_argument(xbt::string_printf("Cannot add route from %s to %s. In a StarZone, symmetrical routes "
+ "must be set from source to everyone (not the contrary)",
+ src_name, dst_name));
+
+ if (src && src->is_netzone()) {
+ if (not gw_src)
+ throw std::invalid_argument(xbt::string_printf(
+ "StarZone::add_route(): source %s is a netzone but gw_src isn't configured", src->get_cname()));
+ if (gw_src->is_netzone())
+ throw std::invalid_argument(
+ xbt::string_printf("StarZone::add_route(): src(%s) is a netzone, gw_src(%s) cannot be a netzone",
+ src->get_cname(), gw_src->get_cname()));
+
+ const auto* netzone_src = get_netzone_recursive(src);
+ if (not netzone_src->is_component_recursive(gw_src))
+ throw std::invalid_argument(xbt::string_printf(
+ "Invalid NetzoneRoute from %s@%s to %s: gw_src %s belongs to %s, not to %s.", src_name, gw_src->get_cname(),
+ dst_name, gw_src->get_cname(), gw_src->get_englobing_zone()->get_cname(), src_name));
+ }
+
+ if (dst && dst->is_netzone()) {
+ if (not gw_dst)
+ throw std::invalid_argument(xbt::string_printf(
+ "StarZone::add_route(): destination %s is a netzone but gw_dst isn't configured", dst->get_cname()));
+ if (gw_dst->is_netzone())
+ throw std::invalid_argument(
+ xbt::string_printf("StarZone::add_route(): dst(%s) is a netzone, gw_dst(%s) cannot be a netzone",
+ dst->get_cname(), gw_dst->get_cname()));
+
+ const auto* netzone_dst = get_netzone_recursive(dst);
+ if (not netzone_dst->is_component_recursive(gw_dst))
+ throw std::invalid_argument(xbt::string_printf(
+ "Invalid NetzoneRoute from %s@%s to %s: gw_dst %s belongs to %s, not to %s.", dst_name, gw_dst->get_cname(),
+ src_name, gw_dst->get_cname(), gw_dst->get_englobing_zone()->get_cname(), dst_name));
+ }
+}
+
+void StarZone::add_route(NetPoint* src, NetPoint* dst, NetPoint* gw_src, NetPoint* gw_dst,
+ const std::vector<s4u::LinkInRoute>& link_list, bool symmetrical)
+{
+ check_add_route_param(src, dst, gw_src, gw_dst, symmetrical);