You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
3.0 KiB
75 lines
3.0 KiB
// pkt_normalizer.h |
|
#ifndef PKT_NORMALIZER_H |
|
#define PKT_NORMALIZER_H |
|
|
|
#include "ll_queue.h" |
|
#include "u_async.h" |
|
#include <stdint.h> |
|
|
|
/* 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
|
|
|