|
|
|
|
@ -186,6 +186,19 @@ static int etcp_all_links_down(struct ETCP_CONN* etcp) {
|
|
|
|
|
return 1; // All links are down
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void start_keepalive_timer(struct ETCP_LINK* link) { |
|
|
|
|
// Start keepalive timer
|
|
|
|
|
if (link->init_timer) {// cancel init timer
|
|
|
|
|
uasync_cancel_timeout(link->etcp->instance->ua, link->init_timer); |
|
|
|
|
link->init_timer = NULL; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (link->keepalive_timer == NULL) { |
|
|
|
|
link->keepalive_timer = uasync_set_timeout(link->etcp->instance->ua, link->keepalive_interval * 10, link, keepalive_timer_cb); |
|
|
|
|
DEBUG_DEBUG(DEBUG_CATEGORY_CONNECTION, "[%s] Keepalive timer started on link %p (interval=%d ms)", link->etcp->log_name, link, link->keepalive_interval); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Keepalive timer callback
|
|
|
|
|
static void keepalive_timer_cb(void* arg) { |
|
|
|
|
DEBUG_TRACE(DEBUG_CATEGORY_CONNECTION, ""); |
|
|
|
|
@ -227,25 +240,13 @@ static void keepalive_timer_cb(void* arg) {
|
|
|
|
|
(unsigned long long)(elapsed / 10), link->keepalive_timeout); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
// else {
|
|
|
|
|
// if (link->recv_keepalive != 1) {
|
|
|
|
|
// link->recv_keepalive = 1; // up
|
|
|
|
|
// loadbalancer_link_ready(link);
|
|
|
|
|
// DEBUG_ERROR(DEBUG_CATEGORY_CONNECTION, "[%s] Link %p (local_id=%d) recv status changed to UP", link->etcp->log_name, link, link->local_link_id);
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// Send keepalive only if no packets were sent since last tick
|
|
|
|
|
if (!link->pkt_sent_since_keepalive) etcp_link_send_keepalive(link); |
|
|
|
|
link->pkt_sent_since_keepalive = 0; |
|
|
|
|
|
|
|
|
|
restart_timer: |
|
|
|
|
// Restart timer
|
|
|
|
|
if (link->keepalive_interval > 0) { |
|
|
|
|
link->keepalive_timer = uasync_set_timeout(link->etcp->instance->ua, |
|
|
|
|
link->keepalive_interval * 10, |
|
|
|
|
link, keepalive_timer_cb); |
|
|
|
|
} |
|
|
|
|
link->keepalive_timer = uasync_set_timeout(link->etcp->instance->ua, link->keepalive_interval * 10, link, keepalive_timer_cb); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static uint32_t sockaddr_hash(struct sockaddr_storage* addr) { |
|
|
|
|
@ -548,6 +549,7 @@ struct ETCP_LINK* etcp_link_new(struct ETCP_CONN* etcp, struct ETCP_SOCKET* conn
|
|
|
|
|
link->keepalive_timeout = 2000; // Default 2 seconds
|
|
|
|
|
link->keepalive_interval = 200; // Default 0.2 s
|
|
|
|
|
} |
|
|
|
|
if (link->keepalive_interval < 10) link->keepalive_interval = 10; |
|
|
|
|
link->keepalive_sent_count = 0; |
|
|
|
|
link->keepalive_recv_count = 0; |
|
|
|
|
|
|
|
|
|
@ -883,6 +885,7 @@ static void etcp_connections_read_callback_socket(socket_t sock, void* arg) {
|
|
|
|
|
} |
|
|
|
|
link->keepalive_interval=(ack_hdr->keepalive[0]<<8) | ack_hdr->keepalive[1]; |
|
|
|
|
link->recovery_interval=((ack_hdr->recovery[0]<<8) | ack_hdr->recovery[1])*100;// timebase в link, timebase/100 в кодограмме
|
|
|
|
|
if (link->keepalive_interval < 10) link->keepalive_interval = 10; |
|
|
|
|
DEBUG_DEBUG(DEBUG_CATEGORY_CONNECTION, "set keepalive for link=%d", link->keepalive_interval); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -941,14 +944,8 @@ static void etcp_connections_read_callback_socket(socket_t sock, void* arg) {
|
|
|
|
|
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); |
|
|
|
|
|
|
|
|
|
// Start keepalive timer
|
|
|
|
|
if (!link->keepalive_timer && link->keepalive_interval > 0) { |
|
|
|
|
link->keepalive_timer = uasync_set_timeout(link->etcp->instance->ua, |
|
|
|
|
link->keepalive_interval * 10, |
|
|
|
|
link, keepalive_timer_cb); |
|
|
|
|
DEBUG_DEBUG(DEBUG_CATEGORY_CONNECTION, "[%s] Keepalive timer started on link %p (interval=%d ms)", |
|
|
|
|
link->etcp->log_name, link, link->keepalive_interval); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
start_keepalive_timer(link); |
|
|
|
|
|
|
|
|
|
loadbalancer_link_ready(link); |
|
|
|
|
|
|
|
|
|
@ -1044,21 +1041,7 @@ process_decrypted:
|
|
|
|
|
link->etcp->peer_node_id = server_node_id; // If not set
|
|
|
|
|
etcp_update_log_name(link->etcp); // Update log_name with peer_node_id
|
|
|
|
|
|
|
|
|
|
// Cancel init timer if exists
|
|
|
|
|
if (link->init_timer) { |
|
|
|
|
uasync_cancel_timeout(link->etcp->instance->ua, link->init_timer); |
|
|
|
|
link->init_timer = NULL; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (link->keepalive_timer) { |
|
|
|
|
uasync_cancel_timeout(link->etcp->instance->ua, link->keepalive_timer); |
|
|
|
|
link->keepalive_timer = NULL; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 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
|
|
|
|
|
link->link_state = 3; // connected
|
|
|
|
|
|
|
|
|
|
if (code == ETCP_INIT_RESPONSE) { |
|
|
|
|
@ -1077,10 +1060,8 @@ process_decrypted:
|
|
|
|
|
// Start keepalive timer
|
|
|
|
|
etcp_link_send_keepalive(link); |
|
|
|
|
|
|
|
|
|
if (link->keepalive_interval > 0) { |
|
|
|
|
DEBUG_DEBUG(DEBUG_CATEGORY_CONNECTION, "[%s] Keepalive timer started on link %p (interval=%d ms)", link->etcp->log_name, link, link->keepalive_interval); |
|
|
|
|
link->keepalive_timer = uasync_set_timeout(link->etcp->instance->ua, link->keepalive_interval * 10, link, keepalive_timer_cb); |
|
|
|
|
} |
|
|
|
|
start_keepalive_timer(link); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
loadbalancer_link_ready(link); |
|
|
|
|
|
|
|
|
|
@ -1091,10 +1072,7 @@ process_decrypted:
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (link->link_state == 2) {// из recovery получен нормальный пакет - восстанавливаем линк в нормальный режим
|
|
|
|
|
if (link->init_timer) {// cancel init timer
|
|
|
|
|
uasync_cancel_timeout(link->etcp->instance->ua, link->init_timer); |
|
|
|
|
link->init_timer = NULL; |
|
|
|
|
} |
|
|
|
|
start_keepalive_timer(link); |
|
|
|
|
etcp_link_send_keepalive(link); // Start keepalive timer
|
|
|
|
|
link->link_state = 3; // connected
|
|
|
|
|
} |
|
|
|
|
|