transport: per-peer sleep callback (peer_sleep_cbk) fired from keepalive protocol

This commit is contained in:
evgeny committed 2026-09-22 00:40:32 +03:00
1 parent 5628138d16
commit e4e9fca243
5 files changed
+67

No files matched your search

+35
View File
@@ -645,6 +645,12 @@ void utun_instance_destroy(struct UTUN_INSTANCE *instance) {
instance->activity_cbks = r->next; u_free(r);
}
// Cleanup peer-sleep callback chain
while (instance->peer_sleep_cbks) {
struct peer_sleep_cbk_entry* r = instance->peer_sleep_cbks;
instance->peer_sleep_cbks = r->next; u_free(r);
}
// Shared SQLite DB закрываем в самом конце: routing/chat/media/db_sync
// используют его во время всего teardown (см. topo_groups_destroy).
if (instance->topo_sqlite_db) {
@@ -1130,6 +1136,35 @@ static void utun_fire_activity_cbk(struct UTUN_INSTANCE* instance, int active) {
}
}
void utun_add_peer_sleep_cbk(struct UTUN_INSTANCE* instance, peer_sleep_cbk_fn fn, void* arg) {
if (!instance || !fn) return;
struct peer_sleep_cbk_entry* e = u_malloc(sizeof(*e));
if (!e) return;
e->fn = fn; e->arg = arg; e->next = instance->peer_sleep_cbks;
instance->peer_sleep_cbks = e;
}
void utun_remove_peer_sleep_cbk(struct UTUN_INSTANCE* instance, peer_sleep_cbk_fn fn, void* arg) {
if (!instance || !fn) return;
struct peer_sleep_cbk_entry** p = &instance->peer_sleep_cbks;
while (*p) {
if ((*p)->fn == fn && (*p)->arg == arg) {
struct peer_sleep_cbk_entry* rm = *p;
*p = rm->next; u_free(rm); return;
}
p = &(*p)->next;
}
}
void utun_fire_peer_sleep_cbk(struct UTUN_INSTANCE* instance, uint64_t peer_node_id, int sleeping) {
struct peer_sleep_cbk_entry* e = instance ? instance->peer_sleep_cbks : NULL;
while (e) {
struct peer_sleep_cbk_entry* n = e->next;
e->fn(instance, peer_node_id, sleeping, e->arg);
e = n;
}
}
static void client_activity_timeout_cb(void* arg) {
struct UTUN_INSTANCE* instance = (struct UTUN_INSTANCE*)arg;
DEBUG_INFO(DEBUG_CATEGORY_BGP, "client_activity_timer fired: node=%016llx type=%u -> standby",