aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Nardi <12729895+IvanNardi@users.noreply.github.com>2023-09-12 19:47:14 +0200
committerGitHub <noreply@github.com>2023-09-12 19:47:14 +0200
commitc5cd4df0568de8b01baa7294a0fc12964bee4272 (patch)
treec40c33d6545d08917198d3245bbbc3239114d0e9
parent5bcf3c2dddf1f4373994d6ee06b9ff468eb72a60 (diff)
Add `ndpi_domain_classify_finalize()` function (#2084)
The "domain classify" data structure is immutable, since it uses "bitmap64". Allow to finalize it before starting to process packets (i.e. before calling `ndpi_domain_classify_contains()`) to avoid, in the data-path, all the memory allocations due to compression. Calling `ndpi_domain_classify_finalize()` is optional.
-rw-r--r--src/include/ndpi_api.h1
-rw-r--r--src/lib/ndpi_domain_classify.c16
-rw-r--r--src/lib/ndpi_main.c1
3 files changed, 18 insertions, 0 deletions
diff --git a/src/include/ndpi_api.h b/src/include/ndpi_api.h
index 9189a3a95..8de858188 100644
--- a/src/include/ndpi_api.h
+++ b/src/include/ndpi_api.h
@@ -2104,6 +2104,7 @@ extern "C" {
u_int32_t ndpi_domain_classify_add_domains(ndpi_domain_classify *s,
u_int8_t class_id,
char *file_path);
+ bool ndpi_domain_classify_finalize(ndpi_domain_classify *s);
bool ndpi_domain_classify_contains(ndpi_domain_classify *s,
u_int8_t *class_id /* out */,
const char *domain);
diff --git a/src/lib/ndpi_domain_classify.c b/src/lib/ndpi_domain_classify.c
index b56101a7e..c475c46f9 100644
--- a/src/lib/ndpi_domain_classify.c
+++ b/src/lib/ndpi_domain_classify.c
@@ -179,6 +179,22 @@ u_int32_t ndpi_domain_classify_add_domains(ndpi_domain_classify *s,
/* ********************************************************** */
+bool ndpi_domain_classify_finalize(ndpi_domain_classify *s) {
+ u_int32_t i;
+
+ if(!s)
+ return(false);
+
+ for(i=0; i<MAX_NUM_NDPI_DOMAIN_CLASSIFICATIONS; i++) {
+ if(s->classes[i].class_id != 0) {
+ ndpi_bitmap64_compress(s->classes[i].domains);
+ }
+ }
+ return(true);
+}
+
+/* ********************************************************** */
+
static bool is_valid_domain_char(u_char c) {
if(((c >= 'A')&& (c <= 'Z'))
|| ((c >= 'a')&& (c <= 'z'))
diff --git a/src/lib/ndpi_main.c b/src/lib/ndpi_main.c
index c2a5b2f2f..6cbbcf252 100644
--- a/src/lib/ndpi_main.c
+++ b/src/lib/ndpi_main.c
@@ -6959,6 +6959,7 @@ int ndpi_enable_loaded_categories(struct ndpi_detection_module_struct *ndpi_str)
}
#else
ndpi_domain_classify_free(ndpi_str->custom_categories.sc_hostnames);
+ ndpi_domain_classify_finalize(ndpi_str->custom_categories.sc_hostnames_shadow);
ndpi_str->custom_categories.sc_hostnames = ndpi_str->custom_categories.sc_hostnames_shadow;
ndpi_str->custom_categories.sc_hostnames_shadow = ndpi_domain_classify_alloc();
#endif