diff --git a/src/dm/dm_core.c b/src/dm/dm_core.c index e5198e71..8cb03b86 100644 --- a/src/dm/dm_core.c +++ b/src/dm/dm_core.c @@ -168,6 +168,10 @@ int dm_route_group(struct UTUN_INSTANCE* inst, uint64_t peer, uint64_t preferred /* Router владеет entry после вызова, в том числе при ошибке. */ static int dm_route_send(struct dm_state* dm, uint64_t group_id, uint64_t dst, uint8_t subcmd, const uint8_t* body, size_t body_len) { + if (!etcp_router_conn_get(dm->inst, group_id, dst, ETCP_RT_ID_DM)) { + DEBUG_ERROR(DEBUG_CATEGORY_DM, "%s: router channel allocation failed peer=%llu", DM_ID, (unsigned long long)dst); + return -1; + } if (!etcp_router_send_q_has_room(dm->inst, group_id, dst, ETCP_RT_ID_DM)) { DEBUG_DEBUG(DEBUG_CATEGORY_DM, "%s: send deferred by backpressure peer=%llu", DM_ID, (unsigned long long)dst); return -1; diff --git a/src/dm/dm_mailbox.c b/src/dm/dm_mailbox.c index 3e64e5f6..87658f27 100644 --- a/src/dm/dm_mailbox.c +++ b/src/dm/dm_mailbox.c @@ -41,6 +41,10 @@ static int mb_scope(struct dm_mb_state* mb, uint64_t gid, uint64_t super, uint64 /* Подписать контроль и передать владение пакетом router, учитывая backpressure. */ static int mb_send(struct dm_mb_state* mb, uint64_t gid, uint64_t dst, uint8_t cmd, const uint8_t* body, size_t len) { + if (!etcp_router_conn_get(mb->inst, gid, dst, ETCP_RT_ID_DM_MAILBOX)) { + DEBUG_ERROR(DEBUG_CATEGORY_DM, "%s: router channel allocation failed peer=%llu", MB_ID, (unsigned long long)dst); + return -1; + } if (!etcp_router_send_q_has_room(mb->inst, gid, dst, ETCP_RT_ID_DM_MAILBOX)) { DEBUG_DEBUG(DEBUG_CATEGORY_DM, "%s: backpressure peer=%llu", MB_ID, (unsigned long long)dst); return -1;