|
|
|
@ -97,12 +97,14 @@ static uint8_t collect_socket_ids(struct TOPO_NODE* ni, uint8_t* sock_ids) { |
|
|
|
while (sm4) { |
|
|
|
while (sm4) { |
|
|
|
uint8_t i; for (i = 0; i < count; i++) if (sock_ids[i] == sm4->id) break; |
|
|
|
uint8_t i; for (i = 0; i < count; i++) if (sock_ids[i] == sm4->id) break; |
|
|
|
if (i == count) sock_ids[count++] = sm4->id; |
|
|
|
if (i == count) sock_ids[count++] = sm4->id; |
|
|
|
|
|
|
|
if (count < 510) sock_ids[count++] = sm4->id | 1; /* NAT slave slot, LSB=1 */ |
|
|
|
sm4 = sm4->next; |
|
|
|
sm4 = sm4->next; |
|
|
|
} |
|
|
|
} |
|
|
|
struct TOPO_SOCKMETA6* sm6 = ni->v6_sock_meta; |
|
|
|
struct TOPO_SOCKMETA6* sm6 = ni->v6_sock_meta; |
|
|
|
while (sm6) { |
|
|
|
while (sm6) { |
|
|
|
uint8_t i; for (i = 0; i < count; i++) if (sock_ids[i] == sm6->id) break; |
|
|
|
uint8_t i; for (i = 0; i < count; i++) if (sock_ids[i] == sm6->id) break; |
|
|
|
if (i == count) sock_ids[count++] = sm6->id; |
|
|
|
if (i == count) sock_ids[count++] = sm6->id; |
|
|
|
|
|
|
|
if (count < 510) sock_ids[count++] = sm6->id | 1; |
|
|
|
sm6 = sm6->next; |
|
|
|
sm6 = sm6->next; |
|
|
|
} |
|
|
|
} |
|
|
|
return count; |
|
|
|
return count; |
|
|
|
@ -162,26 +164,19 @@ int topo_node_sqlite_node_put(sqlite3* db, struct TOPO_NODEQ* nq) { |
|
|
|
|
|
|
|
|
|
|
|
struct TOPO_ADDR4* a4 = ni->v4_addrs; |
|
|
|
struct TOPO_ADDR4* a4 = ni->v4_addrs; |
|
|
|
while (a4) { |
|
|
|
while (a4) { |
|
|
|
/* filter private IPs */ |
|
|
|
|
|
|
|
uint32_t ip; memcpy(&ip, a4->addr, 4); |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
uint8_t b0 = (uint8_t)ip; |
|
|
|
|
|
|
|
if (b0 == 10 || b0 == 127) goto next_a4; |
|
|
|
|
|
|
|
if (b0 == 172 && ((uint8_t)(ip >> 8) & 0xF0) == 16) goto next_a4; |
|
|
|
|
|
|
|
if (b0 == 192 && (uint8_t)(ip >> 8) == 168) goto next_a4; |
|
|
|
|
|
|
|
if (b0 == 169 && (uint8_t)(ip >> 8) == 254) goto next_a4; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int at = ADDR_TYPE_NETIF; |
|
|
|
int at = ADDR_TYPE_NETIF; |
|
|
|
if (a4->type == TOPO_ADDR_REAL) { |
|
|
|
if (a4->type == TOPO_ADDR_NAT) { |
|
|
|
at = ADDR_TYPE_DIRECT; |
|
|
|
|
|
|
|
} else if (a4->type == TOPO_ADDR_NAT) { |
|
|
|
|
|
|
|
struct TOPO_SOCKMETA4* sm = ni->v4_sock_meta; |
|
|
|
struct TOPO_SOCKMETA4* sm = ni->v4_sock_meta; |
|
|
|
while (sm) { if (sm->id == a4->socket_id) break; sm = sm->next; } |
|
|
|
while (sm) { if (sm->id == (a4->socket_id & ~1)) break; sm = sm->next; } |
|
|
|
if (sm && (sm->nat_type == NAT_TYPE_STRICT || sm->nat_type == NAT_VERIFIED_STRICT)) |
|
|
|
if (sm && (sm->nat_type == NAT_TYPE_STRICT || sm->nat_type == NAT_VERIFIED_STRICT)) |
|
|
|
at = ADDR_TYPE_NAT_STRICT; |
|
|
|
at = ADDR_TYPE_NAT_STRICT; |
|
|
|
else |
|
|
|
else |
|
|
|
at = ADDR_TYPE_NAT_EIM; |
|
|
|
at = ADDR_TYPE_NAT_EIM; |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
struct TOPO_SOCKMETA4* sm = ni->v4_sock_meta; |
|
|
|
|
|
|
|
while (sm) { if (sm->id == a4->socket_id) break; sm = sm->next; } |
|
|
|
|
|
|
|
if (sm && (sm->nat_type == NAT_TYPE_DIRECT || sm->nat_type == NAT_VERIFIED_DIRECT)) |
|
|
|
|
|
|
|
at = ADDR_TYPE_DIRECT; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
sqlite3_bind_int64(addr_stmt, 1, (sqlite3_int64)ni->node_id); |
|
|
|
sqlite3_bind_int64(addr_stmt, 1, (sqlite3_int64)ni->node_id); |
|
|
|
@ -193,7 +188,6 @@ int topo_node_sqlite_node_put(sqlite3* db, struct TOPO_NODEQ* nq) { |
|
|
|
sqlite3_bind_int(addr_stmt, 7, at); |
|
|
|
sqlite3_bind_int(addr_stmt, 7, at); |
|
|
|
sqlite3_bind_int(addr_stmt, 8, (int)a4->socket_id); |
|
|
|
sqlite3_bind_int(addr_stmt, 8, (int)a4->socket_id); |
|
|
|
sqlite3_step(addr_stmt); sqlite3_reset(addr_stmt); |
|
|
|
sqlite3_step(addr_stmt); sqlite3_reset(addr_stmt); |
|
|
|
next_a4: |
|
|
|
|
|
|
|
a4 = a4->next; |
|
|
|
a4 = a4->next; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -203,15 +197,18 @@ int topo_node_sqlite_node_put(sqlite3* db, struct TOPO_NODEQ* nq) { |
|
|
|
if (a6->addr[0] == 0xFE && (a6->addr[1] & 0xC0) == 0x80) { a6 = a6->next; continue; } |
|
|
|
if (a6->addr[0] == 0xFE && (a6->addr[1] & 0xC0) == 0x80) { a6 = a6->next; continue; } |
|
|
|
|
|
|
|
|
|
|
|
int at = ADDR_TYPE_NETIF; |
|
|
|
int at = ADDR_TYPE_NETIF; |
|
|
|
if (a6->type == TOPO_ADDR_REAL) { |
|
|
|
if (a6->type == TOPO_ADDR_NAT) { |
|
|
|
at = ADDR_TYPE_DIRECT; |
|
|
|
|
|
|
|
} else if (a6->type == TOPO_ADDR_NAT) { |
|
|
|
|
|
|
|
struct TOPO_SOCKMETA6* sm = ni->v6_sock_meta; |
|
|
|
struct TOPO_SOCKMETA6* sm = ni->v6_sock_meta; |
|
|
|
while (sm) { if (sm->id == a6->socket_id) break; sm = sm->next; } |
|
|
|
while (sm) { if (sm->id == (a6->socket_id & ~1)) break; sm = sm->next; } |
|
|
|
if (sm && (sm->nat_type == NAT_TYPE_STRICT || sm->nat_type == NAT_VERIFIED_STRICT)) |
|
|
|
if (sm && (sm->nat_type == NAT_TYPE_STRICT || sm->nat_type == NAT_VERIFIED_STRICT)) |
|
|
|
at = ADDR_TYPE_NAT_STRICT; |
|
|
|
at = ADDR_TYPE_NAT_STRICT; |
|
|
|
else |
|
|
|
else |
|
|
|
at = ADDR_TYPE_NAT_EIM; |
|
|
|
at = ADDR_TYPE_NAT_EIM; |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
struct TOPO_SOCKMETA6* sm = ni->v6_sock_meta; |
|
|
|
|
|
|
|
while (sm) { if (sm->id == a6->socket_id) break; sm = sm->next; } |
|
|
|
|
|
|
|
if (sm && (sm->nat_type == NAT_TYPE_DIRECT || sm->nat_type == NAT_VERIFIED_DIRECT)) |
|
|
|
|
|
|
|
at = ADDR_TYPE_DIRECT; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
sqlite3_bind_int64(addr_stmt, 1, (sqlite3_int64)ni->node_id); |
|
|
|
sqlite3_bind_int64(addr_stmt, 1, (sqlite3_int64)ni->node_id); |
|
|
|
|