Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge branch 'wifi_rate_zero' into 'master'
[simgrid.git] / src / surf / network_cm02.cpp
index edcfb57..29604a5 100644 (file)
@@ -221,12 +221,22 @@ void NetworkCm02Model::comm_action_expand_constraints(const s4u::Host* src, cons
   }
 
   /* WI-FI links needs special treatment, do it here */
-  if (src_wifi_link != nullptr)
-    get_maxmin_system()->expand(src_wifi_link->get_constraint(), action->get_variable(),
-                                1.0 / src_wifi_link->get_host_rate(src));
-  if (dst_wifi_link != nullptr)
-    get_maxmin_system()->expand(dst_wifi_link->get_constraint(), action->get_variable(),
-                                1.0 / dst_wifi_link->get_host_rate(dst));
+  if (src_wifi_link != nullptr) {
+    /* In case of 0Mbps data rate, don't consider it in the LMM */
+    if (src_wifi_link->get_host_rate(src) != 0)
+      get_maxmin_system()->expand(src_wifi_link->get_constraint(), action->get_variable(),
+                                  1.0 / src_wifi_link->get_host_rate(src));
+    else
+      get_maxmin_system()->update_variable_penalty(action->get_variable(), 0);
+  }
+  if (dst_wifi_link != nullptr) {
+    if (dst_wifi_link->get_host_rate(dst) != 0)
+      get_maxmin_system()->expand(dst_wifi_link->get_constraint(), action->get_variable(),
+                                  1.0 / dst_wifi_link->get_host_rate(dst));
+    else {
+      get_maxmin_system()->update_variable_penalty(action->get_variable(), 0);
+    }
+  }
 
   for (auto const* link : route) {
     if (link->get_sharing_policy() != s4u::Link::SharingPolicy::WIFI)
@@ -316,11 +326,10 @@ bool NetworkCm02Model::comm_get_route_info(const s4u::Host* src, const s4u::Host
 
   bool failed = std::any_of(route.begin(), route.end(), [](const StandardLinkImpl* link) { return not link->is_on(); });
 
-  if (cfg_crosstraffic) {
+  if (not failed && cfg_crosstraffic) {
     dst->route_to(src, back_route, nullptr);
-    if (not failed)
-      failed = std::any_of(back_route.begin(), back_route.end(),
-                           [](const StandardLinkImpl* link) { return not link->is_on(); });
+    failed = std::any_of(back_route.begin(), back_route.end(),
+                         [](const StandardLinkImpl* link) { return not link->is_on(); });
   }
   return failed;
 }