]> git.meshlink.io Git - meshlink/commitdiff
Merge branch 'channels'
authorGuus Sliepen <guus@meshlink.io>
Fri, 22 Aug 2014 08:58:47 +0000 (10:58 +0200)
committerGuus Sliepen <guus@meshlink.io>
Fri, 22 Aug 2014 09:00:15 +0000 (11:00 +0200)
Conflicts:
.gitmodules
src/node.h

.gitmodules
src/Makefile.am
src/meshlink.c
src/meshlink_internal.h
src/node.h
src/utcp [new submodule]

index 0e6f5440dc21eb7dad698f958e642815ae489de5..e938b09181fe4913bb679de84d167cd8917664c7 100644 (file)
@@ -2,3 +2,6 @@
        path = avahi
        url = git@chicago.everbase.net:meshlink/avahi-noptr.git
        branch = noptr
+[submodule "src/utcp"]
+       path = src/utcp
+       url = git://meshlink.io/utcp
index cae2ab95458666bd89d738bae7eab34890788914..a2a9305ac54e32f219be1439581d728b5fb66f13 100644 (file)
@@ -28,6 +28,9 @@ chacha_poly1305_SOURCES = \
        chacha-poly1305/chacha-poly1305.c chacha-poly1305/chacha-poly1305.h \
        chacha-poly1305/poly1305.c chacha-poly1305/poly1305.h
 
+utcp_SOURCES = \
+       utcp/utcp.c utcp/utcp.h
+
 sptps_test_SOURCES = \
        crypto.c crypto.h \
        logger.c logger.h \
@@ -101,7 +104,8 @@ libmeshlink_la_SOURCES = \
        xalloc.h \
        devtools.c devtools.h \
        $(ed25519_SOURCES) \
-       $(chacha_poly1305_SOURCES)
+       $(chacha_poly1305_SOURCES) \
+       $(utcp_SOURCES)
 
 libmeshlink_la_CFLAGS = -fPIC -I../avahi/
 
index ddaa740b88a4b7fd501b02e2f95e7e105260e403..ef02580ea93d641059eb203c7e3a8a17b14c1ab9 100644 (file)
@@ -1914,6 +1914,76 @@ meshlink_edge_t **meshlink_get_all_edges_state(meshlink_handle_t *mesh, meshlink
        return result;
 }
 
+static bool channel_pre_accept(struct utcp *utcp, uint16_t port) {
+       //TODO: implement
+       return false;
+}
+
+static void channel_accept(struct utcp_connection *utcp_connection, uint16_t port) {
+       //TODO: implement
+}
+
+static int channel_recv(struct utcp_connection *connection, const void *data, size_t len) {
+       meshlink_channel_t *channel = connection->priv;
+       node_t *n = channel->node;
+       meshlink_handle_t *mesh = n->mesh;
+       if(!channel->receive_cb)
+               return -1;
+       else {
+               channel->receive_cb(mesh, channel, data, len);
+               return 0;
+       }
+}
+
+static int channel_send(struct utcp *utcp, const void *data, size_t len) {
+       node_t *n = utcp->priv;
+       meshlink_handle_t *mesh = n->mesh;
+       return meshlink_send(mesh, (meshlink_node_t *)n, data, len) ? len : -1;
+}
+
+void meshlink_set_channel_accept_cb(meshlink_handle_t *mesh, meshlink_channel_accept_cb_t cb) {
+       mesh->channel_accept_cb = cb;
+}
+
+void meshlink_set_channel_receive_cb(meshlink_handle_t *mesh, meshlink_channel_t *channel, meshlink_channel_receive_cb_t cb) {
+       channel->receive_cb = cb;
+}
+
+meshlink_channel_t *meshlink_channel_open(meshlink_handle_t *mesh, meshlink_node_t *node, uint16_t port, meshlink_channel_receive_cb_t cb, const void *data, size_t len) {
+       node_t *n = (node_t *)node;
+       if(!n->utcp) {
+               n->utcp = utcp_init(channel_accept, channel_pre_accept, channel_send, n);
+               if(!n->utcp)
+                       return NULL;
+       }
+       meshlink_channel_t *channel = xzalloc(sizeof *channel);
+       channel->node = n;
+       channel->receive_cb = cb;
+       channel->c = utcp_connect(n->utcp, port, channel_recv, channel);
+       if(!channel->c) {
+               free(channel);
+               return NULL;
+       }
+       return channel;
+}
+
+void meshlink_channel_shutdown(meshlink_handle_t *mesh, meshlink_channel_t *channel, int direction) {
+       utcp_shutdown(channel->c, direction);
+}
+
+void meshlink_channel_close(meshlink_handle_t *mesh, meshlink_channel_t *channel) {
+       utcp_close(channel->c);
+       free(channel);
+}
+
+ssize_t meshlink_channel_send(meshlink_handle_t *mesh, meshlink_channel_t *channel, const void *data, size_t len) {
+       // TODO: locking.
+       // Ideally we want to put the data into the UTCP connection's send buffer.
+       // Then, preferrably only if there is room in the receiver window,
+       // kick the meshlink thread to go send packets.
+       return utcp_send(channel->c, data, len);
+}
+
 static void __attribute__((constructor)) meshlink_init(void) {
        crypto_init();
 }
index 994f25bf9bd5f077403ffc67ec5f484ce6165d50..517dc1e01cb8dbee31824f040f7c0a6140015f9e 100644 (file)
@@ -74,6 +74,8 @@ struct meshlink_handle {
        meshlink_log_cb_t log_cb;
        meshlink_log_level_t log_level;
 
+       meshlink_channel_accept_cb_t channel_accept_cb;
+
        pthread_t thread;
        bool threadstarted;
        pthread_mutex_t outpacketqueue_mutex;
@@ -148,6 +150,13 @@ struct meshlink_node {
        void *priv;
 };
 
+/// A channel.
+struct meshlink_channel {
+       struct utcp_connection *c;
+       struct node_t *node;
+       meshlink_channel_receive_cb_t receive_cb;
+};
+
 /// Header for data packets routed between nodes
 typedef struct meshlink_packethdr {
        uint8_t destination[16];
index c86c3cee9a650225137f9c1f17f73cc96effd306..5761e4d747e5544c2d5189fdaed074eaa597ac12 100644 (file)
@@ -23,6 +23,7 @@
 #include "event.h"
 #include "sockaddr.h"
 #include "sptps.h"
+#include "utcp/utcp.h"
 
 typedef struct node_status_t {
        unsigned int unused_active:1;           /* 1 if active (not used for nodes) */
@@ -40,9 +41,10 @@ typedef struct node_status_t {
 
 typedef struct node_t {
        char *name;                             /* name of this node */
+       void *priv;
+
        uint32_t options;                       /* options turned on for this node */
        dev_class_t devclass;
-       void *priv;
 
        struct meshlink_handle *mesh;           /* The mesh this node belongs to */
 
@@ -89,6 +91,8 @@ typedef struct node_t {
        float bandwidth;                        /* Last measured bandwidth */
        float packetloss;                       /* Last measured packet loss rate */
 
+       struct utcp *utcp;
+
        uint64_t in_packets;
        uint64_t in_bytes;
        uint64_t out_packets;
diff --git a/src/utcp b/src/utcp
new file mode 160000 (submodule)
index 0000000..6934880
--- /dev/null
+++ b/src/utcp
@@ -0,0 +1 @@
+Subproject commit 6934880365c13cfebe5806be0f40c4c45a5dcf84