From 976cea11de8bc45fcff1a5c1e007b406e2469db7 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Mon, 18 Mar 2013 19:30:37 +0100 Subject: Inform protocol about interfaces --- include/gmrf/gmrf.h | 2 ++ include/mmss/protocol.h | 1 + mmss-protocol/mmss_protocol.c | 1 + mmss/iface.c | 22 ++++++++++++++++++++++ mmss/mmss.c | 19 ++++--------------- mmss/mmss.h | 7 +++++-- 6 files changed, 35 insertions(+), 17 deletions(-) diff --git a/include/gmrf/gmrf.h b/include/gmrf/gmrf.h index 7f3cbde..4c718f8 100644 --- a/include/gmrf/gmrf.h +++ b/include/gmrf/gmrf.h @@ -56,6 +56,7 @@ static inline bool gmrf_addr_equal(const gmrf_addr_t *addr1, const gmrf_addr_t * void gmrf_logf(gmrf_t *gmrf, int priority, const char *format, ...); gmrf_addr_t gmrf_iface_get_addr(gmrf_t *gmrf, gmrf_iface_t *iface); +const char* gmrf_iface_get_name(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_t *gmrf, gmrf_iface_t *iface, const void *data, size_t len, const gmrf_addr_t *dest); @@ -70,6 +71,7 @@ extern const char *gmrf_protocol_name; extern const char *gmrf_protocol_version; gmrf_context_t* gmrf_protocol_init(gmrf_t *gmrf); +void gmrf_protocol_add_iface(gmrf_t *gmrf, gmrf_context_t *ctx, gmrf_iface_t *iface); void gmrf_protocol_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_ */ diff --git a/include/mmss/protocol.h b/include/mmss/protocol.h index 7d131d2..3ddd094 100644 --- a/include/mmss/protocol.h +++ b/include/mmss/protocol.h @@ -35,6 +35,7 @@ typedef struct mmss_protocol { const char* (*get_version)(void); gmrf_context_t* (*init)(gmrf_t *gmrf); + void (*add_iface)(gmrf_t *gmrf, gmrf_context_t *ctx, gmrf_iface_t *iface); 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; diff --git a/mmss-protocol/mmss_protocol.c b/mmss-protocol/mmss_protocol.c index cad6d76..16f10e4 100644 --- a/mmss-protocol/mmss_protocol.c +++ b/mmss-protocol/mmss_protocol.c @@ -40,5 +40,6 @@ const mmss_protocol_t mmss_protocol_info = { .get_version = get_version, .init = gmrf_protocol_init, + .add_iface = gmrf_protocol_add_iface, .handle_packet = gmrf_protocol_handle_packet, }; diff --git a/mmss/iface.c b/mmss/iface.c index b175fa7..47a2877 100644 --- a/mmss/iface.c +++ b/mmss/iface.c @@ -33,6 +33,10 @@ 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; } @@ -74,3 +78,21 @@ void mmss_dispatch(mmss_packet_t *packet) { &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 = calloc(1, sizeof(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); +} diff --git a/mmss/mmss.c b/mmss/mmss.c index 444445e..77ec21f 100644 --- a/mmss/mmss.c +++ b/mmss/mmss.c @@ -68,27 +68,16 @@ int main(int argc, char *argv[]) { mmss_network_t net = { .mtu = 1500 }; gmrf_t node1 = { .name = "node1", .mmss = &mmss, .proto = proto }, node2 = { .name = "node2", .mmss = &mmss, .proto = proto }; - gmrf_iface_t iface1 = {}, iface2 = {}; - - iface1.net = &net; - iface1.node = &node1; - iface1.address = (gmrf_addr_t){{1}}; - - iface2.net = &net; - iface2.node = &node2; - iface2.address = (gmrf_addr_t){{2}}; - - node1.interfaces = &iface1; - node2.interfaces = &iface2; - - iface2.network_next = &iface1; - net.interfaces = &iface2; node2.next = &node1; gmrf_t *nodes = &node2; init_nodes(nodes); + gmrf_addr_t addr1 = {{1}}, addr2 = {{2}}; + mmss_add_iface(&node1, &net, "mmss0", &addr1); + mmss_add_iface(&node2, &net, "mmss0", &addr2); + while (true) { int timeout = get_queue_timeout(&mmss); diff --git a/mmss/mmss.h b/mmss/mmss.h index c10a119..728bc3c 100644 --- a/mmss/mmss.h +++ b/mmss/mmss.h @@ -80,15 +80,18 @@ struct gmrf_iface { gmrf_iface_t *node_next; gmrf_iface_t *network_next; + char *name; + gmrf_addr_t address; + gmrf_t *node; mmss_network_t *net; - - gmrf_addr_t address; }; const mmss_protocol_t* mmss_load_protocol(const char *module); +void mmss_add_iface(gmrf_t *node, mmss_network_t *net, const char *name, const gmrf_addr_t *address); + void mmss_dispatch(mmss_packet_t *packet); void mmss_run_scheduled(mmss_scheduled_t *scheduled); -- cgit v1.2.3