51 lines
3.7 KiB
C
51 lines
3.7 KiB
C
/* stream_optimizer — автоматический выбор узлов, от которых получать части трансляции.
|
|
* Проверяет поставщиков, сравнивает задержку и переносит выдачи на лучший доступный путь; при необходимости просит relay.
|
|
* Внутренний модуль stream: create для одной трансляции → tick при сетевом событии/по таймеру → destroy.
|
|
* Все вызовы — uasync. Планировщик общий для локальных читателей; destroy отменяет принадлежащие ему пробы и выдачи. */
|
|
#ifndef STREAM_OPTIMIZER_H
|
|
#define STREAM_OPTIMIZER_H
|
|
|
|
#include "stream.h"
|
|
|
|
struct stream_optimizer;
|
|
struct stream_receive_info;
|
|
|
|
// ── Оценка поставщиков и расписание проб ──
|
|
|
|
// Меньшая оценка лучше: chain RTT + 2 * peer RTT + 3 мс/hop + штраф 0..1000 мс; неизвестный RTT = UINT64_MAX.
|
|
uint64_t stream_supplier_score(const struct stream_receive_info *info, const struct stream_metric_snapshot *metrics, int valid);
|
|
|
|
/* Только монотонное расписание; pending/active — незавершённый обход/пробы текущего цикла.
|
|
* Возвращает допустимое число новых узлов, не адресов/субпотоков: 32 один раз, затем 0/1. */
|
|
struct stream_probe_schedule { uint64_t cycle, started_ms, next_ms; };
|
|
unsigned stream_probe_schedule_tick(struct stream_probe_schedule *schedule, uint64_t now_ms, unsigned pending, unsigned active);
|
|
|
|
// ── Жизненный цикл планировщика ──
|
|
|
|
// Скопировать descriptor и создать планировщик; *out заранее NULL. STREAM_OK или отрицательная ошибка.
|
|
int stream_optimizer_create(struct UTUN_INSTANCE *inst, const struct stream_descriptor *descriptor, struct stream_optimizer **out);
|
|
|
|
// Остановить пробы/выдачи и освободить планировщик; NULL допустим, instance ещё должен быть жив.
|
|
void stream_optimizer_destroy(struct stream_optimizer *optimizer);
|
|
|
|
// ── Выбор поставщиков и настройки ──
|
|
|
|
// Выполнить очередной проход выбора для живой подписки; now_ms — монотонное время в миллисекундах.
|
|
void stream_optimizer_tick(struct stream_optimizer *optimizer, struct STREAM_HANDLE *subscription, uint64_t now_ms);
|
|
|
|
// Скопировать пороги подтверждения, удержания и гистерезиса в мс (каждый <=60000); STREAM_OK/STREAM_ERR_ARGUMENT.
|
|
int stream_optimizer_configure(struct stream_optimizer *optimizer, const struct stream_selection_settings *settings);
|
|
|
|
// Скопировать статистику; optimizer и info обязательны.
|
|
void stream_optimizer_info(struct stream_optimizer *optimizer, struct stream_selection_info *info);
|
|
|
|
// ── Уведомления от Merkle/BGP и relay ──
|
|
|
|
// Merkle/BGP помечает список поставщиков устаревшим; пробы/цикл/backoff сохраняются до отложенной сверки.
|
|
void stream_optimizer_roster_changed(struct stream_optimizer *optimizer, uint64_t peer);
|
|
|
|
// Подтверждённая помощь немедленно обновляет кандидатов и снимает старый backoff конкретного пира.
|
|
void stream_optimizer_refresh(struct stream_optimizer *optimizer, uint64_t peer);
|
|
|
|
#endif
|