diff options
Diffstat (limited to 'mmss/network.cpp')
-rw-r--r-- | mmss/network.cpp | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/mmss/network.cpp b/mmss/network.cpp index 863f10b..ae1dc3c 100644 --- a/mmss/network.cpp +++ b/mmss/network.cpp @@ -28,11 +28,33 @@ #include "context.hpp" #include "node.hpp" +#include <cmath> +#include <cstdlib> + namespace MMSS { +float network_t::get_etx() const { + if (etx_min == etx_max) + return etx_min; + + float val = float(std::sin(2*M_PI * (mmss->now()/1000.0 - phase)/period)); + float diff = etx_max - etx_min; + + mmss->logf(LOG_DEBUG, "ETX: %.3f", etx_min + diff * (val+1)/2); + + return etx_min + diff * (val+1)/2; +} + +bool network_t::drop_packet() { + int r = rand_r(&rand_seed); + + return (r > (RAND_MAX/get_etx())); +} + void network_t::enqueue(const void *data, size_t len, const iface_t *src_iface, const std::shared_ptr<iface_t> &dest_iface) { - context_t *mmss = dest_iface->get_node()->get_context(); + if (drop_packet()) + return; std::shared_ptr<packet_t> packet = std::make_shared<packet_t>(src_iface->get_address(), dest_iface, data, len); mmss->queue_event(std::move(packet), mmss->now()+1); |