summaryrefslogtreecommitdiffstats
path: root/mmss/iface.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'mmss/iface.cpp')
-rw-r--r--mmss/iface.cpp80
1 files changed, 43 insertions, 37 deletions
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 <cstdlib>
+#include <cstring>
-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_t> 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<mmss_packet_t*>(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_t> packet = std::make_shared<packet_t>();
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);
-}