From 35950c60f7fe09f1b0e5c7acb8bc0237b8db182e Mon Sep 17 00:00:00 2001 From: Evgeny Date: Thu, 5 Mar 2026 17:16:34 +0300 Subject: [PATCH] =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D1=8B=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D1=85=D0=BE=D0=B4=D1=8F=D1=82=20=D0=B4=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=20mtu=20=D0=B2=20link?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/config_parser.c | 8 ++++++-- src/config_parser.h | 1 + src/etcp.c | 6 ++++-- src/etcp_connections.c | 26 +++++++++++++++++--------- src/etcp_connections.h | 7 +++++-- tests/bench_timeout_heap | Bin 171848 -> 171920 bytes tests/bench_uasync_timeouts | Bin 174616 -> 174688 bytes tests/test_etcp_100_packets.c | 3 ++- 8 files changed, 35 insertions(+), 16 deletions(-) diff --git a/src/config_parser.c b/src/config_parser.c index 54c7fe7..ebb03c5 100644 --- a/src/config_parser.c +++ b/src/config_parser.c @@ -368,6 +368,10 @@ static int parse_server(const char *key, const char *value, struct CFG_SERVER *s } return 0; } + if (strcmp(key, "mtu") == 0) { + srv->mtu = atoi(value); + return 0; + } return 0; } @@ -647,9 +651,9 @@ void print_config(const struct utun_config *cfg) { struct CFG_SERVER *s = cfg->servers; while (s) { struct sockaddr_in *sin = (struct sockaddr_in *)&s->ip; - DEBUG_INFO(DEBUG_CATEGORY_CONFIG, " %s: %s:%d (mark=%d, netif=%u, type=%u)", + DEBUG_INFO(DEBUG_CATEGORY_CONFIG, " %s: %s:%d (mark=%d, netif=%u, type=%u, mtu=%d)", s->name, ip_to_str(&sin->sin_addr, AF_INET).str, ntohs(sin->sin_port), - s->so_mark, s->netif_index, s->type); + s->so_mark, s->netif_index, s->type, s->mtu); s = s->next; } diff --git a/src/config_parser.h b/src/config_parser.h index e2c3373..110ec0f 100644 --- a/src/config_parser.h +++ b/src/config_parser.h @@ -34,6 +34,7 @@ struct CFG_SERVER { uint32_t netif_index;// if_nameindex, 0 - no interface specified int so_mark; uint8_t type; // public/nat/private + int mtu; }; struct CFG_CLIENT_LINK { diff --git a/src/etcp.c b/src/etcp.c index ad9356f..905416f 100644 --- a/src/etcp.c +++ b/src/etcp.c @@ -275,6 +275,7 @@ void etcp_conn_reset(struct ETCP_CONN* etcp) { // Reset timers (just clear the pointers - timers will expire naturally) etcp->retrans_timer = NULL; etcp->ack_resp_timer = NULL; + DEBUG_TRACE(DEBUG_CATEGORY_ETCP, "end"); } // Update log_name when peer_node_id becomes known @@ -579,7 +580,7 @@ struct ETCP_DGRAM* etcp_request_pkt(struct ETCP_CONN* etcp) { size_t ack_q_size = queue_entry_count(etcp->ack_q); if (!inf_pkt && ack_q_size == 0) { -// DEBUG_DEBUG(DEBUG_CATEGORY_ETCP, "[%s] no data/ack to send", etcp->log_name); + DEBUG_DEBUG(DEBUG_CATEGORY_ETCP, "[%s] no data/ack to send", etcp->log_name); return NULL; } @@ -669,7 +670,8 @@ struct ETCP_DGRAM* etcp_request_pkt(struct ETCP_CONN* etcp) { memcpy(&dgram->data[ptr], inf_pkt->ll.dgram, inf_pkt->ll.len); ptr+=inf_pkt->ll.len; } else { - DEBUG_DEBUG(DEBUG_CATEGORY_ETCP, "[%s] only ACK packet with %d bytes total", etcp->log_name, dgram->data_len); + int chk=queue_check_consistency(etcp->ack_q); + DEBUG_DEBUG(DEBUG_CATEGORY_ETCP, "[%s] only ACK (size=%d) packet with %d bytes total (chk=%d) rem=%d", etcp->log_name, ack_q_size, ptr, chk, remain_len); } dgram->data_len=ptr; diff --git a/src/etcp_connections.c b/src/etcp_connections.c index 2003ede..eecaf28 100644 --- a/src/etcp_connections.c +++ b/src/etcp_connections.c @@ -70,8 +70,8 @@ static void etcp_link_send_init(struct ETCP_LINK* link, uint8_t reset) { dgram->data[offset++] = (node_id >> 8) & 0xFF; dgram->data[offset++] = node_id & 0xFF; - dgram->data[offset++] = (link->mtu >> 8) & 0xFF; - dgram->data[offset++] = link->mtu & 0xFF; + dgram->data[offset++] = (link->mtu_local >> 8) & 0xFF; + dgram->data[offset++] = link->mtu_local & 0xFF; dgram->data[offset++] = (link->keepalive_interval >> 8) & 0xFF; dgram->data[offset++] = link->keepalive_interval & 0xFF; @@ -415,7 +415,7 @@ int etcp_find_free_local_link_id(struct ETCP_CONN* etcp) { // =============================== -struct ETCP_SOCKET* etcp_socket_add(struct UTUN_INSTANCE* instance, struct sockaddr_storage* ip, uint32_t netif_index, int so_mark, uint8_t type) { +struct ETCP_SOCKET* etcp_socket_add(struct UTUN_INSTANCE* instance, struct sockaddr_storage* ip, uint32_t netif_index, int so_mark, uint8_t type, int mtu) { DEBUG_TRACE(DEBUG_CATEGORY_CONNECTION, ""); if (!instance) return NULL; @@ -496,6 +496,7 @@ struct ETCP_SOCKET* etcp_socket_add(struct UTUN_INSTANCE* instance, struct socka e_sock->errorcode = 0; e_sock->pkt_format_errors = 0; e_sock->type = type; + e_sock->mtu = mtu; DEBUG_INFO(DEBUG_CATEGORY_BGP, "Add Socket type=%d", type); // Add to instance's socket list @@ -561,7 +562,10 @@ struct ETCP_LINK* etcp_link_new(struct ETCP_CONN* etcp, struct ETCP_SOCKET* conn link->conn = conn; link->etcp = etcp; link->is_server = is_server; - link->mtu = 1500; + int mtu = conn->mtu; + if (mtu == 0) mtu = 1500; + link->mtu_local = mtu; + link->mtu = mtu; link->initialized = 0; link->init_timer = NULL; link->init_timeout = 0; @@ -921,6 +925,9 @@ static void etcp_connections_read_callback_socket(socket_t sock, void* arg) { DEBUG_DEBUG(DEBUG_CATEGORY_CONNECTION, "set keepalive for link=%d", link->keepalive_interval); } + link->mtu_remote = (ack_hdr->mtu[0] << 8) | ack_hdr->mtu[1]; + link->mtu = link->mtu_local < link->mtu_remote ? link->mtu_local : link->mtu_remote; + struct { uint8_t code; uint8_t id[8]; @@ -937,9 +944,9 @@ static void etcp_connections_read_callback_socket(socket_t sock, void* arg) { ack_repl_hdr->code = ETCP_INIT_RESPONSE_NOINIT; // 0x05 - without reset } memcpy(ack_repl_hdr->id, &e_sock->instance->node_id, 8); - int mtu=e_sock->instance->config->global.mtu; - ack_repl_hdr->mtu[0]=mtu>>8; - ack_repl_hdr->mtu[1]=mtu; + + ack_repl_hdr->mtu[0]=link->mtu_local>>8; + ack_repl_hdr->mtu[1]=link->mtu_local; ack_repl_hdr->link_id = link->local_link_id; // Add client's IP:port (so client behind NAT can know its external address) if (addr.ss_family == AF_INET) { @@ -1023,7 +1030,8 @@ process_decrypted: for (int i = 0; i < 8; i++) { server_node_id = (server_node_id << 8) | pkt->data[offset++]; } - link->mtu = (pkt->data[offset++] << 8) | pkt->data[offset++]; + link->mtu_remote = (pkt->data[offset++] << 8) | pkt->data[offset++]; + link->mtu = link->mtu_local < link->mtu_remote ? link->mtu_local : link->mtu_remote; link->remote_link_id = pkt->data[offset++]; // Parse NAT IP:port from response (new format includes 4+2 bytes) @@ -1143,7 +1151,7 @@ int init_connections(struct UTUN_INSTANCE* instance) { } } - struct ETCP_SOCKET* e_sock = etcp_socket_add(instance, &server->ip, server->netif_index, server->so_mark, server->type); + struct ETCP_SOCKET* e_sock = etcp_socket_add(instance, &server->ip, server->netif_index, server->so_mark, server->type, server->mtu ? server->mtu : instance->config->global.mtu); if (e_sock && default_ip != 0) { struct in_addr addr; addr.s_addr = default_ip; diff --git a/src/etcp_connections.h b/src/etcp_connections.h index fa045e8..ef5e1c4 100644 --- a/src/etcp_connections.h +++ b/src/etcp_connections.h @@ -34,6 +34,7 @@ struct ETCP_SOCKET { struct UTUN_INSTANCE* instance; socket_t fd; // UDP socket (cross-platform) struct sockaddr_storage local_addr; // Локальный адрес + int mtu; // MTU для этого сокета // для входящих подключений (links) - массив упорядоченный по ip_port_hash size_t max_channels; // сколько выделено памяти @@ -59,7 +60,9 @@ struct ETCP_LINK { struct sockaddr_storage remote_addr; // Удалённый адрес // Параметры соединения - uint16_t mtu; // MTU удаленного узла + uint16_t mtu; // MTU общий + uint16_t mtu_local; // MTU моего зла + uint16_t mtu_remote; // MTU удаленного узла uint16_t keepalive_interval; // Keepalive интервал (x1ms) uint32_t recovery_interval; // recovery интервал (x0.1ms) uint8_t is_server; // инициирует подключение клиент @@ -115,7 +118,7 @@ int init_connections(struct UTUN_INSTANCE* instance); // SOCKET FUNCTIONS // добавляет новый версер (сокет для приёма и отправки кодограмм. обслуживает много подключений) -struct ETCP_SOCKET* etcp_socket_add(struct UTUN_INSTANCE* instance, struct sockaddr_storage* ip, uint32_t netif_index, int so_mark, uint8_t type); +struct ETCP_SOCKET* etcp_socket_add(struct UTUN_INSTANCE* instance, struct sockaddr_storage* ip, uint32_t netif_index, int so_mark, uint8_t type, int mtu); // удаляет сокет и освобождает ресурсы (грохает все его подключения и сокет) void etcp_socket_remove(struct ETCP_SOCKET* conn); diff --git a/tests/bench_timeout_heap b/tests/bench_timeout_heap index 05c838d2fbd2ef760a2d8115f0ee439abddbd732..2ea3a664456093b913f2170c5457947961dafc77 100755 GIT binary patch delta 18452 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 TL5}OO0fWV76{%wzW%mC7sdjqQ delta 18137 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 WI#qm+Y;gY>Lnm>qR>wEU(EkPC2rT>n diff --git a/tests/bench_uasync_timeouts b/tests/bench_uasync_timeouts index 40757b2ad5f0711c545471b6714f4ab4f07e9047..17f1f99befcb0526253384dfccde59853e1b15b6 100755 GIT binary patch delta 17815 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�uwjC^RtCa6B~B*JZYQ;e$31 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