Define per-link accounting and deferred sender contracts

This commit is contained in:
evgeny committed 2026-10-22 22:26:51 +02:00
1 parent 036cf43918
commit 50d5486a9f
2 files changed
+13 -6

No files matched your search

+9 -3
View File
@@ -73,11 +73,11 @@ uint16_t get_current_timestamp(void);
struct INFLIGHT_PACKET {// выделяется из etcp->inflight_pool
struct ll_entry ll;
uint32_t seq; // packet seq (ID по документации)
struct ETCP_LINK* last_link; // Last sent link
struct ETCP_LINK* last_link; // Последний линк попытки; занимает его окно только в WAIT_ACK
uint64_t last_timestamp; // Last send timestamp
uint8_t send_count; // Number of sends
uint8_t retrans_req_count; // Number of retrans requests
uint8_t state; // WAIT_ACK or WAIT_SEND
uint8_t state; // WAIT_ACK занимает окно last_link; WAIT_SEND ожидает первую/повторную отправку
uint8_t send_hist[8]; // через какие каналы передавался пакет (NEW). send_count - head ptr
uint64_t delivered_at_send; // link->delivered_bytes на момент отправки (для BBR prior_delivered)
uint32_t inflight_at_send; // link->inflight_bytes на момент отправки (для BBR tx_in_flight)
@@ -150,6 +150,8 @@ struct ETCP_CONN {
struct ll_queue* recv_q; // очередь на сборку фрагментированных пакетов(rx_pool -> struct ETCP_FRAGMENT) + index [+0 SEQ]
void (*link_ready_for_send_fn)(struct ETCP_CONN*);// функцию которую должен вызвать драйвер линка при готовности линка принимать данные
void* tx_timer; // единственный отложенный запуск отправителя, включая retry после OOM
uint8_t tx_running; // объединяет пробуждения внутри прохода, запрещает рекурсивную отправку
struct ll_queue* output_queue; // Assembled outgoing packets (storage: ETCP_FRAGMENT / rx_pool)
struct ll_queue* transit_queues; // ожидающий транзит, ключ (group_id:8, src_node_id:8, dst_node_id:8)
@@ -210,7 +212,7 @@ struct ETCP_CONN {
void* session_timer; // таймер согласования транспортной сессии
uint8_t session_required; // только подтверждение challenge может завершить локальный reset
uint64_t session_data_errors; // отвергнутые заголовки DATA; ограничивает повторяющиеся сообщения об ошибке
uint8_t tx_state; // 0 - n/a, 1 - data_wait (queues empty), 2 - link_wait (link busy)
uint8_t tx_state; // 0 — не запускался; DATA_WAIT — нет работы; LINK_WAIT — ожидает ресурс/сессию
uint8_t links_up; // 0 - канал не готов для передачи, 1 - канал готов для передачи (хотя бы один линк не down)
uint8_t reset_done; // 0 - рукопожатие не завершено (реинит разрешён), 1 - соединение стабильно (реинит заблокирован)
int callbacks_running; // счётчик вложенности колбэк-цепочек (>0 — внутри цепочки, etcp_connection_close откладывается)
@@ -320,6 +322,10 @@ int etcp_int_send(struct ETCP_CONN* etcp, const void* data, uint16_t len);
// Request next packet for load balancer
struct ETCP_DGRAM* etcp_request_pkt(struct ETCP_CONN* etcp);
/* Запросить один отложенный проход отправителя; не меняет UP/DOWN. Все вызовы — в uasync.
* Используется очередями, ACK/RTO, изменением окна и подтверждением сессии. close/reset отменяет запуск. */
void etcp_conn_wake_sender(struct ETCP_CONN* conn);
// Process ACK receipt - remove acknowledged packet from inflight queues
void etcp_ack_recv(struct ETCP_CONN* etcp, uint32_t seq, uint16_t ts, uint16_t dts);
+4 -3
View File
@@ -245,9 +245,10 @@ struct ETCP_LINK {
uint8_t shaper_state;
void* shaper_timer;
uint32_t inflight_bytes;
uint32_t inflight_packets;
uint32_t inflight_lim_bytes;
uint32_t inflight_bytes; // байты WAIT_ACK с last_link == этому линку; WAIT_SEND окно не занимает
uint32_t inflight_packets; // число таких пакетов
uint32_t inflight_lim_bytes; // индивидуальный лимит DATA в байтах, включая целиком следующий фрагмент
uint8_t cwnd_limited; // DATA не поместился в окно; сохраняется до передачи этого факта BBR по ACK
// statistics
size_t encrypt_errors;