aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/include/ndpi_api.h.in7
-rw-r--r--src/include/ndpi_typedefs.h21
-rw-r--r--src/lib/ndpi_analyze.c83
3 files changed, 111 insertions, 0 deletions
diff --git a/src/include/ndpi_api.h.in b/src/include/ndpi_api.h.in
index 0b8ff24b5..f94091cc8 100644
--- a/src/include/ndpi_api.h.in
+++ b/src/include/ndpi_api.h.in
@@ -1064,6 +1064,13 @@ extern "C" {
/* Get cardinality estimation */
double ndpi_hll_count(struct ndpi_hll *hll);
+
+ /* ******************************* */
+
+ int ndpi_init_bin(struct ndpi_bin *b, enum ndpi_bin_family f, u_int8_t num_bins);
+ void ndpi_free_bin(struct ndpi_bin *b);
+ void ndpi_inc_bin(struct ndpi_bin *b, u_int8_t slot_id);
+ void ndpi_normalize_bin(struct ndpi_bin *b);
#ifdef __cplusplus
}
diff --git a/src/include/ndpi_typedefs.h b/src/include/ndpi_typedefs.h
index 79288e5bc..3784f995a 100644
--- a/src/include/ndpi_typedefs.h
+++ b/src/include/ndpi_typedefs.h
@@ -1498,4 +1498,25 @@ struct ndpi_hll {
u_int8_t *registers;
};
+/* **************************************** */
+
+enum ndpi_bin_family {
+ ndpi_bin_family8,
+ ndpi_bin_family16,
+ ndpi_bin_family32
+};
+
+struct ndpi_bin {
+ u_int8_t num_bins;
+ enum ndpi_bin_family family;
+ u_int32_t num_incs;
+
+ union {
+ u_int8_t *bins8; /* num_bins bins */
+ u_int16_t *bins16; /* num_bins bins */
+ u_int32_t *bins32; /* num_bins bins */
+ } u;
+};
+
+
#endif /* __NDPI_TYPEDEFS_H__ */
diff --git a/src/lib/ndpi_analyze.c b/src/lib/ndpi_analyze.c
index 2d7e11abc..e1f37cc8d 100644
--- a/src/lib/ndpi_analyze.c
+++ b/src/lib/ndpi_analyze.c
@@ -233,3 +233,86 @@ void ndpi_hll_add_number(struct ndpi_hll *hll, u_int32_t value) {
double ndpi_hll_count(struct ndpi_hll *hll) {
return(hll_count(hll));
}
+
+/* ********************************************************************************* */
+/* ********************************************************************************* */
+
+int ndpi_init_bin(struct ndpi_bin *b, enum ndpi_bin_family f, u_int8_t num_bins) {
+ b->num_bins = num_bins, b->family = f, b->num_incs = 0;
+
+ switch(f) {
+ case ndpi_bin_family8:
+ if((b->u.bins8 = (u_int8_t*)calloc(num_bins, sizeof(u_int8_t))) == NULL)
+ return(-1);
+ break;
+
+ case ndpi_bin_family16:
+ if((b->u.bins16 = (u_int16_t*)calloc(num_bins, sizeof(u_int16_t))) == NULL)
+ return(-1);
+ break;
+
+ case ndpi_bin_family32:
+ if((b->u.bins32 = (u_int32_t*)calloc(num_bins, sizeof(u_int32_t))) == NULL)
+ return(-1);
+ break;
+ }
+
+ return(0);
+}
+
+void ndpi_free_bin(struct ndpi_bin *b) {
+ switch(b->family) {
+ case ndpi_bin_family8:
+ free(b->u.bins8);
+ break;
+ case ndpi_bin_family16:
+ free(b->u.bins16);
+ break;
+ case ndpi_bin_family32:
+ free(b->u.bins32);
+ break;
+ }
+}
+
+void ndpi_inc_bin(struct ndpi_bin *b, u_int8_t slot_id) {
+ if(slot_id >= b->num_bins) slot_id = 0;
+
+ b->num_incs += 1;
+
+ switch(b->family) {
+ case ndpi_bin_family8:
+ b->u.bins8[slot_id]++;
+ break;
+ case ndpi_bin_family16:
+ b->u.bins16[slot_id]++;
+ break;
+ case ndpi_bin_family32:
+ b->u.bins32[slot_id]++;
+ break;
+ }
+}
+
+/*
+ Each bin slot is transformed in a % with respect to the value total
+ */
+void ndpi_normalize_bin(struct ndpi_bin *b) {
+ u_int8_t i;
+
+ if(b->num_incs == 0) return;
+
+ switch(b->family) {
+ case ndpi_bin_family8:
+ for(i=0; i<b->num_bins; i++)
+ b->u.bins8[i] = (b->u.bins8[i]*100) / b->num_incs;
+ break;
+ case ndpi_bin_family16:
+ for(i=0; i<b->num_bins; i++)
+ b->u.bins16[i] = (b->u.bins16[i]*100) / b->num_incs;
+ break;
+ case ndpi_bin_family32:
+ for(i=0; i<b->num_bins; i++)
+ b->u.bins32[i] = (b->u.bins32[i]*100) / b->num_incs;
+ break;
+ }
+}
+