From 0a00bd1c90d362db87f77942ac109d6bbffac7df Mon Sep 17 00:00:00 2001 From: evgeny Date: Thu, 22 Oct 2026 22:53:30 +0200 Subject: [PATCH] Clarify readiness contracts and stop on corrupt accounting --- src/transport_layer/etcp.c | 15 ++------------- src/transport_layer/etcp_loadbalancer.h | 6 +++--- 2 files changed, 5 insertions(+), 16 deletions(-) diff --git a/src/transport_layer/etcp.c b/src/transport_layer/etcp.c index 97c29cc9..6ce4e7d2 100644 --- a/src/transport_layer/etcp.c +++ b/src/transport_layer/etcp.c @@ -46,7 +46,6 @@ static void input_queue_cb(struct ll_queue* q, void* arg); static void etcp_link_ready_callback(struct ETCP_CONN* etcp); static void input_send_q_cb(struct ll_queue* q, void* arg); static void wait_ack_cb(struct ll_queue* q, void* arg); -static void send_ack_req_cb(struct ll_queue* q, void* arg); static void etcp_conn_process_send_queue(struct ETCP_CONN* etcp); static void etcp_send_timer_cb(void* arg); static void etcp_connection_free_deferred(void* arg); @@ -94,7 +93,7 @@ static void etcp_inflight_release(struct INFLIGHT_PACKET* pkt) { if (link->inflight_bytes < pkt->ll.len || !link->inflight_packets) { DEBUG_ERROR(DEBUG_CATEGORY_ETCP, "[%s] inflight accounting mismatch link=%u seq=%u bytes=%u packets=%u len=%u", link->etcp->log_name, link->local_link_id, pkt->seq, link->inflight_bytes, link->inflight_packets, pkt->ll.len); - return; + abort(); // Повреждённый учёт нельзя продолжать с обёрнутыми/неверными счётчиками. } link->inflight_bytes -= pkt->ll.len; link->inflight_packets--; @@ -973,7 +972,7 @@ static void input_queue_try_resume(struct ETCP_CONN* etcp) {// при ACK } // Called from link-level etcp_link_update_inflight_lim() after inflight_lim_bytes changes. -// Recalculates connection-level optimal_inflight and resumes input_queue if room opened up. +// Recalculates connection-level optimal_inflight and requests one sender pass without changing UP/DOWN. void etcp_conn_on_inflight_lim_changed(struct ETCP_CONN* etcp) { if (!etcp || etcp->state == 2) return; uint64_t sum = 0; @@ -1162,16 +1161,6 @@ static void input_send_q_cb(struct ll_queue* q, void* arg) {// etcp->input_send_ (void)q; etcp_conn_wake_sender(arg); } -/* -static void send_ack_req_cb(struct ll_queue* q, void* arg) {// etcp->ack_q data ready - DEBUG_TRACE(DEBUG_CATEGORY_ETCP, ""); - struct ETCP_CONN* etcp=(struct ETCP_CONN*)arg; - DEBUG_DEBUG(DEBUG_CATEGORY_ETCP, "[%s] processing", etcp->log_name); - - etcp_conn_process_send_queue(etcp); - if (etcp->tx_state==ETCP_TX_STATE_DATA_WAIT) queue_resume_callback(etcp->ack_q); - } -*/ void etcp_on_link_down(struct ETCP_CONN* etcp, struct ETCP_LINK* down_link) { DEBUG_TRACE(DEBUG_CATEGORY_ETCP, ""); if (!etcp || etcp->state == 2) return; diff --git a/src/transport_layer/etcp_loadbalancer.h b/src/transport_layer/etcp_loadbalancer.h index c093908e..9f4855f1 100644 --- a/src/transport_layer/etcp_loadbalancer.h +++ b/src/transport_layer/etcp_loadbalancer.h @@ -25,13 +25,13 @@ struct ETCP_LINK* etcp_loadbalancer_select_link(struct ETCP_CONN* etcp, uint32_t // Передать dgram с установленным link: после отправки (включая ошибку сокета) возвращает dgram в pkt_pool. void etcp_loadbalancer_send(struct ETCP_DGRAM* dgram); -// сообщаем в loadbalancer о готовности линка (вызывается из таймера, ACK, изменения лимита) +// Готовность физического линка/его shaper; для ACK/изменения окна использовать etcp_conn_wake_sender. void loadbalancer_link_ready(struct ETCP_LINK* link); -// Проверяет готовность shaper (burst разрешён); cwnd/inflight учитывает select_link отдельно. +// 1 — shaper готов или активен burst, 0 — NULL/ожидание таймера; физический статус и cwnd проверяет select_link. int loadbalancer_link_can_send(struct ETCP_LINK* link); -// Получить состояние связи ETCP: 1 - есть живой линк, 0 - все недоступны +// 1 — хотя бы один link_status=UP; 0 — NULL conn, нет линков или все DOWN. Готовность сессии не проверяется. int etcp_loadbalancer_get_link_status(struct ETCP_CONN* etcp); #ifdef __cplusplus