Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Undeprecate SIMIX_process_self_{get,set}_data.
[simgrid.git] / src / surf / network_cm02.cpp
index 40cce3e..9945dbd 100644 (file)
@@ -104,7 +104,7 @@ void NetworkCm02Model::update_actions_state_lazy(double now, double /*delta*/)
 {
   while (not get_action_heap().empty() && double_equals(get_action_heap().top_date(), now, sg_surf_precision)) {
 
-    NetworkCm02Action* action = static_cast<NetworkCm02Action*>(get_action_heap().pop());
+    auto* action = static_cast<NetworkCm02Action*>(get_action_heap().pop());
     XBT_DEBUG("Something happened to action %p", action);
 
     // if I am wearing a latency hat
@@ -184,7 +184,7 @@ Action* NetworkCm02Model::communicate(s4u::Host* src, s4u::Host* dst, double siz
           std::any_of(back_route.begin(), back_route.end(), [](const LinkImpl* link) { return not link->is_on(); });
   }
 
-  NetworkCm02Action *action = new NetworkCm02Action(this, size, failed);
+  auto* action              = new NetworkCm02Action(this, size, failed);
   action->sharing_penalty_  = latency;
   action->latency_ = latency;
   action->rate_ = rate;
@@ -239,25 +239,18 @@ Action* NetworkCm02Model::communicate(s4u::Host* src, s4u::Host* dst, double siz
   for (auto const& link : route) {
     // Handle WIFI links
     if (link->get_sharing_policy() == s4u::Link::SharingPolicy::WIFI) {
-      xbt_assert(!cfg_crosstraffic,
-                 "Cross-traffic is not yet supported when using WIFI. Please use --cfg=network/crosstraffic:0");
-      NetworkWifiLink* wifi_link = (NetworkWifiLink*)link;
+      NetworkWifiLink* wifi_link = static_cast<NetworkWifiLink*>(link);
 
       double src_rate = wifi_link->get_host_rate(src);
       double dst_rate = wifi_link->get_host_rate(dst);
-
-      // TODO: What do to when src and dst are on the same AP ? (for the moment we use src rate)
-      if (src_rate != -1 && dst_rate != -1) {
+      xbt_assert(
+          !(src_rate == -1 && dst_rate == -1),
+          "Some Stations are not associated to any Access Point. Make sure to call set_host_rate on all Stations.");
+      if (src_rate != -1)
         get_maxmin_system()->expand(link->get_constraint(), action->get_variable(), 1.0 / src_rate);
-      } else {
-        xbt_assert(
-            !(src_rate == -1 && dst_rate == -1),
-            "Some Stations are not associated to any Access Point. Make sure to call set_host_rate on all Stations.");
-        if (src_rate != -1)
-          get_maxmin_system()->expand(link->get_constraint(), action->get_variable(), 1.0 / src_rate);
-        else
-          get_maxmin_system()->expand(link->get_constraint(), action->get_variable(), 1.0 / dst_rate);
-      }
+      else
+        get_maxmin_system()->expand(link->get_constraint(), action->get_variable(), 1.0 / dst_rate);
+
     } else {
       get_maxmin_system()->expand(link->get_constraint(), action->get_variable(), 1.0);
     }
@@ -265,8 +258,27 @@ Action* NetworkCm02Model::communicate(s4u::Host* src, s4u::Host* dst, double siz
 
   if (cfg_crosstraffic) {
     XBT_DEBUG("Crosstraffic active: adding backward flow using 5%% of the available bandwidth");
-    for (auto const& link : back_route)
-      get_maxmin_system()->expand(link->get_constraint(), action->get_variable(), .05);
+    bool wifi_dst_assigned = false; // Used by wifi crosstraffic
+    for (auto const& link : back_route) {
+      if (link->get_sharing_policy() == s4u::Link::SharingPolicy::WIFI) {
+        NetworkWifiLink* wifi_link = static_cast<NetworkWifiLink*>(link);
+        /**
+         * For wifi links we should add 0.05/rate.
+         * However since we are using the "back_route" we should encounter in
+         * the first place the dst wifi link.
+         */
+        if (!wifi_dst_assigned && (wifi_link->get_host_rate(dst) != -1)) {
+          get_maxmin_system()->expand(link->get_constraint(), action->get_variable(),
+                                      .05 / wifi_link->get_host_rate(dst));
+          wifi_dst_assigned = true;
+        } else {
+          get_maxmin_system()->expand(link->get_constraint(), action->get_variable(),
+                                      .05 / wifi_link->get_host_rate(src));
+        }
+      } else {
+        get_maxmin_system()->expand(link->get_constraint(), action->get_variable(), .05);
+      }
+    }
 
     // Change concurrency_share here, if you want that cross-traffic is included in the SURF concurrency
     // (You would also have to change simgrid::kernel::lmm::Element::get_concurrency())
@@ -340,7 +352,7 @@ void NetworkCm02Link::set_bandwidth(double value)
     const kernel::lmm::Element* nextelem = nullptr;
     int numelem                  = 0;
     while ((var = get_constraint()->get_variable_safe(&elem, &nextelem, &numelem))) {
-      NetworkCm02Action* action = static_cast<NetworkCm02Action*>(var->get_id());
+      auto* action = static_cast<NetworkCm02Action*>(var->get_id());
       action->sharing_penalty_ += delta;
       if (not action->is_suspended())
         get_model()->get_maxmin_system()->update_variable_penalty(action->get_variable(), action->sharing_penalty_);
@@ -359,7 +371,7 @@ void NetworkCm02Link::set_latency(double value)
   latency_.peak = value;
 
   while ((var = get_constraint()->get_variable_safe(&elem, &nextelem, &numelem))) {
-    NetworkCm02Action* action = static_cast<NetworkCm02Action*>(var->get_id());
+    auto* action = static_cast<NetworkCm02Action*>(var->get_id());
     action->lat_current_ += delta;
     action->sharing_penalty_ += delta;
     if (action->rate_ < 0)
@@ -450,6 +462,6 @@ void NetworkCm02Action::update_remains_lazy(double now)
   set_last_value(get_variable()->get_value());
 }
 
-}
-}
+} // namespace resource
+} // namespace kernel
 } // namespace simgrid