From 71a73869218fee8317186d8c63622ccf405df376 Mon Sep 17 00:00:00 2001
From: armatusmiles <akurotych@gmail.com>
Date: Tue, 28 Aug 2018 15:33:47 +0300
Subject: [PATCH] [+] traffic_track module template

---
 dap_server.c        | 10 +++++-----
 dap_server.h        |  2 +-
 dap_server_client.c | 34 +++++++++++++---------------------
 dap_server_client.h | 32 ++++++++++++++++----------------
 dap_traffic_track.c | 36 ++++++++++++++++++++++++++++++++++++
 dap_traffic_track.h | 29 +++++++++++++++++++++++++++++
 6 files changed, 100 insertions(+), 43 deletions(-)
 create mode 100644 dap_traffic_track.c
 create mode 100644 dap_traffic_track.h

diff --git a/dap_server.c b/dap_server.c
index 28c412f..244a96f 100644
--- a/dap_server.c
+++ b/dap_server.c
@@ -100,7 +100,7 @@ dap_server_t * dap_server_new()
  */
 void dap_server_delete(dap_server_t * sh)
 {
-    dap_client_remote_t * dap_cur, * tmp;
+    dap_server_client_t * dap_cur, * tmp;
     if(sh->address)
         free(sh->address);
 
@@ -141,17 +141,16 @@ static void async_cb (EV_P_ ev_async *w, int revents)
 static void read_write_cb (struct ev_loop* loop, struct ev_io* watcher, int revents)
 {
     dap_server_t* sh = watcher->data;
-    dap_client_remote_t* dap_cur = dap_client_find(watcher->fd, sh);
+    dap_server_client_t* dap_cur = dap_client_find(watcher->fd, sh);
 
     if ( revents & EV_READ )
     {
         if(dap_cur)
         {
-            int bytes_read = recv(dap_cur->socket,
+            ssize_t bytes_read = recv(dap_cur->socket,
                                   dap_cur->buf_in + dap_cur->buf_in_size,
                                   sizeof(dap_cur->buf_in) - dap_cur->buf_in_size,
                                   0);
-
             if(bytes_read > 0)
             {
                 dap_cur->buf_in_size += bytes_read;
@@ -182,7 +181,7 @@ static void read_write_cb (struct ev_loop* loop, struct ev_io* watcher, int reve
         {
             for(size_t total_sent = 0; total_sent < dap_cur->buf_out_size;) {
                 //log_it(L_DEBUG, "Output: %u from %u bytes are sent ", total_sent, dap_cur->buf_out_size);
-                int bytes_sent = send(dap_cur->socket,
+                ssize_t bytes_sent = send(dap_cur->socket,
                                       dap_cur->buf_out + total_sent,
                                       dap_cur->buf_out_size - total_sent,
                                       MSG_DONTWAIT | MSG_NOSIGNAL );
@@ -280,6 +279,7 @@ dap_server_t* dap_server_listen(const char * addr, uint16_t port, dap_server_typ
 
 void* thread_loop(void * arg)
 {
+    (void)arg;
     log_it(L_NOTICE, "Start loop listener socket thread");
     ev_loop(listener_clients_loop, 0);
     return NULL;
diff --git a/dap_server.h b/dap_server.h
index 50231b0..3ce0162 100644
--- a/dap_server.h
+++ b/dap_server.h
@@ -44,7 +44,7 @@ typedef struct dap_server{
     uint16_t port; // Listen port
     char * address; // Listen address
 
-    dap_client_remote_t * clients; // Hashmap of clients
+    dap_server_client_t * clients; // Hashmap of clients
 
     int socket_listener; // Socket for listener
     int epoll_fd; // Epoll fd
diff --git a/dap_server_client.c b/dap_server_client.c
index bb554f9..d0432a1 100644
--- a/dap_server_client.c
+++ b/dap_server_client.c
@@ -31,7 +31,6 @@
 
 #define LOG_TAG "dap_client_remote"
 
-
 /**
  * @brief dap_client_init Init clients module
  * @return Zero if ok others if no
@@ -56,12 +55,12 @@ void dap_client_remote_deinit()
  * @param s Client's socket
  * @return Pointer to the new list's node
  */
-dap_client_remote_t * dap_client_create(dap_server_t * sh, int s, ev_io* w_client)
+dap_server_client_t * dap_client_create(dap_server_t * sh, int s, ev_io* w_client)
 {
     pthread_mutex_lock(&sh->mutex_on_hash);
     log_it(L_DEBUG, "Client structure create");
 
-    dap_client_remote_t * ret = DAP_NEW_Z(dap_client_remote_t);
+    dap_server_client_t * ret = DAP_NEW_Z(dap_server_client_t);
     ret->socket = s;
     ret->server = sh;
     ret->watcher_client = w_client;
@@ -81,9 +80,9 @@ dap_client_remote_t * dap_client_create(dap_server_t * sh, int s, ev_io* w_clien
  * @param sh
  * @return
  */
-dap_client_remote_t * dap_client_find(int sock, struct dap_server * sh)
+dap_server_client_t * dap_client_find(int sock, struct dap_server * sh)
 {
-    dap_client_remote_t * ret = NULL;
+    dap_server_client_t * ret = NULL;
     pthread_mutex_lock(&sh->mutex_on_hash);
     HASH_FIND_INT(sh->clients, &sock, ret);
     pthread_mutex_unlock(&sh->mutex_on_hash);
@@ -95,11 +94,10 @@ dap_client_remote_t * dap_client_find(int sock, struct dap_server * sh)
  * @param sc
  * @param isReady
  */
-void dap_client_ready_to_read(dap_client_remote_t * sc,bool is_ready)
+void dap_client_ready_to_read(dap_server_client_t * sc,bool is_ready)
 {
     if(is_ready != sc->_ready_to_read) {
-
-        uint32_t events = 0;
+        int events = 0;
         sc->_ready_to_read=is_ready;
 
         if(sc->_ready_to_read)
@@ -117,11 +115,10 @@ void dap_client_ready_to_read(dap_client_remote_t * sc,bool is_ready)
  * @param sc
  * @param isReady
  */
-void dap_client_ready_to_write(dap_client_remote_t * sc,bool is_ready)
+void dap_client_ready_to_write(dap_server_client_t * sc,bool is_ready)
 {
     if(is_ready != sc->_ready_to_write) {
-
-        uint32_t events = 0;
+        int events = 0;
         sc->_ready_to_write=is_ready;
 
         if(sc->_ready_to_read)
@@ -139,7 +136,7 @@ void dap_client_ready_to_write(dap_client_remote_t * sc,bool is_ready)
  * @brief safe_client_remove Removes the client from the list
  * @param sc Client instance
  */
-void dap_client_remove(dap_client_remote_t *sc, struct dap_server * sh)
+void dap_client_remove(dap_server_client_t *sc, struct dap_server * sh)
 {
     pthread_mutex_lock(&sh->mutex_on_hash);
 
@@ -164,7 +161,7 @@ void dap_client_remove(dap_client_remote_t *sc, struct dap_server * sh)
  * @param data_size Size of data to write
  * @return Number of bytes that were placed into the buffer
  */
-size_t dap_client_write(dap_client_remote_t *sc, const void * data, size_t data_size)
+size_t dap_client_write(dap_server_client_t *sc, const void * data, size_t data_size)
 {
      data_size = ((sc->buf_out_size+data_size)<(sizeof(sc->buf_out)))?data_size:(sizeof(sc->buf_out)-sc->buf_out_size );
      memcpy(sc->buf_out+sc->buf_out_size,data,data_size);
@@ -178,7 +175,7 @@ size_t dap_client_write(dap_client_remote_t *sc, const void * data, size_t data_
  * @param a_format Format
  * @return Number of bytes that were placed into the buffer
  */
-size_t dap_client_write_f(dap_client_remote_t *a_client, const char * a_format,...)
+size_t dap_client_write_f(dap_server_client_t *a_client, const char * a_format,...)
 {
     size_t max_data_size = sizeof(a_client->buf_out)-a_client->buf_out_size;
     va_list ap;
@@ -201,13 +198,8 @@ size_t dap_client_write_f(dap_client_remote_t *a_client, const char * a_format,.
  * @param data_size Size of data to read
  * @return Actual bytes number that were read
  */
-size_t dap_client_read(dap_client_remote_t *sc, void * data, size_t data_size)
+size_t dap_client_read(dap_server_client_t *sc, void * data, size_t data_size)
 {
-	
-    //log_it(L_DEBUG, "Size of package: %d\n", (int)data_size);
-    //
-    // hexdump(data, data_size);  packet dump
-
     if (data_size < sc->buf_in_size) {
         memcpy(data, sc->buf_in, data_size);
         memmove(data, sc->buf_in + data_size, sc->buf_in_size - data_size);
@@ -227,7 +219,7 @@ size_t dap_client_read(dap_client_remote_t *sc, void * data, size_t data_size)
  * @param cl Client instance
  * @param shrink_size Size on wich we shrink the buffer with shifting it left
  */
-void dap_client_shrink_buf_in(dap_client_remote_t * cl, size_t shrink_size)
+void dap_client_shrink_buf_in(dap_server_client_t * cl, size_t shrink_size)
 {
     if((shrink_size==0)||(cl->buf_in_size==0) ){
         return;
diff --git a/dap_server_client.h b/dap_server_client.h
index f857572..e783e0e 100644
--- a/dap_server_client.h
+++ b/dap_server_client.h
@@ -29,13 +29,13 @@
 
 
 typedef struct dap_server dap_server_t;
-struct dap_client_remote;
+struct dap_server_client;
 
-typedef void (*dap_client_remote_callback_t) (struct dap_client_remote *,void * arg); // Callback for specific client operations
+typedef void (*dap_client_remote_callback_t) (struct dap_server_client *,void * arg); // Callback for specific client operations
 
-#define DAP_CLIENT_REMOTE_BUF 100000
+#define DAP_CLIENT_REMOTE_BUF 10000
 
-typedef struct dap_client_remote{
+typedef struct dap_server_client{
     int socket;
     bool signal_close;
 
@@ -61,27 +61,27 @@ typedef struct dap_client_remote{
 
     void * _internal;
     void * _inheritor; // Internal data to specific client type, usualy states for state machine
-} dap_client_remote_t; // Node of bidirectional list of clients
+} dap_server_client_t; // Node of bidirectional list of clients
 
 
 
 int dap_client_remote_init(void); //  Init clients module
 void dap_client_remote_deinit(void); // Deinit clients module
 
-dap_client_remote_t * dap_client_create(struct dap_server * sh, int s, ev_io* w_client); // Create new client and add it to the list
-dap_client_remote_t * dap_client_find(int sock, struct dap_server * sh); // Find client by socket
+dap_server_client_t * dap_client_create(struct dap_server * sh, int s, ev_io* w_client); // Create new client and add it to the list
+dap_server_client_t * dap_client_find(int sock, struct dap_server * sh); // Find client by socket
 
-bool dap_client_is_ready_to_read(dap_client_remote_t * sc);
-bool dap_client_is_ready_to_write(dap_client_remote_t * sc);
-void dap_client_ready_to_read(dap_client_remote_t * sc,bool is_ready);
-void dap_client_ready_to_write(dap_client_remote_t * sc,bool is_ready);
+bool dap_client_is_ready_to_read(dap_server_client_t * sc);
+bool dap_client_is_ready_to_write(dap_server_client_t * sc);
+void dap_client_ready_to_read(dap_server_client_t * sc,bool is_ready);
+void dap_client_ready_to_write(dap_server_client_t * sc,bool is_ready);
 
-size_t dap_client_write(dap_client_remote_t *sc, const void * data, size_t data_size);
-size_t dap_client_write_f(dap_client_remote_t *a_client, const char * a_format,...);
-size_t dap_client_read(dap_client_remote_t *sc, void * data, size_t data_size);
+size_t dap_client_write(dap_server_client_t *sc, const void * data, size_t data_size);
+size_t dap_client_write_f(dap_server_client_t *a_client, const char * a_format,...);
+size_t dap_client_read(dap_server_client_t *sc, void * data, size_t data_size);
 
-void dap_client_remove(dap_client_remote_t *sc, struct dap_server * sh); // Removes the client from the list
+void dap_client_remove(dap_server_client_t *sc, struct dap_server * sh); // Removes the client from the list
 
-void dap_client_shrink_buf_in(dap_client_remote_t * cl, size_t shrink_size);
+void dap_client_shrink_buf_in(dap_server_client_t * cl, size_t shrink_size);
 
 #endif
diff --git a/dap_traffic_track.c b/dap_traffic_track.c
new file mode 100644
index 0000000..007888a
--- /dev/null
+++ b/dap_traffic_track.c
@@ -0,0 +1,36 @@
+#include "dap_traffic_track.h"
+#include "dap_common.h"
+
+#define LOG_TAG "dap_traffic_track"
+
+static dap_traffic_callback_t callback;
+static dap_server_client_t * server_clients;
+static ev_timer timeout_watcher;
+static struct ev_loop *loop;
+
+static void timeout_cb()
+{
+    log_it(L_DEBUG, "timeout_cb CB");
+}
+
+void dap_traffic_track_init(dap_server_client_t * clients,
+                            time_t timeout)
+{
+    server_clients = clients;
+    timeout_watcher.repeat = timeout;
+    loop = EV_DEFAULT;
+    ev_init(&timeout_watcher, timeout_cb);
+    ev_timer_again (loop, &timeout_watcher);
+    log_it(L_NOTICE, "Initialized traffic track module");
+}
+
+void dap_traffic_track_deinit()
+{
+    ev_timer_stop (loop, &timeout_watcher);
+    log_it(L_NOTICE, "Deinitialized traffic track module");
+}
+
+void dap_traffic_set_callback(dap_traffic_callback_t cb)
+{
+   callback = cb;
+}
diff --git a/dap_traffic_track.h b/dap_traffic_track.h
new file mode 100644
index 0000000..a8a8886
--- /dev/null
+++ b/dap_traffic_track.h
@@ -0,0 +1,29 @@
+#ifndef _TRAFFIC_TRACK_H_
+#define _TRAFFIC_TRACK_H_
+#include "dap_server_client.h"
+
+typedef struct dap_traffic_info {
+   dap_server_client_t * client;
+   size_t traffic_speed_bytes;
+} dap_traffic_info_t;
+
+typedef void (*dap_traffic_callback_t) (struct dap_traffic_info *, size_t count_info); // Callback for specific server's operations
+
+/**
+ * @brief dap_traffic_track_init
+ * @param clients
+ * @param timeout callback
+ */
+void dap_traffic_track_init(dap_server_client_t * clients,
+                            time_t timeout);
+
+/**
+ * @brief dap_traffic_track_deinit
+ */
+void dap_traffic_track_deinit(void);
+
+/**
+ * @brief dap_traffic_add_callback
+ */
+void dap_traffic_set_callback(dap_traffic_callback_t);
+#endif
-- 
GitLab