Browse Source

fix: peer discovery queries include IPv6 (family IN (4,6))

get_public_peers, get_local_peers, get_supernode_peers
were filtering na.family=4 only — never found v6 peers.
Changed to na.family IN (4,6).
topo_upd
evgeny 2 months ago
parent
commit
e2d8f68c9a
  1. 6
      src/routing_layer/topo_node_sqlite.c
  2. 9
      src/transport_layer/etcp_connections.c

6
src/routing_layer/topo_node_sqlite.c

@ -730,7 +730,7 @@ int topo_node_sqlite_get_public_peers(sqlite3* db, const char* channel_id,
(void)channel_id;
const char* sql =
"SELECT DISTINCT na.node_id FROM node_addresses na"
" WHERE na.node_id!=?1 AND na.family=4 AND na.addr_type IN (1,2)"
" WHERE na.node_id!=?1 AND na.family IN (4,6) AND na.addr_type IN (1,2)"
" AND EXISTS (SELECT 1 FROM nodes n WHERE n.node_id=na.node_id)";
sqlite3_stmt* st = NULL;
if (sqlite3_prepare_v2(db, sql, -1, &st, NULL) != SQLITE_OK) return -1;
@ -754,7 +754,7 @@ int topo_node_sqlite_get_supernode_peers(sqlite3* db, const char* channel_id,
char peers_tbl[80]; peers_table_name(channel_id, peers_tbl, sizeof(peers_tbl));
char sql[256]; snprintf(sql, sizeof(sql),
"SELECT p.node_id FROM \"%s\" p WHERE p.node_type=4"
" AND EXISTS (SELECT 1 FROM node_addresses na WHERE na.node_id=p.node_id AND na.family=4)",
" AND EXISTS (SELECT 1 FROM node_addresses na WHERE na.node_id=p.node_id AND na.family IN (4,6))",
peers_tbl);
sqlite3_stmt* st = NULL;
if (sqlite3_prepare_v2(db, sql, -1, &st, NULL) != SQLITE_OK) return -1;
@ -777,7 +777,7 @@ int topo_node_sqlite_get_local_peers(sqlite3* db, const char* channel_id,
(void)channel_id;
const char* sql =
"SELECT DISTINCT na.node_id FROM node_addresses na"
" WHERE na.node_id!=?1 AND na.family=4 AND na.addr_type IN (0,3)"
" WHERE na.node_id!=?1 AND na.family IN (4,6) AND na.addr_type IN (0,3)"
" AND EXISTS (SELECT 1 FROM nodes n WHERE n.node_id=na.node_id)";
sqlite3_stmt* st = NULL;
if (sqlite3_prepare_v2(db, sql, -1, &st, NULL) != SQLITE_OK) return -1;

9
src/transport_layer/etcp_connections.c

@ -139,6 +139,10 @@ static void etcp_link_send_init(struct ETCP_LINK* link, uint8_t reset, uint8_t c
struct sockaddr_in* sin = (struct sockaddr_in*)&link->conn->interface_addr;
memcpy(req->src_ipv4, &sin->sin_addr.s_addr, 4);
*(uint16_t*)req->src_port = sin->sin_port;
} else if (link->conn && link->conn->interface_addr.ss_family == AF_INET6) {
struct sockaddr_in6* sin6 = (struct sockaddr_in6*)&link->conn->interface_addr;
memset(req->src_ipv4, 0, 4);
*(uint16_t*)req->src_port = sin6->sin6_port;
} else {
memset(req->src_ipv4, 0, 4);
memset(req->src_port, 0, 2);
@ -148,12 +152,13 @@ static void etcp_link_send_init(struct ETCP_LINK* link, uint8_t reset, uint8_t c
size_t offset = ETCP_INIT_REQ_SIZE;
// padding
int wire_ov_init = WIRE_OVERHEAD(link->remote_addr.ss_family);
int s = rand() % (link->handshake_maxsize - link->handshake_minsize) + link->handshake_minsize;
int s_max = (int)(link->mtu) - (int)SC_NONCE_SIZE - 3 - (int)SC_CRC32_SIZE - (int)SC_TAG_SIZE - (int)SC_PUBKEY_ENC_SIZE + (int)UDP_SC_HDR_SIZE;
int s_max = (int)(link->mtu) - wire_ov_init;
if (s > s_max) s = s_max;
if (s < 0) s = 0;
int to_add=s-offset-UDP_HDR_SIZE - UDP_SC_HDR_SIZE;
int to_add = s - offset - wire_ov_init;
if (to_add<0) to_add=0;
int max_data = PACKET_DATA_SIZE - (int)sizeof(struct ETCP_DGRAM);
if (offset + to_add + SC_PUBKEY_ENC_SIZE > max_data) {

Loading…
Cancel
Save