diff --git a/dap_chain_net_srv_vpn.c b/dap_chain_net_srv_vpn.c index b0db4be2c6576d6f1b4a429ba815556e07650748..863774711d6cc31909e94be5c864c36d8870565b 100755 --- a/dap_chain_net_srv_vpn.c +++ b/dap_chain_net_srv_vpn.c @@ -325,6 +325,7 @@ static int s_callback_response_success(dap_chain_net_srv_t * a_srv, uint32_t a_u HASH_ADD(hh, s_clients,usage_id,sizeof(a_usage_id),l_usage_client); l_srv_session->usage_active = l_usage_active; + l_srv_session->usage_active->is_active = true; log_it(L_NOTICE,"Enable VPN service"); if ( l_srv_ch_vpn ){ // If channel is already opened @@ -862,16 +863,17 @@ void s_ch_packet_in(dap_stream_ch_t* a_ch, void* arg) l_srv_vpn->ipv4_unleased = l_item_ipv4->next; DAP_DELETE(l_item_ipv4); }else{ - struct in_addr n_addr={0}; + struct in_addr n_addr = { 0 }; n_addr.s_addr = ntohl(s_raw_server->ipv4_lease_last.s_addr); n_addr.s_addr++; - - if( (uint32_t)n_addr.s_addr >= (uint32_t)(ntohl(s_raw_server->ipv4_network_addr.s_addr)| - ~(ntohl(s_raw_server->ipv4_network_mask.s_addr))) ) { // If the addres still in the network - n_addr.s_addr = ntohl(n_addr.s_addr); + log_it(L_DEBUG, "2791: is %u <= %u?", n_addr.s_addr, ntohl(s_raw_server->ipv4_network_addr.s_addr) | ~ntohl(s_raw_server->ipv4_network_mask.s_addr)); + if(n_addr.s_addr <= (ntohl(s_raw_server->ipv4_network_addr.s_addr) + | ~ntohl(s_raw_server->ipv4_network_mask.s_addr))) { + //n_addr.s_addr = ntohl(n_addr.s_addr); l_ch_vpn->addr_ipv4.s_addr = n_addr.s_addr; s_raw_server->ipv4_lease_last.s_addr = n_addr.s_addr; a_ch->stream->session->tun_client_addr.s_addr = n_addr.s_addr; + n_addr.s_addr = htonl(n_addr.s_addr); log_it(L_NOTICE, "VPN client address %s leased", inet_ntoa(n_addr)); log_it(L_INFO, "\tgateway %s", inet_ntoa(s_raw_server->ipv4_host)); @@ -892,9 +894,11 @@ void s_ch_packet_in(dap_stream_ch_t* a_ch, void* arg) memcpy(pkt_out->data, &l_ch_vpn->addr_ipv4, sizeof(l_ch_vpn->addr_ipv4)); memcpy(pkt_out->data + sizeof(l_ch_vpn->addr_ipv4), &s_raw_server->ipv4_host, 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)); - dap_stream_ch_set_ready_to_write(a_ch, true); + + if(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))) { + 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