Backup before fixing test_routing_mesh segfault
This commit is contained in:
1 parent
0490c846c2
commit
a5818d9cc4
11 files changed
+62
-1130
No files matched your search
+40
-15
@@ -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,
|
||||
|
||||
@@ -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
@@ -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) {
|
||||
|
||||
Reference in new issue
Block a user