// pkt_normalizer.h #ifndef PKT_NORMALIZER_H #define PKT_NORMALIZER_H #include "ll_queue.h" #include "u_async.h" #include /* Default fragment reassembly timeout in uasync timebase units (0.1 ms) */ #ifndef PKT_NORMALIZER_FRAGMENT_TIMEOUT #define PKT_NORMALIZER_FRAGMENT_TIMEOUT 5000 /* 500 ms */ #endif typedef struct pn_struct pn_struct; typedef struct pkt_normalizer_pair pkt_normalizer_pair; /* Service packet callback type */ typedef void (*pkt_normalizer_service_callback_t)(void* user_data, uint8_t type, const uint8_t* data, size_t len); struct pn_struct { ll_queue_t* input; ll_queue_t* output; uasync_t* ua; int is_packer; union { struct { uint8_t* buf; size_t len; size_t cap; int error_count; } packer; struct { uint8_t* buf; /* буфер для сборки фрагментов */ size_t len; /* текущая накопленная длина */ size_t total_len; /* ожидаемая общая длина из первого фрагмента */ size_t cap; /* ёмкость буфера */ int error_count; /* счетчик ошибок сборки */ int in_fragment; /* флаг: идет сборка фрагментов (1) или нет (0) */ /* Service packet reassembly */ uint8_t* service_buf; /* буфер для сборки сервисных пакетов */ size_t service_len; /* текущая накопленная длина сервисного пакета */ size_t service_cap; /* ёмкость буфера сервисного пакета */ uint8_t service_type; /* тип сервисного пакета */ int in_service; /* флаг: идет сборка сервисного пакета (1) или нет (0) */ } unpacker; } u; /* Service packet callback */ pkt_normalizer_service_callback_t service_callback; void* service_callback_user_data; }; pn_struct* pkt_normalizer_init(uasync_t* ua, int is_packer); // 1 for packer, 0 for unpacker void pkt_normalizer_deinit(pn_struct* pn); pkt_normalizer_pair* pkt_normalizer_pair_init(uasync_t* ua); void pkt_normalizer_pair_deinit(pkt_normalizer_pair* pair); /* Error handling */ int pkt_normalizer_get_error_count(const pn_struct* pn); void pkt_normalizer_reset_error_count(pn_struct* pn); /* Flush internal buffer (packer only) */ void pkt_normalizer_flush(pn_struct* pn); int pkt_normalizer_send_service(pn_struct* pn, uint8_t type, const void* data, size_t len); void pkt_normalizer_set_service_callback(pn_struct* pn, pkt_normalizer_service_callback_t callback, void* user_data); void pkt_normalizer_reset_service_state(pn_struct* pn); void pkt_normalizer_reset_state(pn_struct* pn); struct pkt_normalizer_pair { pn_struct* packer; pn_struct* unpacker; }; #endif // PKT_NORMALIZER_H