Route UTUN configuration and group ownership through NCD
This commit is contained in:
1 parent
9745a987ac
commit
bce17d9cfc
21 files changed
+592
-332
No files matched your search
+5
-59
@@ -1009,64 +1009,9 @@ struct UTUN_INSTANCE *utun_instance_reload(struct UTUN_INSTANCE *instance, struc
|
||||
}
|
||||
os = next;
|
||||
}
|
||||
// Clients [client:] — close old config handles, rebuild from new config
|
||||
struct CONFIG_CONN_HANDLE* ch = instance->config_conn_handles;
|
||||
while (ch) { struct CONFIG_CONN_HANDLE* next = ch->next; node_conn_direct_close(ch->handle); u_free(ch); ch = next; }
|
||||
instance->config_conn_handles = NULL;
|
||||
|
||||
for (struct CFG_CLIENT *nc = new_config->clients; nc; nc = nc->next) {
|
||||
if (strlen(nc->peer_public_key_hex) == 0) { DEBUG_WARN(DEBUG_CATEGORY_CONFIG, "client %s no peer pubkey", nc->name); continue; }
|
||||
uint8_t pubkey_bin[SC_PUBKEY_SIZE];
|
||||
if (sc_hex_to_binary(nc->peer_public_key_hex, pubkey_bin, SC_PUBKEY_SIZE) != 0) { DEBUG_ERROR(DEBUG_CATEGORY_ETCP, "invalid pubkey hex client %s", nc->name); continue; }
|
||||
uint64_t node_id = sc_derive_node_id_from_pubkey(pubkey_bin);
|
||||
|
||||
if (nc->reality_enabled) {
|
||||
struct NODE_CONN_DIRECT* rhandle = etcp_config_client_reality(instance, nc, pubkey_bin, node_id);
|
||||
if (rhandle) {
|
||||
ch = u_calloc(1, sizeof(*ch));
|
||||
if (ch) { ch->node_id = node_id; strncpy(ch->name, nc->name, MAX_CONN_NAME_LEN - 1);
|
||||
ch->handle = rhandle; ch->next = instance->config_conn_handles; instance->config_conn_handles = ch; }
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
struct NODE_CONN_DIRECT* handle = NULL;
|
||||
struct ETCP_CONN* conn = NULL;
|
||||
for (struct CFG_CLIENT_LINK *nl = nc->links; nl; nl = nl->next) {
|
||||
struct ETCP_SOCKET* sock = NULL;
|
||||
for (struct ETCP_SOCKET* s = instance->etcp_sockets; s; s = s->next)
|
||||
if (nl->local_srv && strcmp(nl->local_srv->name, s->name) == 0) { sock = s; break; }
|
||||
if (!sock) { DEBUG_ERROR(DEBUG_CATEGORY_ETCP, "no socket for server '%s' client %s", nl->local_srv ? nl->local_srv->name : "?", nc->name); continue; }
|
||||
if (!handle) {
|
||||
struct TOPO_ADDR4 v4_addr; struct TOPO_ADDR6 v6_addr;
|
||||
struct TOPO_NODE ni_tmp; memset(&ni_tmp, 0, sizeof(ni_tmp));
|
||||
ni_tmp.node_id = node_id; ni_tmp.node_name = nc->name;
|
||||
memcpy(ni_tmp.public_key, pubkey_bin, SC_PUBKEY_SIZE);
|
||||
if (nl->remote_addr.ss_family == AF_INET) {
|
||||
struct sockaddr_in* sin = (struct sockaddr_in*)&nl->remote_addr;
|
||||
v4_addr = (struct TOPO_ADDR4){0}; memcpy(v4_addr.addr, &sin->sin_addr.s_addr, 4);
|
||||
v4_addr.port = ntohs(sin->sin_port); v4_addr.type = TOPO_ADDR_INTERFACE; v4_addr.protocol = TOPO_PROTO_UDP;
|
||||
ni_tmp.v4_addrs = &v4_addr;
|
||||
} else if (nl->remote_addr.ss_family == AF_INET6) {
|
||||
struct sockaddr_in6* sin6 = (struct sockaddr_in6*)&nl->remote_addr;
|
||||
v6_addr = (struct TOPO_ADDR6){0}; memcpy(v6_addr.addr, &sin6->sin6_addr, 16);
|
||||
v6_addr.port = ntohs(sin6->sin6_port); v6_addr.type = TOPO_ADDR_INTERFACE; v6_addr.protocol = TOPO_PROTO_UDP;
|
||||
ni_tmp.v6_addrs = &v6_addr;
|
||||
}
|
||||
int rc = node_conn_direct_open_node(instance, node_id, NULL, NULL, &handle, &ni_tmp, sock);
|
||||
if (rc == NCD_ERR || !handle) { DEBUG_ERROR(DEBUG_CATEGORY_ETCP, "ncd reload open failed client %s", nc->name); break; }
|
||||
conn = node_conn_direct_get_conn(handle);
|
||||
DEBUG_INFO(DEBUG_CATEGORY_CONNECTION, "reload: client %s ncd %s node=0x%016llx", nc->name, rc == NCD_NEW ? "NEW" : "REUSED", (unsigned long long)node_id);
|
||||
} else {
|
||||
etcp_link_new(conn, sock, &nl->remote_addr, 0);
|
||||
}
|
||||
}
|
||||
if (handle) {
|
||||
ch = u_calloc(1, sizeof(*ch));
|
||||
if (ch) { ch->node_id = node_id; strncpy(ch->name, nc->name, MAX_CONN_NAME_LEN - 1);
|
||||
ch->handle = handle; ch->next = instance->config_conn_handles; instance->config_conn_handles = ch; }
|
||||
}
|
||||
}
|
||||
int client_result = init_client_connections(instance, new_config->clients);
|
||||
if (client_result < 0)
|
||||
DEBUG_ERROR(DEBUG_CATEGORY_CONFIG, "reload: failed to replace client handles; previous connections retained");
|
||||
// Reload networks: clear and repopulate
|
||||
if (instance->networks) {
|
||||
struct ll_entry *entry;
|
||||
@@ -1103,7 +1048,8 @@ struct UTUN_INSTANCE *utun_instance_reload(struct UTUN_INSTANCE *instance, struc
|
||||
// routing_create(instance); // commented per request
|
||||
if (instance->config) free_config(instance->config);
|
||||
instance->config = new_config;
|
||||
DEBUG_INFO(DEBUG_CATEGORY_CONFIG, "Selective partial reload completed (only changed updated, unchanged untouched, [debug] applied)");
|
||||
if (client_result < 0) DEBUG_WARN(DEBUG_CATEGORY_CONFIG, "Reload completed with client errors; previous client handles retained");
|
||||
else DEBUG_INFO(DEBUG_CATEGORY_CONFIG, "Selective partial reload completed (only changed updated, unchanged untouched, [debug] applied)");
|
||||
return instance;
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user