You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
73 lines
3.5 KiB
73 lines
3.5 KiB
#ifndef ETCP_CONNECT_H |
|
#define ETCP_CONNECT_H |
|
|
|
struct UTUN_INSTANCE; |
|
struct ETCP_CONN; |
|
|
|
/* |
|
* ============================================================================ |
|
* Штатное закрытие исходящих соединений (etcp_connect) |
|
* ============================================================================ |
|
* |
|
* Исходящее соединение создаётся через etcp_connect(): |
|
* etcp_connect(inst, node, cb, arg, flags) |
|
* ├── etcp_connection_create(inst, NULL) → conn (добавляется в inst->connections) |
|
* ├── ctx = u_calloc(...); ctx->conn = conn |
|
* ├── для TCP: ctx->tcp_link = stcp_link_connect(...) |
|
* │ conn->transport_link = ctx->tcp_link |
|
* └── ctx->next = inst->pending_connects; inst->pending_connects = ctx |
|
* |
|
* Пути завершения: |
|
* |
|
* 1. Таймаут установки (connect_initial_timeout_cb): |
|
* stcp_link_close(tcp_link) → etcp_connection_close(conn) → connect_cancel(ctx) |
|
* |
|
* 2. Settle таймаут (connect_settle_timeout_cb): |
|
* stcp_link_close(tcp_link) (если !tcp_ready) → connect_cancel(ctx) |
|
* |
|
* 3. Штатное закрытие через utun_instance_destroy(): |
|
* utun_instance_destroy(inst) |
|
* ├── etcp_connection_close(conn) для всех conn |
|
* │ Фаза 1 (detach): закрыть линки, удалить из inst->connections, state=2 |
|
* │ Фаза 2 (deferred): uasync_call_soon(ua, conn, etcp_connection_free_deferred) |
|
* │ |
|
* ├── while (immediate_queue_head) uasync_poll(ua, 0) // ждём завершения |
|
* │ └── etcp_connection_free_resources(conn) |
|
* │ ├── drain_and_free_queue(*) |
|
* │ ├── etcp_connect_cancel_for_conn(inst, conn) ← эта функция |
|
* │ └── u_free(etcp) |
|
* │ |
|
* └── memory_pool_destroy(pkt/ack/data) // теперь безопасно |
|
* |
|
* Закрытие tcp_link НЕ входит в ответственность cancel-функций. |
|
* tcp_link закрывается ДО вызова connect_cancel / cancel_for_conn |
|
* (в путях 1 и 2 явно; в пути 3 tcp_link закрыт ранее или утекает — pre-existing). |
|
* |
|
* ============================================================================ |
|
*/ |
|
|
|
|
|
/* |
|
* ============================================================================ |
|
* etcp_connect_cancel_for_conn() |
|
* ============================================================================ |
|
* |
|
* Аналог приватного connect_cancel(), но ищет ETCP_CONNECT ctx по совпадению |
|
* ctx->conn == conn (а не по указателю на ctx). |
|
* |
|
* Делает: |
|
* 1. Удаляет ctx из inst->pending_connects |
|
* 2. ctx->done = 1; ctx->conn = NULL |
|
* 3. uasync_cancel_timeout(initial_timer / settle_timer) |
|
* 4. u_free(ctx) |
|
* |
|
* НЕ закрывает ctx->tcp_link (чужая ответственность). |
|
* |
|
* Вызывается ТОЛЬКО из etcp_connection_free_resources (фаза 2 deferred cleanup). |
|
* НЕ вызывать из mainloop / uasync_poll callbacks — conn уже может быть в state=2. |
|
* |
|
* ============================================================================ |
|
*/ |
|
void etcp_connect_cancel_for_conn(struct UTUN_INSTANCE* inst, struct ETCP_CONN* conn); |
|
|
|
#endif
|
|
|