Backup before fixing test_routing_mesh segfault

This commit is contained in:
Evgeny committed 2026-02-16 22:02:57 +03:00
1 parent 0490c846c2
commit a5818d9cc4
11 files changed
+62 -1130

No files matched your search

+40 -15
View File
@@ -163,17 +163,19 @@ static void keepalive_timer_cb(void* arg) {
uint64_t elapsed = now - link->last_recv_local_time;
if (elapsed > timeout_units) {
if (link->link_status != 0) {
link->link_status = 0; // down
DEBUG_WARN(DEBUG_CATEGORY_CONNECTION, "[%s] Link %p (local_id=%d) status changed to DOWN - "
if (link->recv_keepalive != 0) {
link->recv_keepalive = 0; // down
link->link_status = 0;
DEBUG_WARN(DEBUG_CATEGORY_CONNECTION, "[%s] Link %p (local_id=%d) recv status changed to DOWN - "
"no packets received for %llu ms (timeout=%u ms)",
link->etcp->log_name, link, link->local_link_id,
(unsigned long long)(elapsed / 10), link->keepalive_timeout);
}
} else {
if (link->link_status != 1) {
link->link_status = 1; // up
DEBUG_INFO(DEBUG_CATEGORY_CONNECTION, "[%s] Link %p (local_id=%d) status changed to UP",
if (link->recv_keepalive != 1) {
link->recv_keepalive = 1; // up
// loadbalancer_link_ready(link);
DEBUG_INFO(DEBUG_CATEGORY_CONNECTION, "[%s] Link %p (local_id=%d) recv status changed to UP",
link->etcp->log_name, link, link->local_link_id);
}
}
@@ -580,8 +582,12 @@ int etcp_encrypt_send(struct ETCP_DGRAM* dgram) {
if (!dgram || !dgram->link) return -1;
DEBUG_INFO(DEBUG_CATEGORY_CONNECTION, "[%s] Send rk=%d lk=%d up=%d",
dgram->link->etcp->log_name, dgram->link->recv_keepalive, dgram->link->remote_keepalive, dgram->link->link_status);
// Mark that packet was sent (for keepalive logic)
dgram->link->pkt_sent_since_keepalive = 1;
dgram->flag_up=dgram->link->recv_keepalive;
int errcode=0;
sc_context_t* sc = &dgram->link->etcp->crypto_ctx;
@@ -594,7 +600,7 @@ int etcp_encrypt_send(struct ETCP_DGRAM* dgram) {
// DUMP: Show packet before encryption
if (debug_should_output(DEBUG_LEVEL_DEBUG, DEBUG_CATEGORY_CRYPTO)) log_dump("ECTP_ENCRYPT_SEND", dgram->data, dgram->data_len);
// DEBUG_INFO(DEBUG_CATEGORY_ETCP, "Encrypt start");
sc_encrypt(sc, (uint8_t*)&dgram->timestamp/*не править это, тут верно!*/, sizeof(uint16_t) + len, enc_buf, &enc_buf_len);
sc_encrypt(sc, (uint8_t*)&dgram->timestamp/*не править это, тут верно!*/, 3 + len, enc_buf, &enc_buf_len);
// DEBUG_INFO(DEBUG_CATEGORY_ETCP, "Encrypt end");
if (enc_buf_len == 0) {
DEBUG_ERROR(DEBUG_CATEGORY_CRYPTO, "etcp_encrypt_send: encryption failed for node %llu", (unsigned long long)dgram->link->etcp->instance->node_id);
@@ -647,6 +653,7 @@ static void etcp_connections_read_callback_socket(socket_t sock, void* arg) {
// 4 - не init пакет (неверный код)
// 5 - коллизия peer ID и ключей
// 6 - не удалось расшифровать обычный пакет
// 7 - слишком короткий пакет
// 13 - переполнение при парсинге пакета
// 46 - расшифрованный пакет слишком маленький (< 3 байта)
// 55 - не удалось создать подключение
@@ -682,6 +689,10 @@ static void etcp_connections_read_callback_socket(socket_t sock, void* arg) {
// Try normal decryption first if we have an established link with session keys
// This is the common case for data packets and responses
if (link) {
link->recv_keepalive = 1; // Link is up after successful initialization
}
if (link!=NULL && link->etcp!=NULL && link->etcp->crypto_ctx.session_ready) {
DEBUG_INFO(DEBUG_CATEGORY_ETCP, "Decrypt start (normal)");
if (!sc_decrypt(&link->etcp->crypto_ctx, data, recv_len, (uint8_t*)&pkt->timestamp, &pkt_len)) {
@@ -718,7 +729,13 @@ static void etcp_connections_read_callback_socket(socket_t sock, void* arg) {
}
// INIT decryption succeeded - process as new incoming connection
pkt->data_len=pkt_len-2;
if (pkt_len<3) {
DEBUG_ERROR(DEBUG_CATEGORY_CRYPTO, "etcp_connections_read_callback: too short packet");
errorcode=7;
goto ec_fr;
}
pkt->data_len=pkt_len-3;
pkt->noencrypt_len=0;
struct {
uint8_t code;
@@ -796,6 +813,8 @@ static void etcp_connections_read_callback_socket(socket_t sock, void* arg) {
pkt->data_len=sizeof(*ack_repl_hdr);
pkt->noencrypt_len=0;
pkt->link=link;
link->recv_keepalive = 1;
DEBUG_DEBUG(DEBUG_CATEGORY_CONNECTION, "Sending INIT RESPONSE, link=%p, local_link_id=%d, remote_link_id=%d", link, link->local_link_id, link->remote_link_id);
DEBUG_INFO(DEBUG_CATEGORY_ETCP, "[ETCP DEBUG] Send INIT RESPONSE");
etcp_encrypt_send(pkt);
@@ -803,7 +822,6 @@ static void etcp_connections_read_callback_socket(socket_t sock, void* arg) {
memory_pool_free(e_sock->instance->pkt_pool, pkt);
link->initialized = 1;// получен init request (server), считаем линк уже готовым к работе
link->link_status = 1; // Link is up after successful initialization
DEBUG_INFO(DEBUG_CATEGORY_CONNECTION, "[%s] Link %p (local_id=%d) initialized and marked as UP (server)",
link->etcp->log_name, link, link->local_link_id);
@@ -828,17 +846,22 @@ static void etcp_connections_read_callback_socket(socket_t sock, void* arg) {
process_decrypted:
DEBUG_INFO(DEBUG_CATEGORY_ETCP, "Decrypt end");
if (pkt_len<3) { errorcode=46; DEBUG_ERROR(DEBUG_CATEGORY_ETCP, "etcp_connections_read_callback: decrypted packet too small, size=%zu", pkt_len); goto ec_fr; }
pkt->data_len=pkt_len-2;
pkt->data_len=pkt_len-3;
pkt->noencrypt_len=0;
pkt->link=link;
link->remote_keepalive=pkt->flag_up;
if ( link->remote_keepalive && !link->link_status && link->initialized) loadbalancer_link_ready(link);// up выставляем только если и remote=up и local=up
link->link_status=link->remote_keepalive;
link->last_recv_local_time=get_current_time_units();
link->last_recv_timestamp=pkt->timestamp;
link->last_recv_updated=1;
// Mark link as up when receiving packets
if (link->link_status != 1) {
link->link_status = 1;
if (link->recv_keepalive != 1) {
link->recv_keepalive = 1;
// loadbalancer_link_ready(link);
DEBUG_INFO(DEBUG_CATEGORY_CONNECTION, "[%s] Link %p (local_id=%d) status changed to UP - packet received",
link->etcp->log_name, link, link->local_link_id);
}
@@ -913,11 +936,13 @@ process_decrypted:
// Mark link as initialized
// DEBUG_DEBUG(DEBUG_CATEGORY_CONNECTION, "Setting link->initialized=1, link=%p, is_server=%d", link, link->is_server);
link->initialized = 1;// получен init response (client)
link->link_status = 1; // Link is up after successful initialization
DEBUG_INFO(DEBUG_CATEGORY_CONNECTION, "[%s] Link %p (local_id=%d) initialized and marked as UP (client)",
link->etcp->log_name, link, link->local_link_id);
// link->link_status = 1; // Link is up after successful initialization
loadbalancer_link_ready(link);
DEBUG_INFO(DEBUG_CATEGORY_CONNECTION, "[%s] Link %p (local_id=%d) initialized and marked as UP (client): rk=%d lk=%d up=%d",
link->etcp->log_name, link, link->local_link_id, link->recv_keepalive, link->remote_keepalive, link->link_status);
// Start keepalive timer
etcp_link_send_keepalive(link);
if (!link->keepalive_timer && link->keepalive_interval > 0) {
link->keepalive_timer = uasync_set_timeout(link->etcp->instance->ua,
link->keepalive_interval * 10,
+6 -1
View File
@@ -17,13 +17,16 @@
#define ETCP_CHANNEL_RESPONSE 0x05
#pragma pack(push, 1)
struct ETCP_DGRAM {// пакет (незашифрованный)
struct ETCP_LINK* link;// откуда получена или куда отправялем
uint16_t data_len;// общий размер пакета не включая timestamp
uint16_t noencrypt_len;// число байт (с конца) которые не надо шифровать. для передачи pubkey
uint16_t timestamp;// timestamp отправляющего узла при отправке пакета
uint8_t flag_up:1;// bit0 = up/down (recv_keepalive)
uint8_t data[0];// данные пакета (без timestamp)
};
#pragma pack(pop)
// список активных подключений которые обслуживает сокет. каждый сокет может обслуживать много подключений
struct ETCP_SOCKET {
@@ -60,7 +63,9 @@ struct ETCP_LINK {
uint8_t initialized; // Флаг инициализации (1=подтверждено или получен request)
uint8_t local_link_id; // id моего линка
uint8_t remote_link_id; // id этого линка на peer (устанавливается в момент initialized)
uint8_t link_status; // 1 - up, 0 - down
uint8_t recv_keepalive; // 1 - up, 0 - down (принимаются ли пакеты)
uint8_t remote_keepalive; // 1 - up, 0 - down (удаленная сторона сообщает - принимаются ли у нее пакеты)
uint8_t link_status; // 1 - up, 0 - down (итоговый статус - если есть проблемы на любой стороне - линк down)
// Состояние установки соединения (только для клиентов)
void* init_timer; // Таймер для повторов INIT (NULL=не подключается)
+1 -1
View File
@@ -264,7 +264,7 @@ int main(int argc, char *argv[]) {
debug_config_init();
debug_set_level(DEBUG_LEVEL_TRACE);
debug_set_categories(DEBUG_CATEGORY_ALL & ~DEBUG_CATEGORY_UASYNC); // Enable all except uasync
debug_set_categories(DEBUG_CATEGORY_ALL & ~DEBUG_CATEGORY_UASYNC & ~DEBUG_CATEGORY_TIMERS); // Enable all except uasync
debug_enable_function_name(1);
if (args.debug_config) {