From 0ffde34faac958a28842a952157852fd072834a5 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Fri, 26 Jul 2013 14:22:18 +0200 Subject: Convert mmss to C++, add parser --- mmss/mmss.hpp | 172 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 172 insertions(+) create mode 100644 mmss/mmss.hpp (limited to 'mmss/mmss.hpp') diff --git a/mmss/mmss.hpp b/mmss/mmss.hpp new file mode 100644 index 0000000..a2c2fe2 --- /dev/null +++ b/mmss/mmss.hpp @@ -0,0 +1,172 @@ +/* + Copyright (c) 2013, Matthias Schiffer + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#ifndef _GMRF_MMSS_MMSS_H_ +#define _GMRF_MMSS_MMSS_H_ + +#include "queue.hpp" + +extern "C" { + +#include +#include + +} + +#include +#include + +struct mmss { + uint64_t now; + mmss_queue_t packet_queue; + mmss_queue_t scheduled_queue; +}; + +struct mmss_config { + mmss_network_t *networks; + gmrf_t *nodes; +}; + +struct mmss_network { + mmss_network_t *next; + + char *name; + + gmrf_iface_t *interfaces; + size_t mtu; +}; + +struct mmss_packet { + uint64_t sent; + + gmrf_iface_t *source; + gmrf_iface_t *dest; + + size_t len; + uint8_t data[]; +}; + +struct mmss_scheduled { + 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; + + gmrf_t *node; + mmss_network_t *net; +}; + + +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 mmss_read_config(mmss_t *mmss, mmss_config_t *conf, const char *filename); + +void mmss_add_iface(gmrf_t *node, mmss_network_t *net, const char *name, const gmrf_addr_t *address); + +void mmss_dispatch(mmss_packet_t *packet); +void mmss_run_scheduled(mmss_scheduled_t *scheduled); + +void mmss_logf(mmss_t *mmss, int priority, const char *format, ...); + + +static inline int max(int a, int b) { + return (a > b) ? a : b; +} + +static inline int min(int a, int b) { + return (a < b) ? a : b; +} + + +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(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(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; + + return ret; +} + +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(std::malloc(alignto(sizeof(mmss_string_stack_t) + strlen(str) + 1, 8))); + ret->next = stack; + std::strcpy(ret->str, str); + + return ret; +} + +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; + } +} + + +#endif /* _GMRF_MMSS_MMSS_H_ */ -- cgit v1.2.3