// pkt_normalizer.h (упрощенная версия) #ifndef PKT_NORMALIZER_H #define PKT_NORMALIZER_H #include "../lib/ll_queue.h" #include "../lib/u_async.h" #include // Структура для packer struct PKTNORM { // public: struct ll_queue* input; // Входная очередь в packer (через нее отправляем пакеты) struct ll_queue* output; // Выходная очередь из unpacker (через нее принимаем пакеты) uint16_t tx_wait_time; // private: uasync_t* ua; // uasync instance struct ETCP_CONN* etcp; // packer: uint16_t frag_size; // размер фрагмента на которые разбивать uint8_t* data; // буфер (выделяется из пула pn->etcp->instance->data_pool) uint16_t data_ptr; // число заполненных байт uint16_t data_size; // размер выделенной области // struct ll_entry sndpart; // блок ожидающий досборки void* flush_timer; // For timeout flush struct ll_entry* pending; // Partial processed input entry uint16_t pending_in_ptr; // Pointer in pending entry // unpacker: struct ll_entry* recvpart; // блок ожидающий заполнение // uint16_t recvpart_rem; // сколько байт осталось собрать (0 = ждём заголовок нового пакета) // stats: uint32_t alloc_errors; uint32_t logic_errors; }; // Инициализация пары struct PKTNORM* pn_init(struct ETCP_CONN* etcp);// все что нужно (в т.ч. mtu и ua) берет из etcp // Деинициализация пары void pn_deinit(struct PKTNORM* pn); // Сброс состояния (для unpacker) void pn_unpacker_reset_state(struct PKTNORM* pn); // создаёт malloc data, копирует, помещает в input. void pn_packer_send(struct PKTNORM* pn, uint8_t* data, uint16_t len); #endif // PKT_NORMALIZER_H