diff options
Diffstat (limited to 'mmss/mmss.hpp')
-rw-r--r-- | mmss/mmss.hpp | 133 |
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_ */ |