summaryrefslogtreecommitdiffstats
path: root/mmss
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2013-03-18 03:34:12 +0100
committerMatthias Schiffer <mschiffer@universe-factory.net>2013-03-18 03:34:12 +0100
commit77199be682daa1797a4518b3958d58c133dd88f2 (patch)
tree60737630a303d0127fdf9db062228289311152fa /mmss
parentcdf537c71c29c05fd3d77637a3731de80019d2be (diff)
downloadgmrf-77199be682daa1797a4518b3958d58c133dd88f2.tar
gmrf-77199be682daa1797a4518b3958d58c133dd88f2.zip
Rename context data structures, define more of the module API
Diffstat (limited to 'mmss')
-rw-r--r--mmss/iface.c18
-rw-r--r--mmss/mmss.c33
-rw-r--r--mmss/mmss.h13
-rw-r--r--mmss/queue.c10
-rw-r--r--mmss/queue.h6
-rw-r--r--mmss/types.h2
6 files changed, 46 insertions, 36 deletions
diff --git a/mmss/iface.c b/mmss/iface.c
index 0661c0e..cecfed0 100644
--- a/mmss/iface.c
+++ b/mmss/iface.c
@@ -29,31 +29,31 @@
#include <stdlib.h>
-gmrf_addr_t gmrf_iface_get_addr(gmrf_context_t *ctx, gmrf_iface_t *iface) {
+gmrf_addr_t gmrf_iface_get_addr(gmrf_t *gmrf, gmrf_iface_t *iface) {
return iface->address;
}
-size_t gmrf_iface_get_mtu(gmrf_context_t *ctx, gmrf_iface_t *iface) {
+size_t gmrf_iface_get_mtu(gmrf_t *gmrf, gmrf_iface_t *iface) {
return iface->net->mtu;
}
-static void enqueue(mmss_context_t *ctx, gmrf_iface_t *source, gmrf_iface_t *dest, const void *data, size_t len) {
+static void enqueue(mmss_t *mmss, gmrf_iface_t *source, gmrf_iface_t *dest, const void *data, size_t len) {
mmss_packet_t *packet = calloc(1, sizeof(mmss_packet_t) + len);
- packet->sent = ctx->now;
+ packet->sent = mmss->now;
packet->source = source;
packet->dest = dest;
packet->len = len;
memcpy(packet->data, data, len);
- mmss_queue_put(ctx, &ctx->packet_queue, packet, ctx->now+1);
+ mmss_queue_put(mmss, &mmss->packet_queue, packet, mmss->now+1);
}
-bool gmrf_iface_send(gmrf_context_t *ctx, gmrf_iface_t *iface, const void *data, size_t len, const gmrf_addr_t *dest) {
+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(ctx->mmss, iface, dest_iface, data, len);
+ enqueue(gmrf->mmss, iface, dest_iface, data, len);
break;
}
}
@@ -61,10 +61,10 @@ bool gmrf_iface_send(gmrf_context_t *ctx, gmrf_iface_t *iface, const void *data,
return true;
}
-bool gmrf_iface_send_bc(gmrf_context_t *ctx, gmrf_iface_t *iface, const void *data, size_t len) {
+bool gmrf_iface_send_bc(gmrf_t *gmrf, gmrf_iface_t *iface, const void *data, size_t len) {
gmrf_iface_t *dest_iface;
for (dest_iface = iface->net->interfaces; dest_iface; dest_iface = dest_iface->network_next)
- enqueue(ctx->mmss, iface, dest_iface, data, len);
+ enqueue(gmrf->mmss, iface, dest_iface, data, len);
return true;
}
diff --git a/mmss/mmss.c b/mmss/mmss.c
index eca99ad..abb4835 100644
--- a/mmss/mmss.c
+++ b/mmss/mmss.c
@@ -31,11 +31,19 @@
#include <stdlib.h>
+static void init_nodes(gmrf_t *nodes) {
+ gmrf_t *node;
+ for (node = nodes; node; node = node->next) {
+ node->ctx = node->proto->init(node);
+ }
+}
+
+
int main() {
- mmss_context_t ctx = { .now = 0 };
+ mmss_t mmss = { .now = 0 };
mmss_network_t net = { .mtu = 1500 };
- gmrf_context_t node1 = { .mmss = &ctx }, node2 = { .mmss = &ctx };
+ gmrf_t node1 = { .mmss = &mmss }, node2 = { .mmss = &mmss };
gmrf_iface_t iface1 = {}, iface2 = {};
iface1.net = &net;
@@ -53,10 +61,12 @@ int main() {
net.interfaces = &iface2;
node2.next = &node1;
- gmrf_context_t *nodes = &node2;
+ gmrf_t *nodes = &node2;
+
+ init_nodes(nodes);
while (true) {
- int timeout = mmss_queue_timeout(&ctx, &ctx.packet_queue);
+ int timeout = mmss_queue_timeout(&mmss, &mmss.packet_queue);
if (timeout < 0) {
fprintf(stderr, "Nothing queued, deadlock occured.\n");
@@ -64,25 +74,24 @@ int main() {
}
if (timeout > 0) {
- assert(!mmss_queue_get(&ctx, &ctx.packet_queue));
+ assert(!mmss_queue_get(&mmss, &mmss.packet_queue));
- ctx.now += timeout;
- timeout = mmss_queue_timeout(&ctx, &ctx.packet_queue);
+ mmss.now += timeout;
+ timeout = mmss_queue_timeout(&mmss, &mmss.packet_queue);
}
assert(timeout == 0);
while (timeout == 0) {
- mmss_packet_t *packet = mmss_queue_get(&ctx, &ctx.packet_queue);
+ mmss_packet_t *packet = mmss_queue_get(&mmss, &mmss.packet_queue);
assert(packet);
- packet->dest->node->handle_packet(packet->dest->node, packet->dest,
- &packet->source->address, packet->data,
- packet->len);
+ packet->dest->node->proto->handle_packet(packet->dest->node, packet->dest->node->ctx, packet->dest,
+ &packet->source->address, packet->data, packet->len);
free(packet);
- timeout = mmss_queue_timeout(&ctx, &ctx.packet_queue);
+ timeout = mmss_queue_timeout(&mmss, &mmss.packet_queue);
}
}
diff --git a/mmss/mmss.h b/mmss/mmss.h
index e7f773e..e8b8f32 100644
--- a/mmss/mmss.h
+++ b/mmss/mmss.h
@@ -33,7 +33,7 @@
#include "queue.h"
-struct mmss_context {
+struct mmss {
uint64_t now;
mmss_queue_t packet_queue;
};
@@ -57,20 +57,21 @@ struct mmss_packet {
};
-struct gmrf_context {
- gmrf_context_t *next;
+struct gmrf {
+ gmrf_t *next;
- mmss_context_t *mmss;
+ mmss_t *mmss;
+ gmrf_context_t *ctx;
gmrf_iface_t *interfaces;
- gmrf_handle_packet_func handle_packet;
+ mmss_protocol_t *proto;
};
struct gmrf_iface {
gmrf_iface_t *node_next;
gmrf_iface_t *network_next;
- gmrf_context_t *node;
+ gmrf_t *node;
mmss_network_t *net;
gmrf_addr_t address;
diff --git a/mmss/queue.c b/mmss/queue.c
index 3adf188..cf1e10a 100644
--- a/mmss/queue.c
+++ b/mmss/queue.c
@@ -39,7 +39,7 @@ struct mmss_queue_entry {
};
-void mmss_queue_put(mmss_context_t *ctx, mmss_queue_t *queue, void *data, uint64_t timeout) {
+void mmss_queue_put(mmss_t *mmss, mmss_queue_t *queue, void *data, uint64_t timeout) {
while (*queue && timeout > (*queue)->timeout)
queue = &(*queue)->next;
@@ -52,10 +52,10 @@ void mmss_queue_put(mmss_context_t *ctx, mmss_queue_t *queue, void *data, uint64
*queue = entry;
}
-void* mmss_queue_get(mmss_context_t *ctx, mmss_queue_t *queue) {
+void* mmss_queue_get(mmss_t *mmss, mmss_queue_t *queue) {
mmss_queue_entry_t *entry = *queue;
- if (!entry || entry->timeout > ctx->now)
+ if (!entry || entry->timeout > mmss->now)
return NULL;
*queue = entry->next;
@@ -65,11 +65,11 @@ void* mmss_queue_get(mmss_context_t *ctx, mmss_queue_t *queue) {
return data;
}
-int mmss_queue_timeout(const mmss_context_t *ctx, const mmss_queue_t *const queue) {
+int mmss_queue_timeout(const mmss_t *mmss, const mmss_queue_t *const queue) {
if (!*queue)
return -1;
- int diff = (*queue)->timeout - ctx->now;
+ int diff = (*queue)->timeout - mmss->now;
if (diff < 0)
return 0;
diff --git a/mmss/queue.h b/mmss/queue.h
index be98a04..6e2648b 100644
--- a/mmss/queue.h
+++ b/mmss/queue.h
@@ -35,8 +35,8 @@
typedef struct mmss_queue_entry *mmss_queue_t;
-void mmss_queue_put(mmss_context_t *ctx, mmss_queue_t *queue, void *data, uint64_t timeout);
-void* mmss_queue_get(mmss_context_t *ctx, mmss_queue_t *queue);
-int mmss_queue_timeout(const mmss_context_t *ctx, const mmss_queue_t *const queue);
+void mmss_queue_put(mmss_t *mmss, mmss_queue_t *queue, void *data, uint64_t timeout);
+void* mmss_queue_get(mmss_t *mmss, mmss_queue_t *queue);
+int mmss_queue_timeout(const mmss_t *mmss, const mmss_queue_t *const queue);
#endif /* _GMRF_MMSS_QUEUE_H_ */
diff --git a/mmss/types.h b/mmss/types.h
index 56e6250..4ce1e81 100644
--- a/mmss/types.h
+++ b/mmss/types.h
@@ -27,7 +27,7 @@
#ifndef _GMRF_MMSS_TYPES_H_
#define _GMRF_MMSS_TYPES_H_
-typedef struct mmss_context mmss_context_t;
+typedef struct mmss mmss_t;
typedef struct mmss_network mmss_network_t;
typedef struct mmss_packet mmss_packet_t;