]> git.meshlink.io Git - meshlink/blobdiff - src/meshlink.c
Allow the application to provide channel send/receive buffers.
[meshlink] / src / meshlink.c
index c34b24c9643f4bde69e2904877502e78c01f2b86..1540df37344ace42cc87c70cc07160401fd914e7 100644 (file)
@@ -391,7 +391,10 @@ static int getifaddrs_in_netns(struct ifaddrs **ifa, int netns) {
 #endif
 
 char *meshlink_get_local_address_for_family(meshlink_handle_t *mesh, int family) {
-       (void)mesh;
+       if(!mesh) {
+               meshlink_errno = MESHLINK_EINVAL;
+               return NULL;
+       }
 
        // Determine address of the local interface used for outgoing connections.
        char localaddr[NI_MAXHOST];
@@ -3863,7 +3866,7 @@ static void channel_retransmit(struct utcp_connection *utcp_connection) {
        node_t *n = utcp_connection->utcp->priv;
        meshlink_handle_t *mesh = n->mesh;
 
-       if(n->mtuprobes == 31) {
+       if(n->mtuprobes == 31 && n->mtutimeout.cb) {
                timeout_set(&mesh->loop, &n->mtutimeout, &(struct timespec) {
                        0, 0
                });
@@ -4052,9 +4055,15 @@ void meshlink_set_channel_accept_cb(meshlink_handle_t *mesh, meshlink_channel_ac
 }
 
 void meshlink_set_channel_sndbuf(meshlink_handle_t *mesh, meshlink_channel_t *channel, size_t size) {
-       (void)mesh;
+       meshlink_set_channel_sndbuf_storage(mesh, channel, NULL, size);
+}
 
-       if(!channel) {
+void meshlink_set_channel_rcvbuf(meshlink_handle_t *mesh, meshlink_channel_t *channel, size_t size) {
+       meshlink_set_channel_rcvbuf_storage(mesh, channel, NULL, size);
+}
+
+void meshlink_set_channel_sndbuf_storage(meshlink_handle_t *mesh, meshlink_channel_t *channel, void *buf, size_t size) {
+       if(!mesh || !channel) {
                meshlink_errno = MESHLINK_EINVAL;
                return;
        }
@@ -4063,14 +4072,26 @@ void meshlink_set_channel_sndbuf(meshlink_handle_t *mesh, meshlink_channel_t *ch
                abort();
        }
 
-       utcp_set_sndbuf(channel->c, size);
+       utcp_set_sndbuf(channel->c, buf, size);
        pthread_mutex_unlock(&mesh->mutex);
 }
 
-void meshlink_set_channel_rcvbuf(meshlink_handle_t *mesh, meshlink_channel_t *channel, size_t size) {
-       (void)mesh;
+void meshlink_set_channel_rcvbuf_storage(meshlink_handle_t *mesh, meshlink_channel_t *channel, void *buf, size_t size) {
+       if(!mesh || !channel) {
+               meshlink_errno = MESHLINK_EINVAL;
+               return;
+       }
 
-       if(!channel) {
+       if(pthread_mutex_lock(&mesh->mutex) != 0) {
+               abort();
+       }
+
+       utcp_set_rcvbuf(channel->c, buf, size);
+       pthread_mutex_unlock(&mesh->mutex);
+}
+
+void meshlink_set_channel_flags(meshlink_handle_t *mesh, meshlink_channel_t *channel, uint32_t flags) {
+       if(!mesh || !channel) {
                meshlink_errno = MESHLINK_EINVAL;
                return;
        }
@@ -4079,7 +4100,7 @@ void meshlink_set_channel_rcvbuf(meshlink_handle_t *mesh, meshlink_channel_t *ch
                abort();
        }
 
-       utcp_set_rcvbuf(channel->c, size);
+       utcp_set_flags(channel->c, flags);
        pthread_mutex_unlock(&mesh->mutex);
 }