1
This commit is contained in:
1 parent
b5e545be6d
commit
8880db0ca2
9 files changed
+387
-130
No files matched your search
@@ -797,6 +797,16 @@ static void send_metrics(struct control_server* server, struct control_client* c
|
||||
rsp->etcp.norm_out_total_pkts = 0;
|
||||
rsp->etcp.norm_out_total_bytes = 0;
|
||||
}
|
||||
|
||||
/* ACK debug counters */
|
||||
rsp->etcp.cnt_ack_hit_inf = conn->cnt_ack_hit_inf;
|
||||
rsp->etcp.cnt_ack_hit_sndq = conn->cnt_ack_hit_sndq;
|
||||
rsp->etcp.cnt_ack_miss = conn->cnt_ack_miss;
|
||||
rsp->etcp.cnt_link_wait = conn->cnt_link_wait;
|
||||
rsp->etcp.tx_state = conn->tx_state;
|
||||
for (int i = 0; i < 8; i++) {
|
||||
rsp->etcp.debug[i] = conn->debug[i];
|
||||
}
|
||||
|
||||
/* Fill TUN metrics */
|
||||
if (instance->tun) {
|
||||
|
||||
+27
-7
@@ -391,7 +391,18 @@ int etcp_int_send(struct ETCP_CONN* etcp, const void* data, uint16_t len) {
|
||||
|
||||
|
||||
|
||||
static void input_queue_try_resume(struct ETCP_CONN* etcp) {
|
||||
static void input_queue_try_push(struct ETCP_CONN* etcp) {// пробуем протолкнуть при отправке
|
||||
DEBUG_TRACE(DEBUG_CATEGORY_ETCP, "");
|
||||
|
||||
// когда очередь отправки пуста - пробуем взять новый пакет на обработку
|
||||
size_t wait_ack_bytes = queue_total_bytes(etcp->input_wait_ack);
|
||||
if (wait_ack_bytes <= etcp->optimal_inflight) {
|
||||
DEBUG_DEBUG(DEBUG_CATEGORY_ETCP, "[%s] resume input queue: inflight_bytes=%d, input_len=%d", etcp->log_name, wait_ack_bytes, etcp->input_queue->total_bytes);
|
||||
queue_resume_callback(etcp->input_queue);// и только когда больше нечего отправлять - забираем новый пакет
|
||||
}
|
||||
}
|
||||
|
||||
static void input_queue_try_resume(struct ETCP_CONN* etcp) {// при ACK
|
||||
DEBUG_TRACE(DEBUG_CATEGORY_ETCP, "");
|
||||
|
||||
// Сперва отправим всё из очереди отправки
|
||||
@@ -590,6 +601,8 @@ struct ETCP_DGRAM* etcp_request_pkt(struct ETCP_CONN* etcp) {
|
||||
DEBUG_TRACE(DEBUG_CATEGORY_ETCP, "");
|
||||
struct ETCP_LINK* link = etcp_loadbalancer_select_link(etcp);
|
||||
if (!link) {
|
||||
etcp->tx_state=ETCP_TX_STATE_WAIT_LINKS;
|
||||
etcp->cnt_link_wait++;
|
||||
DEBUG_DEBUG(DEBUG_CATEGORY_ETCP, "[%s] no link available", etcp->log_name);
|
||||
return NULL;// если линков нет - ждём появления свободного
|
||||
}
|
||||
@@ -598,8 +611,7 @@ struct ETCP_DGRAM* etcp_request_pkt(struct ETCP_CONN* etcp) {
|
||||
|
||||
if (send_q_size == 0) {// сгребаем из input_queue
|
||||
// DEBUG_DEBUG(DEBUG_CATEGORY_ETCP, "etcp_request_pkt: input_send_q empty, check if avail input_queue -> inflight");
|
||||
input_queue_try_resume(etcp);
|
||||
return NULL;
|
||||
input_queue_try_push(etcp);
|
||||
}
|
||||
|
||||
// First, check if there's a packet in input_send_q (retrans or new)
|
||||
@@ -618,12 +630,14 @@ struct ETCP_DGRAM* etcp_request_pkt(struct ETCP_CONN* etcp) {
|
||||
|
||||
if (!inf_pkt && ack_q_size == 0) {
|
||||
DEBUG_DEBUG(DEBUG_CATEGORY_ETCP, "[%s] no data/ack to send", etcp->log_name);
|
||||
etcp->tx_state=ETCP_TX_STATE_NO_DATA;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct ETCP_DGRAM* dgram = memory_pool_alloc(etcp->instance->pkt_pool);
|
||||
if (!dgram) {
|
||||
DEBUG_ERROR(DEBUG_CATEGORY_ETCP, "[%s] failed to allocate ETCP_DGRAM", etcp->log_name);
|
||||
etcp->tx_state=ETCP_TX_STATE_ERR_MEM;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -724,7 +738,8 @@ static void etcp_link_ready_callback(struct ETCP_CONN* etcp) {
|
||||
DEBUG_TRACE(DEBUG_CATEGORY_ETCP, "");
|
||||
if (!etcp) return;
|
||||
// DEBUG_DEBUG(DEBUG_CATEGORY_ETCP, "etcp_link_ready_callback: processing send queue for etcp=%p", etcp);
|
||||
etcp_conn_process_send_queue(etcp);
|
||||
queue_resume_callback(etcp->input_send_q);
|
||||
// etcp_conn_process_send_queue(etcp);
|
||||
}
|
||||
|
||||
// Process packets in send queue and transmit them
|
||||
@@ -806,11 +821,16 @@ void etcp_ack_recv(struct ETCP_CONN* etcp, uint32_t seq, uint16_t ts, uint16_t d
|
||||
// DEBUG_DEBUG(DEBUG_CATEGORY_ETCP, "[%s] processing ACK for seq=%u, ts=%u, dts=%u", etcp->log_name, seq, ts, dts);
|
||||
|
||||
// Find the acknowledged packet in the wait_ack queue
|
||||
struct INFLIGHT_PACKET* acked_pkt = (struct INFLIGHT_PACKET*)queue_find_data_by_id(etcp->input_wait_ack, seq);
|
||||
if (acked_pkt) queue_remove_data(etcp->input_wait_ack, (struct ll_entry*)acked_pkt);
|
||||
else { acked_pkt = (struct INFLIGHT_PACKET*)queue_find_data_by_id(etcp->input_send_q, seq);
|
||||
struct INFLIGHT_PACKET* acked_pkt;
|
||||
if (acked_pkt = (struct INFLIGHT_PACKET*)queue_find_data_by_id(etcp->input_wait_ack, seq)) {
|
||||
etcp->cnt_ack_hit_inf++;
|
||||
queue_remove_data(etcp->input_wait_ack, (struct ll_entry*)acked_pkt);
|
||||
}
|
||||
else if ( acked_pkt = (struct INFLIGHT_PACKET*)queue_find_data_by_id(etcp->input_send_q, seq) ) {
|
||||
etcp->cnt_ack_hit_sndq++;
|
||||
queue_remove_data(etcp->input_send_q, (struct ll_entry*)acked_pkt);
|
||||
}
|
||||
else etcp->cnt_ack_miss++;
|
||||
|
||||
if (!acked_pkt) {
|
||||
// Packet might be already acknowledged or not found
|
||||
|
||||
+12
-1
@@ -62,6 +62,10 @@ struct ACK_PACKET {
|
||||
uint32_t recv_timestamp;// время приема (локальное)
|
||||
};
|
||||
|
||||
#define ETCP_TX_STATE_WAIT_LINKS 1
|
||||
#define ETCP_TX_STATE_NO_DATA 2
|
||||
#define ETCP_TX_STATE_ERR_MEM 100
|
||||
|
||||
// ETCP connection structure (refactored)
|
||||
struct ETCP_CONN {
|
||||
struct ETCP_CONN* next;
|
||||
@@ -98,7 +102,6 @@ struct ETCP_CONN {
|
||||
|
||||
|
||||
// IDs and state
|
||||
uint8_t got_initial_pkt; //
|
||||
uint32_t next_tx_id; // Next TX ID
|
||||
uint32_t last_rx_id; // Last received ID
|
||||
uint32_t last_delivered_id; // Last delivered to output_queue
|
||||
@@ -141,6 +144,14 @@ struct ETCP_CONN {
|
||||
|
||||
// Flags
|
||||
uint8_t routing_exchange_active; // 0 - не активен, 1 - надо инициировать обмен маршрутами (клиент), 2 - обмен маршрутами активен
|
||||
uint8_t got_initial_pkt; //
|
||||
|
||||
uint32_t cnt_ack_hit_inf; // счетчик удлений из inflight
|
||||
uint32_t cnt_ack_hit_sndq; // счетчик удалений inflight пакетов из sndq
|
||||
uint32_t cnt_ack_miss; // счетчик не найденных ack
|
||||
uint32_t cnt_link_wait; // счетчик переходов в ожидание когда link busy
|
||||
uint32_t tx_state; // 1 - wait link ready, 2
|
||||
uint32_t debug[8]; // 8 значений для дебага (live watch)
|
||||
|
||||
// Logging identifier (format: "XXXX→XXXX" - last 4 digits of local and peer node_id)
|
||||
char log_name[16];
|
||||
|
||||
Reference in new issue
Block a user