diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2013-07-29 21:00:11 +0200 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2013-07-29 21:00:11 +0200 |
commit | 1ff55d4c9acb9e1688bf76f12ae5ae26027ce113 (patch) | |
tree | f2181f8b1d558cd8dd34ccb1ad4306aae5391c01 /mmss/network.cpp | |
parent | b15c16f12ca6838e5ebefc80c11dcf7933bce8bc (diff) | |
download | gmrf-1ff55d4c9acb9e1688bf76f12ae5ae26027ce113.tar gmrf-1ff55d4c9acb9e1688bf76f12ae5ae26027ce113.zip |
Implement simple packet loss simulation
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); |