feature: packet IO support IP reassembly
This commit is contained in:
@@ -5,66 +5,47 @@ extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
struct ip_reassembly_config
|
||||
{
|
||||
uint8_t enable;
|
||||
uint32_t bucket_entries; // range: [1, 4294967295] (must be power of 2)
|
||||
uint32_t bucket_num; // range: [1, 4294967295]
|
||||
|
||||
uint64_t ip_frag_timeout_ms; // range: [1, 60000] (ms)
|
||||
uint64_t ip_frag_expire_polling_interval_ms; // range: [0, 60000] (ms)
|
||||
uint64_t ip_frag_expire_polling_limit; // range: [1, 1024]
|
||||
};
|
||||
#include <stdint.h>
|
||||
|
||||
struct ip_reassembly_stat
|
||||
{
|
||||
// IPv4 frag stat
|
||||
uint64_t ip4_defrags_expected;
|
||||
uint64_t ip4_defrags_succeed;
|
||||
uint64_t ip4_defrags_failed_timeout;
|
||||
uint64_t ip4_defrags_failed_invalid_length;
|
||||
uint64_t ip4_defrags_failed_overlap;
|
||||
uint64_t ip4_defrags_failed_too_many_frag;
|
||||
uint64_t ip4_defrags_failed;
|
||||
|
||||
uint64_t ip4_frags;
|
||||
uint64_t ip4_frags_freed;
|
||||
uint64_t ip4_frags_buffered;
|
||||
uint64_t ip4_frags_bypass_no_buffer;
|
||||
uint64_t ip4_frags_bypass_dup_fist_frag;
|
||||
uint64_t ip4_frags_bypass_dup_last_frag;
|
||||
uint64_t ip4_frags_no_buffer;
|
||||
uint64_t ip4_frags_timeout;
|
||||
uint64_t ip4_frags_invalid_length;
|
||||
uint64_t ip4_frags_overlap;
|
||||
uint64_t ip4_frags_too_many;
|
||||
|
||||
// IPv6 frag stat
|
||||
uint64_t ip6_defrags_expected;
|
||||
uint64_t ip6_defrags_succeed;
|
||||
uint64_t ip6_defrags_failed_timeout;
|
||||
uint64_t ip6_defrags_failed_invalid_length;
|
||||
uint64_t ip6_defrags_failed_overlap;
|
||||
uint64_t ip6_defrags_failed_too_many_frag;
|
||||
uint64_t ip6_defrags_failed;
|
||||
|
||||
uint64_t ip6_frags;
|
||||
uint64_t ip6_frags_freed;
|
||||
uint64_t ip6_frags_buffered;
|
||||
uint64_t ip6_frags_bypass_no_buffer;
|
||||
uint64_t ip6_frags_bypass_dup_fist_frag;
|
||||
uint64_t ip6_frags_bypass_dup_last_frag;
|
||||
uint64_t ip6_frags_no_buffer;
|
||||
uint64_t ip6_frags_timeout;
|
||||
uint64_t ip6_frags_invalid_length;
|
||||
uint64_t ip6_frags_overlap;
|
||||
uint64_t ip6_frags_too_many;
|
||||
} __attribute__((aligned(64)));
|
||||
|
||||
struct ip_reassembly_config *ip_reassembly_config_new(const char *toml_file);
|
||||
void ip_reassembly_config_free(struct ip_reassembly_config *cfg);
|
||||
void ip_reassembly_config_print(const struct ip_reassembly_config *cfg);
|
||||
struct ip_reassembly *ip_reassembly_new(uint64_t timeout_ms, uint64_t frag_queue_num, uint64_t frag_queue_size);
|
||||
void ip_reassembly_free(struct ip_reassembly *ip_reass);
|
||||
|
||||
struct ip_reassembly *ip_reassembly_new(const struct ip_reassembly_config *cfg, uint64_t now);
|
||||
void ip_reassembly_free(struct ip_reassembly *assy);
|
||||
void ip_reassembly_expire(struct ip_reassembly *assy, uint64_t now);
|
||||
struct ip_reassembly_stat *ip_reassembly_stat(struct ip_reassembly *assy);
|
||||
struct packet *ip_reassembly_defrag(struct ip_reassembly *ip_reass, struct packet *pkt, uint64_t now);
|
||||
struct packet *ip_reassembly_clean(struct ip_reassembly *ip_reass, uint64_t now_ms);
|
||||
|
||||
/*
|
||||
* Returns the reassembled packet, or NULL if the packet is not reassembled
|
||||
* The returned packet should be freed by calling the packet_free() function
|
||||
*/
|
||||
struct packet *ip_reassembly_packet(struct ip_reassembly *assy, const struct packet *pkt, uint64_t now);
|
||||
struct packet *ipv4_reassembly_packet(struct ip_reassembly *assy, const struct packet *pkt, uint64_t now);
|
||||
struct packet *ipv6_reassembly_packet(struct ip_reassembly *assy, const struct packet *pkt, uint64_t now);
|
||||
struct ip_reassembly_stat *ip_reassembly_get_stat(struct ip_reassembly *ip_reass);
|
||||
void ip_reassembly_print_stat(struct ip_reassembly *ip_reass);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user