aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--example/ndpiReader.c25
-rw-r--r--src/include/ndpi_api.h.in8
-rw-r--r--src/include/ndpi_typedefs.h7
-rw-r--r--src/lib/ndpi_analyze.c39
4 files changed, 79 insertions, 0 deletions
diff --git a/example/ndpiReader.c b/example/ndpiReader.c
index 5fbf9ebe2..a4fb74246 100644
--- a/example/ndpiReader.c
+++ b/example/ndpiReader.c
@@ -3690,6 +3690,30 @@ void rulesUnitTest() {
/* *********************************************** */
+void rsiUnitTest() {
+ struct ndpi_rsi_struct s;
+ unsigned int v[] = {
+ 2227, 2219, 2208, 2217, 2218, 2213, 2223, 2243, 2224, 2229,
+ 2215, 2239, 2238, 2261, 2336, 2405, 2375, 2383, 2395, 2363,
+ 2382, 2387, 2365, 2319, 2310, 2333, 2268, 2310, 2240, 2217,
+ };
+ u_int i, n = sizeof(v) / sizeof(unsigned int);
+
+ ndpi_init_rsi(&s, 8);
+
+ for(i=0; i<n; i++) {
+ float rsi = ndpi_rsi_add_value(&s, v[i]);
+
+#if 0
+ printf("%2d) RSI = %f\n", i, rsi);
+#endif
+ }
+
+ ndpi_free_rsi(&s);
+}
+
+/* *********************************************** */
+
void hashUnitTest() {
ndpi_str_hash *h = ndpi_hash_alloc(16384);
char* dict[] = { "hello", "world", NULL };
@@ -3731,6 +3755,7 @@ int orginal_main(int argc, char **argv) {
/* Internal checks */
// binUnitTest();
+ rsiUnitTest();
hashUnitTest();
dgaUnitTest();
hllUnitTest();
diff --git a/src/include/ndpi_api.h.in b/src/include/ndpi_api.h.in
index 18936f9ff..0d68237a6 100644
--- a/src/include/ndpi_api.h.in
+++ b/src/include/ndpi_api.h.in
@@ -1389,6 +1389,14 @@ extern "C" {
u_int32_t ndpi_data_max(struct ndpi_analyze_struct *s);
float ndpi_data_ratio(u_int32_t sent, u_int32_t rcvd);
+ /* ******************************* */
+
+ void ndpi_init_rsi(struct ndpi_rsi_struct *s, u_int16_t num_learning_values);
+ void ndpi_free_rsi(struct ndpi_rsi_struct *s);
+ float ndpi_rsi_add_value(struct ndpi_rsi_struct *s, const u_int32_t value);
+
+ /* ******************************* */
+
const char* ndpi_data_ratio2str(float ratio);
void ndpi_data_print_window_values(struct ndpi_analyze_struct *s); /* debug */
diff --git a/src/include/ndpi_typedefs.h b/src/include/ndpi_typedefs.h
index 0ce2310c8..a3910a7df 100644
--- a/src/include/ndpi_typedefs.h
+++ b/src/include/ndpi_typedefs.h
@@ -1544,6 +1544,13 @@ struct ndpi_analyze_struct {
/* **************************************** */
+struct ndpi_rsi_struct {
+ struct ndpi_analyze_struct *gains, *losses;
+ u_int32_t last_value;
+};
+
+/* **************************************** */
+
typedef struct ndpi_ptree ndpi_ptree_t;
/* **************************************** */
diff --git a/src/lib/ndpi_analyze.c b/src/lib/ndpi_analyze.c
index 753b20036..3b1b2557f 100644
--- a/src/lib/ndpi_analyze.c
+++ b/src/lib/ndpi_analyze.c
@@ -817,3 +817,42 @@ int ndpi_cluster_bins(struct ndpi_bin *bins, u_int16_t num_bins,
}
/* ********************************************************************************* */
+
+/*
+ RSI (Relative Strength Index)
+
+ RSI = 100 − [ 100/ (1 + (Average loss/Average gain)) ]
+
+ https://www.investopedia.com/terms/r/rsi.asp
+*/
+
+void ndpi_init_rsi(struct ndpi_rsi_struct *s, u_int16_t num_learning_values) {
+ s->gains = ndpi_alloc_data_analysis(num_learning_values);
+ s->losses = ndpi_alloc_data_analysis(num_learning_values);
+ s->last_value = 0;
+}
+
+void ndpi_free_rsi(struct ndpi_rsi_struct *s) {
+ ndpi_free_data_analysis(s->gains), ndpi_free_data_analysis(s->losses);
+}
+
+float ndpi_rsi_add_value(struct ndpi_rsi_struct *s, const u_int32_t value) {
+ if(s->gains->num_data_entries == 0)
+ ndpi_data_add_value(s->gains, 0), ndpi_data_add_value(s->losses, 0);
+ else {
+ if(value > s->last_value)
+ ndpi_data_add_value(s->gains, value - s->last_value), ndpi_data_add_value(s->losses, 0);
+ else
+ ndpi_data_add_value(s->losses, s->last_value - value), ndpi_data_add_value(s->gains, 0);
+ }
+
+ s->last_value = value;
+
+ if(s->gains->num_data_entries >= s->gains->num_values_array_len) {
+ float relative_strength = ndpi_data_average(s->gains) / ndpi_data_average(s->losses);
+
+ /* printf("RSI: %f\n", relative_strength); */
+ return(100. - (100. / (1. + relative_strength)));
+ } else
+ return(-1); /* Too early */
+}