diff --git a/modules/service/vpn/dap_chain_net_srv_vpn.c b/modules/service/vpn/dap_chain_net_srv_vpn.c index aaf563d863221a664b0a72364784bf60975043ec..3765acf6c7cb58aaf4e4d4c77ed672aac3ac06a4 100644 --- a/modules/service/vpn/dap_chain_net_srv_vpn.c +++ b/modules/service/vpn/dap_chain_net_srv_vpn.c @@ -1317,13 +1317,16 @@ void s_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) // for client only case VPN_PACKET_OP_CODE_VPN_RECV:{ a_ch->stream->esocket->last_ping_request = time(NULL); // not ping, but better ;-) + //ch_sf_tun_client_send(CH_VPN(a_ch), l_vpn_pkt->data, l_vpn_pkt->header.op_data.data_size); + dap_events_socket_t *l_es = dap_chain_net_vpn_client_tun_get_esock(); // Find tun socket for current worker - ch_sf_tun_socket_t * l_tun = s_tun_sockets[a_ch->stream_worker->worker->id]; + ch_sf_tun_socket_t *l_tun = l_es ? l_es->_inheritor : NULL; + //ch_sf_tun_socket_t * l_tun = s_tun_sockets[a_ch->stream_worker->worker->id]; assert(l_tun); s_stream_session_esocket_send(l_srv_session, l_tun->es, l_vpn_pkt->data, l_vpn_pkt->header.op_data.data_size); } break; - // for servier only + // for server only case VPN_PACKET_OP_CODE_VPN_SEND: { ch_sf_tun_socket_t * l_tun = s_tun_sockets[a_ch->stream_worker->worker->id]; assert(l_tun); diff --git a/modules/service/vpn/dap_chain_net_vpn_client_tun.c b/modules/service/vpn/dap_chain_net_vpn_client_tun.c index ca890bcfc029c4cf4b47e4cc8844dac5dec5096f..1d1dc7e4efbf7e612f8f33fc131e5bf9ab63fa95 100644 --- a/modules/service/vpn/dap_chain_net_vpn_client_tun.c +++ b/modules/service/vpn/dap_chain_net_vpn_client_tun.c @@ -253,6 +253,32 @@ static void m_client_tun_write(dap_events_socket_t * a_es, void * arg) // log_it(L_WARNING, __PRETTY_FUNCTION__); } +void m_client_tun_new(dap_events_socket_t * a_es, void * arg) +{ + (void) arg; + ch_sf_tun_socket_t * l_tun_socket = DAP_NEW_Z(ch_sf_tun_socket_t); + if ( l_tun_socket ){ + l_tun_socket->worker = a_es->worker; + l_tun_socket->worker_id = l_tun_socket->worker->id; + l_tun_socket->es = a_es; + //s_tun_sockets_queue_msg[a_es->worker->id] = dap_events_socket_create_type_queue_ptr_unsafe(a_es->worker, s_tun_recv_msg_callback ); + //s_tun_sockets[a_es->worker->id] = l_tun_socket; + + a_es->_inheritor = l_tun_socket; + //s_tun_attach_queue( a_es->fd ); + { + struct ifreq ifr; + memset(&ifr, 0, sizeof(ifr)); + ifr.ifr_flags = IFF_ATTACH_QUEUE; + ioctl(a_es->fd, TUNSETQUEUE, (void *)&ifr); + } + log_it(L_NOTICE,"New TUN event socket initialized for worker %u" , l_tun_socket->worker_id); + + }else{ + log_it(L_ERROR, "Can't allocate memory for tun socket"); + } +} + static void m_client_tun_read(dap_events_socket_t * a_es, void * arg) { const static int tun_MTU = 100000; /// TODO Replace with detection of MTU size @@ -304,6 +330,10 @@ static void m_client_tun_error(dap_events_socket_t * a_es, int a_arg) log_it(L_WARNING, " TUN client problems: code %d", a_arg); } +dap_events_socket_t* dap_chain_net_vpn_client_tun_get_esock(void) { + return s_tun_events_socket; +} + int dap_chain_net_vpn_client_tun_create(const char *a_ipv4_addr_str, const char *a_ipv4_gw_str) { // char dev[IFNAMSIZ] = { 0 }; @@ -412,6 +442,7 @@ int dap_chain_net_vpn_client_tun_create(const char *a_ipv4_addr_str, const char pthread_mutex_init(&s_clients_mutex, NULL); static dap_events_socket_callbacks_t l_s_callbacks = { + .new_callback = m_client_tun_new,//m_es_tun_new; .read_callback = m_client_tun_read,// for server .write_callback = m_client_tun_write,// for client .error_callback = m_client_tun_error, @@ -421,6 +452,7 @@ int dap_chain_net_vpn_client_tun_create(const char *a_ipv4_addr_str, const char s_tun_events_socket = dap_events_socket_wrap_no_add(dap_events_get_default(), s_fd_tun, &l_s_callbacks); s_tun_events_socket->type = DESCRIPTOR_TYPE_FILE; dap_worker_add_events_socket_auto(s_tun_events_socket); + //dap_events_socket_assign_on_worker_mt(l_es, a_worker); s_tun_events_socket->_inheritor = NULL; //return 0; diff --git a/modules/service/vpn/include/dap_chain_net_vpn_client_tun.h b/modules/service/vpn/include/dap_chain_net_vpn_client_tun.h index 054b7642ad81f23f99e7787d692349cc0c1d459f..1697d3b6c5f595d24961bfd94c8358991e4c3341 100644 --- a/modules/service/vpn/include/dap_chain_net_vpn_client_tun.h +++ b/modules/service/vpn/include/dap_chain_net_vpn_client_tun.h @@ -26,6 +26,7 @@ #include "dap_chain_net_srv_vpn.h" int dap_chain_net_vpn_client_tun_init(const char *a_ipv4_gw_str); +dap_events_socket_t* dap_chain_net_vpn_client_tun_get_esock(void); int dap_chain_net_vpn_client_tun_create(const char *a_ipv4_addr_str, const char *a_ipv4_gw_str); int dap_chain_net_vpn_client_tun_delete(void); int dap_chain_net_vpn_client_tun_status(void);