diff --git a/src/routing_layer/route_ping.c b/src/routing_layer/route_ping.c index 2b20f83b..dad1e81c 100644 --- a/src/routing_layer/route_ping.c +++ b/src/routing_layer/route_ping.c @@ -80,6 +80,7 @@ void route_ping_handle_resp(struct NAT_DETECTION* nd, struct ETCP_CONN* from_con DEBUG_INFO(DEBUG_CATEGORY_BGP, "from=%s request_id=%08x sent=%u ok=%u avg_rtt=%u", from_conn->log_name, (unsigned)resp->request_id, (unsigned)resp->count_sent, (unsigned)resp->count_ok, (unsigned)resp->avg_rtt); + topo_node_ping_update_rtt(nd->inst->topo_groups, from_conn->peer_node_id, resp->avg_rtt); struct route_ping_pending** cur = &nd->ping_pending; while (*cur) { diff --git a/src/transport_layer/etcp.c b/src/transport_layer/etcp.c index b7bcdadd..c55059bb 100644 --- a/src/transport_layer/etcp.c +++ b/src/transport_layer/etcp.c @@ -441,6 +441,7 @@ void etcp_conn_reset(struct ETCP_CONN* etcp) { etcp->rtt_avg_10 = 0; etcp->rtt_avg_100 = 0; etcp->jitter = 0; + etcp->last_rtt_cb_time = 0; etcp->bytes_sent_total = 0; etcp->retransmissions_count = 0; etcp->ack_packets_count = 0; @@ -1545,6 +1546,13 @@ void etcp_conn_input(struct ETCP_DGRAM* pkt) { etcp->rtt_avg_10=rtt_max; etcp->tt_last=tt_sum/cnt; etcp->jitter=j_sum/cnt; + if (etcp->rtt_last) { + uint64_t now_tb = get_time_tb(); + if (now_tb - etcp->last_rtt_cb_time > RTT_CB_PERIOD_TB) { + topo_node_ping_update_rtt(etcp->instance->topo_groups, etcp->peer_node_id, etcp->rtt_last); + etcp->last_rtt_cb_time = now_tb; + } + } break; } case ETCP_SECTION_PAYLOAD: { diff --git a/src/transport_layer/etcp.h b/src/transport_layer/etcp.h index 6e9faae0..cda281c1 100644 --- a/src/transport_layer/etcp.h +++ b/src/transport_layer/etcp.h @@ -199,6 +199,7 @@ struct ETCP_CONN { uint16_t rtt_avg_10; uint16_t rtt_avg_100; uint16_t jitter; + uint64_t last_rtt_cb_time; // время последнего вызова ping_update_rtt (0.1ms) uint32_t bytes_sent_total; // uint32_t bytes_received_total; // Not used uint32_t retransmissions_count; @@ -258,6 +259,8 @@ struct ETCP_CONN { char* name; // Connection name from config (e.g., "client_test1"), or NULL/empty }; +#define RTT_CB_PERIOD_TB 600000 // 1 минута в 0.1ms + // Functions struct ETCP_CONN* etcp_connection_create(struct UTUN_INSTANCE* instance, char* name); void etcp_connection_close(struct ETCP_CONN* etcp);