Rename context data structures, define more of the module API
This commit is contained in:
parent
cdf537c71c
commit
77199be682
8 changed files with 55 additions and 47 deletions
|
@ -33,6 +33,7 @@
|
|||
#include <string.h>
|
||||
|
||||
|
||||
typedef struct gmrf gmrf_t;
|
||||
typedef struct gmrf_context gmrf_context_t;
|
||||
typedef struct gmrf_iface gmrf_iface_t;
|
||||
|
||||
|
@ -52,17 +53,13 @@ static inline bool gmrf_addr_equal(const gmrf_addr_t *addr1, const gmrf_addr_t *
|
|||
}
|
||||
|
||||
|
||||
gmrf_addr_t gmrf_iface_get_addr(gmrf_context_t *ctx, gmrf_iface_t *iface);
|
||||
size_t gmrf_iface_get_mtu(gmrf_context_t *ctx, gmrf_iface_t *iface);
|
||||
gmrf_addr_t gmrf_iface_get_addr(gmrf_t *gmrf, gmrf_iface_t *iface);
|
||||
size_t gmrf_iface_get_mtu(gmrf_t *gmrf, gmrf_iface_t *iface);
|
||||
|
||||
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_bc(gmrf_context_t *ctx, gmrf_iface_t *iface, const void *data, size_t len);
|
||||
bool gmrf_iface_send(gmrf_t *gmrf, gmrf_iface_t *iface, const void *data, size_t len, const gmrf_addr_t *dest);
|
||||
bool gmrf_iface_send_bc(gmrf_t *gmrf, gmrf_iface_t *iface, const void *data, size_t len);
|
||||
|
||||
|
||||
typedef void (*gmrf_handle_packet_func)(gmrf_context_t *ctx, gmrf_iface_t *iface, const gmrf_addr_t *source, const void *data, size_t len);
|
||||
|
||||
typedef struct gmrf_protocol {
|
||||
gmrf_handle_packet_func handle_packet;
|
||||
} gmrf_protocol_t;
|
||||
gmrf_context_t* gmrf_init(gmrf_t *gmrf);
|
||||
void gmrf_handle_packet(gmrf_t *gmrf, gmrf_context_t *ctx, gmrf_iface_t *iface, const gmrf_addr_t *source, const void *data, size_t len);
|
||||
|
||||
#endif /* _GMRF_GMRF_H_ */
|
||||
|
|
|
@ -34,7 +34,8 @@ typedef struct mmss_protocol {
|
|||
const char *name;
|
||||
const char *version;
|
||||
|
||||
gmrf_protocol_t* (*init)(gmrf_context_t *ctx);
|
||||
gmrf_context_t* (*init)(gmrf_t *gmrf);
|
||||
void (*handle_packet)(gmrf_t *gmrf, gmrf_context_t *ctx, gmrf_iface_t *iface, const gmrf_addr_t *source, const void *data, size_t len);
|
||||
} mmss_protocol_t;
|
||||
|
||||
#endif /* _GMRF_MMSS_PROTOCOL_H_ */
|
||||
|
|
18
mmss/iface.c
18
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;
|
||||
}
|
||||
|
|
33
mmss/mmss.c
33
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
13
mmss/mmss.h
13
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;
|
||||
|
|
10
mmss/queue.c
10
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;
|
||||
|
|
|
@ -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_ */
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Reference in a new issue