Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Provide a S4U function to control the SNR level of an host on a wifi link (+documenta...
authorMartin Quinson <martin.quinson@ens-rennes.fr>
Wed, 8 Jul 2020 23:42:30 +0000 (01:42 +0200)
committerMartin Quinson <martin.quinson@ens-rennes.fr>
Wed, 8 Jul 2020 23:42:30 +0000 (01:42 +0200)
docs/source/app_s4u.rst
include/simgrid/s4u/Link.hpp
src/s4u/s4u_Link.cpp
teshsuite/surf/wifi_usage/wifi_usage.cpp

index 1342527..96ee46d 100644 (file)
@@ -1404,6 +1404,15 @@ Dynamic profiles
       .. autodoxymethod:: simgrid::s4u::Link::set_latency_profile(kernel::profile::Profile *profile)
       .. autodoxymethod:: simgrid::s4u::Link::set_state_profile(kernel::profile::Profile *profile)
 
+WIFI links
+----------
+
+.. tabs::
+
+   .. group-tab:: C++
+
+      .. autodoxymethod:: simgrid::s4u::Link::set_host_wifi_rate(s4u::Host* host, int level)
+
 Signals
 -------
 
index 89f4f79..552d57a 100644 (file)
@@ -63,7 +63,20 @@ public:
   /** @brief Describes how the link is shared between flows */
   SharingPolicy get_sharing_policy() const;
 
-  /** @brief Returns the current load (in flops per second) */
+  /** @brief Set the level of communication speed of the given host on this wifi link.
+   *
+   * The bandwidth of a wifi link for a given host depends on its SNR (signal to noise ratio),
+   * which ultimately depends on the distance between the host and the station and the material between them.
+   *
+   * This is modeled in SimGrid by providing several bandwidths to wifi links, one per SNR level (just provide
+   * comma-separated values in the XML file). By default, the first level in the list is used, but you can use the
+   * current function to specify that a given host uses another level of bandwidth. This can be used to take the
+   * location of hosts into account, or even to model mobility in your SimGrid simulation.
+   *
+   * Note that this function asserts that the link is actually a wifi link */
+  void set_host_wifi_rate(s4u::Host* host, int level);
+
+  /** @brief Returns the current load (in bytes per second) */
   double get_usage() const;
 
   /** @brief Check if the Link is used (at least one flow uses the link) */
index bec2b9e..1b9dfd7 100644 (file)
@@ -11,6 +11,7 @@
 #include "simgrid/simix.hpp"
 #include "src/kernel/lmm/maxmin.hpp"
 #include "src/surf/network_interface.hpp"
+#include "src/surf/network_wifi.hpp"
 #include "xbt/log.h"
 
 namespace simgrid {
@@ -75,6 +76,15 @@ Link::SharingPolicy Link::get_sharing_policy() const
   return this->pimpl_->get_sharing_policy();
 }
 
+void Link::set_host_wifi_rate(s4u::Host* host, int level)
+{
+  xbt_assert(pimpl_->get_sharing_policy() == Link::SharingPolicy::WIFI, "Link %s does not seem to be a wifi link.",
+             get_cname());
+  auto* wlink = dynamic_cast<kernel::resource::NetworkWifiLink*>(pimpl_);
+  xbt_assert(wlink != nullptr, "Cannot convert link %s into a wifi link.", get_cname());
+  wlink->set_host_rate(host, level);
+}
+
 double Link::get_usage() const
 {
   return this->pimpl_->get_constraint()->get_usage();
index b510cd2..6265626 100644 (file)
@@ -7,7 +7,7 @@
 #include "xbt/config.hpp"
 #include "xbt/log.h"
 
-#include "src/surf/network_wifi.hpp"
+#include "src/surf/network_interface.hpp"
 
 XBT_LOG_NEW_DEFAULT_CATEGORY(simulator, "[usage] wifi_usage <platform-file>");
 
@@ -72,9 +72,9 @@ void run_ping_test(const char* src, const char* dest, int data_size)
              simgrid::s4u::this_actor::get_host()->get_cname(), dest, end_time - start_time);
   });
   simgrid::s4u::Actor::create("receiver", simgrid::s4u::Host::by_name(dest), [mailbox]() { mailbox->get(); });
-  auto* l = (simgrid::kernel::resource::NetworkWifiLink*)simgrid::s4u::Link::by_name("AP1")->get_impl();
-  l->set_host_rate(simgrid::s4u::Host::by_name(src), 0);
-  l->set_host_rate(simgrid::s4u::Host::by_name(dest), 0);
+  auto* ap1 = simgrid::s4u::Link::by_name("AP1");
+  ap1->set_host_wifi_rate(simgrid::s4u::Host::by_name(src), 0);
+  ap1->set_host_wifi_rate(simgrid::s4u::Host::by_name(dest), 0);
   simgrid::s4u::this_actor::sleep_for(10);
   XBT_INFO("\n");
 }