extern bool node_write_devclass(meshlink_handle_t *mesh, node_t *n);
bool send_id(meshlink_handle_t *mesh, connection_t *c) {
- return send_request(mesh, c, NULL, "%d %s %d.%d %s", ID, mesh->self->name, PROT_MAJOR, PROT_MINOR, mesh->appname);
+ return send_request(mesh, c, NULL, "%d %s %d.%d %s %u", ID, mesh->self->name, PROT_MAJOR, PROT_MINOR, mesh->appname, 0);
}
static bool commit_invitation(meshlink_handle_t *mesh, connection_t *c, const void *data) {
+ // Check if the node is known
+ node_t *n = lookup_node(mesh, c->name);
+
+ if(n) {
+ if(n->status.blacklisted) {
+ logger(mesh, MESHLINK_ERROR, "Invitee %s is blacklisted", c->name);
+ } else {
+ logger(mesh, MESHLINK_ERROR, "Invitee %s already known", c->name);
+ }
+
+ return false;
+ }
+
// Create a new node
- node_t *n = new_node();
+ n = new_node();
n->name = xstrdup(c->name);
n->devclass = DEV_CLASS_UNKNOWN;
n->ecdsa = ecdsa_set_public_key(data);
// Remember its current address
node_add_recent_address(mesh, n, &c->address);
- if(!node_write_config(mesh, n) || !config_sync(mesh, "current")) {
+ if(!node_write_config(mesh, n, true) || !config_sync(mesh, "current")) {
logger(mesh, MESHLINK_ERROR, "Error writing configuration file for invited node %s!\n", c->name);
free_node(n);
return false;
char name[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 %u", name, &c->protocol_major, &c->protocol_minor, &c->flags) < 2) {
logger(mesh, MESHLINK_ERROR, "Got bad %s from %s", "ID", c->name);
return false;
}
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);
snprintf(label, sizeof(label), "%s %s %s", meshlink_tcp_label, c->name, mesh->self->name);
}
- char buf1[1024], buf2[1024];
- bin2hex((uint8_t *)mesh->private_key + 64, buf1, 32);
- bin2hex((uint8_t *)n->ecdsa + 64, buf2, 32);
- logger(mesh, MESHLINK_DEBUG, "Connection to %s mykey %s hiskey %s", c->name, buf1, buf2);
+ if(mesh->log_level <= MESHLINK_DEBUG) {
+ char buf1[1024], buf2[1024];
+ bin2hex((uint8_t *)mesh->private_key + 64, buf1, 32);
+ bin2hex((uint8_t *)n->ecdsa + 64, buf2, 32);
+ logger(mesh, MESHLINK_DEBUG, "Connection to %s mykey %s hiskey %s", c->name, buf1, buf2);
+ }
+
return sptps_start(&c->sptps, c, c->outgoing, false, mesh->private_key, n->ecdsa, label, sizeof(label) - 1, send_meta_sptps, receive_meta_sptps);
}
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));
}
} else {
if(n->connection) {
/* Oh dear, we already have a connection to this node. */
- logger(mesh, MESHLINK_DEBUG, "Established a second connection with %s, closing old connection", n->connection->name);
+ logger(mesh, MESHLINK_INFO, "Established a second connection with %s, closing old connection", n->connection->name);
if(n->connection->outgoing) {
if(c->outgoing) {
n->devclass = devclass;
n->status.dirty = true;
+ n->status.tiny = c->flags & PROTOCOL_TINY;
n->last_successfull_connection = mesh->loop.now.tv_sec;
/* Send him everything we know */
- send_everything(mesh, c);
+ if(!(c->flags & PROTOCOL_TINY)) {
+ send_everything(mesh, c);
+ }
/* Create an edge_t for this connection */