diff --git a/doc/tasks.md b/doc/tasks.md index 90203a73..575dc230 100644 --- a/doc/tasks.md +++ b/doc/tasks.md @@ -4,6 +4,17 @@ ## Текущие задачи +[+] **Multicast с исходящими дескрипторами и входящими подписками** — 20.10.2026: + Отдельный routing_layer/multicast.c; контракт и примеры использования — multicast.h. + Номера 1..65535 выдаются последовательно без поколений; подписки на (группа, source, descriptor). + Общая FIFO 256 КиБ на ETCP-соединение, разделение по маршрутам, отмена при close/stop; + отчёты с участком src/dst, получателями, префиксом payload и счётчиком: общий бюджет 16 КиБ, таймер 300 мс. + test_multicast PASS: разветвление, тихий drop, lifetime, лимиты, таймер, смена маршрута, + длинные отчёты, backpressure/restart, исчерпание и обход номеров. Valgrind: 0 ошибок, lost=0. + check.sh: 163/165; прежние encrypted_attachment phase=5 и local_transport_packets line=209 + (отдельный повтор PASS). Логи: /tmp/multicast-full-check.log, /tmp/multicast-valgrind.log, + /tmp/multicast-valgrind-test.log, /tmp/multicast-local-transport-retry.log. + [+] **Выбор битрейта трансляции до 12 Мбит/с** — 20.10.2026: Desktop и Android: верхний ручной пункт 12М, прежние сохранённые значения выше приводятся к лимиту. Android пересекает выбор с диапазоном encoder и сохраняет лимит при смене режима/камеры; @@ -35,6 +46,8 @@ Отдельный повтор PASS: миллион hostile packets, bounded flood/events/memory, discovery recovery. Код local transport не менялся. Логи: /tmp/video-warmup-full-check.log, /tmp/video-warmup-local-packets-retry.log; причина и связь с нагрузкой пока не установлены. + Проверка multicast: line=209, invitations == before + 9; отдельный повтор PASS. + Логи: /tmp/multicast-full-check.log, /tmp/multicast-local-transport-retry.log. [+] **Android: fullscreen вдоль длинной стороны и повторное использование codec probes** — 20.10.2026: Общее вписывание со стримами поворачивает только изображение большого видео, интерфейс остаётся diff --git a/tests/test_multicast.c b/tests/test_multicast.c index 83b703ee..e4daede4 100644 --- a/tests/test_multicast.c +++ b/tests/test_multicast.c @@ -304,6 +304,7 @@ static void test_overload(void) { } CHECK(stats(f, B).queued_bytes == MULTICAST_QUEUE_BYTES && stats(f, B).overload_packets == 0); CHECK(c.count == 0 && d.count == 32); + uint64_t first_drop = get_time_tb(); CHECK(multicast_send(f->inst[A], fd, &one, 1, "one", 3) == 0); CHECK(l.count == 0); pump(f); DEBUG_DEBUG(DEBUG_CATEGORY_GENERAL, "first report: losses=%u pending=%zu sent=%llu received=%llu overload=%llu", @@ -320,8 +321,10 @@ static void test_overload(void) { uint64_t different[] = {3, 5}; CHECK(multicast_send(f->inst[A], fd, different, 2, "set", 3) == 0); pump(f); CHECK(l.count == 1); - test_clock_run_for(f->ua, 2900); CHECK(l.count == 1); - test_clock_run_for(f->ua, 150); CHECK(l.count == 3); + uint64_t now = get_time_tb(); + CHECK(now < first_drop + 2500); + test_clock_run_for(f->ua, (int)(first_drop + 2500 - now)); CHECK(l.count == 1); + test_clock_run_for(f->ua, 700); pump(f); CHECK(l.count == 3); CHECK(l.item[1].packets == 2 && l.item[1].recipient_count == 1 && memcmp(l.item[1].prefix, "two", 3) == 0); CHECK(l.item[2].packets == 1 && l.item[2].recipient_count == 2 && l.ids[2][0] == 3 && l.ids[2][1] == 5); CHECK(stats(f, B).overload_packets == 4 && stats(f, B).queued_bytes == MULTICAST_QUEUE_BYTES);