// pkt_normalizer.h #ifndef PKT_NORMALIZER_H #define PKT_NORMALIZER_H #include "ll_queue.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; struct pn_struct { ll_queue_t* input; ll_queue_t* output; int is_packer; union { struct { uint8_t* buf; size_t len; size_t cap; } packer; struct { uint8_t* buf; /* буфер для сборки фрагментов */ size_t len; /* текущая накопленная длина */ size_t total_len; /* ожидаемая общая длина из первого фрагмента */ size_t cap; /* ёмкость буфера */ int error_count; /* счетчик ошибок сборки */ int in_fragment; /* флаг: идет сборка фрагментов (1) или нет (0) */ void* fragment_timeout_id; /* ID таймаута для сборки фрагментов */ } unpacker; } u; }; pn_struct* pkt_normalizer_init(int is_packer); // 1 for packer, 0 for unpacker void pkt_normalizer_deinit(pn_struct* pn); pkt_normalizer_pair* pkt_normalizer_pair_init(void); 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); struct pkt_normalizer_pair { pn_struct* packer; pn_struct* unpacker; }; #endif // PKT_NORMALIZER_H