assert(*request);
char name[MAX_STRING_SIZE];
+ char real_address[MAX_STRING_SIZE] = "";
+ char real_port[MAX_STRING_SIZE] = "";
- if(sscanf(request, "%*d " MAX_STRING " %d.%d", name, &c->protocol_major, &c->protocol_minor) < 2) {
+ if(sscanf(request, "%*d " MAX_STRING " %d.%d %*s " MAX_STRING " " MAX_STRING, name, &c->protocol_major, &c->protocol_minor, real_address, real_port) < 2) {
logger(mesh, MESHLINK_ERROR, "Got bad %s from %s", "ID", c->name);
return false;
}
+ /* Parse the real address if present */
+
+ if(!c->outgoing && *real_address && *real_port) {
+ sockaddr_t sa = str2sockaddr(real_address, real_port);
+
+ if(sa.sa.sa_family == AF_UNKNOWN || sa.sa.sa_family == AF_UNSPEC) {
+ logger(mesh, MESHLINK_ERROR, "Could not parse real address from %s", c->name);
+ sockaddrfree(&sa);
+ return false;
+ }
+
+ sockaddrfree(&c->address);
+ c->address = sa;
+ }
+
/* Check if this is an invitation */
if(name[0] == '?') {
return false;
}
- if(n->status.blacklisted) {
- logger(mesh, MESHLINK_WARNING, "Peer %s is blacklisted", c->name);
- return false;
- }
-
if(!node_read_public_key(mesh, n)) {
logger(mesh, MESHLINK_ERROR, "No key known for peer %s", c->name);
}
bool send_ack(meshlink_handle_t *mesh, connection_t *c) {
+ node_t *n = lookup_node(mesh, c->name);
+
+ if(n && n->status.blacklisted) {
+ logger(mesh, MESHLINK_WARNING, "Peer %s is blacklisted", c->name);
+ return send_error(mesh, c, BLACKLISTED, "blacklisted");
+ }
+
c->last_ping_time = mesh->loop.now.tv_sec;
return send_request(mesh, c, NULL, "%d %s %d %x", ACK, mesh->myport, mesh->devclass, OPTION_PMTU_DISCOVERY | (PROT_MINOR << 24));
}