Files
utun2/src/routing_layer/topo_group_invite.h
T

62 lines
3.3 KiB
C

/**
* @file topo_group_invite.h
* @brief Получение описания канала по прямому NCD-транспорту (INVITE_INFO).
*
* Запрашивает и проверяет подписанные сведения канала, готовит локальную группу.
* Успешный ответ не добавляет участника на других узлах и не означает READY группы.
* Вход по пользовательской ссылке и добавление участника описаны в chat_sync.h/chat_join.h.
* Все операции — в потоке uasync; временные запросы отменяются при остановке чата.
*/
#ifndef TOPO_GROUP_INVITE_H
#define TOPO_GROUP_INVITE_H
#include <stdint.h>
#include "topo_node.h"
#include "secure_channel.h"
struct UTUN_INSTANCE;
struct ETCP_CONN;
struct ll_entry;
struct NODE_CONN_DIRECT;
/* service id протокола invite: ETCP_RT_ID_GROUP_INVITE (etcp_bind, см. etcp_api.h) */
#define TGI_SUBCMD_INFO_REQ 0x01
#define TGI_SUBCMD_INFO_RESP 0x02
/* события коллбэка джойнера */
#define TGI_EVENT_JOIN 0 /* описание канала принято, локальная инфраструктура готова */
#define TGI_EVENT_TIMEOUT 1 /* попытка завершилась ошибкой или таймаутом */
typedef void (*tgi_cb_t)(uint64_t node_id, uint64_t group_id, int event, void* arg);
/** Идемпотентная инициализация: биндит обработчик ETCP_RT_ID_GROUP_INVITE. */
void topo_group_invite_init(struct UTUN_INSTANCE* inst);
/**
* Джойнер: прямое подключение (ncd) к приглашающему + проверка членства.
* ni — TOPO_NODE приглашающего (pubkey + адреса), не владеем.
* 0 — попытка начата, -1 — ошибка. До создания попытки ошибка не вызывает cb;
* после создания ошибки дают TGI_EVENT_TIMEOUT, иногда до возврата функции.
* Успешный обмен даёт TGI_EVENT_JOIN; cancel_all завершает ожидание без cb.
*/
int topo_group_invite_join(struct UTUN_INSTANCE* inst, uint64_t group_id,
struct TOPO_NODE* ni, uint64_t node_id,
tgi_cb_t cb, void* cb_arg);
/**
* Запустить групповую попытку к уже известному участнику, при необходимости
* передав адреса ni (заимствованы; NULL — взять известные). 0/-1.
* Применяется обычная проверка CHAT-членства. Сам CHANNEL_INVITE не отправляет.
*/
int topo_group_invite_to_channel(struct UTUN_INSTANCE* inst, uint64_t group_id,
struct TOPO_NODE* ni, uint64_t node_id);
/** Отменяет все pending-invite (teardown). */
void topo_group_invite_cancel_all(struct UTUN_INSTANCE* inst);
/** Обработчик приёма пакетов invite (etcp_bind). */
void topo_group_invite_recv_handler(struct ETCP_CONN* conn, struct ll_entry* entry);
#endif