From 77199be682daa1797a4518b3958d58c133dd88f2 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Mon, 18 Mar 2013 03:34:12 +0100 Subject: Rename context data structures, define more of the module API --- mmss/iface.c | 18 +++++++++--------- mmss/mmss.c | 33 +++++++++++++++++++++------------ mmss/mmss.h | 13 +++++++------ mmss/queue.c | 10 +++++----- mmss/queue.h | 6 +++--- mmss/types.h | 2 +- 6 files changed, 46 insertions(+), 36 deletions(-) (limited to 'mmss') 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 -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 +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; -- cgit v1.2.3