]> git.meshlink.io Git - meshlink/blobdiff - src/meshlink.c
Add a configurable fast connection retry period.
[meshlink] / src / meshlink.c
index fdc6fed874460271a5fe810722871238a8352cc3..30b386846a7322e261a1b0f4888331773352fe0c 100644 (file)
@@ -612,7 +612,7 @@ static bool finalize_join(meshlink_handle_t *mesh, const void *buf, uint16_t len
        }
 
        // Write host config files
-       while(count--) {
+       for(uint32_t i = 0; i < count; i++) {
                const void *data;
                uint32_t len = packmsg_get_bin_raw(&in, &data);
 
@@ -655,11 +655,24 @@ static bool finalize_join(meshlink_handle_t *mesh, const void *buf, uint16_t len
                        return false;
                }
 
-               node_add(mesh, n);
+               if(i == 0) {
+                       /* The first host config file is of the inviter itself;
+                        * remember the address we are currently using for the invitation connection.
+                        */
+                       sockaddr_t sa;
+                       socklen_t salen = sizeof(sa);
 
-               if(!config_write(mesh, "current", n->name, &config, mesh->config_key)) {
+                       if(getpeername(mesh->sock, &sa.sa, &salen) == 0) {
+                               node_add_recent_address(mesh, n, &sa);
+                       }
+               }
+
+               if(!node_write_config(mesh, n)) {
+                       free_node(n);
                        return false;
                }
+
+               node_add(mesh, n);
        }
 
        /* Ensure the configuration directory metadata is on disk */
@@ -3794,6 +3807,22 @@ void meshlink_set_dev_class_timeouts(meshlink_handle_t *mesh, dev_class_t devcla
        pthread_mutex_unlock(&mesh->mutex);
 }
 
+void meshlink_set_dev_class_fast_retry_period(meshlink_handle_t *mesh, dev_class_t devclass, int fast_retry_period) {
+       if(!mesh || devclass < 0 || devclass >= DEV_CLASS_COUNT) {
+               meshlink_errno = EINVAL;
+               return;
+       }
+
+       if(fast_retry_period < 0) {
+               meshlink_errno = EINVAL;
+               return;
+       }
+
+       pthread_mutex_lock(&mesh->mutex);
+       mesh->dev_class_traits[devclass].fast_retry_period = fast_retry_period;
+       pthread_mutex_unlock(&mesh->mutex);
+}
+
 void handle_network_change(meshlink_handle_t *mesh, bool online) {
        (void)online;