diff --git a/src/edge.c b/src/edge.c index 0e35cd1ed..8feeccb6f 100644 --- a/src/edge.c +++ b/src/edge.c @@ -81,13 +81,21 @@ void free_edge(edge_t *e) { } void edge_add(edge_t *e) { - splay_insert(edge_weight_tree, e); - splay_insert(e->from->edge_tree, e); - - e->reverse = lookup_edge(e->to, e->from); - - if(e->reverse) - e->reverse->reverse = e; + if (splay_insert(e->from->edge_tree, e)) { + e->reverse = lookup_edge(e->to, e->from); + + if(e->reverse) + e->reverse->reverse = e; + + if (!splay_insert(edge_weight_tree, e)) + logger(DEBUG_ALWAYS, LOG_ERR, + "%s:%d: edge from: %s to: %s exists in edge_weight_tree", + __FUNCTION__, __LINE__, e->from->name, e->to->name); + } else { + logger(DEBUG_ALWAYS, LOG_ERR, + "%s:%d: edge from: %s to: %s exists in e->from->edge_tree", + __FUNCTION__, __LINE__, e->from->name, e->to->name); + } } void edge_del(edge_t *e) { diff --git a/src/protocol_edge.c b/src/protocol_edge.c index 0879613ce..7e20a427a 100644 --- a/src/protocol_edge.c +++ b/src/protocol_edge.c @@ -158,8 +158,11 @@ bool add_edge_h(connection_t *c, const char *request) { // Otherwise, just ignore it. sockaddrfree(&local_address); return true; - } else if(local_address.sa.sa_family) { + } else if(local_address.sa.sa_family && local_address.sa.sa_family != AF_UNKNOWN) { // We learned a new local address for this edge. + // local_address.sa.sa_family will be 0 if we got it from older tinc versions + // local_address.sa.sa_family will be 255 (AF_UNKNOWN) if we got it from newer versions + // but for edge which does not have local_address sockaddrfree(&e->local_address); e->local_address = local_address; @@ -168,6 +171,10 @@ bool add_edge_h(connection_t *c, const char *request) { forward_request(c, request); return true; + } else { + logger(DEBUG_PROTOCOL, LOG_WARNING, "%s:%d %s -> %s - got edge we know from older version? (%d.%d)", + __FUNCTION__, __LINE__, e->from->name, e->to->name, c->protocol_major, c->protocol_minor); + return true; } } else { sockaddrfree(&local_address);