From b1ff5bef485770239be96610dd0218cfd5926424 Mon Sep 17 00:00:00 2001 From: "Dmitriy A. Gerasimov" <dmitriy.gerasimov@demlabs.net> Date: Mon, 9 Dec 2019 15:21:06 +0700 Subject: [PATCH] [+] Update limits and other integrations with new service API --- dap_chain_net_srv_vpn.c | 281 +++++++++++++++++++++++++++------------- dap_chain_net_srv_vpn.h | 1 - 2 files changed, 191 insertions(+), 91 deletions(-) diff --git a/dap_chain_net_srv_vpn.c b/dap_chain_net_srv_vpn.c index 3872247..a145de2 100755 --- a/dap_chain_net_srv_vpn.c +++ b/dap_chain_net_srv_vpn.c @@ -125,6 +125,8 @@ static int s_callback_response_success(dap_chain_net_srv_t * a_srv, uint32_t a_u static int s_callback_response_error(dap_chain_net_srv_t * a_srv, uint32_t a_usage_id, dap_chain_net_srv_client_t * a_srv_client , const void * a_custom_data, size_t a_custom_data_size ); +static int s_callback_receipt_next_success(dap_chain_net_srv_t * a_srv, uint32_t a_usage_id, dap_chain_net_srv_client_t * a_srv_client, + const void * a_receipt_next, size_t a_receipt_next_size); // Tunnel threads @@ -136,7 +138,7 @@ static void s_tun_destroy(void); // Stream callbacks static void s_new(dap_stream_ch_t* ch, void* arg); -static void srv_ch_sf_delete(dap_stream_ch_t* ch, void* arg); +static void srv_ch_vpn_delete(dap_stream_ch_t* ch, void* arg); static void s_ch_packet_in(dap_stream_ch_t* ch, void* arg); static void s_ch_packet_out(dap_stream_ch_t* ch, void* arg); @@ -146,6 +148,10 @@ static void s_ch_packet_out(dap_stream_ch_t* ch, void* arg); static char *s_srv_vpn_addr = NULL, *s_srv_vpn_mask = NULL; +static void s_update_limits(dap_stream_ch_t * a_ch , + dap_chain_net_srv_stream_session_t * a_srv_session, + dap_chain_net_srv_usage_t * a_usage, size_t a_bytes); + /** * @brief dap_stream_ch_vpn_init Init actions for VPN stream channel * @param vpn_addr Zero if only client mode. Address if the node shares its local VPN @@ -166,12 +172,13 @@ int dap_chain_net_srv_vpn_init(dap_config_t * g_config) pthread_cond_init(&s_sf_socks_cond, NULL); pthread_create(&srv_sf_socks_raw_pid, NULL, srv_ch_sf_thread_raw, NULL); pthread_create(&srv_sf_socks_pid, NULL, srv_ch_sf_thread, NULL); - dap_stream_ch_proc_add(DAP_STREAM_CH_ID_NET_SRV_VPN, s_new, srv_ch_sf_delete, s_ch_packet_in, + dap_stream_ch_proc_add(DAP_STREAM_CH_ID_NET_SRV_VPN, s_new, srv_ch_vpn_delete, s_ch_packet_in, s_ch_packet_out); dap_chain_net_srv_uid_t l_uid = { .uint64 = DAP_CHAIN_NET_SRV_VPN_ID }; dap_chain_net_srv_t* l_srv = dap_chain_net_srv_add( l_uid, s_callback_requested, - s_callback_response_success, s_callback_response_error); + s_callback_response_success, s_callback_response_error, + s_callback_receipt_next_success); dap_chain_net_srv_vpn_t* l_srv_vpn = DAP_NEW_Z( dap_chain_net_srv_vpn_t); l_srv->_inhertor = l_srv_vpn; l_srv_vpn->parent = l_srv; @@ -310,47 +317,74 @@ static int s_callback_requested(dap_chain_net_srv_t * a_srv, uint32_t a_usage_id static int s_callback_response_success(dap_chain_net_srv_t * a_srv, uint32_t a_usage_id, dap_chain_net_srv_client_t * a_srv_client , const void * a_request, size_t a_request_size ) { + int l_ret = 0; const dap_chain_datum_tx_receipt_t * l_receipt = (const dap_chain_datum_tx_receipt_t *) a_request; size_t l_receipt_size = a_request_size; + + // dap_stream_ch_chain_net_srv_pkt_request_t * l_request = (dap_stream_ch_chain_net_srv_pkt_request_t *) a_request; // dap_chain_net_srv_stream_session_t * l_srv_session = (dap_chain_net_srv_stream_session_t *) a_srv_client->ch->stream->session->_inheritor; dap_chain_net_srv_stream_session_t * l_srv_session = (dap_chain_net_srv_stream_session_t *) a_srv_client->ch->stream->session->_inheritor; + dap_chain_net_srv_usage_t * l_usage_active= dap_chain_net_srv_usage_find(l_srv_session->usages,a_usage_id); + dap_chain_net_srv_ch_vpn_t * l_srv_ch_vpn =(dap_chain_net_srv_ch_vpn_t*) a_srv_client->ch->stream->channel[DAP_CHAIN_NET_SRV_VPN_ID] ? + a_srv_client->ch->stream->channel[DAP_CHAIN_NET_SRV_VPN_ID]->internal : NULL; + + if ( !l_usage_active){ + log_it( L_ERROR, "No active service usage, can't success"); + return -1; + } - usage_client_t * l_usage_client = DAP_NEW_Z(usage_client_t); + usage_client_t * l_usage_client = NULL; + + l_usage_client = DAP_NEW_Z(usage_client_t); l_usage_client->usage_id = a_usage_id; l_usage_client->net_srv_client = a_srv_client; l_usage_client->receipt = DAP_NEW_SIZE(dap_chain_datum_tx_receipt_t,l_receipt_size); - - l_srv_session->usage_active = dap_chain_net_srv_usage_find(l_srv_session->usages,a_usage_id); pthread_rwlock_init(&l_usage_client->rwlock,NULL); + memcpy(l_usage_client->receipt, l_receipt, l_receipt_size); pthread_rwlock_wrlock(&s_clients_rwlock); HASH_ADD(hh, s_clients,usage_id,sizeof(a_usage_id),l_usage_client); - pthread_rwlock_unlock(&s_clients_rwlock); + + l_srv_session->usage_active = l_usage_active; log_it(L_NOTICE,"Enable VPN service"); - dap_chain_net_srv_ch_vpn_t * l_srv_vpn =(dap_chain_net_srv_ch_vpn_t*) a_srv_client->ch->stream->channel[DAP_CHAIN_NET_SRV_VPN_ID] ? - a_srv_client->ch->stream->channel[DAP_CHAIN_NET_SRV_VPN_ID]->internal : NULL; - if (l_srv_vpn ){ // If channel is already opened + if ( l_srv_ch_vpn ){ // If channel is already opened - dap_stream_ch_set_ready_to_read( l_srv_vpn->ch , true ); + dap_stream_ch_set_ready_to_read( l_srv_ch_vpn->ch , true ); - l_srv_vpn->usage_id = l_srv_session->usage_active? l_srv_session->usage_active->id : 0; + l_srv_ch_vpn->usage_id = a_usage_id; + // So complicated to update usage client to be sure that nothing breaks it + l_usage_client->ch_vpn = l_srv_ch_vpn; + } else{ + log_it(L_WARNING, "VPN channel is not open, will be no data transmission"); + l_ret = -2; + } + pthread_rwlock_unlock(&s_clients_rwlock); + return l_ret; +} - if( l_srv_vpn->usage_id) { - // So complicated to update usage client to be sure that nothing breaks it - usage_client_t * l_usage_client = NULL; - pthread_rwlock_rdlock(&s_clients_rwlock); - HASH_FIND(hh,s_clients, &l_srv_vpn->usage_id,sizeof(l_srv_vpn->usage_id),l_usage_client ); - if (l_usage_client){ - pthread_rwlock_wrlock(&l_usage_client->rwlock); - l_usage_client->ch_vpn = l_srv_vpn; - pthread_rwlock_unlock(&l_usage_client->rwlock); - } - pthread_rwlock_unlock(&s_clients_rwlock); - } + + +static int s_callback_receipt_next_success(dap_chain_net_srv_t * a_srv, uint32_t a_usage_id, dap_chain_net_srv_client_t * a_srv_client, + const void * a_receipt_next, size_t a_receipt_next_size) +{ + dap_chain_net_srv_stream_session_t * l_srv_session = (dap_chain_net_srv_stream_session_t *) a_srv_client->ch->stream->session->_inheritor; + dap_chain_net_srv_ch_vpn_t * l_srv_ch_vpn =(dap_chain_net_srv_ch_vpn_t*) a_srv_client->ch->stream->channel[DAP_CHAIN_NET_SRV_VPN_ID] ? + a_srv_client->ch->stream->channel[DAP_CHAIN_NET_SRV_VPN_ID]->internal : NULL; + + if ( ! l_srv_ch_vpn ){ + log_it(L_ERROR, "No VPN service stream channel, its closed?"); + return -3; } + + const dap_chain_datum_tx_receipt_t * l_receipt_next = (const dap_chain_datum_tx_receipt_t *) a_receipt_next; + size_t l_receipt_next_size = a_receipt_next_size; + + log_it(L_INFO, "Next receipt successfuly accepted"); + // usage is present, we've accepted packets + dap_stream_ch_set_ready_to_read( l_srv_ch_vpn->ch , true ); return 0; } @@ -420,38 +454,6 @@ static void s_tun_destroy(void) pthread_rwlock_unlock(& s_raw_server_rwlock); } -/** - * @brief s_callback_trafic - * @param a_client - * @param a_ch - */ -static void s_callback_trafic(dap_client_remote_t *a_client, dap_stream_ch_t* a_ch) -{ - dap_chain_net_srv_ch_vpn_t *l_ch_vpn = CH_VPN(a_ch); - //dap_stream_ch_vpn_t *l_ch_vpn = (dap_stream_ch_vpn_t*)(a_ch->internal); - if(!a_client || !l_ch_vpn) - return; - dap_chain_net_srv_abstract_t *srv_common = &l_ch_vpn->net_srv->srv_common; - size_t bytes_max = srv_common->proposal_params.vpn.limit_bytes; - static size_t bytes_cur_prev = 0; - size_t bytes_cur = a_client->download_stat.buf_size_total; - size_t delta_bytes = (bytes_cur > bytes_cur_prev) ? bytes_cur - bytes_cur_prev : 0; - // make receipt transaction - if(delta_bytes) { - const dap_chain_net_srv_abstract_t *l_cond = &(l_ch_vpn->net_srv->srv_common); - //l_cond-> - //if() - //if(!dap_chain_mempool_tx_create_receipt(delta_bytes)) - // bytes_cur_prev = bytes_cur; // if transaction added successfully - } - // no more traffic -> disconnect? - if(bytes_cur >= bytes_max) { - //dap_stream_delete(a_ch->stream); - //dap_stream_ch_delete(a_ch); - //srv_ch_sf_delete(a_ch, NULL); - } - -} /** * @brief ch_sf_socket_delete @@ -503,7 +505,7 @@ void s_new(dap_stream_ch_t* a_stream_ch, void* a_arg) * @param ch * @param arg */ -void srv_ch_sf_delete(dap_stream_ch_t* ch, void* arg) +void srv_ch_vpn_delete(dap_stream_ch_t* ch, void* arg) { log_it(L_DEBUG, "ch_sf_delete() for %s", ch->stream->conn->hostaddr); dap_chain_net_srv_ch_vpn_t * l_ch_vpn = CH_VPN(ch); @@ -561,29 +563,19 @@ void srv_ch_sf_delete(dap_stream_ch_t* ch, void* arg) pthread_mutex_destroy(& l_ch_vpn->mutex); } -static void s_ch_proxy_delete(ch_vpn_socket_proxy_t * sf) +static void s_ch_proxy_delete(ch_vpn_socket_proxy_t * a_sock_proxy) { - dap_return_if_fail(sf); - if(sf->sock > 0) - close(sf->sock); - // wait while mutex will be released if it be locked - pthread_mutex_lock(&sf->mutex); - pthread_mutex_unlock(&sf->mutex); - - pthread_mutex_destroy(&(sf->mutex)); - free(sf); -} + if( !a_sock_proxy) + return; -static void s_ch_ready_to_write(dap_stream_ch_t * ch, bool is_ready) -{ - pthread_mutex_lock(&ch->mutex); - ch->ready_to_write = is_ready; - if(is_ready) - ch->stream->conn_http->state_write = DAP_HTTP_CLIENT_STATE_DATA; - //!!! - dap_stream_ch_set_ready_to_write(ch, is_ready); - pthread_mutex_unlock(&ch->mutex); + if(a_sock_proxy->sock > 0) + close(a_sock_proxy->sock); + // wait while mutex will be released if it be locked + pthread_mutex_lock(&a_sock_proxy->mutex); + pthread_mutex_unlock(&a_sock_proxy->mutex); + pthread_mutex_destroy(&(a_sock_proxy->mutex)); + DAP_DELETE(a_sock_proxy); } static ch_vpn_pkt_t* srv_ch_sf_raw_read() @@ -627,6 +619,11 @@ static void s_ch_packet_out(dap_stream_ch_t* a_ch, void* a_arg) dap_stream_ch_set_ready_to_write(a_ch,false); return; } + if ( ! l_usage->receipt ){ + log_it(L_WARNING, "No active receipt, switching off"); + dap_stream_ch_set_ready_to_write(a_ch,false); + return; + } bool l_is_smth_out = false; // log_it(L_DEBUG,"Socket forwarding packet out callback: %u sockets in hashtable", HASH_COUNT(CH_SF(ch)->socks) ); @@ -640,8 +637,9 @@ static void s_ch_packet_out(dap_stream_ch_t* a_ch, void* a_arg) for(i = 0; i < cur->pkt_out_size; i++) { ch_vpn_pkt_t * pout = cur->pkt_out[i]; if(pout) { - if(dap_stream_ch_pkt_write(a_ch, DAP_STREAM_CH_PKT_TYPE_NET_SRV_VPN_DATA, pout, - pout->header.op_data.data_size + sizeof(pout->header))) { + size_t l_wrote_size; + if((l_wrote_size = dap_stream_ch_pkt_write(a_ch, DAP_STREAM_CH_PKT_TYPE_NET_SRV_VPN_DATA, pout, + pout->header.op_data.data_size + sizeof(pout->header)))>0 ) { l_is_smth_out = true; DAP_DELETE(pout); cur->pkt_out[i] = NULL; @@ -652,6 +650,7 @@ static void s_ch_packet_out(dap_stream_ch_t* a_ch, void* a_arg) l_signal_to_break = true; break; } + s_update_limits (a_ch, l_srv_session, l_usage,l_wrote_size ); } } } @@ -684,6 +683,106 @@ static void s_ch_packet_out(dap_stream_ch_t* a_ch, void* a_arg) dap_stream_ch_set_ready_to_write(a_ch, l_is_smth_out); } +/** + * @brief s_check_limits + * @param a_ch + * @param a_srv_session + * @param a_usage + * @param a_bytes + */ +static void s_update_limits(dap_stream_ch_t * a_ch , + dap_chain_net_srv_stream_session_t * a_srv_session, + dap_chain_net_srv_usage_t * a_usage, size_t a_bytes) +{ + bool l_issue_new_receipt = false; + // Check if there are time limits + if( a_srv_session->limits_ts ){ + if( a_srv_session->limits_ts < time(NULL) ){ // Limits out + a_srv_session->limits_ts = 0; + log_it(L_INFO, "Limits by timestamp are over. Switch to the next receipt"); + DAP_DELETE(a_usage->receipt); + a_usage->receipt = a_usage->receipt_next; + a_usage->receipt_next = NULL; + l_issue_new_receipt = true; + if ( a_usage->receipt){ // If there is next receipt add the time and request the next receipt + a_srv_session->limits_units_type.uint32 = a_usage->receipt->receipt.units_type.uint32; + switch( a_usage->receipt->receipt.units_type.enm){ + case SERV_UNIT_DAY:{ + a_srv_session->limits_ts = time(NULL) + (time_t) a_usage->receipt->receipt.units*24*3600; + log_it(L_INFO,"%llu days more for VPN usage", a_usage->receipt->receipt.units); + } break; + case SERV_UNIT_SEC:{ + a_srv_session->limits_ts = time(NULL) + (time_t) a_usage->receipt->receipt.units; + log_it(L_INFO,"%llu seconds more for VPN usage", a_usage->receipt->receipt.units); + } break; + default: { + log_it(L_WARNING, "VPN doesnt accept serv unit type 0x%08X for limits_ts", a_usage->receipt->receipt.units_type.uint32 ); + dap_stream_ch_set_ready_to_write(a_ch,false); + dap_stream_ch_set_ready_to_read(a_ch,false); + } + } + + //l_ch_vpn->limits_ts = time(NULL) + l_usage->receipt->receipt + }else { + log_it( L_NOTICE, "No activate receipt in usage, switch off write callback for channel"); + dap_stream_ch_set_ready_to_write(a_ch,false); + dap_stream_ch_set_ready_to_read(a_ch,false); + } + } + }else if ( a_srv_session->limits_bytes ){ + if ( a_srv_session->limits_bytes >(uint128_t) a_bytes ){ + // Update limits + a_srv_session->limits_bytes -= (uint128_t) a_bytes; + }else{ // traffic out + log_it(L_INFO, "Limits by traffic is over. Switch to the next receipt"); + DAP_DELETE(a_usage->receipt); + a_usage->receipt = a_usage->receipt_next; + a_usage->receipt_next = NULL; + l_issue_new_receipt = true; + if ( a_usage->receipt){ // If there is next receipt add the time and request the next receipt + a_srv_session->limits_units_type.uint32 = a_usage->receipt->receipt.units_type.uint32; + switch( a_usage->receipt->receipt.units_type.enm){ + case SERV_UNIT_B:{ + a_srv_session->limits_bytes += (uint128_t) a_usage->receipt->receipt.units; + log_it(L_INFO,"%llu bytes more for VPN usage", a_usage->receipt->receipt.units); + } break; + case SERV_UNIT_KB:{ + a_srv_session->limits_bytes += 1000ull * ( (uint128_t) a_usage->receipt->receipt.units); + log_it(L_INFO,"%llu bytes more for VPN usage", a_usage->receipt->receipt.units); + } break; + case SERV_UNIT_MB:{ + a_srv_session->limits_bytes += 1000000ull * ( (uint128_t) a_usage->receipt->receipt.units); + log_it(L_INFO,"%llu bytes more for VPN usage", a_usage->receipt->receipt.units); + } break; + default: { + log_it(L_WARNING, "VPN doesnt accept serv unit type 0x%08X for limits_bytes", a_usage->receipt->receipt.units_type.uint32 ); + dap_stream_ch_set_ready_to_write(a_ch,false); + dap_stream_ch_set_ready_to_read(a_ch,false); + } + } + + + }else { + log_it( L_NOTICE, "No activate receipt in usage, switch off write callback for channel"); + dap_stream_ch_set_ready_to_write(a_ch,false); + dap_stream_ch_set_ready_to_read(a_ch,false); + } + + } + } + + // If issue new receipt + if ( l_issue_new_receipt ) { + if ( a_usage->receipt){ + dap_chain_datum_tx_receipt_t * l_receipt =dap_chain_net_srv_issue_receipt(a_usage->service, a_usage,a_usage->price ); + a_usage->receipt_next = l_receipt; + dap_stream_ch_pkt_write( a_usage->clients->ch , DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_SIGN_REQUEST , + l_receipt, l_receipt->size); + } + } + +} + /** * @brief stream_sf_packet_in * @param ch @@ -699,12 +798,14 @@ void s_ch_packet_in(dap_stream_ch_t* a_ch, void* arg) if ( ! l_usage){ log_it(L_NOTICE, "No active usage in list, possible disconnected. Send nothin on this channel"); dap_stream_ch_set_ready_to_write(a_ch,false); + dap_stream_ch_set_ready_to_read(a_ch,false); return; } if ( ! l_usage->is_active ){ log_it(L_INFO, "Usage inactivation: switch off packet input channel"); dap_stream_ch_set_ready_to_write(a_ch,false); + dap_stream_ch_set_ready_to_read(a_ch,false); return; } @@ -734,7 +835,7 @@ void s_ch_packet_in(dap_stream_ch_t* a_ch, void* arg) pkt_out->header.usage_id = l_usage->id; dap_stream_ch_pkt_write(a_ch, DAP_STREAM_CH_PKT_TYPE_NET_SRV_VPN_DATA, pkt_out, pkt_out->header.op_data.data_size + sizeof(pkt_out->header)); - s_ch_ready_to_write(a_ch, true); + dap_stream_ch_set_ready_to_write(a_ch, true); break; } dap_chain_net_srv_vpn_item_ipv4_t * l_item_ipv4 = l_srv_vpn->ipv4_unleased; @@ -757,7 +858,7 @@ void s_ch_packet_in(dap_stream_ch_t* a_ch, void* arg) sizeof(s_raw_server->ipv4_host)); dap_stream_ch_pkt_write(a_ch, DAP_STREAM_CH_PKT_TYPE_NET_SRV_VPN_DATA, l_pkt_out, l_pkt_out->header.op_data.data_size + sizeof(l_pkt_out->header)); - s_ch_ready_to_write(a_ch, true); + dap_stream_ch_set_ready_to_write(a_ch, true); l_srv_vpn->ipv4_unleased = l_item_ipv4->next; DAP_DELETE(l_item_ipv4); }else{ @@ -793,7 +894,7 @@ void s_ch_packet_in(dap_stream_ch_t* a_ch, void* arg) sizeof(s_raw_server->ipv4_host)); dap_stream_ch_pkt_write(a_ch, DAP_STREAM_CH_PKT_TYPE_NET_SRV_VPN_DATA, pkt_out, pkt_out->header.op_data.data_size + sizeof(pkt_out->header)); - s_ch_ready_to_write(a_ch, true); + dap_stream_ch_set_ready_to_write(a_ch, true); //ch_sf_raw_write(n_addr.s_addr,STREAM_SF_PACKET_OP_CODE_RAW_L3_ADDR_REPLY,&n_addr,sizeof(n_addr)); } else { // All the network is filled with clients, can't lease a new address @@ -805,7 +906,7 @@ void s_ch_packet_in(dap_stream_ch_t* a_ch, void* arg) pkt_out->header.op_problem.code = VPN_PROBLEM_CODE_NO_FREE_ADDR; dap_stream_ch_pkt_write(a_ch, DAP_STREAM_CH_PKT_TYPE_NET_SRV_VPN_DATA, pkt_out, pkt_out->header.op_data.data_size + sizeof(pkt_out->header)); - s_ch_ready_to_write(a_ch, true); + dap_stream_ch_set_ready_to_write(a_ch, true); } } } @@ -835,9 +936,9 @@ void s_ch_packet_in(dap_stream_ch_t* a_ch, void* arg) pkt_out->header.sock_id = s_raw_server->tun_fd; dap_stream_ch_pkt_write(a_ch, DAP_STREAM_CH_PKT_TYPE_NET_SRV_VPN_DATA, pkt_out, pkt_out->header.op_data.data_size + sizeof(pkt_out->header)); - s_ch_ready_to_write(a_ch, true); + dap_stream_ch_set_ready_to_write(a_ch, true); } else { - + s_update_limits (a_ch, l_srv_session, l_usage,(size_t) ret ); //log_it(L_DEBUG, "Raw IP packet daddr:%s saddr:%s %u from %d bytes sent to tun/tap interface", // str_saddr, str_daddr, sf_pkt->header.op_data.data_size, ret); //log_it(L_DEBUG, "Raw IP sent %u bytes ", ret); @@ -1003,12 +1104,12 @@ void s_ch_packet_in(dap_stream_ch_t* a_ch, void* arg) free(pkt_out); client_connected = true; } - s_ch_ready_to_write(a_ch, true); + dap_stream_ch_set_ready_to_write(a_ch, true); } else { log_it(L_INFO, "Can't connect to the remote server %s", addr_str); dap_stream_ch_pkt_write_f(a_ch, 'i', "sock_id=%d op_code=%c result=-1", l_vpn_pkt->header.sock_id, l_vpn_pkt->header.op_code); - s_ch_ready_to_write(a_ch, true); + dap_stream_ch_set_ready_to_write(a_ch, true); } } else { log_it(L_ERROR, "Can't create the socket"); @@ -1104,12 +1205,12 @@ void * srv_ch_sf_thread(void * arg) memcpy(pout->data, buf, buf_size); sf->pkt_out_size++; pthread_mutex_unlock(&(sf->mutex)); - s_ch_ready_to_write(sf->ch, true); + dap_stream_ch_set_ready_to_write(sf->ch, true); } else { log_it(L_NOTICE, "Socket id %d returned error on recv() function - may be host has disconnected", s); pthread_mutex_unlock(&(sf->mutex)); - s_ch_ready_to_write(sf->ch, true); + dap_stream_ch_set_ready_to_write(sf->ch, true); srv_stream_sf_disconnect(sf); } } else { @@ -1215,7 +1316,7 @@ void* srv_ch_sf_thread_raw(void *arg) memcpy(pkt_out->data, tmp_buf, read_ret); dap_stream_ch_pkt_write(l_ch_vpn->ch, DAP_STREAM_CH_PKT_TYPE_NET_SRV_VPN_DATA, pkt_out, pkt_out->header.op_data.data_size + sizeof(pkt_out->header)); - s_ch_ready_to_write(l_ch_vpn->ch, true); + dap_stream_ch_set_ready_to_write(l_ch_vpn->ch, true); } pthread_rwlock_unlock(&s_clients_rwlock); } diff --git a/dap_chain_net_srv_vpn.h b/dap_chain_net_srv_vpn.h index 3e617ed..014a422 100755 --- a/dap_chain_net_srv_vpn.h +++ b/dap_chain_net_srv_vpn.h @@ -135,7 +135,6 @@ typedef struct dap_chain_net_srv_ch_vpn int raw_l3_sock; bool is_allowed; - struct in_addr addr_ipv4; dap_stream_ch_t * ch; UT_hash_handle hh; -- GitLab