diff --git a/src/transport_layer/etcp.h b/src/transport_layer/etcp.h index 82eb2e02..3daaf683 100644 --- a/src/transport_layer/etcp.h +++ b/src/transport_layer/etcp.h @@ -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); diff --git a/src/transport_layer/etcp_connections.h b/src/transport_layer/etcp_connections.h index 0fa187f3..310776f2 100644 --- a/src/transport_layer/etcp_connections.h +++ b/src/transport_layer/etcp_connections.h @@ -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;