summaryrefslogtreecommitdiff
path: root/infra/ip_reassembly
diff options
context:
space:
mode:
authorluwenpeng <[email protected]>2024-10-31 16:25:37 +0800
committerluwenpeng <[email protected]>2024-11-01 15:34:07 +0800
commit89971d4b0adeb1fc50ae29e9d8f75299070c24e3 (patch)
treec960c22c546000fa29ec8e48fad7798e503ea48c /infra/ip_reassembly
parentd56cda3d9aadff2bb98529467452d7097bd167cc (diff)
packet IO support output fieldstat
Diffstat (limited to 'infra/ip_reassembly')
-rw-r--r--infra/ip_reassembly/ip_reassembly.c12
-rw-r--r--infra/ip_reassembly/ip_reassembly.h41
2 files changed, 53 insertions, 0 deletions
diff --git a/infra/ip_reassembly/ip_reassembly.c b/infra/ip_reassembly/ip_reassembly.c
index dd4e749..e7224c8 100644
--- a/infra/ip_reassembly/ip_reassembly.c
+++ b/infra/ip_reassembly/ip_reassembly.c
@@ -752,3 +752,15 @@ void ip_reassembly_print_stat(struct ip_reassembly *ip_reass)
IP_REASSEMBLY_LOG_INFO("ip_reass: %p, ip6_frags_too_many : %lu", ip_reass, ip_reass->stat.ip6_frags_too_many);
}
}
+
+uint64_t ip_reassembly_stat_get(struct ip_reassembly_stat *stat, enum ip_reass_stat_type type)
+{
+ switch (type)
+ {
+#define XX(_type, _name) case _type: return stat->_name;
+ IP_REASS_STAT_MAP(XX)
+#undef XX
+ default:
+ return 0;
+ }
+} \ No newline at end of file
diff --git a/infra/ip_reassembly/ip_reassembly.h b/infra/ip_reassembly/ip_reassembly.h
index 572ede8..25ecb6a 100644
--- a/infra/ip_reassembly/ip_reassembly.h
+++ b/infra/ip_reassembly/ip_reassembly.h
@@ -38,6 +38,45 @@ struct ip_reassembly_stat
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);
@@ -47,6 +86,8 @@ struct packet *ip_reassembly_clean(struct ip_reassembly *ip_reass, 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);
+uint64_t ip_reassembly_stat_get(struct ip_reassembly_stat *stat, enum ip_reass_stat_type type);
+
#ifdef __cplusplus
}
#endif