summaryrefslogtreecommitdiff
path: root/infra/ip_reassembly/ip_reassembly.h
blob: 25ecb6a841dd15d0c35ee79c9e5f5bb32da42125 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#pragma once

#ifdef __cplusplus
extern "C"
{
#endif

#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;

    uint64_t ip4_frags;
    uint64_t ip4_frags_freed;
    uint64_t ip4_frags_buffered;
    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;

    uint64_t ip6_frags;
    uint64_t ip6_frags_freed;
    uint64_t ip6_frags_buffered;
    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)));

#define IP_REASS_STAT_MAP(XX)                                            \
    XX(IP_REASS_STAT_IP4_DEFRAGS_EXPECTED, ip4_defrags_expected)         \
    XX(IP_REASS_STAT_IP4_DEFRAGS_SUCCEED, ip4_defrags_succeed)           \
    XX(IP_REASS_STAT_IP4_DEFRAGS_FAILED, ip4_defrags_failed)             \
    XX(IP_REASS_STAT_IP4_FRAGS, ip4_frags)                               \
    XX(IP_REASS_STAT_IP4_FRAGS_FREED, ip4_frags_freed)                   \
    XX(IP_REASS_STAT_IP4_FRAGS_BUFFERED, ip4_frags_buffered)             \
    XX(IP_REASS_STAT_IP4_FRAGS_NO_BUFFER, ip4_frags_no_buffer)           \
    XX(IP_REASS_STAT_IP4_FRAGS_TIMEOUT, ip4_frags_timeout)               \
    XX(IP_REASS_STAT_IP4_FRAGS_INVALID_LENGTH, ip4_frags_invalid_length) \
    XX(IP_REASS_STAT_IP4_FRAGS_OVERLAP, ip4_frags_overlap)               \
    XX(IP_REASS_STAT_IP4_FRAGS_TOO_MANY, ip4_frags_too_many)             \
    XX(IP_REASS_STAT_IP6_DEFRAGS_EXPECTED, ip6_defrags_expected)         \
    XX(IP_REASS_STAT_IP6_DEFRAGS_SUCCEED, ip6_defrags_succeed)           \
    XX(IP_REASS_STAT_IP6_DEFRAGS_FAILED, ip6_defrags_failed)             \
    XX(IP_REASS_STAT_IP6_FRAGS, ip6_frags)                               \
    XX(IP_REASS_STAT_IP6_FRAGS_FREED, ip6_frags_freed)                   \
    XX(IP_REASS_STAT_IP6_FRAGS_BUFFERED, ip6_frags_buffered)             \
    XX(IP_REASS_STAT_IP6_FRAGS_NO_BUFFER, ip6_frags_no_buffer)           \
    XX(IP_REASS_STAT_IP6_FRRAGS_TIMEOUT, ip6_frags_timeout)              \
    XX(IP_REASS_STAT_IP6_FRAGS_INVALID_LENGTH, ip6_frags_invalid_length) \
    XX(IP_REASS_STAT_IP6_FRAGS_OVERLAP, ip6_frags_overlap)               \
    XX(IP_REASS_STAT_IP6_FRAGS_TOO_MANY, ip6_frags_too_many)

enum ip_reass_stat_type
{
#define XX(type, name) type,
    IP_REASS_STAT_MAP(XX)
#undef XX
    IP_REASS_STAT_MAX
};

__attribute__((unused)) static const char ip_reass_stat_str[IP_REASS_STAT_MAX][64] =
{
#define XX(type, name) #name,
    IP_REASS_STAT_MAP(XX)
#undef XX
};

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 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);

struct ip_reassembly_stat *ip_reassembly_get_stat(struct ip_reassembly *ip_reass);
void ip_reassembly_print_stat(struct ip_reassembly *ip_reass);

uint64_t ip_reassembly_stat_get(struct ip_reassembly_stat *stat, enum ip_reass_stat_type type);

#ifdef __cplusplus
}
#endif