From 4c1ea11022d7c334460e0b97082825735329e0f3 Mon Sep 17 00:00:00 2001 From: evgeny Date: Wed, 5 Aug 2026 18:16:18 +0300 Subject: [PATCH] conn_mgr: split handler into router (routed) and direct paths MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit conn_mgr_router_recv_handler (etcp_router_bind): DIRECT_REQ, INTERM_EXCHANGE, DISCONNECT conn_mgr_direct_recv_handler (etcp_bind): INVITE_INFO_REQ, INVITE_INFO_RESP Each transport path now has its own handler — no more mixed concerns. --- src/routing_layer/conn_mgr.h | 1 + src/routing_layer/conn_mgr_core.c | 12 ++++++++++-- src/utun_instance.c | 2 +- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/routing_layer/conn_mgr.h b/src/routing_layer/conn_mgr.h index 1fbc9f22..0033e38f 100644 --- a/src/routing_layer/conn_mgr.h +++ b/src/routing_layer/conn_mgr.h @@ -76,6 +76,7 @@ typedef void (*conn_mgr_cb_t)(struct CONN_MGR_HANDLE* h, struct CONN_MGR* conn_mgr_init(struct TOPO_GROUP* group); void conn_mgr_destroy(struct CONN_MGR* mgr); +void conn_mgr_direct_recv_handler(struct ETCP_CONN* conn, struct ll_entry* entry); void conn_mgr_router_recv_handler(struct ETCP_CONN* conn, struct ll_entry* entry); /* ═══════ единая точка входа ═══════ */ diff --git a/src/routing_layer/conn_mgr_core.c b/src/routing_layer/conn_mgr_core.c index 791fbf53..1d686875 100644 --- a/src/routing_layer/conn_mgr_core.c +++ b/src/routing_layer/conn_mgr_core.c @@ -726,8 +726,16 @@ void conn_mgr_router_recv_handler(struct ETCP_CONN* conn, struct ll_entry* entry case CM_SUBCMD_INTERM_EXCHANGE_RESP: if (mgr) cm_handle_interm_exchange_resp(mgr, d, len); break; case CM_SUBCMD_INTERM_SELECTED: if (mgr) cm_handle_interm_selected(mgr, d, len); break; case CM_SUBCMD_DISCONNECT: if (len >= CM_DISCONNECT_SIZE && mgr) cm_handle_disconnect(mgr, ((struct CM_DISCONNECT*)d)->node_id); break; - case CM_SUBCMD_INVITE_INFO_REQ: if (mgr && len >= sizeof(struct CM_INVITE_REQ)) cm_handle_invite_info_req(mgr, conn, d, len); break; - case CM_SUBCMD_INVITE_INFO_RESP: if (mgr) cm_handle_invite_info_resp(mgr, conn, d, len); break; + } +} + +void conn_mgr_direct_recv_handler(struct ETCP_CONN* conn, struct ll_entry* entry) { + if (!entry || !entry->dgram || entry->len < 3) return; + uint8_t* d = entry->dgram + 1; size_t len = entry->len - 1; uint8_t sub = d[1]; + struct CONN_MGR* mgr = conn->instance->conn_mgr; + switch (sub) { + case CM_SUBCMD_INVITE_INFO_REQ: if (mgr && len >= sizeof(struct CM_INVITE_REQ)) cm_handle_invite_info_req(mgr, conn, d, len); break; + case CM_SUBCMD_INVITE_INFO_RESP: if (mgr) cm_handle_invite_info_resp(mgr, conn, d, len); break; } } diff --git a/src/utun_instance.c b/src/utun_instance.c index caa8e630..8361fd6e 100644 --- a/src/utun_instance.c +++ b/src/utun_instance.c @@ -207,7 +207,7 @@ static int instance_init_common(struct UTUN_INSTANCE* instance, struct UASYNC* u } else { DEBUG_INFO(DEBUG_CATEGORY_BGP, "BGP module initialized"); etcp_router_bind(instance, ETCP_RT_ID_CONN_MGR, conn_mgr_router_recv_handler); - etcp_bind(instance, ETCP_RT_ID_CONN_MGR, conn_mgr_router_recv_handler); + etcp_bind(instance, ETCP_RT_ID_CONN_MGR, conn_mgr_direct_recv_handler); struct TOPO_GROUP* g = topo_groups_get_default(instance->topo_groups); if (instance->rt && g && g->local_node) { topo_group_update_my_nodeinfo(instance, g);