From 41a68b86bc2ec52c60da8ad0c7ebff7eb9ce710b Mon Sep 17 00:00:00 2001 From: evgeny Date: Wed, 21 Oct 2026 22:43:54 +0200 Subject: [PATCH] Close NAT channels after cancelling producers and quiet transient TUN backpressure --- src/nat_transport.c | 10 ++++++++++ src/tun_if.c | 4 +++- tests/test_nat_engine.c | 2 ++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/nat_transport.c b/src/nat_transport.c index 5fa40162..5f804a44 100644 --- a/src/nat_transport.c +++ b/src/nat_transport.c @@ -315,6 +315,16 @@ void nat_transport_destroy(struct UTUN_INSTANCE* inst) { struct ll_entry* peer; while ((peer = queue_data_get(tr->peers))) nat_peer_free((struct nat_peer*)peer); queue_free(tr->peers); + // После отмены producers закрыть только каналы NAT; остальные сервисы ядра продолжают работать. + while (inst->router_conns) { + struct ETCP_ROUTER_CONN* route = NULL; + for (struct ll_entry* e = inst->router_conns->head; e; e = e->next) { + struct ETCP_ROUTER_CONN* candidate = (struct ETCP_ROUTER_CONN*)e; + if (candidate->svc_id == ETCP_RT_ID_NAT) { route = candidate; break; } + } + if (!route) break; + etcp_router_conn_close(route); + } nat_packet_free(tr->tun_pending); tun_close(tr->nat_tun); eim_nat_destroy_ctx(&inst->nat); diff --git a/src/tun_if.c b/src/tun_if.c index 1593346d..96c765ff 100644 --- a/src/tun_if.c +++ b/src/tun_if.c @@ -255,7 +255,9 @@ ssize_t tun_write(struct tun_if* tun, const uint8_t* buf, size_t len) { } while (n < 0 && errno == EINTR); if (n != (ssize_t)len) { int error = n < 0 ? errno : EIO; - DEBUG_ERROR(DEBUG_CATEGORY_TUN, "TUN %s write failed: requested=%zu written=%zd error=%s", tun->ifname, len, n, strerror(error)); + if (error == EAGAIN || error == EWOULDBLOCK) + DEBUG_DEBUG(DEBUG_CATEGORY_TUN, "TUN %s write backpressure: requested=%zu", tun->ifname, len); + else DEBUG_ERROR(DEBUG_CATEGORY_TUN, "TUN %s write failed: requested=%zu written=%zd error=%s", tun->ifname, len, n, strerror(error)); tun->write_errors++; errno = error; return -1; diff --git a/tests/test_nat_engine.c b/tests/test_nat_engine.c index be325ef4..98d2455d 100644 --- a/tests/test_nat_engine.c +++ b/tests/test_nat_engine.c @@ -1163,6 +1163,8 @@ static void test_hash_lifecycle(void) { ASSERT_EQ(eim_nat_egress(&ctx, packet, 42, 100000 + i, NULL), EIM_NAT_OK, "reuse freed port"); uint16_t external; memcpy(&external, packet + 20, 2); ASSERT_EQ(be16toh(external), removed[i], "free ports reused in FIFO order"); + } + for (size_t i = 0; i < 3; i++) { memcpy(packet, original, 42); ASSERT_EQ(eim_nat_egress(&ctx, packet, 42, removed[i], NULL), EIM_NAT_ERROR, "removed key does not alias reused slot"); ASSERT(memcmp(packet, original, 42) == 0, "full-pool error preserves packet");