]> git.meshlink.io Git - meshlink/commitdiff
Don't add duplicates to the list of recently seen addresses.
authorGuus Sliepen <guus@meshlink.io>
Fri, 6 Dec 2019 20:47:11 +0000 (21:47 +0100)
committerGuus Sliepen <guus@meshlink.io>
Fri, 6 Dec 2019 20:47:11 +0000 (21:47 +0100)
Duplicate addresses would be appended to the list, and could push out other
addresses. If the address already exists, only move it to the top if it is
not already there.

Also don't force an immediate write of the host config file when trying to
add an address that already exists.

src/discovery.c
src/meshlink.c
src/node.c
src/node.h

index 52b08f2c8b008e768b94674ade053d59b075f439..68e1a2610db6cac4cdaaafc975ac02465ffdd3ec 100644 (file)
@@ -248,11 +248,11 @@ static void discovery_resolve_callback(CattaSServiceResolver *resolver, CattaIfI
                                }
 
                                if(naddress.unknown.family != AF_UNKNOWN) {
-                                       meshlink_hint_address(mesh, node, (struct sockaddr *)&naddress);
-
                                        node_t *n = (node_t *)node;
                                        connection_t *c = n->connection;
 
+                                       node_add_recent_address(mesh, n, &naddress);
+
                                        if(c && c->outgoing && !c->status.active) {
                                                c->outgoing->timeout = 0;
 
index b0cb8a9307abf9d2a6700f2ef3931c5f63206773..69ab8f244ef1e715e171b2b13fd8ff521fb27dab 100644 (file)
@@ -3120,11 +3120,11 @@ void meshlink_hint_address(meshlink_handle_t *mesh, meshlink_node_t *node, const
        pthread_mutex_lock(&mesh->mutex);
 
        node_t *n = (node_t *)node;
-       memmove(n->recent + 1, n->recent, (MAX_RECENT - 1) * sizeof(*n->recent));
-       memcpy(n->recent, addr, SALEN(*addr));
 
-       if(!node_write_config(mesh, n)) {
-               logger(mesh, MESHLINK_DEBUG, "Could not update %s\n", n->name);
+       if(node_add_recent_address(mesh, n, (sockaddr_t *)addr)) {
+               if(!node_write_config(mesh, n)) {
+                       logger(mesh, MESHLINK_DEBUG, "Could not update %s\n", n->name);
+               }
        }
 
        pthread_mutex_unlock(&mesh->mutex);
index 5f5d235cf4d28e35929754b38576080ac8fc8836..b8caed6c7e06ca182f671fd046f8be4d44d76611 100644 (file)
@@ -135,7 +135,7 @@ void update_node_udp(meshlink_handle_t *mesh, node_t *n, const sockaddr_t *sa) {
 
                hash_insert(mesh->node_udp_cache, sa, n);
 
-               meshlink_hint_address(mesh, (meshlink_node_t *)n, &sa->sa);
+               node_add_recent_address(mesh, n, sa);
 
                if(mesh->log_level <= MESHLINK_DEBUG) {
                        char *hostname = sockaddr2hostname(&n->address);
@@ -144,3 +144,32 @@ void update_node_udp(meshlink_handle_t *mesh, node_t *n, const sockaddr_t *sa) {
                }
        }
 }
+
+bool node_add_recent_address(meshlink_handle_t *mesh, node_t *n, const sockaddr_t *sa) {
+       (void)mesh;
+       bool found = false;
+       int i;
+
+       /* Check if we already know this address */
+       for(i = 0; i < MAX_RECENT && n->recent[i].sa.sa_family; i++) {
+               if(!sockaddrcmp(&n->recent[i], sa)) {
+                       found = true;
+                       break;
+               }
+       }
+
+       if(found && i == 0) {
+               /* It's already the most recent address, nothing to do. */
+               return false;
+       }
+
+       if(i >= MAX_RECENT) {
+               i = MAX_RECENT - 1;
+       }
+
+       memmove(n->recent + 1, n->recent, i * sizeof(*n->recent));
+       memcpy(n->recent, sa, SALEN(sa->sa));
+
+       n->status.dirty = true;
+       return !found;
+}
index 19e31fac9aaa31ee75363e3fe6df4d18528c82f0..ff8b3335ba70740830a08d70f8e51245f315a32c 100644 (file)
@@ -107,5 +107,6 @@ extern void node_del(struct meshlink_handle *mesh, node_t *n);
 extern node_t *lookup_node(struct meshlink_handle *mesh, const char *name) __attribute__((__warn_unused_result__));
 extern node_t *lookup_node_udp(struct meshlink_handle *mesh, const sockaddr_t *sa) __attribute__((__warn_unused_result__));
 extern void update_node_udp(struct meshlink_handle *mesh, node_t *n, const sockaddr_t *sa);
+extern bool node_add_recent_address(struct meshlink_handle *mesh, node_t *n, const sockaddr_t *addr);
 
 #endif