X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Fdiscovery.c;h=82d1edb5fa5c7f32398590cf5127bf82ec89e908;hb=8b44f34be360263e5f30fdd1559da66e1faa3b25;hp=428e44074fcc4103d76ad74f9fad75bf8ec726c4;hpb=9634f8196d94e858c08495e77c578f21b672c27e;p=meshlink diff --git a/src/discovery.c b/src/discovery.c index 428e4407..82d1edb5 100644 --- a/src/discovery.c +++ b/src/discovery.c @@ -167,7 +167,8 @@ static void send_mdns_packet(meshlink_handle_t *mesh, const discovery_address_t char *fingerprint = meshlink_get_fingerprint(mesh, (meshlink_node_t *)mesh->self); const char *keys[] = {MESHLINK_MDNS_NAME_KEY, MESHLINK_MDNS_FINGERPRINT_KEY}; const char *values[] = {mesh->name, fingerprint}; - size_t size = prepare_packet(data, sizeof data, fingerprint, mesh->appname, "tcp", atoi(mesh->myport), 2, keys, values); + size_t size = prepare_packet(data, sizeof data, fingerprint, mesh->appname, "tcp", atoi(mesh->myport), 2, keys, values, false); + free(fingerprint); switch(addr->address.sa.sa_family) { case AF_INET: @@ -233,13 +234,23 @@ static void mdns_io_handler(event_loop_t *loop, void *data, int flags) { uint16_t port = 0; const char *keys[2] = {MESHLINK_MDNS_NAME_KEY, MESHLINK_MDNS_FINGERPRINT_KEY}; char *values[2] = {NULL, NULL}; + bool response; - if(parse_packet(buf, len, &name, mesh->appname, "tcp", &port, 2, keys, values)) { + if(parse_packet(buf, len, &name, mesh->appname, "tcp", &port, 2, keys, values, &response)) { node_t *n = (node_t *)meshlink_get_node(mesh, values[0]); if(n) { logger(mesh, MESHLINK_INFO, "Node %s is part of the mesh network.\n", n->name); + if(!response && n != mesh->self) { + // Send a unicast response back + char *fingerprint = meshlink_get_fingerprint(mesh, (meshlink_node_t *)mesh->self); + const char *response_values[] = {mesh->name, fingerprint}; + size_t size = prepare_packet(buf, sizeof(buf), fingerprint, mesh->appname, "tcp", atoi(mesh->myport), 2, keys, response_values, true); + sendto(io->fd, buf, size, MSG_DONTWAIT | MSG_NOSIGNAL, &sa.sa, sl); + free(fingerprint); + } + switch(sa.sa.sa_family) { case AF_INET: sa.in.sin_port = port; @@ -504,6 +515,7 @@ static void netlink_parse(meshlink_handle_t *mesh, const void *data, size_t len) static void netlink_io_handler(event_loop_t *loop, void *data, int flags) { (void)flags; + (void)data; static time_t prev_update; meshlink_handle_t *mesh = loop->data; @@ -547,6 +559,7 @@ static void netlink_io_handler(event_loop_t *loop, void *data, int flags) { #elif defined(RTM_NEWADDR) static void pfroute_io_handler(event_loop_t *loop, void *data, int flags) { (void)flags; + (void)data; static time_t prev_update; meshlink_handle_t *mesh = loop->data; @@ -663,6 +676,8 @@ void discovery_stop(meshlink_handle_t *mesh) { free(mesh->discovery.ifaces); free(mesh->discovery.addresses); + mesh->discovery.ifaces = NULL; + mesh->discovery.addresses = NULL; mesh->discovery.iface_count = 0; mesh->discovery.address_count = 0;