Clarify local update ownership, results and failure contracts
This commit is contained in:
1 parent
1e0281d4d8
commit
f9994e11b5
2 files changed
+14
-7
No files matched your search
@@ -1118,7 +1118,7 @@ int topo_group_update_my_nodeinfo(struct UTUN_INSTANCE* instance, struct TOPO_GR
|
||||
if (!lq) { DEBUG_ERROR(DEBUG_CATEGORY_BGP, "local node update: allocation failed"); return -1; }
|
||||
struct TOPO_NODE* ni = NULL;
|
||||
char* name = NULL;
|
||||
int new_identity = 0, retained = 0, routes_changed = 0, vc = 0, vc6 = 0;
|
||||
int new_identity = 0, retained = 0, routes_changed = 0, changed = 1, vc = 0, vc6 = 0;
|
||||
lq->node_id = instance->node_id; lq->radio = group->radio_active; lq->phone_status = call_phone_status(instance);
|
||||
if (group->group_type != TOPO_GROUP_TYPE_CHAT) {
|
||||
struct TOPO_SUBNET4** tail4 = NULL; struct TOPO_SUBNET6** tail6 = NULL;
|
||||
@@ -1150,7 +1150,7 @@ int topo_group_update_my_nodeinfo(struct UTUN_INSTANCE* instance, struct TOPO_GR
|
||||
}
|
||||
}
|
||||
ni = topo_node_registry_find(groups, instance->node_id);
|
||||
int changed = !old || !ni || strcmp(ni->node_name ? ni->node_name : "", instance->name) ||
|
||||
changed = !old || !ni || strcmp(ni->node_name ? ni->node_name : "", instance->name) ||
|
||||
memcmp(ni->public_key, instance->my_keys.public_key, SC_PUBKEY_SIZE) ||
|
||||
memcmp(ni->ed25519_public_key, instance->my_ed25519_pubkey, SC_PUBKEY_SIZE) ||
|
||||
ni->client_type != instance->client_type || ni->client_activity != instance->client_activity ||
|
||||
@@ -1201,7 +1201,7 @@ int topo_group_update_my_nodeinfo(struct UTUN_INSTANCE* instance, struct TOPO_GR
|
||||
lq->last_ver = ni->ver; lq->last_timestamp = ni->timestamp;
|
||||
if (old) { topo_nodeq_clear_paths(old); topo_nodeq_free_group_fields(groups, old); u_free(old); }
|
||||
group->local_node = lq;
|
||||
DEBUG_DEBUG(DEBUG_CATEGORY_BGP, "local node published: group=%016llx v4=%d v6=%d ver=%u timestamp=%llu",
|
||||
DEBUG_INFO(DEBUG_CATEGORY_BGP, "local node published: group=%016llx v4=%d v6=%d ver=%u timestamp=%llu",
|
||||
(unsigned long long)group->group_id, vc, vc6, ni->ver, (unsigned long long)ni->timestamp);
|
||||
return vc;
|
||||
allocation_failed:
|
||||
|
||||
@@ -212,7 +212,7 @@ struct TOPO_GROUP_NODE {
|
||||
uint64_t node_id; // идентификатор узла в этой группе
|
||||
struct TOPO_NODESUBNETS* subnets; // подсети узла (v4/v6), для route_insert()
|
||||
struct ll_queue* paths; // TOPO_NODEPATH{conn,hop_count,rtt} — маршруты
|
||||
uint8_t last_ver; // последняя версия NODEINFO (защита от stale, BGP)
|
||||
uint8_t last_ver; // диагностический циклический ver; свежесть определяется timestamp
|
||||
uint64_t last_timestamp; // последняя принятая версия записи в группе
|
||||
uint8_t conn_mgr_type; // CONN_TYPE_DIRECT/REVERSE/INDIRECT/NONE
|
||||
uint64_t conn_mgr_intermediaries[CONN_MGR_MAX_INTERMEDIARIES]; // посредники для INDIRECT
|
||||
@@ -271,11 +271,17 @@ uint64_t* topo_node_best_hop_list(struct TOPO_GROUP_NODE* nq, uint8_t* out_count
|
||||
/* Лучший живой путь: минимум переходов, затем ID соседа. Указатель заимствованный. */
|
||||
struct TOPO_NODEPATH* topo_node_best_path(const struct TOPO_GROUP_NODE* nq);
|
||||
|
||||
/* Обновить локальный узел группы и его анонс. 0/-1. */
|
||||
/* Подготовить и опубликовать local_node с актуальными подсетями/состоянием; число IPv4-подсетей или -1.
|
||||
* Учитывает адреса и префиксы, а не только счётчики; CHAT не анонсирует подсети и возвращает 0.
|
||||
* При отказе подготовки/подписи или конфликте IPv4 сохраняет прежние local_node и маршруты.
|
||||
* Вызывает обновление общей подписанной записи; рассылку NODEINFO выполняет вызывающий. */
|
||||
int topo_group_update_my_nodeinfo(struct UTUN_INSTANCE* instance, struct TOPO_GROUP* group);
|
||||
/* Создать подписанную локальную идентичность с отдельной ссылкой ядра. 0/-1. */
|
||||
int topo_node_init_self(struct UTUN_INSTANCE* instance);
|
||||
int topo_node_update_my_addresses(struct UTUN_INSTANCE* instance); /* 1=changed, 0=unchanged, -1=error */
|
||||
/* Пересобрать общие адреса из рабочих UDP/TCP-сокетов; 1=изменились, 0=прежние, -1=ошибка.
|
||||
* Новая запись подписывается/сохраняется перед заменой, затем рассылается во все группы.
|
||||
* Ошибка SQL-проекции даёт -1 и после применённого изменения; при неизменных адресах проекция также обновляется. */
|
||||
int topo_node_update_my_addresses(struct UTUN_INSTANCE* instance);
|
||||
/* Обработчик изменений локального сокета: обновляет адреса узла. */
|
||||
void topo_node_on_socket_changed(struct ETCP_SOCKET* sock, int event, void* arg);
|
||||
/* Вывести диагностику узлов группы в лог категории BGP на уровне INFO. */
|
||||
@@ -299,7 +305,8 @@ uint16_t topo_get_chain_rtt(struct TOPO_GROUP_NODE* nq);
|
||||
* тип/активность и полные списки сокетов/адресов/Reality. Длина или -1. */
|
||||
int topo_node_build_sig_msg(struct TOPO_NODE* ni, uint8_t* buf, size_t buf_size);
|
||||
|
||||
/* Увеличить timestamp, подписать локальный NODEINFO и сохранить снимок в SQLite. 0/-1. */
|
||||
/* Увеличить timestamp (выше текущего/сохранённого), подписать локальный NODEINFO; при наличии SQLite сохранить снимок.
|
||||
* 0/-1; при ошибке возвращает прежние timestamp/подпись, остальные изменённые вызывающим поля не откатывает. */
|
||||
int topo_node_sign_self(struct UTUN_INSTANCE* instance, struct TOPO_NODE* ni);
|
||||
/* Проверить timestamp, привязку node_id к ключу и подпись. 0/-1. */
|
||||
int topo_node_verify(const struct TOPO_NODE* ni);
|
||||
|
||||
Reference in new issue
Block a user