From 1f67abe0f324a226de619ba9de44dbd5eb54ecaa Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Fri, 26 Jul 2013 17:45:15 +0200 Subject: Clean up queue implementation, fix namespaces --- mmss/iface.cpp | 80 +++++++++++++++++++++++++++++++--------------------------- 1 file changed, 43 insertions(+), 37 deletions(-) (limited to 'mmss/iface.cpp') diff --git a/mmss/iface.cpp b/mmss/iface.cpp index 441da4a..e25eccd 100644 --- a/mmss/iface.cpp +++ b/mmss/iface.cpp @@ -26,38 +26,68 @@ #include "mmss.hpp" -#include +#include -gmrf_addr_t gmrf_iface_get_addr(gmrf_t *gmrf, gmrf_iface_t *iface) { - return iface->address; -} +namespace MMSS { -const char* gmrf_iface_get_name(gmrf_t *gmrf, gmrf_iface_t *iface) { - return iface->name; +void dispatch(std::shared_ptr packet) { + packet->dest->node->proto->handle_packet(packet->dest->node, packet->dest->node->ctx, packet->dest, + &packet->source->address, packet->data.get(), packet->len); } -size_t gmrf_iface_get_mtu(gmrf_t *gmrf, gmrf_iface_t *iface) { - return iface->net->mtu; +void add_iface(gmrf_t *node, network_t *net, const char *name, const gmrf_addr_t *address) { + gmrf_iface_t *iface = new gmrf_iface_t; + + iface->name = strdup(name); + iface->address = *address; + + iface->node = node; + iface->net = net; + + iface->node_next = node->interfaces; + node->interfaces = iface; + + iface->network_next = net->interfaces; + net->interfaces = iface; + + node->proto->add_iface(node, node->ctx, iface); } -static void enqueue(mmss_t *mmss, gmrf_iface_t *source, gmrf_iface_t *dest, const void *data, size_t len) { - mmss_packet_t *packet = reinterpret_cast(calloc(1, sizeof(mmss_packet_t) + len)); +static void enqueue(context_t *mmss, gmrf_iface_t *source, gmrf_iface_t *dest, const void *data, size_t len) { + std::shared_ptr packet = std::make_shared(); packet->sent = mmss->now; packet->source = source; packet->dest = dest; packet->len = len; - memcpy(packet->data, data, len); - mmss_queue_put(mmss, &mmss->packet_queue, packet, mmss->now+1); + packet->data.reset(new uint8_t[len]); + std::memcpy(packet->data.get(), data, len); + + mmss->packet_queue.put(packet, mmss->now+1); +} + +} + + +gmrf_addr_t gmrf_iface_get_addr(gmrf_t *gmrf, gmrf_iface_t *iface) { + return iface->address; +} + +const char* gmrf_iface_get_name(gmrf_t *gmrf, gmrf_iface_t *iface) { + return iface->name; +} + +size_t gmrf_iface_get_mtu(gmrf_t *gmrf, gmrf_iface_t *iface) { + return iface->net->mtu; } bool gmrf_iface_send(gmrf_t *gmrf, gmrf_iface_t *iface, const void *data, size_t len, const gmrf_addr_t *dest) { gmrf_iface_t *dest_iface; for (dest_iface = iface->net->interfaces; dest_iface; dest_iface = dest_iface->network_next) { if (gmrf_addr_equal(&dest_iface->address, dest)) { - enqueue(gmrf->mmss, iface, dest_iface, data, len); + MMSS::enqueue(gmrf->mmss, iface, dest_iface, data, len); break; } } @@ -74,27 +104,3 @@ bool gmrf_iface_send_bc(gmrf_t *gmrf, gmrf_iface_t *iface, const void *data, siz return true; } - -void mmss_dispatch(mmss_packet_t *packet) { - packet->dest->node->proto->handle_packet(packet->dest->node, packet->dest->node->ctx, packet->dest, - &packet->source->address, packet->data, packet->len); - free(packet); -} - -void mmss_add_iface(gmrf_t *node, mmss_network_t *net, const char *name, const gmrf_addr_t *address) { - gmrf_iface_t *iface = new gmrf_iface_t; - - iface->name = strdup(name); - iface->address = *address; - - iface->node = node; - iface->net = net; - - iface->node_next = node->interfaces; - node->interfaces = iface; - - iface->network_next = net->interfaces; - net->interfaces = iface; - - node->proto->add_iface(node, node->ctx, iface); -} -- cgit v1.2.3