- Fixed incorrect init_connections() call in test_etcp_simple_traffic.c (was calling server_instance instead of client_instance) - Fixed double free in timeout_heap_pop() when handling deleted elements - Enhanced NULL pointer safety in uasync_print_resources() by removing complex heap manipulation - Added debug logging to timeout_heap_pop() for better error tracking Test results: test_etcp_simple_traffic now passes without double free errors
76 lines
3.2 KiB
C
Executable File
76 lines
3.2 KiB
C
Executable File
// pkt_normalizer.h
|
|
#ifndef PKT_NORMALIZER_H
|
|
#define PKT_NORMALIZER_H
|
|
|
|
#include "ll_queue.h"
|
|
#include "../lib/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
|
|
|
|
/* ETCP overhead for calculating fragment size from MTU */
|
|
#define ETCP_OVERHEAD 100 // Reserve 100 bytes for headers, crypto, etc.*/
|
|
|
|
/* 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 {
|
|
struct ll_queue* input;
|
|
struct ll_queue* 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;
|
|
};
|
|
|
|
struct pkt_normalizer_pair {
|
|
struct pn_struct* packer;
|
|
struct pn_struct* unpacker;
|
|
};
|
|
|
|
struct pn_struct* pkt_normalizer_init(uasync_t* ua, int is_packer, int mtu); // 1 for packer, 0 for unpacker, mtu for fragment size calculation
|
|
void pkt_normalizer_deinit(struct pn_struct* pn);
|
|
|
|
struct pkt_normalizer_pair* pkt_normalizer_pair_init(uasync_t* ua, int mtu);
|
|
void pkt_normalizer_pair_deinit(struct pkt_normalizer_pair* pair);
|
|
|
|
/* Error handling */
|
|
int pkt_normalizer_get_error_count(const struct pn_struct* pn);
|
|
void pkt_normalizer_reset_error_count(struct pn_struct* pn);
|
|
|
|
/* Flush internal buffer (packer only) */
|
|
void pkt_normalizer_flush(struct pn_struct* pn);
|
|
|
|
int pkt_normalizer_send_service(struct pn_struct* pn, uint8_t type, const void* data, size_t len);
|
|
void pkt_normalizer_set_service_callback(struct pn_struct* pn, pkt_normalizer_service_callback_t callback, void* user_data);
|
|
void pkt_normalizer_reset_service_state(struct pn_struct* pn);
|
|
void pkt_normalizer_reset_state(struct pn_struct* pn);
|
|
|
|
#endif // PKT_NORMALIZER_H
|