From: Martin Quinson Date: Wed, 8 Jul 2020 23:42:30 +0000 (+0200) Subject: Provide a S4U function to control the SNR level of an host on a wifi link (+documenta... X-Git-Tag: v3.26~490 X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/e2d3cb7c869ece98836a275af3bafc4fe487e08b Provide a S4U function to control the SNR level of an host on a wifi link (+documentation) --- diff --git a/docs/source/app_s4u.rst b/docs/source/app_s4u.rst index 13425270b3..96ee46da5e 100644 --- a/docs/source/app_s4u.rst +++ b/docs/source/app_s4u.rst @@ -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 ------- diff --git a/include/simgrid/s4u/Link.hpp b/include/simgrid/s4u/Link.hpp index 89f4f792d4..552d57aa6f 100644 --- a/include/simgrid/s4u/Link.hpp +++ b/include/simgrid/s4u/Link.hpp @@ -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) */ diff --git a/src/s4u/s4u_Link.cpp b/src/s4u/s4u_Link.cpp index bec2b9e757..1b9dfd71b7 100644 --- a/src/s4u/s4u_Link.cpp +++ b/src/s4u/s4u_Link.cpp @@ -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(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(); diff --git a/teshsuite/surf/wifi_usage/wifi_usage.cpp b/teshsuite/surf/wifi_usage/wifi_usage.cpp index b510cd293c..6265626fa9 100644 --- a/teshsuite/surf/wifi_usage/wifi_usage.cpp +++ b/teshsuite/surf/wifi_usage/wifi_usage.cpp @@ -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 "); @@ -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"); }