is possible using the address and socket that the reply
packet used. */
- n->status.udp_confirmed = true;
+ if(!n->status.udp_confirmed) {
+ char *address, *port;
+ sockaddr2str(&n->address, &address, &port);
+ send_request(mesh, n->nexthop->connection, NULL, "%d %s %s . -1 -1 -1 0 %s %s", ANS_KEY, n->name, n->name, address, port);
+ free(address);
+ free(port);
+ n->status.udp_confirmed = true;
+ }
/* If we haven't established the PMTU yet, restart the discovery process. */
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;
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 != '.') {