summaryrefslogtreecommitdiffstats
path: root/mmss/mmss.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'mmss/mmss.hpp')
-rw-r--r--mmss/mmss.hpp133
1 files changed, 51 insertions, 82 deletions
diff --git a/mmss/mmss.hpp b/mmss/mmss.hpp
index a2c2fe2..78c93be 100644
--- a/mmss/mmss.hpp
+++ b/mmss/mmss.hpp
@@ -24,34 +24,34 @@
*/
-#ifndef _GMRF_MMSS_MMSS_H_
-#define _GMRF_MMSS_MMSS_H_
+#ifndef _GMRF_MMSS_MMSS_HPP_
+#define _GMRF_MMSS_MMSS_HPP_
#include "queue.hpp"
-extern "C" {
+#include <memory>
-#include <gmrf/gmrf.h>
-#include <mmss/protocol.h>
-}
-
-#include <cstdlib>
-#include <cstring>
+namespace MMSS {
-struct mmss {
+class context_t {
+public:
uint64_t now;
- mmss_queue_t packet_queue;
- mmss_queue_t scheduled_queue;
+ timeout_queue_t<packet_t> packet_queue;
+ timeout_queue_t<scheduled_t> scheduled_queue;
+
+ context_t() : now(0), packet_queue(this), scheduled_queue(this) {}
};
-struct mmss_config {
- mmss_network_t *networks;
+class config_t {
+public:
+ network_t *networks;
gmrf_t *nodes;
};
-struct mmss_network {
- mmss_network_t *next;
+class network_t {
+public:
+ network_t *next;
char *name;
@@ -59,66 +59,43 @@ struct mmss_network {
size_t mtu;
};
-struct mmss_packet {
+class packet_t {
+public:
uint64_t sent;
gmrf_iface_t *source;
gmrf_iface_t *dest;
size_t len;
- uint8_t data[];
+ std::unique_ptr<uint8_t> data;
};
-struct mmss_scheduled {
+class scheduled_t {
+public:
gmrf_t *node;
gmrf_scheduled_func f;
void *arg;
};
-struct mmss_string_stack {
- mmss_string_stack_t *next;
- char str[];
-};
-
-
-struct gmrf {
- gmrf_t *next;
-
- char *name;
- mmss_t *mmss;
- gmrf_context_t *ctx;
- gmrf_iface_t *interfaces;
-
- unsigned rand_seed;
-
- const mmss_protocol_t *proto;
-};
-
-struct gmrf_iface {
- gmrf_iface_t *node_next;
- gmrf_iface_t *network_next;
-
- char *name;
- gmrf_addr_t address;
+const protocol_t* load_protocol(const char *module);
- gmrf_t *node;
- mmss_network_t *net;
-};
+namespace Config {
+void add_network(context_t *mmss, config_t *conf, const char *name);
-const mmss_protocol_t* mmss_load_protocol(const char *module);
+}
-void mmss_config_add_network(mmss_t *mmss, mmss_config_t *conf, const char *name);
+bool read_config(context_t *mmss, config_t *conf, const char *filename);
-bool mmss_read_config(mmss_t *mmss, mmss_config_t *conf, const char *filename);
+void add_iface(gmrf_t *node, network_t *net, const char *name, const gmrf_addr_t *address);
-void mmss_add_iface(gmrf_t *node, mmss_network_t *net, const char *name, const gmrf_addr_t *address);
+uint64_t now(const context_t *mmss);
-void mmss_dispatch(mmss_packet_t *packet);
-void mmss_run_scheduled(mmss_scheduled_t *scheduled);
+void dispatch(std::shared_ptr<packet_t> packet);
+void run_scheduled(std::shared_ptr<scheduled_t> scheduled);
-void mmss_logf(mmss_t *mmss, int priority, const char *format, ...);
+void logf(context_t *mmss, int priority, const char *format, ...);
static inline int max(int a, int b) {
@@ -134,39 +111,31 @@ static inline size_t alignto(size_t l, size_t a) {
return ((l+a-1)/a)*a;
}
-static inline mmss_string_stack_t* mmss_string_stack_dup(const char *str) {
- mmss_string_stack_t *ret = reinterpret_cast<mmss_string_stack_t*>(std::malloc(alignto(sizeof(mmss_string_stack_t) + strlen(str) + 1, 8)));
- ret->next = NULL;
- std::strcpy(ret->str, str);
-
- return ret;
}
-static inline mmss_string_stack_t* mmss_string_stack_dupn(const char *str, size_t len) {
- size_t str_len = strnlen(str, len);
- mmss_string_stack_t *ret = reinterpret_cast<mmss_string_stack_t*>(std::malloc(alignto(sizeof(mmss_string_stack_t) + str_len + 1, 8)));
- ret->next = NULL;
- std::strncpy(ret->str, str, str_len);
- ret->str[str_len] = 0;
+struct gmrf {
+ gmrf_t *next;
- return ret;
-}
+ char *name;
-static inline mmss_string_stack_t* mmss_string_stack_push(mmss_string_stack_t *stack, const char *str) {
- mmss_string_stack_t *ret = reinterpret_cast<mmss_string_stack_t*>(std::malloc(alignto(sizeof(mmss_string_stack_t) + strlen(str) + 1, 8)));
- ret->next = stack;
- std::strcpy(ret->str, str);
+ MMSS::context_t *mmss;
+ gmrf_context_t *ctx;
+ gmrf_iface_t *interfaces;
- return ret;
-}
+ unsigned rand_seed;
-static inline void mmss_string_stack_free(mmss_string_stack_t *str) {
- while(str) {
- mmss_string_stack_t *next = str->next;
- std::free(str);
- str = next;
- }
-}
+ const MMSS::protocol_t *proto;
+};
+
+struct gmrf_iface {
+ gmrf_iface_t *node_next;
+ gmrf_iface_t *network_next;
+ char *name;
+ gmrf_addr_t address;
+
+ gmrf_t *node;
+ MMSS::network_t *net;
+};
-#endif /* _GMRF_MMSS_MMSS_H_ */
+#endif /* _GMRF_MMSS_MMSS_HPP_ */