Send ACK independently of the local outgoing DATA congestion pacer

This commit is contained in:
evgeny committed 2026-10-23 00:03:29 +02:00
1 parent 4cfd0ec89f
commit 3c38072b9b
2 files changed
+7 -4

No files matched your search

+4 -2
View File
@@ -29,7 +29,7 @@ struct ETCP_LINK* etcp_loadbalancer_select_link(struct ETCP_CONN* etcp, uint32_t
int full = data_len && (data_len > link->inflight_lim_bytes ||
link->inflight_bytes > link->inflight_lim_bytes - data_len);
if (full) link->cwnd_limited = 1;
else if (loadbalancer_link_can_send(link) && (!best || link->inflight_bytes < best->inflight_bytes)) best = link;
else if ((!data_len || loadbalancer_link_can_send(link)) && (!best || link->inflight_bytes < best->inflight_bytes)) best = link;
}
link = link->next ? link->next : etcp->links;
} while (link != start);
@@ -67,7 +67,9 @@ void etcp_loadbalancer_send(struct ETCP_DGRAM* dgram) {
}
// Update shaper after successful send
if (link->burst_active) {
if (!dgram->payload_len) {
DEBUG_TRACE(DEBUG_CATEGORY_ETCP, "[%s] ACK/control bypasses DATA pacer link=%u", etcp->log_name, link->local_link_id);
} else if (link->burst_active) {
// burst bypasses shaper — не обновляем нагрузку
} else if (link->bandwidth == 0) {
DEBUG_TRACE(DEBUG_CATEGORY_ETCP, "[%s] unlimited bandwidth, skipping shaper update", etcp->log_name);
+3 -2
View File
@@ -18,8 +18,9 @@ extern "C" {
#define SHAPER_BURST_DELAY_TB 10ULL // 10 = 1ms burst allowance
/* Заимствованный рабочий линк с минимальным inflight, round-robin при равенстве; NULL — нет подходящего.
* data_len > 0 требует места для целого DATA, 0 выбирает линк для ACK без проверки cwnd.
* Оба режима учитывают shaper; burst обходит только pacing, индивидуальное окно DATA сохраняется. */
* data_len > 0 требует места для целого DATA и готовности shaper; 0 выбирает ACK без DATA-cwnd/pacing.
* ACK уже ограничен входящим потоком/ACK_DELAY; исходящая оценка DATA не описывает полосу обратных подтверждений.
* Burst обходит только pacing, индивидуальное окно DATA сохраняется. */
struct ETCP_LINK* etcp_loadbalancer_select_link(struct ETCP_CONN* etcp, uint32_t data_len);
// Передать dgram с установленным link: после отправки (включая ошибку сокета) возвращает dgram в pkt_pool.