- xbt_assert((src == dst) or (not src and dst) or (src and not dst),
- "Cannot add route from %s to %s. In a StarZone, route must be: i) from source host to everyone, ii) from "
- "everyone to a single host or iii) loopback, same source and destination",
- src_name, dst_name);
- xbt_assert((not symmetrical) or (symmetrical and src),
- "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 and src->is_netzone()) {
- xbt_assert(gw_src, "add_route(): source %s is a netzone but gw_src isn't configured", src->get_cname());
- xbt_assert(not gw_src->is_netzone(), "add_route(): src(%s) is a netzone, gw_src(%s) cannot be a netzone",
- src->get_cname(), gw_src->get_cname());
+ 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));