Recheck broadcast admission between subscriber callbacks
This commit is contained in:
1 parent
47846709f2
commit
09a3d09013
3 files changed
+9
-5
No files matched your search
+7
-3
@@ -154,9 +154,13 @@ void broadcast_remove_cbk(struct TOPO_GROUP* group, broadcast_recv_fn fn, void*
|
||||
}
|
||||
}
|
||||
|
||||
static void broadcast_fire_cbks(struct broadcast_ctx* ctx, const uint8_t* uuid, const uint8_t* data, uint16_t data_len) {
|
||||
static void broadcast_fire_cbks(struct broadcast_ctx* ctx, struct ETCP_CONN* from_conn,
|
||||
const uint8_t* uuid, const uint8_t* data, uint16_t data_len) {
|
||||
struct broadcast_cbk_entry* c = ctx->cbks;
|
||||
while (c) { c->fn(uuid, data, data_len, c->arg); c = c->next; }
|
||||
while (c) {
|
||||
if (!topo_group_data_allowed(ctx->group, from_conn)) return;
|
||||
c->fn(uuid, data, data_len, c->arg); c = c->next;
|
||||
}
|
||||
}
|
||||
|
||||
static void broadcast_cleanup_timer_cb(void* arg) {
|
||||
@@ -238,7 +242,7 @@ void broadcast_recv(struct TOPO_GROUP* group, struct ETCP_CONN* from_conn, const
|
||||
}
|
||||
}
|
||||
|
||||
broadcast_fire_cbks(ctx, uuid, data, data_len);
|
||||
broadcast_fire_cbks(ctx, from_conn, uuid, data, data_len);
|
||||
}
|
||||
|
||||
static void broadcast_recv_dispatcher(struct ETCP_CONN* from_conn, struct ll_entry* entry) {
|
||||
|
||||
+1
-1
@@ -39,7 +39,7 @@ int broadcast_init(struct TOPO_GROUP* group);
|
||||
// Отменяет таймер/standby-ожидание, освобождает кеш и регистрации, но не arg подписчиков; NULL/нет контекста допустимы.
|
||||
void broadcast_destroy(struct TOPO_GROUP* group);
|
||||
// data не NULL даже при data_len=0; data_len <= BROADCAST_MAX_DATA, группа должна быть инициализирована.
|
||||
// 0 — данные сохранены в кеше и рассылка предпринята; -1 — аргументы/отсутствие контекста/OOM записи кеша.
|
||||
// 0 — данные сохранены в кеше и рассылка предпринята; -1 — аргументы/контекст/отсутствие CHAT-допуска/OOM кеша.
|
||||
// Ошибки выделения/отправки отдельным соседям не меняют 0; собственные recv-callbacks не вызываются.
|
||||
int broadcast_send(struct TOPO_GROUP* group, const uint8_t* data, uint16_t data_len);
|
||||
// Добавляет fn(arg) в начало; дубликаты разрешены и вызываются отдельно. При NULL/нет контекста/OOM не добавляет.
|
||||
|
||||
+1
-1
@@ -59,7 +59,7 @@ void radio_set_mute_cb(struct UTUN_INSTANCE* inst, radio_mute_fn fn, void* arg);
|
||||
int radio_talk_begin(struct UTUN_INSTANCE* inst, uint64_t group_id); /* новая передача, seq=0 */
|
||||
/* Копирует один Opus-кадр (1..512 байт); собирает radio_burst_frames (1..10, default4).
|
||||
* Настройка фиксируется при BEGIN. Неполная пачка уходит при END или через target*20мс от первого кадра.
|
||||
* 0 — принят/устаревший хвост после END проигнорирован, -1 — неверные аргументы/нет группы. */
|
||||
* 0 — принят/устаревший хвост после END проигнорирован, -1 — неверные аргументы/нет группы/отозван CHAT-допуск. */
|
||||
int radio_talk_send(struct UTUN_INSTANCE* inst, uint64_t group_id, const uint8_t* opus, int len);
|
||||
int radio_talk_end(struct UTUN_INSTANCE* inst, uint64_t group_id); /* Сначала хвост DATA, затем отдельный FIN. */
|
||||
|
||||
|
||||
Reference in new issue
Block a user