Files
utun2/lib/packet_link_backend.h
T

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