@ -59,6 +59,7 @@ struct TOPO_GROUP_CONNECT {
int candidate_count ;
int candidate_count ;
struct CONN_MGR_HANDLE * handles [ TGC_MAX_HANDLES ] ;
struct CONN_MGR_HANDLE * handles [ TGC_MAX_HANDLES ] ;
int handle_count ;
int handle_count ;
struct CONN_MGR_HANDLE * cur_handle ; /* handle текущей попытки Phase 2/3 (для закрытия на TIMEOUT) */
} ;
} ;
static void tgc_phase2_try_next ( struct TOPO_GROUP_CONNECT * gc ) ;
static void tgc_phase2_try_next ( struct TOPO_GROUP_CONNECT * gc ) ;
@ -72,6 +73,12 @@ static void tgc_callback(struct CONN_MGR_HANDLE* h, uint64_t node_id, uint64_t g
/* ─── нотификация GUI о списке узлов в процессе подключения ─── */
/* ─── нотификация GUI о списке узлов в процессе подключения ─── */
/**
* О т п р а в л я е т в GUI с о б ы т и е CHAT_EVT_CONNECTING_NODES — с п и с о к у з л о в , к к о т о р ы м
* с е й ч а с и д ё т п о п ы т к а п о д к л ю ч е н и я . GUI п о н е м у р и с у е т ж ё л т ы й к р у ж о к у э т и х у з л о в .
* П у с т о й с п и с о к ( count = 0 ) о з н а ч а е т « с е й ч а с н и к к о м у н е п о д к л ю ч а е м с я » —
* в с е ж ё л т ы е к р у ж к и с н и м а ю т с я .
*/
static void tgc_notify_connecting ( struct TOPO_GROUP_CONNECT * gc , const uint64_t * ids , int count ) {
static void tgc_notify_connecting ( struct TOPO_GROUP_CONNECT * gc , const uint64_t * ids , int count ) {
size_t cl = strlen ( gc - > group - > channel_id ) ; if ( cl > 255 ) cl = 255 ;
size_t cl = strlen ( gc - > group - > channel_id ) ; if ( cl > 255 ) cl = 255 ;
size_t sz = 1 + cl + 2 + ( size_t ) count * 8 ;
size_t sz = 1 + cl + 2 + ( size_t ) count * 8 ;
@ -82,7 +89,7 @@ static void tgc_notify_connecting(struct TOPO_GROUP_CONNECT* gc, const uint64_t*
for ( int i = 0 ; i < count ; i + + ) { memcpy ( p , & ids [ i ] , 8 ) ; p + = 8 ; }
for ( int i = 0 ; i < count ; i + + ) { memcpy ( p , & ids [ i ] , 8 ) ; p + = 8 ; }
chat_event_post ( CHAT_EVT_CONNECTING_NODES , buf , ( int ) sz ) ;
chat_event_post ( CHAT_EVT_CONNECTING_NODES , buf , ( int ) sz ) ;
u_free ( buf ) ;
u_free ( buf ) ;
DEBUG_DEBUG ( DEBUG_CATEGORY_BGP , " %s: notify_connecting ch=%s count=%d " ,
DEBUG_INFO ( DEBUG_CATEGORY_BGP , " %s: notify_connecting ch=%s count=%d " ,
TGC_ID , gc - > group - > channel_id , count ) ;
TGC_ID , gc - > group - > channel_id , count ) ;
}
}
@ -90,6 +97,12 @@ static void tgc_notify_connecting(struct TOPO_GROUP_CONNECT* gc, const uint64_t*
* Ж и з н е н н ы й ц и к л
* Ж и з н е н н ы й ц и к л
* ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ */
* ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ */
/**
* З а п у с к а в т о - п о д к л ю ч е н и я к у з л а м CHAT - г р у п п ы .
* Е с л и м о д у л ь у ж е з а п у щ е н — о с т а н а в л и в а е т е г о и с т а р т у е т з а н о в о с н у л я .
* Н а ч и н а е т с Phase 1 : п а р а л л е л ь н ы е п о п ы т к и к о в с е м п и р а м , ч т о б ы л и connected
* в п р о ш л о й с е с с и и ( и з Б Д ) . Е с л и т а к и х н е т — с р а з у п е р е х о д и т к Phase 2.
*/
int topo_group_connect_init ( struct TOPO_GROUP * group ) {
int topo_group_connect_init ( struct TOPO_GROUP * group ) {
if ( ! group | | group - > group_type ! = TOPO_GROUP_TYPE_CHAT | | ! group - > channel_id [ 0 ] )
if ( ! group | | group - > group_type ! = TOPO_GROUP_TYPE_CHAT | | ! group - > channel_id [ 0 ] )
return - 1 ;
return - 1 ;
@ -125,6 +138,11 @@ int topo_group_connect_init(struct TOPO_GROUP* group) {
return 0 ;
return 0 ;
}
}
/**
* П о л н а я о с т а н о в к а а в т о - п о д к л ю ч е н и я : о т м е н я е т в с е т а й м е р ы , з а к р ы в а е т в с е
* о т к р ы т ы е с о е д и н е н и я и о с в о б о ж д а е т п а м я т ь . В ы з ы в а е т с я п р и у д а л е н и и г р у п п ы
* и п р и п е р е з а п у с к е ( init / restart ) .
*/
void topo_group_connect_destroy ( struct TOPO_GROUP * group ) {
void topo_group_connect_destroy ( struct TOPO_GROUP * group ) {
struct TOPO_GROUP_CONNECT * gc = group - > connect ;
struct TOPO_GROUP_CONNECT * gc = group - > connect ;
if ( ! gc ) return ;
if ( ! gc ) return ;
@ -132,10 +150,16 @@ void topo_group_connect_destroy(struct TOPO_GROUP* group) {
if ( gc - > phase_timer ) { uasync_cancel_timeout ( group - > instance - > ua , gc - > phase_timer ) ; gc - > phase_timer = NULL ; }
if ( gc - > phase_timer ) { uasync_cancel_timeout ( group - > instance - > ua , gc - > phase_timer ) ; gc - > phase_timer = NULL ; }
if ( gc - > pause_timer ) { uasync_cancel_timeout ( group - > instance - > ua , gc - > pause_timer ) ; gc - > pause_timer = NULL ; }
if ( gc - > pause_timer ) { uasync_cancel_timeout ( group - > instance - > ua , gc - > pause_timer ) ; gc - > pause_timer = NULL ; }
for ( int i = 0 ; i < gc - > handle_count ; i + + ) conn_mgr_close ( gc - > handles [ i ] ) ;
for ( int i = 0 ; i < gc - > handle_count ; i + + ) conn_mgr_close ( gc - > handles [ i ] ) ;
if ( gc - > cur_handle ) { conn_mgr_close ( gc - > cur_handle ) ; gc - > cur_handle = NULL ; }
u_free ( gc - > candidate_ids ) ;
u_free ( gc - > candidate_ids ) ;
u_free ( gc ) ;
u_free ( gc ) ;
}
}
/**
* В н е ш н и й п е р е з а п у с к а в т о - п о д к л ю ч е н и я ( destroy + init ) . И с п о л ь з у е т с я , н а п р и м е р ,
* п р и с м е н е с е т и , к о г д а н а д о н а ч а т ь п о и с к з а н о в о . Н е т р о г а е т м о д у л ь , е с л и у ж е
* е с т ь ж и в ы е с о е д и н е н и я .
*/
void topo_group_connect_restart ( struct TOPO_GROUP * group ) {
void topo_group_connect_restart ( struct TOPO_GROUP * group ) {
struct TOPO_GROUP_CONNECT * gc = group - > connect ;
struct TOPO_GROUP_CONNECT * gc = group - > connect ;
if ( ! gc ) { DEBUG_DEBUG ( DEBUG_CATEGORY_BGP , " %s: restart ch=%s no gc → init " , TGC_ID , group - > channel_id ) ; topo_group_connect_init ( group ) ; return ; }
if ( ! gc ) { DEBUG_DEBUG ( DEBUG_CATEGORY_BGP , " %s: restart ch=%s no gc → init " , TGC_ID , group - > channel_id ) ; topo_group_connect_init ( group ) ; return ; }
@ -145,6 +169,10 @@ void topo_group_connect_restart(struct TOPO_GROUP* group) {
topo_group_connect_init ( group ) ;
topo_group_connect_init ( group ) ;
}
}
/**
* С к о л ь к о с е й ч а с ж и в ы х с о е д и н е н и й с п и р а м и г р у п п ы . Н у ж н о в н е ш н е й л о г и к е
* ( н а п р и м е р , chat_sync ) д л я р е ш е н и я , з а п у с к а т ь л и п е р е п о д к л ю ч е н и е .
*/
int topo_group_connect_active_count ( struct TOPO_GROUP * group ) {
int topo_group_connect_active_count ( struct TOPO_GROUP * group ) {
struct TOPO_GROUP_CONNECT * gc = group - > connect ;
struct TOPO_GROUP_CONNECT * gc = group - > connect ;
return gc ? gc - > active_conn_count : 0 ;
return gc ? gc - > active_conn_count : 0 ;
@ -154,6 +182,11 @@ int topo_group_connect_active_count(struct TOPO_GROUP* group) {
* ON UP / DOWN
* ON UP / DOWN
* ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ */
* ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ */
/**
* О б р а б о т к а п о я в л е н и я с о е д и н е н и я с п и р о м . У в е л и ч и в а е т с ч ё т ч и к а к т и в н ы х и
* п о м е ч а е т connected = 1 в Б Д ( ч т о б ы п р и с л е д у ю щ е м с т а р т е у з е л п о п а л в Phase 1 ) .
* П р о п у с к а е т , е с л и п и р у ж е п о д к л ю ч ё н ч е р е з д р у г о е с о е д и н е н и е .
*/
void topo_group_connect_on_up ( struct TOPO_GROUP * group , struct ETCP_CONN * conn ) {
void topo_group_connect_on_up ( struct TOPO_GROUP * group , struct ETCP_CONN * conn ) {
if ( ! group | | group - > group_type ! = TOPO_GROUP_TYPE_CHAT | | ! group - > channel_id [ 0 ] | | ! conn ) return ;
if ( ! group | | group - > group_type ! = TOPO_GROUP_TYPE_CHAT | | ! group - > channel_id [ 0 ] | | ! conn ) return ;
uint64_t peer = conn - > peer_node_id ;
uint64_t peer = conn - > peer_node_id ;
@ -178,6 +211,11 @@ void topo_group_connect_on_up(struct TOPO_GROUP* group, struct ETCP_CONN* conn)
TGC_ID , ( unsigned long long ) peer , group - > channel_id , ( unsigned long long ) group - > group_id , gc - > active_conn_count ) ;
TGC_ID , ( unsigned long long ) peer , group - > channel_id , ( unsigned long long ) group - > group_id , gc - > active_conn_count ) ;
}
}
/**
* О б р а б о т к а о б р ы в а с о е д и н е н и я . У м е н ь ш а е т с ч ё т ч и к а к т и в н ы х и п о м е ч а е т
* connected = 0 в Б Д . Е с л и ж и в ы х с о е д и н е н и й н е о с т а л о с ь — н е м е д л е н н о
* п е р е з а п у с к а е т ц и к л п о и с к а с Phase 1.
*/
void topo_group_connect_on_down ( struct TOPO_GROUP * group , struct ETCP_CONN * conn ) {
void topo_group_connect_on_down ( struct TOPO_GROUP * group , struct ETCP_CONN * conn ) {
if ( ! group | | group - > group_type ! = TOPO_GROUP_TYPE_CHAT | | ! group - > channel_id [ 0 ] | | ! conn ) return ;
if ( ! group | | group - > group_type ! = TOPO_GROUP_TYPE_CHAT | | ! group - > channel_id [ 0 ] | | ! conn ) return ;
uint64_t peer = conn - > peer_node_id ;
uint64_t peer = conn - > peer_node_id ;
@ -224,10 +262,16 @@ void topo_group_connect_on_down(struct TOPO_GROUP* group, struct ETCP_CONN* conn
* Е д и н ы й к о л л б э к д л я в с е х ф а з
* Е д и н ы й к о л л б э к д л я в с е х ф а з
* ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ */
* ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ */
/**
* Е д и н ы й к о л л б э к н а р е з у л ь т а т к а ж д о й п о п ы т к и п о д к л ю ч е н и я ( у с п е х / т а й м а у т / о б р ы в ) .
* В Phase 1 — п р о с т о с ч и т а е т р е з у л ь т а т ы ( и т о г п о д в о д и т tgc_phase1_timeout ) .
* В Phase 2 / 3 — у с п е х з а в е р ш а е т ц и к л ; п р о в а л з а к р ы в а е т handle ( ч т о б ы н е о с т а в и т ь
* з а л и п ш е е с о с т о я н и е ) и с т а в и т п а у з у п е р е д с л е д у ю щ е й п о п ы т к о й .
*/
static void tgc_callback ( struct CONN_MGR_HANDLE * h , uint64_t node_id , uint64_t group_id ,
static void tgc_callback ( struct CONN_MGR_HANDLE * h , uint64_t node_id , uint64_t group_id ,
enum conn_mgr_event event , void * arg ) {
enum conn_mgr_event event , void * arg ) {
struct TOPO_GROUP_CONNECT * gc = ( struct TOPO_GROUP_CONNECT * ) arg ;
struct TOPO_GROUP_CONNECT * gc = ( struct TOPO_GROUP_CONNECT * ) arg ;
( void ) h ; ( void ) group_id ;
( void ) group_id ;
int ok = ( event = = CONN_EVENT_UP ) ;
int ok = ( event = = CONN_EVENT_UP ) ;
@ -253,6 +297,7 @@ static void tgc_callback(struct CONN_MGR_HANDLE* h, uint64_t node_id, uint64_t g
tgc_notify_connecting ( gc , NULL , 0 ) ;
tgc_notify_connecting ( gc , NULL , 0 ) ;
} else {
} else {
DEBUG_INFO ( DEBUG_CATEGORY_BGP , " %s: Phase2 0x%016llx FAIL — pause then try next " , TGC_ID , ( unsigned long long ) node_id ) ;
DEBUG_INFO ( DEBUG_CATEGORY_BGP , " %s: Phase2 0x%016llx FAIL — pause then try next " , TGC_ID , ( unsigned long long ) node_id ) ;
if ( gc - > cur_handle ) { conn_mgr_close ( gc - > cur_handle ) ; gc - > cur_handle = NULL ; }
tgc_start_pause ( gc , ( void ( * ) ( void * ) ) tgc_phase2_try_next , " tgc_p2_try " ) ;
tgc_start_pause ( gc , ( void ( * ) ( void * ) ) tgc_phase2_try_next , " tgc_p2_try " ) ;
}
}
break ;
break ;
@ -263,6 +308,7 @@ static void tgc_callback(struct CONN_MGR_HANDLE* h, uint64_t node_id, uint64_t g
tgc_notify_connecting ( gc , NULL , 0 ) ;
tgc_notify_connecting ( gc , NULL , 0 ) ;
} else {
} else {
DEBUG_INFO ( DEBUG_CATEGORY_BGP , " %s: Phase3 0x%016llx FAIL — pause then try next " , TGC_ID , ( unsigned long long ) node_id ) ;
DEBUG_INFO ( DEBUG_CATEGORY_BGP , " %s: Phase3 0x%016llx FAIL — pause then try next " , TGC_ID , ( unsigned long long ) node_id ) ;
if ( gc - > cur_handle ) { conn_mgr_close ( gc - > cur_handle ) ; gc - > cur_handle = NULL ; }
tgc_start_pause ( gc , ( void ( * ) ( void * ) ) tgc_phase3_try_next , " tgc_p3_try " ) ;
tgc_start_pause ( gc , ( void ( * ) ( void * ) ) tgc_phase3_try_next , " tgc_p3_try " ) ;
}
}
break ;
break ;
@ -273,6 +319,12 @@ static void tgc_callback(struct CONN_MGR_HANDLE* h, uint64_t node_id, uint64_t g
* П а у з а : 1 s ACTIVE / 30 s STANDBY
* П а у з а : 1 s ACTIVE / 30 s STANDBY
* ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ */
* ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ */
/**
* П а у з а м е ж д у п о п ы т к а м и п о д к л ю ч е н и я . Д л и т е л ь н о с т ь з а в и с и т о т а к т и в н о с т и
* п р и л о ж е н и я : 1 с е к у н д а к о г д а п р и л о ж е н и е а к т и в н о , 30 с е к у н д к о г д а в ф о н е
* ( э к р а н в ы к л ю ч е н ) . П о с л е п а у з ы в ы з ы в а е т cb ( с л е д у ю щ а я п о п ы т к а и л и п е р е з а п у с к
* ц и к л а ) . Н а в р е м я п а у з ы у в е д о м л я е т GUI п у с т ы м с п и с к о м ( ж ё л т ы е к р у ж к и г а с н у т ) .
*/
static void tgc_start_pause ( struct TOPO_GROUP_CONNECT * gc , void ( * cb ) ( void * ) , const char * label ) {
static void tgc_start_pause ( struct TOPO_GROUP_CONNECT * gc , void ( * cb ) ( void * ) , const char * label ) {
gc - > phase = TGC_PHASE_PAUSE ;
gc - > phase = TGC_PHASE_PAUSE ;
int active = ( gc - > group - > instance - > client_activity = = CLIENT_ACTIVITY_ACTIVE ) ;
int active = ( gc - > group - > instance - > client_activity = = CLIENT_ACTIVITY_ACTIVE ) ;
@ -287,6 +339,11 @@ static void tgc_start_pause(struct TOPO_GROUP_CONNECT* gc, void (*cb)(void*), co
* Phase 1 timeout
* Phase 1 timeout
* ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ */
* ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ */
/**
* Т а й м а у т п а р а л л е л ь н ы х п о п ы т о к Phase 1 ( 2 с е к у н д ы ) . З а к р ы в а е т н е у д а ч н ы е
* handles и с б р а с ы в а е т connected в Б Д . Е с л и х о т ь о д и н у з е л п о д к л ю ч и л с я —
* ц и к л з а в е р ш ё н ; и н а ч е п е р е х о д и м к Phase 2.
*/
static void tgc_phase1_timeout ( void * arg ) {
static void tgc_phase1_timeout ( void * arg ) {
struct TOPO_GROUP_CONNECT * gc = ( struct TOPO_GROUP_CONNECT * ) arg ;
struct TOPO_GROUP_CONNECT * gc = ( struct TOPO_GROUP_CONNECT * ) arg ;
gc - > phase_timer = NULL ;
gc - > phase_timer = NULL ;
@ -330,6 +387,11 @@ static void tgc_phase1_timeout(void* arg) {
* Phase 2
* Phase 2
* ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ */
* ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ */
/**
* П о с л е д о в а т е л ь н ы й п е р е б о р у з л о в с п у б л и ч н ы м и / EIM а д р е с а м и ( с н а ч а л а supernode ,
* з а т е м о б ы ч н ы е п у б л и ч н ы е ) . П р о б у е т с л е д у ю щ и й у з е л и с т а в и т е м у ж ё л т ы й к р у ж о к .
* К о г д а в с е п е р е б р а н ы — п е р е х о д и т к Phase 3.
*/
static void tgc_phase2_try_next ( struct TOPO_GROUP_CONNECT * gc ) {
static void tgc_phase2_try_next ( struct TOPO_GROUP_CONNECT * gc ) {
if ( gc - > phase = = TGC_PHASE_PAUSE ) gc - > phase = TGC_PHASE_TWO ;
if ( gc - > phase = = TGC_PHASE_PAUSE ) gc - > phase = TGC_PHASE_TWO ;
if ( gc - > phase ! = TGC_PHASE_TWO ) return ;
if ( gc - > phase ! = TGC_PHASE_TWO ) return ;
@ -358,7 +420,7 @@ static void tgc_phase2_try_next(struct TOPO_GROUP_CONNECT* gc) {
uint64_t nid = gc - > candidate_ids [ gc - > cursor + + ] ;
uint64_t nid = gc - > candidate_ids [ gc - > cursor + + ] ;
DEBUG_INFO ( DEBUG_CATEGORY_BGP , " %s: Phase2 trying 0x%016llx (%d/%d) super_round=%d " , TGC_ID ,
DEBUG_INFO ( DEBUG_CATEGORY_BGP , " %s: Phase2 trying 0x%016llx (%d/%d) super_round=%d " , TGC_ID ,
( unsigned long long ) nid , gc - > cursor , gc - > candidate_count , gc - > tried_super ) ;
( unsigned long long ) nid , gc - > cursor , gc - > candidate_count , gc - > tried_super ) ;
if ( conn_mgr_open_invite ( gc - > group - > instance , gc - > group - > group_id , NULL , nid , tgc_callback , gc , NULL ) < 0 ) continue ;
if ( conn_mgr_open_invite ( gc - > group - > instance , gc - > group - > group_id , NULL , nid , tgc_callback , gc , & gc - > cur_handle ) < 0 ) continue ;
tgc_notify_connecting ( gc , & nid , 1 ) ;
tgc_notify_connecting ( gc , & nid , 1 ) ;
return ;
return ;
}
}
@ -371,6 +433,11 @@ static void tgc_phase2_try_next(struct TOPO_GROUP_CONNECT* gc) {
* Phase 3 — л о к а л ь н ы е / strict NAT а д р е с а
* Phase 3 — л о к а л ь н ы е / strict NAT а д р е с а
* ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ */
* ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ */
/**
* П о с л е д о в а т е л ь н ы й п е р е б о р у з л о в с л о к а л ь н ы м и / strict NAT а д р е с а м и ( к а к Phase 2 ,
* н о д л я у з л о в , д о с т у п н ы х т о л ь к о в л о к а л ь н о й с е т и ) . К о г д а в с е п е р е б р а н ы —
* п а у з а и п о л н ы й п е р е з а п у с к ц и к л а с Phase 1 ( б е с к о н е ч н о , п о к а н е п о д к л ю ч и м с я ) .
*/
static void tgc_phase3_try_next ( struct TOPO_GROUP_CONNECT * gc ) {
static void tgc_phase3_try_next ( struct TOPO_GROUP_CONNECT * gc ) {
if ( gc - > phase = = TGC_PHASE_PAUSE ) gc - > phase = TGC_PHASE_THREE ;
if ( gc - > phase = = TGC_PHASE_PAUSE ) gc - > phase = TGC_PHASE_THREE ;
if ( gc - > phase ! = TGC_PHASE_THREE ) return ;
if ( gc - > phase ! = TGC_PHASE_THREE ) return ;
@ -386,7 +453,7 @@ static void tgc_phase3_try_next(struct TOPO_GROUP_CONNECT* gc) {
uint64_t nid = gc - > candidate_ids [ gc - > cursor + + ] ;
uint64_t nid = gc - > candidate_ids [ gc - > cursor + + ] ;
DEBUG_INFO ( DEBUG_CATEGORY_BGP , " %s: Phase3 trying 0x%016llx (%d/%d) " , TGC_ID ,
DEBUG_INFO ( DEBUG_CATEGORY_BGP , " %s: Phase3 trying 0x%016llx (%d/%d) " , TGC_ID ,
( unsigned long long ) nid , gc - > cursor , gc - > candidate_count ) ;
( unsigned long long ) nid , gc - > cursor , gc - > candidate_count ) ;
if ( conn_mgr_open_invite ( gc - > group - > instance , gc - > group - > group_id , NULL , nid , tgc_callback , gc , NULL ) < 0 ) continue ;
if ( conn_mgr_open_invite ( gc - > group - > instance , gc - > group - > group_id , NULL , nid , tgc_callback , gc , & gc - > cur_handle ) < 0 ) continue ;
tgc_notify_connecting ( gc , & nid , 1 ) ;
tgc_notify_connecting ( gc , & nid , 1 ) ;
return ;
return ;
}
}
@ -398,10 +465,17 @@ static void tgc_phase3_try_next(struct TOPO_GROUP_CONNECT* gc) {
* П о л н ы й п е р е з а п у с к ц и к л а с Phase 1 ( б е з destroy / init )
* П о л н ы й п е р е з а п у с к ц и к л а с Phase 1 ( б е з destroy / init )
* ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ */
* ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ */
/**
* П о л н ы й п е р е з а п у с к ц и к л а с Phase 1 б е з у н и ч т о ж е н и я м о д у л я . З а к р ы в а е т в с е
* о т к р ы т ы е с о е д и н е н и я , с б р а с ы в а е т с о с т о я н и е и з а н о в о з а п у с к а е т п а р а л л е л ь н ы е
* п о п ы т к и к о в с е м connected - п и р а м и з Б Д . В ы з ы в а е т с я п р и о б р ы в е в с е х с о е д и н е н и й
* и п о с л е и с ч е р п а н и я Phase 3.
*/
static void tgc_cycle_restart ( struct TOPO_GROUP_CONNECT * gc ) {
static void tgc_cycle_restart ( struct TOPO_GROUP_CONNECT * gc ) {
gc - > pause_timer = NULL ;
gc - > pause_timer = NULL ;
if ( gc - > phase_timer ) { uasync_cancel_timeout ( gc - > group - > instance - > ua , gc - > phase_timer ) ; gc - > phase_timer = NULL ; }
if ( gc - > phase_timer ) { uasync_cancel_timeout ( gc - > group - > instance - > ua , gc - > phase_timer ) ; gc - > phase_timer = NULL ; }
for ( int i = 0 ; i < gc - > handle_count ; i + + ) conn_mgr_close ( gc - > handles [ i ] ) ;
for ( int i = 0 ; i < gc - > handle_count ; i + + ) conn_mgr_close ( gc - > handles [ i ] ) ;
if ( gc - > cur_handle ) { conn_mgr_close ( gc - > cur_handle ) ; gc - > cur_handle = NULL ; }
gc - > handle_count = 0 ; gc - > pending = 0 ; gc - > connected_count = 0 ;
gc - > handle_count = 0 ; gc - > pending = 0 ; gc - > connected_count = 0 ;
gc - > cursor = 0 ; gc - > tried_super = 0 ;
gc - > cursor = 0 ; gc - > tried_super = 0 ;
u_free ( gc - > candidate_ids ) ; gc - > candidate_ids = NULL ; gc - > candidate_count = 0 ;
u_free ( gc - > candidate_ids ) ; gc - > candidate_ids = NULL ; gc - > candidate_count = 0 ;