#ifndef _TCP_REASSEMBLY_H #define _TCP_REASSEMBLY_H #ifdef __cpluscplus extern "C" { #endif #include "log.h" #include #define TCP_REASSEMBLE_DEBUG(format, ...) LOG_DEBUG("tcp_reassembly", format, ##__VA_ARGS__) #define TCP_REASSEMBLE_ERROR(format, ...) LOG_ERROR("tcp_reassembly", format, ##__VA_ARGS__) /* * If retransmission or overlap occurs, the old data packet may have been consumed by the upper-layer plug-in, * so the old data packet takes priority and the new data packet will be bypassed. */ struct tcp_reassembly_options { uint8_t enable; uint32_t max_timeout; // range: [1, 60000] uint32_t max_segments; // 0: unlimited uint32_t max_bytes; // 0: unlimited }; struct tcp_reassembly_stat { uint64_t curr_segments; uint64_t curr_bytes; uint64_t insert_segments; uint64_t insert_bytes; uint64_t remove_segments; uint64_t remove_bytes; uint64_t consume_segments; uint64_t consume_bytes; uint64_t retrans_bypass_segments; uint64_t retrans_bypass_bytes; uint64_t overload_bypass_segments; uint64_t overload_bypass_bytes; uint64_t timeout_discard_segments; uint64_t timeout_discard_bytes; }; struct tcp_reassembly *tcp_reassembly_new(struct tcp_reassembly_options *opts); void tcp_reassembly_free(struct tcp_reassembly *assy); void tcp_reassembly_init(struct tcp_reassembly *assy, uint32_t syn_seq); void tcp_reassembly_expire(struct tcp_reassembly *assy, uint64_t now); void tcp_reassembly_insert(struct tcp_reassembly *assy, uint32_t seq, const char *payload, uint32_t len, uint64_t now); const char *tcp_reassembly_peek(struct tcp_reassembly *assy, uint32_t *len); void tcp_reassembly_consume(struct tcp_reassembly *assy, uint32_t len); struct tcp_reassembly_stat *tcp_reassembly_get_stat(struct tcp_reassembly *assy); void tcp_reassembly_print_stat(struct tcp_reassembly *assy); #ifdef __cpluscplus } #endif #endif