X-Git-Url: http://git.meshlink.io/?p=meshlink;a=blobdiff_plain;f=src%2Fprotocol_key.c;h=641e2b969434c8941a5ca752b9dca69822175dea;hp=f912c0fb44431c6f33ee625fda372eb5fa3187e0;hb=ffda069e617db34c12321b438964e4c369053466;hpb=9ece2f9ded8c65c7f20826f2ec9ae1f0527bdd7c diff --git a/src/protocol_key.c b/src/protocol_key.c index f912c0fb..641e2b96 100644 --- a/src/protocol_key.c +++ b/src/protocol_key.c @@ -324,6 +324,12 @@ bool ans_key_h(meshlink_handle_t *mesh, connection_t *c, const char *request) { return true; } + if(from == to) { + logger(mesh, MESHLINK_WARNING, "Got %s from %s from %s to %s", + "ANS_KEY", c->name, from_name, to_name); + return true; + } + /* Append the known UDP address of the from node, if we have a confirmed one */ if(!*address && from->status.udp_confirmed && from->address.sa.sa_family != AF_UNSPEC) { char *address, *port; @@ -338,6 +344,37 @@ bool ans_key_h(meshlink_handle_t *mesh, connection_t *c, const char *request) { return send_request(mesh, to->nexthop->connection, NULL, "%s", request); } + /* Is this an ANS_KEY informing us of our own reflexive UDP address? */ + + if(from == mesh->self) { + if(*key == '.' && *address && *port) { + logger(mesh, MESHLINK_DEBUG, "Learned our own reflexive UDP address from %s: %s port %s", c->name, address, port); + + /* Inform all other nodes we want to communicate with and which are reachable via this connection */ + for splay_each(node_t, n, mesh->nodes) { + if(n->nexthop == c->node) { + continue; + } + + if(n->status.udp_confirmed) { + continue; + } + + if(!n->status.waitingforkey && !n->status.validkey) { + continue; + } + + logger(mesh, MESHLINK_DEBUG, "Forwarding our own reflexive UDP address to %s", n->name); + send_request(mesh, c, NULL, "%d %s %s . -1 -1 -1 0 %s %s", ANS_KEY, mesh->self->name, n->name, address, port); + } + } else { + logger(mesh, MESHLINK_WARNING, "Got %s from %s from %s to %s", + "ANS_KEY", c->name, from_name, to_name); + } + + return true; + } + /* Process SPTPS data if present */ if(*key != '.') {