Browse Source

etcp: фикс зависшего reinit_pending после реинита готового соединения

etcp_conn_queue_set_ready() делает ранний выход по state!=0, поэтому при
реините уже готового соединения (peer restart / duplicate INIT / collision)
reinit_pending оставался в 1 навсегда. Добавленные в 841b3042 guard'ы
etcp_conn_input/etcp_output_try_assembly дропали все входящие пакеты.

Снятие reinit_pending + REINIT перенесено в etcp_conn_ready.
proxy
evgeny 2 weeks ago
parent
commit
688785fc6e
  1. 8
      src/transport_layer/etcp.c

8
src/transport_layer/etcp.c

@ -668,6 +668,14 @@ void etcp_conn_ready(struct ETCP_CONN* conn) {
DEBUG_INFO(DEBUG_CATEGORY_ETCP, "[%s] Connection ready", conn->log_name);
etcp_conn_queue_set_ready(conn);
// Реинит уже готового соединения (state!=0): etcp_conn_queue_set_ready не сработал
// (ранний выход по state!=0), поэтому reinit_pending остаётся висеть и блокирует приём —
// guard'ы в etcp_conn_input/etcp_output_try_assembly дропают все входящие пакеты.
if (conn->reinit_pending) {
conn->reinit_pending = 0;
etcp_cbk_fire(conn, ETCP_CBK_EVENT_REINIT);
}
}
// Move from pending to indexed connections, fire ready callbacks

Loading…
Cancel
Save