30 lines
2.3 KiB
C
30 lines
2.3 KiB
C
/* Интерфейс реализации 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
|