@ -213,7 +213,9 @@ void etcp_link_restart_init_timer(struct ETCP_LINK* link) {
void etcp_link_enter_init ( struct ETCP_LINK * link ) { //
void etcp_link_enter_init ( struct ETCP_LINK * link ) { //
DEBUG_TRACE ( DEBUG_CATEGORY_CONNECTION , " " ) ;
DEBUG_TRACE ( DEBUG_CATEGORY_CONNECTION , " " ) ;
if ( ! link ) return ;
if ( ! link ) return ;
int old_state = link - > link_state ;
link - > link_state = 1 ; // handshake
link - > link_state = 1 ; // handshake
etcp_fire_link_status_cbk ( link , old_state , link - > link_status ) ;
if ( link - > is_server ! = 0 ) return ;
if ( link - > is_server ! = 0 ) return ;
etcp_link_send_init ( link , 1 , 0 ) ; // init with reset
etcp_link_send_init ( link , 1 , 0 ) ; // init with reset
etcp_link_restart_init_timer ( link ) ;
etcp_link_restart_init_timer ( link ) ;
@ -222,7 +224,9 @@ void etcp_link_enter_init(struct ETCP_LINK* link) {//
void etcp_link_enter_reinit ( struct ETCP_LINK * link ) {
void etcp_link_enter_reinit ( struct ETCP_LINK * link ) {
DEBUG_TRACE ( DEBUG_CATEGORY_CONNECTION , " " ) ;
DEBUG_TRACE ( DEBUG_CATEGORY_CONNECTION , " " ) ;
if ( ! link ) return ;
if ( ! link ) return ;
int old_state = link - > link_state ;
link - > link_state = 2 ; // reconnect
link - > link_state = 2 ; // reconnect
etcp_fire_link_status_cbk ( link , old_state , link - > link_status ) ;
etcp_on_link_down ( link - > etcp ) ;
etcp_on_link_down ( link - > etcp ) ;
if ( link - > is_server ! = 0 ) return ;
if ( link - > is_server ! = 0 ) return ;
etcp_conn_reinit ( link - > etcp ) ;
etcp_conn_reinit ( link - > etcp ) ;
@ -324,7 +328,9 @@ static void keepalive_timer_cb(void* arg) {
if ( elapsed > timeout_units ) {
if ( elapsed > timeout_units ) {
if ( link - > recv_keepalive ! = 0 ) {
if ( link - > recv_keepalive ! = 0 ) {
link - > recv_keepalive = 0 ;
link - > recv_keepalive = 0 ;
int old_link_status = link - > link_status ;
link - > link_status = 0 ;
link - > link_status = 0 ;
etcp_fire_link_status_cbk ( link , link - > link_state , old_link_status ) ;
etcp_on_link_down ( link - > etcp ) ;
etcp_on_link_down ( link - > etcp ) ;
DEBUG_INFO ( DEBUG_CATEGORY_KEEPALIVE , " [%s] Conn:%s Link down: link_id=%d state=%d init=%d ka=%d remote_ka=%d tmo: %llu>%llu els=%llums " , link - > etcp - > log_name , link - > conn ? link - > conn - > name : " ??? " , link - > local_link_id , link - > link_state , link - > initialized , link - > recv_keepalive , link - > remote_keepalive , ( unsigned long long ) timeout_units , ( unsigned long long ) elapsed , ( unsigned long long ) ( elapsed / 10 ) ) ;
DEBUG_INFO ( DEBUG_CATEGORY_KEEPALIVE , " [%s] Conn:%s Link down: link_id=%d state=%d init=%d ka=%d remote_ka=%d tmo: %llu>%llu els=%llums " , link - > etcp - > log_name , link - > conn ? link - > conn - > name : " ??? " , link - > local_link_id , link - > link_state , link - > initialized , link - > recv_keepalive , link - > remote_keepalive , ( unsigned long long ) timeout_units , ( unsigned long long ) elapsed , ( unsigned long long ) ( elapsed / 10 ) ) ;
DEBUG_WARN ( DEBUG_CATEGORY_KEEPALIVE , " [%s] Link %p (local_id=%d) recv status changed to DOWN - no packets for %llu ms " , link - > etcp - > log_name , link , link - > local_link_id , ( unsigned long long ) ( elapsed / 10 ) ) ;
DEBUG_WARN ( DEBUG_CATEGORY_KEEPALIVE , " [%s] Link %p (local_id=%d) recv status changed to DOWN - no packets for %llu ms " , link - > etcp - > log_name , link , link - > local_link_id , ( unsigned long long ) ( elapsed / 10 ) ) ;
@ -1475,7 +1481,7 @@ static void send_init_response(struct ETCP_SOCKET* e_sock, struct ETCP_DGRAM* pk
memory_pool_free ( e_sock - > instance - > pkt_pool , pkt ) ;
memory_pool_free ( e_sock - > instance - > pkt_pool , pkt ) ;
link - > initialized = 1 ;
link - > initialized = 1 ;
link - > link_state = 3 ;
{ int old_state = link - > link_state ; link - > link_state = 3 ; etcp_fire_link_status_cbk ( link , old_state , link - > link_status ) ; }
if ( link - > init_timer ) {
if ( link - > init_timer ) {
uasync_cancel_timeout ( link - > etcp - > instance - > ua , link - > init_timer ) ;
uasync_cancel_timeout ( link - > etcp - > instance - > ua , link - > init_timer ) ;
link - > init_timer = NULL ;
link - > init_timer = NULL ;
@ -1579,7 +1585,7 @@ static int handle_init_response_client(struct ETCP_SOCKET* e_sock, struct ETCP_D
etcp_update_log_name ( link - > etcp ) ;
etcp_update_log_name ( link - > etcp ) ;
link - > initialized = 1 ; // получен init response (client)
link - > initialized = 1 ; // получен init response (client)
link - > link_state = 3 ; // connected
{ int old_state = link - > link_state ; link - > link_state = 3 ; etcp_fire_link_status_cbk ( link , old_state , link - > link_status ) ; }
if ( link - > init_timer ) {
if ( link - > init_timer ) {
uasync_cancel_timeout ( link - > etcp - > instance - > ua , link - > init_timer ) ;
uasync_cancel_timeout ( link - > etcp - > instance - > ua , link - > init_timer ) ;
link - > init_timer = NULL ;
link - > init_timer = NULL ;
@ -2057,6 +2063,8 @@ process_decrypted:
int was_up = link - > link_status ;
int was_up = link - > link_status ;
link - > link_status = link - > remote_keepalive & & link - > recv_keepalive ;
link - > link_status = link - > remote_keepalive & & link - > recv_keepalive ;
if ( link - > link_status ! = was_up )
etcp_fire_link_status_cbk ( link , link - > link_state , was_up ) ;
if ( link - > link_status & & ! was_up & & link - > initialized ) {
if ( link - > link_status & & ! was_up & & link - > initialized ) {
DEBUG_INFO ( DEBUG_CATEGORY_DEBUG , " [%s] Link %d status popped UP: recv_ka=%d remote_ka=%d state=%d init=%d → calling loadbalancer_link_ready " , link - > etcp - > log_name , link - > local_link_id , link - > recv_keepalive , link - > remote_keepalive , link - > link_state , link - > initialized ) ;
DEBUG_INFO ( DEBUG_CATEGORY_DEBUG , " [%s] Link %d status popped UP: recv_ka=%d remote_ka=%d state=%d init=%d → calling loadbalancer_link_ready " , link - > etcp - > log_name , link - > local_link_id , link - > recv_keepalive , link - > remote_keepalive , link - > link_state , link - > initialized ) ;
loadbalancer_link_ready ( link ) ;
loadbalancer_link_ready ( link ) ;
@ -2091,7 +2099,7 @@ process_decrypted:
if ( link - > link_state = = 2 ) { // из recovery получен нормальный пакет - восстанавливаем линк в нормальный режим
if ( link - > link_state = = 2 ) { // из recovery получен нормальный пакет - восстанавливаем линк в нормальный режим
start_keepalive_timer ( link ) ;
start_keepalive_timer ( link ) ;
etcp_link_send_keepalive ( link ) ; // Start keepalive timer
etcp_link_send_keepalive ( link ) ; // Start keepalive timer
link - > link_state = 3 ; // connected
{ int old_state = link - > link_state ; link - > link_state = 3 ; etcp_fire_link_status_cbk ( link , old_state , link - > link_status ) ; }
}
}
@ -2120,7 +2128,7 @@ ec_fr:
int init_sockets ( struct UTUN_INSTANCE * instance ) {
int init_sockets ( struct UTUN_INSTANCE * instance ) {
DEBUG_TRACE ( DEBUG_CATEGORY_CONNECTION , " " ) ;
DEBUG_TRACE ( DEBUG_CATEGORY_CONNECTION , " " ) ;
if ( ! instance | | ! instance - > config ) return - 1 ;
if ( ! instance | | ! instance - > config ) return - 1 ;
if ( instance - > etcp_sockets | | instance - > stcp_server ) {
if ( instance - > etcp_sockets | | instance - > stcp_servers ) {
DEBUG_INFO ( DEBUG_CATEGORY_ETCP , " Sockets already initialized, skipping " ) ;
DEBUG_INFO ( DEBUG_CATEGORY_ETCP , " Sockets already initialized, skipping " ) ;
return 0 ;
return 0 ;
}
}
@ -2179,14 +2187,16 @@ int init_sockets(struct UTUN_INSTANCE* instance) {
// TCP transport: create stcp_server instead of UDP socket
// TCP transport: create stcp_server instead of UDP socket
if ( server - > transport ) {
if ( server - > transport ) {
uint16_t port = ntohs ( ( ( struct sockaddr_in * ) & server - > ip ) - > sin_port ) ;
uint16_t port = 0 ;
if ( server - > ip . ss_family = = AF_INET ) port = ntohs ( ( ( struct sockaddr_in * ) & server - > ip ) - > sin_port ) ;
else if ( server - > ip . ss_family = = AF_INET6 ) port = ntohs ( ( ( struct sockaddr_in6 * ) & server - > ip ) - > sin6_port ) ;
struct stcp_link_config scfg = { . ua = instance - > ua , . my_keys = & instance - > my_keys , . inst = instance } ;
struct stcp_link_config scfg = { . ua = instance - > ua , . my_keys = & instance - > my_keys , . inst = instance } ;
struct stcp_server * tsrv = stcp_server_listen ( & scfg , port , tcp_server_on_link , instance ) ;
struct stcp_server * tsrv = stcp_server_listen ( & scfg , port , tcp_server_on_link , instance ) ;
if ( ! tsrv ) {
if ( ! tsrv ) {
DEBUG_ERROR ( DEBUG_CATEGORY_ETCP , " Failed to create TCP server for %s " , server - > name ) ;
DEBUG_ERROR ( DEBUG_CATEGORY_ETCP , " Failed to create TCP server for %s " , server - > name ) ;
fail_count + + ;
fail_count + + ;
} else {
} else {
instance - > stcp_server = tsrv ;
stcp_server_list_add ( instance , tsrv ) ;
tcp_socket_add ( instance , server ) ;
tcp_socket_add ( instance , server ) ;
success_count + + ;
success_count + + ;
DEBUG_INFO ( DEBUG_CATEGORY_ETCP , " TCP server %s on port %u " , server - > name , port ) ;
DEBUG_INFO ( DEBUG_CATEGORY_ETCP , " TCP server %s on port %u " , server - > name , port ) ;
@ -2233,7 +2243,7 @@ int init_connections(struct UTUN_INSTANCE* instance) {
int socket_result = 0 ;
int socket_result = 0 ;
// If sockets already exist (created by init_sockets), check stored status
// If sockets already exist (created by init_sockets), check stored status
if ( instance - > etcp_sockets | | instance - > stcp_server ) {
if ( instance - > etcp_sockets | | instance - > stcp_servers ) {
if ( instance - > socket_init_status = = 1 ) {
if ( instance - > socket_init_status = = 1 ) {
socket_result = 1 ;
socket_result = 1 ;
}
}