diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/include/ndpi_api.h.in | 7 | ||||
-rw-r--r-- | src/include/ndpi_typedefs.h | 21 | ||||
-rw-r--r-- | src/lib/ndpi_analyze.c | 83 |
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; + } +} + |