]> git.meshlink.io Git - meshlink/commitdiff
Use the canonical address exclusively for making outgoing meta-connections.
authorGuus Sliepen <guus@meshlink.io>
Mon, 7 Sep 2020 19:12:28 +0000 (21:12 +0200)
committerGuus Sliepen <guus@meshlink.io>
Mon, 7 Sep 2020 19:12:28 +0000 (21:12 +0200)
If we have a node's canonical address, we now always use that as a source
for addresses for outgoing meta-connection attempts. This commit also adds
the function meshlink_clear_canonical_address() to ensure the canonical
address can be removed if it is no longer valid.

src/meshlink++.h
src/meshlink.c
src/meshlink.h
src/meshlink.sym
src/net_socket.c

index e0a51066facd10b3f27599ee81d838fd3263a477..183544ac99f3c4ebf3819b243457f2044542c06e 100644 (file)
@@ -515,6 +515,18 @@ public:
                return meshlink_set_canonical_address(handle, node, address, port);
        }
 
+       /// Clear the canonical Address for a node.
+       /** This function clears the canonical Address for a node.
+        *
+        *  @param mesh         A handle which represents an instance of MeshLink.
+        *  @param node         A pointer to a struct meshlink_node describing the node.
+        *
+        *  @return             This function returns true if the address was removed, false otherwise.
+        */
+       bool clear_canonical_address(node *node) {
+               return meshlink_clear_canonical_address(handle, node);
+       }
+
        /// Add an invitation address for the local node.
        /** This function adds an address for the local node, which will be used only for invitation URLs.
         *  This address is not stored permanently.
index 7492c46bda6a0ce7716fc27278b58db108735500..56da2a045452acf8004b0d0a04cbf1e7e2810ceb 100644 (file)
@@ -2603,6 +2603,30 @@ bool meshlink_set_canonical_address(meshlink_handle_t *mesh, meshlink_node_t *no
        return config_sync(mesh, "current");
 }
 
+bool meshlink_clear_canonical_address(meshlink_handle_t *mesh, meshlink_node_t *node) {
+       if(!mesh || !node) {
+               meshlink_errno = MESHLINK_EINVAL;
+               return false;
+       }
+
+       if(pthread_mutex_lock(&mesh->mutex) != 0) {
+               abort();
+       }
+
+       node_t *n = (node_t *)node;
+       free(n->canonical_address);
+       n->canonical_address = NULL;
+
+       if(!node_write_config(mesh, n)) {
+               pthread_mutex_unlock(&mesh->mutex);
+               return false;
+       }
+
+       pthread_mutex_unlock(&mesh->mutex);
+
+       return config_sync(mesh, "current");
+}
+
 bool meshlink_add_invitation_address(struct meshlink_handle *mesh, const char *address, const char *port) {
        if(!mesh || !address) {
                meshlink_errno = MESHLINK_EINVAL;
index 3a23eb088b6d38a810b7f821565b00cd6afdfddd..738f8647e5071d3ca815558d942229447fbc3884 100644 (file)
@@ -801,6 +801,8 @@ bool meshlink_verify(struct meshlink_handle *mesh, struct meshlink_node *source,
  *
  *  If a canonical Address is set for the local node,
  *  it will be used for the hostname part of generated invitation URLs.
+ *  If a canonical Address is set for a remote node,
+ *  it is used exclusively for creating outgoing connections to that node.
  *
  *  \memberof meshlink_node
  *  @param mesh         A handle which represents an instance of MeshLink.
@@ -813,6 +815,17 @@ bool meshlink_verify(struct meshlink_handle *mesh, struct meshlink_node *source,
  */
 bool meshlink_set_canonical_address(struct meshlink_handle *mesh, struct meshlink_node *node, const char *address, const char *port) __attribute__((__warn_unused_result__));
 
+/// Clear the canonical Address for a node.
+/** This function clears the canonical Address for a node.
+ *
+ *  \memberof meshlink_node
+ *  @param mesh         A handle which represents an instance of MeshLink.
+ *  @param node         A pointer to a struct meshlink_node describing the node.
+ *
+ *  @return             This function returns true if the address was removed, false otherwise.
+ */
+bool meshlink_clear_canonical_address(struct meshlink_handle *mesh, struct meshlink_node *node) __attribute__((__warn_unused_result__));
+
 /// Add an invitation address for the local node.
 /** This function adds an address for the local node, which will be used only for invitation URLs.
  *  This address is not stored permanently.
index ba79ce3f38626849c072dbc0e6fd8173585102d7..08dff729daaa687904dd9a6538796d9c0185d2f4 100644 (file)
@@ -26,6 +26,7 @@ meshlink_channel_open
 meshlink_channel_open_ex
 meshlink_channel_send
 meshlink_channel_shutdown
+meshlink_clear_canonical_address
 meshlink_clear_invitation_addresses
 meshlink_close
 meshlink_destroy
index 7ac6dbbdbe023b06033e5e76956b964ff2cdc9b6..d846237275c023010b07b5aaca342e31f9be7d47 100644 (file)
@@ -320,7 +320,7 @@ static bool get_next_outgoing_address(meshlink_handle_t *mesh, outgoing_t *outgo
 
                outgoing->ai = NULL;
                outgoing->aip = NULL;
-               outgoing->state = OUTGOING_RECENT;
+               outgoing->state = OUTGOING_END;
        }
 
        if(outgoing->state == OUTGOING_RECENT) {