summaryrefslogtreecommitdiffstats
path: root/mmss/context.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'mmss/context.cpp')
-rw-r--r--mmss/context.cpp65
1 files changed, 64 insertions, 1 deletions
diff --git a/mmss/context.cpp b/mmss/context.cpp
index 36f2ea5..c398d3c 100644
--- a/mmss/context.cpp
+++ b/mmss/context.cpp
@@ -24,9 +24,15 @@
*/
-#include "mmss.hpp"
+#include "context.hpp"
+#include "config.hpp"
+#include "network.hpp"
#include "node.hpp"
+#include <algorithm>
+#include <cassert>
+#include <cstdio>
+
namespace MMSS {
@@ -80,4 +86,61 @@ void context_t::logf(int priority, const char *format, ...) {
va_end(ap);
}
+void context_t::run(int argc, char *argv[]) {
+ if (argc != 2) {
+ std::fprintf(stderr, "usage: %s protocol_module\n", argv[0]);
+ std::exit(1);
+ }
+
+ std::shared_ptr<const protocol_t> proto = protocol_t::load(this, argv[1]);
+ if (!proto)
+ std::exit(1);
+
+ config_t conf = {};
+
+ //read_config(this, &conf, "babel_test.mmss");
+
+ std::shared_ptr<network_t> net0 = std::make_shared<network_t>("net0");
+ std::shared_ptr<network_t> net1 = std::make_shared<network_t>("net1");
+
+ std::shared_ptr<node_t> node1 = node_t::create(this, "node1", 1, proto);
+ std::shared_ptr<node_t> node2 = node_t::create(this, "node2", 2, proto);
+ std::shared_ptr<node_t> node3 = node_t::create(this, "node3", 3, proto);
+
+ std::list<std::shared_ptr<node_t>> nodes;
+
+ nodes.push_back(node1);
+ nodes.push_back(node2);
+ nodes.push_back(node3);
+
+ gmrf_addr_t addr1 = {{1}}, addr2 = {{2}}, addr3 = {{3}}, addr4 = {{4}};
+ add_iface(node1, net0, "mmss0", &addr1);
+ add_iface(node2, net0, "mmss0", &addr2);
+ add_iface(node2, net1, "mmss1", &addr3);
+ add_iface(node3, net1, "mmss1", &addr4);
+
+ while (true) {
+ if (now() > 10000000)
+ break;
+
+ int timeout = event_queue.timeout();
+
+ if (timeout < 0) {
+ fprintf(stderr, "nothing queued, deadlock occured.\n");
+ break;
+ }
+
+ if (timeout > 0) {
+ assert(!event_queue.get());
+
+ advance(timeout);
+ timeout = event_queue.timeout();
+ }
+
+ assert(timeout == 0);
+
+ event_queue.get()->handle(this);
+ }
+}
+
}