+ NetworkWifiLink* src_wifi_link = nullptr;
+ NetworkWifiLink* dst_wifi_link = nullptr;
+ if (not route.empty() && route.at(0)->get_sharing_policy() == s4u::Link::SharingPolicy::WIFI) {
+ src_wifi_link = static_cast<NetworkWifiLink*>(route.at(0));
+ double rate = src_wifi_link->get_host_rate(src);
+ xbt_assert(rate != -1,
+ "The route from %s to %s begins with the WIFI link %s, but the host %s does not seem attached to that "
+ "WIFI link. Did you call link->set_host_rate()?",
+ src->get_cname(), dst->get_cname(), src_wifi_link->get_cname(), src->get_cname());
+ get_maxmin_system()->expand(src_wifi_link->get_constraint(), action->get_variable(), 1.0 / rate);
+ }
+ if (route.size() > 1 && route.at(route.size() - 1)->get_sharing_policy() == s4u::Link::SharingPolicy::WIFI) {
+ dst_wifi_link = static_cast<NetworkWifiLink*>(route.at(route.size() - 1));
+ double rate = dst_wifi_link->get_host_rate(dst);
+ xbt_assert(rate != -1,
+ "The route from %s to %s ends with the WIFI link %s, but the host %s does not seem attached to that "
+ "WIFI link. Did you call link->set_host_rate()?",
+ src->get_cname(), dst->get_cname(), dst_wifi_link->get_cname(), dst->get_cname());
+ get_maxmin_system()->expand(dst_wifi_link->get_constraint(), action->get_variable(), 1.0 / rate);
+ }
+
+ for (auto const& link : route) {
+ // WIFI links are handled manually just above, so skip them now
+ if (link->get_sharing_policy() == s4u::Link::SharingPolicy::WIFI) {
+ xbt_assert(link == src_wifi_link || link == dst_wifi_link,
+ "Wifi links can only occure at the beginning of the route (meaning that it's attached to the src) or "
+ "at its end (meaning that it's attached to the dst");
+ } else {
+ get_maxmin_system()->expand(link->get_constraint(), action->get_variable(), 1.0);
+ }
+ }