@ -280,6 +280,151 @@ void route_node_dump_all(struct ROUTE_BGP* bgp) {
}
}
int route_node_format_all ( struct ROUTE_BGP * bgp , char * buf , size_t buf_size ) {
if ( ! bgp | | ! bgp - > nodes | | ! buf | | buf_size = = 0 ) return 0 ;
int pos = 0 ;
pos + = snprintf ( buf + pos , buf_size > ( size_t ) pos ? buf_size - pos : 0 ,
" === BGP Nodes dump: %d nodes === \n " , queue_entry_count ( bgp - > nodes ) ) ;
int idx = 0 ;
struct ll_entry * e = bgp - > nodes - > head ;
while ( e & & ( size_t ) pos < buf_size ) {
struct NODEINFO_Q * nq = ( struct NODEINFO_Q * ) e ;
struct NODEINFO * ni = & nq - > node ;
int is_local = ( bgp - > local_node = = nq ) ;
const char * name_s = ( ni - > node_name_len > 0 ) ? ( const char * ) ( ( const uint8_t * ) ni + sizeof ( struct NODEINFO ) ) : " " ;
pos + = snprintf ( buf + pos , buf_size > ( size_t ) pos ? buf_size - pos : 0 ,
" --- Node #%d: id=%016llx name= \" %.*s \" ver=%u dirty=%u alien=%u%s --- \n " ,
idx , ( unsigned long long ) ni - > node_id , ni - > node_name_len , name_s ,
ni - > ver , nq - > dirty , nq - > alien , is_local ? " [LOCAL] " : " " ) ;
if ( nq - > best_socket )
pos + = snprintf ( buf + pos , buf_size > ( size_t ) pos ? buf_size - pos : 0 ,
" best_socket=%p \n " , ( void * ) nq - > best_socket ) ;
pos + = snprintf ( buf + pos , buf_size > ( size_t ) pos ? buf_size - pos : 0 , " pubkey: " ) ;
for ( int k = 0 ; k < SC_PUBKEY_SIZE ; k + + )
pos + = snprintf ( buf + pos , buf_size > ( size_t ) pos ? buf_size - pos : 0 , " %02x " , ni - > public_key [ k ] ) ;
pos + = snprintf ( buf + pos , buf_size > ( size_t ) pos ? buf_size - pos : 0 , " \n " ) ;
pos + = snprintf ( buf + pos , buf_size > ( size_t ) pos ? buf_size - pos : 0 , " ed25519: " ) ;
for ( int k = 0 ; k < SC_PUBKEY_SIZE ; k + + )
pos + = snprintf ( buf + pos , buf_size > ( size_t ) pos ? buf_size - pos : 0 , " %02x " , ni - > ed25519_public_key [ k ] ) ;
pos + = snprintf ( buf + pos , buf_size > ( size_t ) pos ? buf_size - pos : 0 , " \n " ) ;
# define FMT_ADD(fmt, ...) \
pos + = snprintf ( buf + pos , buf_size > ( size_t ) pos ? buf_size - pos : 0 , fmt , # # __VA_ARGS__ )
const struct NODEINFO_IPV4_SOCKET_META * v4sm ;
int v4sm_cnt = get_node_v4_sockets_meta ( nq , & v4sm ) ;
for ( int i = 0 ; i < v4sm_cnt ; i + + )
FMT_ADD ( " v4sock[%d]: id=%u type=%u \n " , i , v4sm [ i ] . id , v4sm [ i ] . type ) ;
const struct NODEINFO_IPV4_ADDR * v4a ;
int v4a_cnt = get_node_v4_addrs ( nq , & v4a ) ;
if ( v4a_cnt > 0 ) {
const char * atn [ ] = { " INTERFACE " , " NAT " , " REAL " } ;
for ( int i = 0 ; i < v4a_cnt ; i + + )
FMT_ADD ( " v4addr[%d]: %s:%u %s sock=%u \n " ,
i , ip_to_str ( v4a [ i ] . addr , AF_INET ) . str , v4a [ i ] . port ,
( v4a [ i ] . type < = 2 ) ? atn [ v4a [ i ] . type ] : " ? " , v4a [ i ] . socket_id ) ;
}
const struct NODEINFO_IPV6_SOCKET_META * v6sm ;
int v6sm_cnt = get_node_v6_sockets_meta ( nq , & v6sm ) ;
for ( int i = 0 ; i < v6sm_cnt ; i + + )
FMT_ADD ( " v6sock[%d]: id=%u type=%u \n " , i , v6sm [ i ] . id , v6sm [ i ] . type ) ;
const struct NODEINFO_IPV6_ADDR * v6a ;
int v6a_cnt = get_node_v6_addrs ( nq , & v6a ) ;
for ( int i = 0 ; i < v6a_cnt ; i + + )
FMT_ADD ( " v6addr[%d]: %s:%u type=%u sock=%u \n " ,
i , ip_to_str ( v6a [ i ] . addr , AF_INET6 ) . str , v6a [ i ] . port ,
v6a [ i ] . type , v6a [ i ] . socket_id ) ;
const struct NODEINFO_IPV4_SUBNET * sub4 ;
int sub4_cnt = get_node_routes ( nq , & sub4 ) ;
for ( int i = 0 ; i < sub4_cnt ; i + + )
FMT_ADD ( " v4sub[%d]: %s/%d \n " , i ,
ip_to_str ( sub4 [ i ] . addr , AF_INET ) . str , sub4 [ i ] . prefix_length ) ;
const struct NODEINFO_IPV6_SUBNET * sub6 ;
int sub6_cnt = get_node_v6_routes ( nq , & sub6 ) ;
for ( int i = 0 ; i < sub6_cnt ; i + + )
FMT_ADD ( " v6sub[%d]: %s/%d \n " , i ,
ip_to_str ( sub6 [ i ] . addr , AF_INET6 ) . str , sub6 [ i ] . prefix_length ) ;
if ( ni - > tranzit_nodes > 0 ) {
const uint8_t * dyn = node_dyn_start ( ni ) ;
dyn = skip_name ( dyn , ni - > node_name_len ) ;
dyn = skip_v4_sockets_meta ( dyn , ni - > local_v4_sockets ) ;
dyn = skip_v4_addrs ( dyn , ni - > local_v4_addrs ) ;
dyn = skip_v6_sockets_meta ( dyn , ni - > local_v6_sockets ) ;
dyn = skip_v6_addrs ( dyn , ni - > local_v6_addrs ) ;
dyn = skip_v4_subnets ( dyn , ni - > local_v4_subnets ) ;
dyn + = ni - > local_v6_subnets * sizeof ( struct NODEINFO_IPV6_SUBNET ) ;
const struct NODEINFO_TRANZIT_NODE * tr = ( const struct NODEINFO_TRANZIT_NODE * ) dyn ;
for ( uint8_t i = 0 ; i < ni - > tranzit_nodes ; i + + )
FMT_ADD ( " tranzit[%d]: node=%016llx rtt=%u linkq=%u \n " ,
i , ( unsigned long long ) tr [ i ] . node_id , tr [ i ] . rtt , tr [ i ] . link_q ) ;
}
if ( nq - > paths ) {
int path_idx = 0 ;
struct ll_entry * pe = nq - > paths - > head ;
while ( pe ) {
struct NODEINFO_PATH * path = ( struct NODEINFO_PATH * ) pe ;
uint64_t * hop = ( uint64_t * ) ( ( uint8_t * ) path + sizeof ( struct NODEINFO_PATH ) ) ;
pos + = snprintf ( buf + pos , buf_size > ( size_t ) pos ? buf_size - pos : 0 ,
" path[%d]: conn=%s hop_count=%u hops=[ " ,
path_idx , path - > conn ? path - > conn - > log_name : " NULL " , path - > hop_count ) ;
for ( uint8_t hi = 0 ; hi < path - > hop_count ; hi + + )
pos + = snprintf ( buf + pos , buf_size > ( size_t ) pos ? buf_size - pos : 0 ,
" %s%016llx " , hi ? " -> " : " " , ( unsigned long long ) hop [ hi ] ) ;
pos + = snprintf ( buf + pos , buf_size > ( size_t ) pos ? buf_size - pos : 0 , " ] \n " ) ;
path_idx + + ;
pe = pe - > next ;
}
}
struct NODE_CONNECTIVITY * c = & nq - > connectivity ;
if ( is_node_connectivity_active ( c ) ) {
FMT_ADD ( " connectivity: probe=%s iface=%s(%u) nat=%s(%u) real=%s(%u) pend=%u iface_rtt=%u nat_rtt=%u real_rtt=%u start_tb=%llu ping_req_tb=%llu \n " ,
probe_status_str ( c - > probe_status ) ,
probe_result_str ( c - > interface_status ) , c - > interface_min_rtt ,
probe_result_str ( c - > nat_status ) , c - > nat_min_rtt ,
probe_result_str ( c - > real_status ) , c - > real_min_rtt ,
c - > pending_count , c - > interface_min_rtt , c - > nat_min_rtt , c - > real_min_rtt ,
( unsigned long long ) c - > probe_start_time , ( unsigned long long ) c - > ping_req_time ) ;
}
if ( nq - > conn_mgr_type ! = CONN_TYPE_NONE ) {
pos + = snprintf ( buf + pos , buf_size > ( size_t ) pos ? buf_size - pos : 0 ,
" conn_mgr: type=%s intermediates=[ " ,
conn_mgr_type_str ( nq - > conn_mgr_type ) ) ;
for ( uint8_t i = 0 ; i < nq - > conn_mgr_intermediariy_count ; i + + )
pos + = snprintf ( buf + pos , buf_size > ( size_t ) pos ? buf_size - pos : 0 ,
" %s%016llx " , i ? " , " : " " ,
( unsigned long long ) nq - > conn_mgr_intermediaries [ i ] ) ;
pos + = snprintf ( buf + pos , buf_size > ( size_t ) pos ? buf_size - pos : 0 , " ] \n " ) ;
}
# undef FMT_ADD
e = e - > next ;
idx + + ;
}
if ( ( size_t ) pos > = buf_size ) {
pos = ( int ) buf_size - 14 ;
if ( pos < 0 ) pos = 0 ;
pos + = snprintf ( buf + pos , buf_size - pos , " \n [TRUNCATED] \n " ) ;
}
return pos ;
}
int route_bgp_update_my_nodeinfo ( struct UTUN_INSTANCE * instance , struct ROUTE_BGP * bgp ) {
if ( ! instance | | ! bgp ) {
DEBUG_ERROR ( DEBUG_CATEGORY_BGP , " route_bgp_update_my_nodeinfo: invalid args " ) ;