summaryrefslogtreecommitdiffstats
path: root/mmss/network.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'mmss/network.cpp')
-rw-r--r--mmss/network.cpp24
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);