]> git.meshlink.io Git - meshlink/commitdiff
a first mdns discovery implementation
authorNiklas Hofmann <niklas.hofmann@everbase.net>
Thu, 31 Jul 2014 01:08:06 +0000 (03:08 +0200)
committerNiklas Hofmann <niklas.hofmann@everbase.net>
Thu, 31 Jul 2014 01:08:06 +0000 (03:08 +0200)
src/discovery.c
src/meshlink.c
src/meshlink.h
src/node.c
src/node.h

index 834822aa341537bc26c33bac6991ca9ebf0e0031..a7b36c482e107ab326199f9902b4534b752398ff 100644 (file)
@@ -12,6 +12,8 @@
 #include <avahi-common/alternative.h>
 #include <avahi-common/error.h>
 
+#include <netinet/in.h>
+
 #define MESHLINK_MDNS_SERVICE_TYPE "_meshlink._tcp"
 //#define MESHLINK_MDNS_SERVICE_NAME "Meshlink"
 #define MESHLINK_MDNS_FINGERPRINT_KEY "fingerprint"
@@ -76,10 +78,40 @@ static void discovery_resolve_callback(
             if( node && fgli && strcmp(avahi_string_list_get_text(fgli)+strlen(MESHLINK_MDNS_FINGERPRINT_KEY)+1, meshlink_get_fingerprint(mesh, node)) == 0 )
             {
                 fprintf(stderr, "Node %s is part of the mesh network - updating ip address.\n", node->name);
+
+                struct sockaddr_storage naddr;
+                memset(&naddr, 0, sizeof(naddr));
+
+                switch(address->proto)
+                {
+                    case AVAHI_PROTO_INET:
+                    {
+                        struct sockaddr_in* naddr_in = (struct sockaddr_in*)&naddr;
+                        naddr_in->sin_family = AF_INET;
+                        naddr_in->sin_port = port;
+                        naddr_in->sin_addr.s_addr = address->data.ipv4.address;
+                    }
+                    break;
+
+                    case AVAHI_PROTO_INET6:
+                    {
+                        struct sockaddr_in6* naddr_in = (struct sockaddr_in6*)&naddr;
+                        naddr_in->sin6_family = AF_INET6;
+                        naddr_in->sin6_port = port;
+                        memcpy(naddr_in->sin6_addr.s6_addr, address->data.ipv6.address, sizeof(naddr_in->sin6_addr.s6_addr));
+                    }
+                    break;
+
+                    default:
+                    naddr.ss_family = AF_UNKNOWN;
+                }
+
+                // @TODO: aquire mutex?
+                meshlink_hint_address(mesh, node->name, &naddr);
             }
             else
             {
-                fprintf(stderr, "Node %s is not part of the mesh network - ignoring ip address.\n", node->name);
+                fprintf(stderr, "Node %s is not part of the mesh network - ignoring ip address.\n", node ? node->name : "n/a");
             }
         }
     }
@@ -298,7 +330,7 @@ fail:
 
 void discovery_stop(meshlink_handle_t *mesh)
 {
-       // @TODO: Shut down 
+       // Shut down 
        avahi_simple_poll_quit(mesh->avahi_poll);
 
        // Wait for the discovery thread to finish
index 8d120813a1fb57067ba33ca8a274d964d31fd7dd..c25e08c5c72a25da131ed0c11cc32dcba239744a 100644 (file)
@@ -1660,7 +1660,7 @@ void meshlink_whitelist(meshlink_handle_t *mesh, meshlink_node_t *node) {
 /* Hint that a hostname may be found at an address
  * See header file for detailed comment.
  */
-extern void meshlink_hint_address(meshlink_handle_t *mesh, char *hostname, struct sockaddr *addr) {
+extern void meshlink_hint_address(meshlink_handle_t *mesh, const char *hostname, struct sockaddr *addr) {
        if(!mesh || !hostname || !addr)
                return;
        
index 8a101741635ba4f60f7bec8be3ce3e1e8012dbda..4468fd0079e4c9a0b1da1b43de0eddadfb20d1ad 100644 (file)
@@ -574,7 +574,7 @@ extern ssize_t meshlink_channel_send(meshlink_handle_t *mesh, meshlink_channel_t
  *                     given hostname. The caller is free to overwrite or free
  *                     this memory once meshlink returns.
  */
-extern void meshlink_hint_address(meshlink_handle_t *mesh, char *hostname, struct sockaddr *addr);
+extern void meshlink_hint_address(meshlink_handle_t *mesh, const char *hostname, struct sockaddr *addr);
 
 #ifdef __cplusplus
 }
index b7b39927948b2e8579b71a1f07a2aa9261266f99..edf2c85809134bc55581b7a9b5d46d562c2be663 100644 (file)
@@ -104,7 +104,7 @@ void node_del(meshlink_handle_t *mesh, node_t *n) {
        pthread_mutex_unlock(&(mesh->nodes_mutex));
 }
 
-node_t *lookup_node(meshlink_handle_t *mesh, char *name) {
+node_t *lookup_node(meshlink_handle_t *mesh, const char *name) {
        node_t n = {NULL};
        node_t* result;
 
index 4f0f13089bf6b1901f401a9b1787bc6ac055c9be..e9bc0538b847ad7550da763050349111af26ec5f 100644 (file)
@@ -97,7 +97,7 @@ extern node_t *new_node(void) __attribute__ ((__malloc__));
 extern void free_node(node_t *);
 extern void node_add(struct meshlink_handle *mesh, node_t *);
 extern void node_del(struct meshlink_handle *mesh, node_t *);
-extern node_t *lookup_node(struct meshlink_handle *mesh, char *);
+extern node_t *lookup_node(struct meshlink_handle *mesh, const char *);
 extern node_t *lookup_node_udp(struct meshlink_handle *mesh, const sockaddr_t *);
 extern void update_node_udp(struct meshlink_handle *mesh, node_t *, const sockaddr_t *);