/* Интерфейс реализации packet_link. После create реализация публикует состояние и целые RX-пакеты. * Оболочка не создаёт очередей данных. Все вызовы — в одном uasync-потоке. * stop отменяет источники событий, destroy освобождает impl после выхода обработчиков оболочки. */ #ifndef PACKET_LINK_BACKEND_H #define PACKET_LINK_BACKEND_H #include "packet_link.h" #ifdef __cplusplus extern "C" { #endif struct UASYNC; struct packet_link_ops { int (*send)(void* impl, struct ll_entry* packet); /* Отказ только до принятия; после принятия ошибки через state. */ void (*set_rx_enabled)(void* impl, int enabled); /* При возобновлении допустима синхронная выдача RX. */ void (*stop)(void* impl); /* Снять callbacks/таймеры, не освобождать impl. */ void (*destroy)(void* impl); /* Освободить остановленную реализацию. */ }; /* Копирует ops/state/callbacks. Успех передаёт impl оболочке, отказ оставляет вызывающему. * arg заимствован до close. Первое state_changed отложено до возврата create. */ struct packet_link* packet_link_create(struct UASYNC* ua, const struct packet_link_ops* ops, void* impl, const struct packet_link_state* initial, const struct packet_link_callbacks* callbacks, void* arg); /* Обновить снимок сразу; уведомление отложено/объединено. TERMINATED необратим. */ void packet_link_backend_set_state(struct packet_link* link, const struct packet_link_state* state); /* OK передаёт пакет получателю. CLOSED/WOULD_BLOCK/INVALID оставляет пакет реализации. * Во время send выдача RX запрещена: реализация должна дождаться своего следующего события. */ int packet_link_backend_receive(struct packet_link* link, struct ll_entry* packet); #ifdef __cplusplus } #endif #endif