- if(!*address && from->address.sa.sa_family != AF_UNSPEC) {
- char *address, *port;
- logger(DEBUG_PROTOCOL, LOG_DEBUG, "Appending reflexive UDP address to ANS_KEY from %s to %s", from->name, to->name);
- sockaddr2str(&from->address, &address, &port);
- send_request(to->nexthop->connection, "%s %s %s", request, address, port);
- free(address);
- free(port);
+ 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;
+ }
+
+ if(!to->nexthop || !to->nexthop->connection) {
+ logger(mesh, MESHLINK_WARNING, "Cannot forward ANS_KEY to %s via %s", to->name, to->nexthop ? to->nexthop->name : to->name);
+ return false;
+ }
+
+ /* TODO: find a good way to avoid the use of strlen() */
+ size_t len = strlen(request);
+ from->in_forward += len + SPTPS_OVERHEAD;
+ to->out_forward += len + SPTPS_OVERHEAD;
+
+ /* 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 *reflexive_address, *reflexive_port;
+ logger(mesh, MESHLINK_DEBUG, "Appending reflexive UDP address to ANS_KEY from %s to %s", from->name, to->name);
+ sockaddr2str(&from->address, &reflexive_address, &reflexive_port);
+ send_request(mesh, to->nexthop->connection, NULL, "%s %s %s", request, reflexive_address, reflexive_port);
+ free(reflexive_address);
+ free(reflexive_port);