From 386cc41dee50227ecd29e75a099229052167486f Mon Sep 17 00:00:00 2001
From: Dmitry Gerasimov <dmitriy.gerasimov@demlabs.net>
Date: Wed, 29 Jun 2022 18:27:23 +0700
Subject: [PATCH] [+] Additional checks for worker esocket timer [*] MacOS utun
 fixes

---
 dap-sdk/io/dap_worker.c                     |  8 +++++++
 modules/service/vpn/dap_chain_net_srv_vpn.c | 26 ++++++++++++++++-----
 2 files changed, 28 insertions(+), 6 deletions(-)

diff --git a/dap-sdk/io/dap_worker.c b/dap-sdk/io/dap_worker.c
index c5eba48f2f..3ae20d64c8 100644
--- a/dap-sdk/io/dap_worker.c
+++ b/dap-sdk/io/dap_worker.c
@@ -321,7 +321,14 @@ static bool s_socket_all_check_activity( void * a_arg)
     time_t l_curtime= time(NULL);
     //dap_ctime_r(&l_curtime, l_curtimebuf);
     //log_it(L_DEBUG,"Check sockets activity on worker #%u at %s", l_worker->id, l_curtimebuf);
+    size_t l_esockets_counter = 0;
+    uint l_esockets_count = HASH_CNT(hh, l_worker->context->esockets);
     HASH_ITER(hh, l_worker->context->esockets, l_es, tmp ) {
+        if (l_esockets_counter >= l_worker->context->event_sockets_count || l_esockets_counter >= l_esockets_count){
+            log_it(L_ERROR, "Something wrong with context's esocket table: %u esockets in context, %u in table but we're on %zu iteration",
+                   l_worker->context->event_sockets_count, l_esockets_count,l_esockets_counter +1 );
+                break;
+        }
         if (l_es->type == DESCRIPTOR_TYPE_SOCKET_CLIENT){
             if ( !(l_es->flags & DAP_SOCK_SIGNAL_CLOSE) &&
                  (  l_curtime >=  (l_es->last_time_active + s_connection_timeout) ) && !l_es->no_close ) {
@@ -333,6 +340,7 @@ static bool s_socket_all_check_activity( void * a_arg)
                 dap_events_socket_remove_and_delete_unsafe(l_es,false);
             }
         }
+        l_esockets_counter++;
     }
     return true;
 }
diff --git a/modules/service/vpn/dap_chain_net_srv_vpn.c b/modules/service/vpn/dap_chain_net_srv_vpn.c
index 7cab4e7101..2394f0aa5b 100644
--- a/modules/service/vpn/dap_chain_net_srv_vpn.c
+++ b/modules/service/vpn/dap_chain_net_srv_vpn.c
@@ -114,7 +114,9 @@ typedef struct vpn_local_network {
     int tun_ctl_fd;
     char * tun_device_name;
     int tun_fd;
+#ifndef DAP_OS_DARWIN
     struct ifreq ifr;
+#endif
     bool auto_cpu_reassignment;
 
     ch_vpn_pkt_t * pkt_out[400];
@@ -595,7 +597,7 @@ static int s_vpn_tun_create(dap_config_t * g_config)
     s_tun_sockets_queue_msg =  DAP_NEW_Z_SIZE(dap_events_socket_t*,s_tun_sockets_count*sizeof(dap_events_socket_t*));
     s_tun_sockets_mutex_started = DAP_NEW_Z_SIZE(pthread_mutex_t,s_tun_sockets_count*sizeof(pthread_mutex_t));
     s_tun_sockets_cond_started = DAP_NEW_Z_SIZE(pthread_cond_t,s_tun_sockets_count*sizeof(pthread_cond_t));
-    int err = -1;
+    int err = 0;
 
 #if defined (DAP_OS_DARWIN)
     // Prepare structs
@@ -679,7 +681,7 @@ static int s_vpn_tun_create(dap_config_t * g_config)
         assert( l_worker );
 #elif defined(DAP_OS_LINUX) || defined(DAP_OS_BSD)
         int l_tun_fd;
-        if( (l_tun_fd = open("/dev/net/tun", O_RDWR | O_NONBLOCK)) < 0 ) {
+        if( (l_tun_fd = open(s_raw_server->tun_device_name, O_RDWR | O_NONBLOCK)) < 0 ) {
             log_it(L_ERROR,"Opening /dev/net/tun error: '%s'", strerror(errno));
             err = -100;
             break;
@@ -691,7 +693,7 @@ static int s_vpn_tun_create(dap_config_t * g_config)
             break;
         }
         s_tun_deattach_queue(l_tun_fd);
-
+        s_raw_server->tun_device_name = strdup("s_raw_server->ifr.ifr_name");
 #else
 #error "Undefined tun interface attach for your platform"
 #endif
@@ -722,12 +724,24 @@ static int s_vpn_tun_create(dap_config_t * g_config)
 
     if (! err ){
         char buf[256];
-        log_it(L_NOTICE,"Bringed up %s virtual network interface (%s/%s)", s_raw_server->ifr.ifr_name,inet_ntoa(s_raw_server->ipv4_gw),c_mask);
-        snprintf(buf,sizeof(buf),"ip link set %s up",s_raw_server->ifr.ifr_name);
+        log_it(L_NOTICE,"Bringed up %s virtual network interface (%s/%s)", s_raw_server->tun_device_name,inet_ntoa(s_raw_server->ipv4_gw),c_mask);
+#if defined DAP_OS_ANDROID
+#elif defined(DAP_OS_LINUX)
+        snprintf(buf,sizeof(buf),"ip link set %s up",s_raw_server->tun_device_name);
+        system(buf);
+        snprintf(buf,sizeof(buf),"ip addr add %s/%s dev %s ",inet_ntoa(s_raw_server->ipv4_gw),c_mask, s_raw_server->tun_device_name );
         system(buf);
-        snprintf(buf,sizeof(buf),"ip addr add %s/%s dev %s ",inet_ntoa(s_raw_server->ipv4_gw),c_mask, s_raw_server->ifr.ifr_name );
+#elif defined DAP_OS_DARWIN
+        snprintf(buf,sizeof(buf),"ifconfig %s %s %s up",s_raw_server->tun_device_name,
+                 inet_ntoa(s_raw_server->ipv4_gw),inet_ntoa(s_raw_server->ipv4_gw));
         system(buf);
+        snprintf(buf,sizeof(buf),"route add -net %s -netmask %s -interface %s", inet_ntoa(s_raw_server->ipv4_gw),c_mask,s_raw_server->tun_device_name );
+        system(buf);
+#else
+#error "Not defined for your platform"
+#endif
     }
+    return 0;
 lb_err:
     return err;
 }
-- 
GitLab