|
|
|
|
@ -1694,13 +1694,35 @@ void etcp_connections_read_callback_socket(socket_t sock, void* arg) {
|
|
|
|
|
|
|
|
|
|
struct ETCP_LINK* existing_link = etcp_link_find_by_remote_id(conn, req->link_id); |
|
|
|
|
if (!existing_link) { |
|
|
|
|
existing_link = etcp_link_find_by_addr(e_sock, &addr); |
|
|
|
|
if (existing_link && existing_link->etcp == conn) { |
|
|
|
|
DEBUG_INFO(DEBUG_CATEGORY_CONNECTION, "[%s] found existing outbound link by addr for incoming INIT, reusing link=%p", |
|
|
|
|
conn->log_name, existing_link); |
|
|
|
|
} else { |
|
|
|
|
existing_link = NULL; |
|
|
|
|
existing_link = etcp_link_find_by_addr(e_sock, &addr); |
|
|
|
|
if (existing_link && existing_link->etcp == conn) { |
|
|
|
|
if (memcmp(conn->crypto_ctx.peer_public_key, sc.peer_public_key, SC_PUBKEY_SIZE)) { |
|
|
|
|
DEBUG_WARN(DEBUG_CATEGORY_CONNECTION, "[%s] link address match but pubkey mismatch, firing node_changed", conn->log_name); |
|
|
|
|
DEBUG_ERROR(DEBUG_CATEGORY_CRYPTO, "pubkey mismatch on reused link for node %016llx", (unsigned long long)peer_id); |
|
|
|
|
conn->callbacks_running = 1; |
|
|
|
|
struct etcp_cbk_entry* cbe = conn->node_changed_cbks; |
|
|
|
|
while (cbe) { struct etcp_cbk_entry* n = cbe->next; cbe->fn(conn, cbe->arg); cbe = n; } |
|
|
|
|
conn->callbacks_running = 0; |
|
|
|
|
errorcode = 67; |
|
|
|
|
goto ec_fr; |
|
|
|
|
} |
|
|
|
|
DEBUG_INFO(DEBUG_CATEGORY_CONNECTION, "[%s] found existing outbound link by addr for incoming INIT, reusing link=%p", |
|
|
|
|
conn->log_name, existing_link); |
|
|
|
|
} else if (existing_link) { |
|
|
|
|
struct ETCP_CONN* old_conn = existing_link->etcp; |
|
|
|
|
DEBUG_WARN(DEBUG_CATEGORY_CONNECTION, "[%s] conflicting link at %s belongs to %s, firing node_changed", |
|
|
|
|
conn->log_name, sockaddr_storage_to_str(&addr).str, old_conn->log_name); |
|
|
|
|
DEBUG_ERROR(DEBUG_CATEGORY_CRYPTO, "link address conflict for node %016llx, firing node_changed callbacks on %s", |
|
|
|
|
(unsigned long long)peer_id, old_conn->log_name); |
|
|
|
|
old_conn->callbacks_running = 1; |
|
|
|
|
struct etcp_cbk_entry* cbe = old_conn->node_changed_cbks; |
|
|
|
|
while (cbe) { struct etcp_cbk_entry* n = cbe->next; cbe->fn(old_conn, cbe->arg); cbe = n; } |
|
|
|
|
old_conn->callbacks_running = 0; |
|
|
|
|
errorcode = 67; |
|
|
|
|
goto ec_fr; |
|
|
|
|
} else { |
|
|
|
|
existing_link = NULL; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
uint8_t send_reset = 0; |
|
|
|
|
|