|
|
|
@ -705,6 +705,7 @@ int topo_group_update_my_nodeinfo(struct UTUN_INSTANCE* instance, struct TOPO_GR |
|
|
|
int tcp4_count = 0, tcp6_count = 0; |
|
|
|
int tcp4_count = 0, tcp6_count = 0; |
|
|
|
struct ETCP_SOCKET* e_sock = instance->etcp_sockets; |
|
|
|
struct ETCP_SOCKET* e_sock = instance->etcp_sockets; |
|
|
|
while (e_sock) { |
|
|
|
while (e_sock) { |
|
|
|
|
|
|
|
if (e_sock->is_tcp) { e_sock = e_sock->next; continue; } |
|
|
|
if (e_sock->type == CFG_SERVER_TYPE_PRIVATE || e_sock->type == CFG_SERVER_TYPE_LOCAL) { e_sock = e_sock->next; continue; } |
|
|
|
if (e_sock->type == CFG_SERVER_TYPE_PRIVATE || e_sock->type == CFG_SERVER_TYPE_LOCAL) { e_sock = e_sock->next; continue; } |
|
|
|
if (e_sock->local_addr.ss_family == AF_INET) { sock_count++; addr_count++; } |
|
|
|
if (e_sock->local_addr.ss_family == AF_INET) { sock_count++; addr_count++; } |
|
|
|
else if (e_sock->local_addr.ss_family == AF_INET6) { sock6_count++; addr6_count++; } |
|
|
|
else if (e_sock->local_addr.ss_family == AF_INET6) { sock6_count++; addr6_count++; } |
|
|
|
@ -713,8 +714,8 @@ int topo_group_update_my_nodeinfo(struct UTUN_INSTANCE* instance, struct TOPO_GR |
|
|
|
{ struct ETCP_SOCKET* ts = instance->etcp_sockets; |
|
|
|
{ struct ETCP_SOCKET* ts = instance->etcp_sockets; |
|
|
|
while (ts) { if (!ts->is_tcp) { ts = ts->next; continue; } |
|
|
|
while (ts) { if (!ts->is_tcp) { ts = ts->next; continue; } |
|
|
|
if (ts->type == CFG_SERVER_TYPE_PRIVATE || ts->type == CFG_SERVER_TYPE_LOCAL) { ts = ts->next; continue; } |
|
|
|
if (ts->type == CFG_SERVER_TYPE_PRIVATE || ts->type == CFG_SERVER_TYPE_LOCAL) { ts = ts->next; continue; } |
|
|
|
if (ts->interface_addr.ss_family == AF_INET || ts->local_addr.ss_family == AF_INET) { tcp4_count++; addr_count++; } |
|
|
|
if (ts->interface_addr.ss_family == AF_INET || ts->local_addr.ss_family == AF_INET) { tcp4_count++; sock_count++; addr_count++; } |
|
|
|
else if (ts->interface_addr.ss_family == AF_INET6 || ts->local_addr.ss_family == AF_INET6) { tcp6_count++; addr6_count++; } |
|
|
|
else if (ts->interface_addr.ss_family == AF_INET6 || ts->local_addr.ss_family == AF_INET6) { tcp6_count++; sock6_count++; addr6_count++; } |
|
|
|
ts = ts->next; } |
|
|
|
ts = ts->next; } |
|
|
|
} |
|
|
|
} |
|
|
|
DEBUG_DEBUG(DEBUG_CATEGORY_BGP, "counts: udp_v4s=%d udp_v4a=%d udp_v6s=%d udp_v6a=%d tcp4=%d tcp6=%d v4a_total=%d v6a_total=%d", |
|
|
|
DEBUG_DEBUG(DEBUG_CATEGORY_BGP, "counts: udp_v4s=%d udp_v4a=%d udp_v6s=%d udp_v6a=%d tcp4=%d tcp6=%d v4a_total=%d v6a_total=%d", |
|
|
|
@ -794,6 +795,7 @@ int topo_group_update_my_nodeinfo(struct UTUN_INSTANCE* instance, struct TOPO_GR |
|
|
|
DEBUG_ERROR(DEBUG_CATEGORY_GENERAL, "TOPO_UPD_SELF: etcp_iter[%d] e_sock=%p type=%d fam=%d next=%p", |
|
|
|
DEBUG_ERROR(DEBUG_CATEGORY_GENERAL, "TOPO_UPD_SELF: etcp_iter[%d] e_sock=%p type=%d fam=%d next=%p", |
|
|
|
etcp_iter_cnt, (void*)e_sock, e_sock->type, e_sock->local_addr.ss_family, (void*)e_sock->next); |
|
|
|
etcp_iter_cnt, (void*)e_sock, e_sock->type, e_sock->local_addr.ss_family, (void*)e_sock->next); |
|
|
|
etcp_iter_cnt++; |
|
|
|
etcp_iter_cnt++; |
|
|
|
|
|
|
|
if (e_sock->is_tcp) { e_sock = e_sock->next; continue; } |
|
|
|
if (e_sock->type == CFG_SERVER_TYPE_PRIVATE || e_sock->type == CFG_SERVER_TYPE_LOCAL) { e_sock = e_sock->next; continue; } |
|
|
|
if (e_sock->type == CFG_SERVER_TYPE_PRIVATE || e_sock->type == CFG_SERVER_TYPE_LOCAL) { e_sock = e_sock->next; continue; } |
|
|
|
if (e_sock->local_addr.ss_family == AF_INET) { |
|
|
|
if (e_sock->local_addr.ss_family == AF_INET) { |
|
|
|
{ struct TOPO_SOCKMETA4* sm = memory_pool_alloc(group->instance->topo_groups->v4_sock_meta_pool); |
|
|
|
{ struct TOPO_SOCKMETA4* sm = memory_pool_alloc(group->instance->topo_groups->v4_sock_meta_pool); |
|
|
|
@ -807,7 +809,7 @@ int topo_group_update_my_nodeinfo(struct UTUN_INSTANCE* instance, struct TOPO_GR |
|
|
|
{ struct TOPO_ADDR4* a = memory_pool_alloc(group->instance->topo_groups->v4_addr_pool); |
|
|
|
{ struct TOPO_ADDR4* a = memory_pool_alloc(group->instance->topo_groups->v4_addr_pool); |
|
|
|
if (nat_verified) { |
|
|
|
if (nat_verified) { |
|
|
|
memcpy(a->addr, &nat_sin->sin_addr.s_addr, 4); a->port = ntohs(nat_sin->sin_port); |
|
|
|
memcpy(a->addr, &nat_sin->sin_addr.s_addr, 4); a->port = ntohs(nat_sin->sin_port); |
|
|
|
a->type = TOPO_ADDR_NAT; a->socket_id = e_sock->sock_id | 1; |
|
|
|
a->type = TOPO_ADDR_NAT; a->socket_id = e_sock->sock_id; |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
int use_local = (local_sin->sin_addr.s_addr != 0); |
|
|
|
int use_local = (local_sin->sin_addr.s_addr != 0); |
|
|
|
memcpy(a->addr, use_local ? &local_sin->sin_addr.s_addr : &if_sin->sin_addr.s_addr, 4); |
|
|
|
memcpy(a->addr, use_local ? &local_sin->sin_addr.s_addr : &if_sin->sin_addr.s_addr, 4); |
|
|
|
@ -833,16 +835,23 @@ int topo_group_update_my_nodeinfo(struct UTUN_INSTANCE* instance, struct TOPO_GR |
|
|
|
while (ts) { DEBUG_ERROR(DEBUG_CATEGORY_GENERAL, "TOPO_UPD_SELF: tcp_iter[%d] ts=%p type=%d fam=%d next=%p", |
|
|
|
while (ts) { DEBUG_ERROR(DEBUG_CATEGORY_GENERAL, "TOPO_UPD_SELF: tcp_iter[%d] ts=%p type=%d fam=%d next=%p", |
|
|
|
tcp_iter_cnt, (void*)ts, ts->type, ts->local_addr.ss_family, (void*)ts->next); |
|
|
|
tcp_iter_cnt, (void*)ts, ts->type, ts->local_addr.ss_family, (void*)ts->next); |
|
|
|
tcp_iter_cnt++; if (!ts->is_tcp) { ts = ts->next; continue; } |
|
|
|
tcp_iter_cnt++; if (!ts->is_tcp) { ts = ts->next; continue; } |
|
|
|
|
|
|
|
if (ts->type == CFG_SERVER_TYPE_PRIVATE || ts->type == CFG_SERVER_TYPE_LOCAL) { ts = ts->next; continue; } |
|
|
|
struct sockaddr_storage* addr = ts->interface_addr.ss_family ? &ts->interface_addr : &ts->local_addr; |
|
|
|
struct sockaddr_storage* addr = ts->interface_addr.ss_family ? &ts->interface_addr : &ts->local_addr; |
|
|
|
if (!addr || !addr->ss_family) { ts = ts->next; continue; } |
|
|
|
if (!addr || !addr->ss_family) { ts = ts->next; continue; } |
|
|
|
if (addr->ss_family == AF_INET) { |
|
|
|
if (addr->ss_family == AF_INET) { |
|
|
|
struct sockaddr_in* sin = (struct sockaddr_in*)addr; |
|
|
|
struct sockaddr_in* sin = (struct sockaddr_in*)addr; |
|
|
|
|
|
|
|
{ struct TOPO_SOCKMETA4* sm = memory_pool_alloc(group->instance->topo_groups->v4_sock_meta_pool); |
|
|
|
|
|
|
|
sm->id = ts->sock_id; sm->config_type = ts->type; sm->nat_type = ts->nat_type; |
|
|
|
|
|
|
|
sm->next = ni->v4_sock_meta; ni->v4_sock_meta = sm; } |
|
|
|
{ struct TOPO_ADDR4* a = memory_pool_alloc(group->instance->topo_groups->v4_addr_pool); |
|
|
|
{ struct TOPO_ADDR4* a = memory_pool_alloc(group->instance->topo_groups->v4_addr_pool); |
|
|
|
memcpy(a->addr, &sin->sin_addr.s_addr, 4); a->port = ntohs(sin->sin_port); |
|
|
|
memcpy(a->addr, &sin->sin_addr.s_addr, 4); a->port = ntohs(sin->sin_port); |
|
|
|
a->type = TOPO_ADDR_INTERFACE; a->socket_id = ts->sock_id; a->protocol = TOPO_PROTO_TCP; |
|
|
|
a->type = TOPO_ADDR_INTERFACE; a->socket_id = ts->sock_id; a->protocol = TOPO_PROTO_TCP; |
|
|
|
a->next = ni->v4_addrs; ni->v4_addrs = a; } |
|
|
|
a->next = ni->v4_addrs; ni->v4_addrs = a; } |
|
|
|
} else if (addr->ss_family == AF_INET6) { |
|
|
|
} else if (addr->ss_family == AF_INET6) { |
|
|
|
struct sockaddr_in6* sin6 = (struct sockaddr_in6*)addr; |
|
|
|
struct sockaddr_in6* sin6 = (struct sockaddr_in6*)addr; |
|
|
|
|
|
|
|
{ struct TOPO_SOCKMETA6* sm6 = memory_pool_alloc(group->instance->topo_groups->v6_sock_meta_pool); |
|
|
|
|
|
|
|
sm6->id = ts->sock_id; sm6->config_type = ts->type; sm6->nat_type = ts->nat_type; |
|
|
|
|
|
|
|
sm6->next = ni->v6_sock_meta; ni->v6_sock_meta = sm6; } |
|
|
|
{ struct TOPO_ADDR6* a6 = memory_pool_alloc(group->instance->topo_groups->v6_addr_pool); |
|
|
|
{ struct TOPO_ADDR6* a6 = memory_pool_alloc(group->instance->topo_groups->v6_addr_pool); |
|
|
|
memcpy(a6->addr, &sin6->sin6_addr, 16); a6->port = ntohs(sin6->sin6_port); |
|
|
|
memcpy(a6->addr, &sin6->sin6_addr, 16); a6->port = ntohs(sin6->sin6_port); |
|
|
|
a6->type = TOPO_ADDR_INTERFACE; a6->socket_id = ts->sock_id; a6->protocol = TOPO_PROTO_TCP; |
|
|
|
a6->type = TOPO_ADDR_INTERFACE; a6->socket_id = ts->sock_id; a6->protocol = TOPO_PROTO_TCP; |
|
|
|
@ -902,6 +911,7 @@ void topo_node_update_my_addresses(struct UTUN_INSTANCE* instance) { |
|
|
|
|
|
|
|
|
|
|
|
struct ETCP_SOCKET* e_sock = instance->etcp_sockets; |
|
|
|
struct ETCP_SOCKET* e_sock = instance->etcp_sockets; |
|
|
|
while (e_sock) { |
|
|
|
while (e_sock) { |
|
|
|
|
|
|
|
if (e_sock->is_tcp) { e_sock = e_sock->next; continue; } |
|
|
|
if (e_sock->type == CFG_SERVER_TYPE_PRIVATE || e_sock->type == CFG_SERVER_TYPE_LOCAL) { e_sock = e_sock->next; continue; } |
|
|
|
if (e_sock->type == CFG_SERVER_TYPE_PRIVATE || e_sock->type == CFG_SERVER_TYPE_LOCAL) { e_sock = e_sock->next; continue; } |
|
|
|
if (e_sock->local_addr.ss_family == AF_INET) { |
|
|
|
if (e_sock->local_addr.ss_family == AF_INET) { |
|
|
|
{ struct TOPO_SOCKMETA4* sm = memory_pool_alloc(instance->topo_groups->v4_sock_meta_pool); |
|
|
|
{ struct TOPO_SOCKMETA4* sm = memory_pool_alloc(instance->topo_groups->v4_sock_meta_pool); |
|
|
|
@ -914,7 +924,7 @@ void topo_node_update_my_addresses(struct UTUN_INSTANCE* instance) { |
|
|
|
{ struct TOPO_ADDR4* a = memory_pool_alloc(instance->topo_groups->v4_addr_pool); |
|
|
|
{ struct TOPO_ADDR4* a = memory_pool_alloc(instance->topo_groups->v4_addr_pool); |
|
|
|
if (nat_verified) { |
|
|
|
if (nat_verified) { |
|
|
|
memcpy(a->addr, &nat_sin->sin_addr.s_addr, 4); a->port = ntohs(nat_sin->sin_port); |
|
|
|
memcpy(a->addr, &nat_sin->sin_addr.s_addr, 4); a->port = ntohs(nat_sin->sin_port); |
|
|
|
a->type = TOPO_ADDR_NAT; a->socket_id = e_sock->sock_id | 1; |
|
|
|
a->type = TOPO_ADDR_NAT; a->socket_id = e_sock->sock_id; |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
int use_local = (local_sin->sin_addr.s_addr != 0); |
|
|
|
int use_local = (local_sin->sin_addr.s_addr != 0); |
|
|
|
memcpy(a->addr, use_local ? &local_sin->sin_addr.s_addr : &if_sin->sin_addr.s_addr, 4); |
|
|
|
memcpy(a->addr, use_local ? &local_sin->sin_addr.s_addr : &if_sin->sin_addr.s_addr, 4); |
|
|
|
@ -942,12 +952,18 @@ void topo_node_update_my_addresses(struct UTUN_INSTANCE* instance) { |
|
|
|
if (!addr || !addr->ss_family) { ts = ts->next; continue; } |
|
|
|
if (!addr || !addr->ss_family) { ts = ts->next; continue; } |
|
|
|
if (addr->ss_family == AF_INET) { |
|
|
|
if (addr->ss_family == AF_INET) { |
|
|
|
struct sockaddr_in* sin = (struct sockaddr_in*)addr; |
|
|
|
struct sockaddr_in* sin = (struct sockaddr_in*)addr; |
|
|
|
|
|
|
|
{ struct TOPO_SOCKMETA4* sm = memory_pool_alloc(instance->topo_groups->v4_sock_meta_pool); |
|
|
|
|
|
|
|
sm->id = ts->sock_id; sm->config_type = ts->type; sm->nat_type = ts->nat_type; |
|
|
|
|
|
|
|
sm->next = ni->v4_sock_meta; ni->v4_sock_meta = sm; } |
|
|
|
{ struct TOPO_ADDR4* a = memory_pool_alloc(instance->topo_groups->v4_addr_pool); |
|
|
|
{ struct TOPO_ADDR4* a = memory_pool_alloc(instance->topo_groups->v4_addr_pool); |
|
|
|
memcpy(a->addr, &sin->sin_addr.s_addr, 4); a->port = ntohs(sin->sin_port); |
|
|
|
memcpy(a->addr, &sin->sin_addr.s_addr, 4); a->port = ntohs(sin->sin_port); |
|
|
|
a->type = TOPO_ADDR_INTERFACE; a->socket_id = ts->sock_id; a->protocol = TOPO_PROTO_TCP; |
|
|
|
a->type = TOPO_ADDR_INTERFACE; a->socket_id = ts->sock_id; a->protocol = TOPO_PROTO_TCP; |
|
|
|
a->next = ni->v4_addrs; ni->v4_addrs = a; } |
|
|
|
a->next = ni->v4_addrs; ni->v4_addrs = a; } |
|
|
|
} else if (addr->ss_family == AF_INET6) { |
|
|
|
} else if (addr->ss_family == AF_INET6) { |
|
|
|
struct sockaddr_in6* sin6 = (struct sockaddr_in6*)addr; |
|
|
|
struct sockaddr_in6* sin6 = (struct sockaddr_in6*)addr; |
|
|
|
|
|
|
|
{ struct TOPO_SOCKMETA6* sm6 = memory_pool_alloc(instance->topo_groups->v6_sock_meta_pool); |
|
|
|
|
|
|
|
sm6->id = ts->sock_id; sm6->config_type = ts->type; sm6->nat_type = ts->nat_type; |
|
|
|
|
|
|
|
sm6->next = ni->v6_sock_meta; ni->v6_sock_meta = sm6; } |
|
|
|
{ struct TOPO_ADDR6* a6 = memory_pool_alloc(instance->topo_groups->v6_addr_pool); |
|
|
|
{ struct TOPO_ADDR6* a6 = memory_pool_alloc(instance->topo_groups->v6_addr_pool); |
|
|
|
memcpy(a6->addr, &sin6->sin6_addr, 16); a6->port = ntohs(sin6->sin6_port); |
|
|
|
memcpy(a6->addr, &sin6->sin6_addr, 16); a6->port = ntohs(sin6->sin6_port); |
|
|
|
a6->type = TOPO_ADDR_INTERFACE; a6->socket_id = ts->sock_id; a6->protocol = TOPO_PROTO_TCP; |
|
|
|
a6->type = TOPO_ADDR_INTERFACE; a6->socket_id = ts->sock_id; a6->protocol = TOPO_PROTO_TCP; |
|
|
|
|