Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge branch 'master' into klement
[simgrid.git] / src / s4u / s4u_Link.cpp
index 9ead7c2..1b9dfd7 100644 (file)
 #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 {
+
+template class xbt::Extendable<s4u::Link>;
+
 namespace s4u {
 
 xbt::signal<void(Link&)> Link::on_creation;
 xbt::signal<void(Link const&)> Link::on_destruction;
 xbt::signal<void(Link const&)> Link::on_state_change;
 xbt::signal<void(Link const&)> Link::on_bandwidth_change;
-xbt::signal<void(kernel::resource::NetworkAction&, Host* src, Host* dst)> Link::on_communicate;
+xbt::signal<void(kernel::resource::NetworkAction&)> Link::on_communicate;
 xbt::signal<void(kernel::resource::NetworkAction&, kernel::resource::Action::State)>
     Link::on_communication_state_change;
 
@@ -52,16 +56,35 @@ double Link::get_latency() const
   return this->pimpl_->get_latency();
 }
 
+void Link::set_latency(double value)
+{
+  kernel::actor::simcall([this, value] { pimpl_->set_latency(value); });
+}
+
 double Link::get_bandwidth() const
 {
   return this->pimpl_->get_bandwidth();
 }
 
+void Link::set_bandwidth(double value)
+{
+  kernel::actor::simcall([this, value] { pimpl_->set_bandwidth(value); });
+}
+
 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();
@@ -124,10 +147,20 @@ double sg_link_bandwidth(const_sg_link_t link)
 {
   return link->get_bandwidth();
 }
+
+void sg_link_bandwidth_set(sg_link_t link, double value)
+{
+  return link->set_bandwidth(value);
+}
+
 double sg_link_latency(const_sg_link_t link)
 {
   return link->get_latency();
 }
+void sg_link_latency_set(sg_link_t link, double value)
+{
+  return link->set_latency(value);
+}
 void* sg_link_data(const_sg_link_t link)
 {
   return link->get_data();