Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • cellframe/cellframe-sdk
  • MIKA83/cellframe-sdk
2 results
Show changes
Commits on Source (6)
...@@ -968,12 +968,12 @@ int cdb_set2(CDB *db, const char *key, int ksize, const char *val, int vsize, in ...@@ -968,12 +968,12 @@ int cdb_set2(CDB *db, const char *key, int ksize, const char *val, int vsize, in
rec.expire = expire? now + expire : 0; rec.expire = expire? now + expire : 0;
cdb_lock_lock(db->mlock[lockid]); cdb_lock_lock(db->mlock[lockid]);
cdb_lock_lock(db->rclock);
if (db->rcache) { if (db->rcache) {
/* if record already exists, get its old meta info */ /* if record already exists, get its old meta info */
int item_vsize; int item_vsize;
char *cval; char *cval;
uint32_t old_expire = 0; uint32_t old_expire = 0;
cdb_lock_lock(db->rclock);
cval = cdb_ht_get(db->rcache, key, ksize, &item_vsize, false); cval = cdb_ht_get(db->rcache, key, ksize, &item_vsize, false);
if (cval) { if (cval) {
/* record already exists */ /* record already exists */
...@@ -981,12 +981,12 @@ int cdb_set2(CDB *db, const char *key, int ksize, const char *val, int vsize, in ...@@ -981,12 +981,12 @@ int cdb_set2(CDB *db, const char *key, int ksize, const char *val, int vsize, in
rec.osize = item_vsize - SFOFF - SI4; rec.osize = item_vsize - SFOFF - SI4;
old_expire = *(uint32_t*)(cval + SFOFF); old_expire = *(uint32_t*)(cval + SFOFF);
} }
cdb_lock_unlock(db->rclock);
if (old_expire && old_expire <= now) if (old_expire && old_expire <= now)
/* once exist but expired? */ /* once exist but expired? */
expired = true; expired = true;
} }
cdb_lock_unlock(db->rclock);
if (OFFNULL(ooff)) { if (OFFNULL(ooff)) {
FOFF soffs[SFOFFNUM]; FOFF soffs[SFOFFNUM];
FOFF *soff = soffs; FOFF *soff = soffs;
...@@ -1155,9 +1155,9 @@ int cdb_get(CDB *db, const char *key, int ksize, void **val, int *vsize) ...@@ -1155,9 +1155,9 @@ int cdb_get(CDB *db, const char *key, int ksize, void **val, int *vsize)
*vsize = 0; *vsize = 0;
*val = NULL; *val = NULL;
cdb_lock_lock(db->rclock);
if (db->rcache) { if (db->rcache) {
char *cval; char *cval;
cdb_lock_lock(db->rclock);
cval = cdb_ht_get(db->rcache, key, ksize, vsize, true); cval = cdb_ht_get(db->rcache, key, ksize, vsize, true);
if (cval) { if (cval) {
db->rchit++; db->rchit++;
...@@ -1183,8 +1183,8 @@ int cdb_get(CDB *db, const char *key, int ksize, void **val, int *vsize) ...@@ -1183,8 +1183,8 @@ int cdb_get(CDB *db, const char *key, int ksize, void **val, int *vsize)
return -3; return -3;
} }
} }
cdb_lock_unlock(db->rclock);
} }
cdb_lock_unlock(db->rclock);
offs = soffs; offs = soffs;
hash = CDBHASH64(key, ksize); hash = CDBHASH64(key, ksize);
......
...@@ -2,7 +2,7 @@ project(cellframe-sdk C) ...@@ -2,7 +2,7 @@ project(cellframe-sdk C)
cmake_minimum_required(VERSION 2.8) cmake_minimum_required(VERSION 2.8)
set(CMAKE_C_STANDARD 11) set(CMAKE_C_STANDARD 11)
set(CELLFRAME_SDK_NATIVE_VERSION "2.6-102") set(CELLFRAME_SDK_NATIVE_VERSION "2.6-104")
add_definitions ("-DCELLFRAME_SDK_VERSION=\"${CELLFRAME_SDK_NATIVE_VERSION}\"") add_definitions ("-DCELLFRAME_SDK_VERSION=\"${CELLFRAME_SDK_NATIVE_VERSION}\"")
set(DAPSDK_MODULES "") set(DAPSDK_MODULES "")
......
...@@ -119,10 +119,14 @@ static bool s_timer_timeout_check(void * a_arg) ...@@ -119,10 +119,14 @@ static bool s_timer_timeout_check(void * a_arg)
dap_events_t * l_events = dap_events_get_default(); dap_events_t * l_events = dap_events_get_default();
assert(l_events); assert(l_events);
dap_worker_t * l_worker =(dap_worker_t*) pthread_getspecific(l_events->pth_key_worker);; // We're in own esocket context dap_worker_t * l_worker =(dap_worker_t*) pthread_getspecific(l_events->pth_key_worker); // We're in own esocket context
assert(l_worker); assert(l_worker);
if(dap_events_socket_check_unsafe(l_worker, l_es) ){ if(dap_events_socket_check_unsafe(l_worker, l_es) ){
if ((l_es->type != DESCRIPTOR_TYPE_SOCKET) && (l_es->type != DESCRIPTOR_TYPE_SOCKET_UDP)) {
log_it(L_CRITICAL, "Timer esocket wrong argument: socket %d type %d, ignore this timeout...", l_es->socket, l_es->type);
return false;
}
dap_client_http_pvt_t * l_http_pvt = PVT(l_es); dap_client_http_pvt_t * l_http_pvt = PVT(l_es);
log_it(L_WARNING,"Connection timeout for request http://%s:%u/%s, possible network problems or host is down", log_it(L_WARNING,"Connection timeout for request http://%s:%u/%s, possible network problems or host is down",
l_http_pvt->uplink_addr, l_http_pvt->uplink_port, l_http_pvt->path); l_http_pvt->uplink_addr, l_http_pvt->uplink_port, l_http_pvt->path);
...@@ -131,7 +135,11 @@ static bool s_timer_timeout_check(void * a_arg) ...@@ -131,7 +135,11 @@ static bool s_timer_timeout_check(void * a_arg)
l_http_pvt->were_callbacks_called = true; l_http_pvt->were_callbacks_called = true;
} }
l_http_pvt->is_closed_by_timeout = true; l_http_pvt->is_closed_by_timeout = true;
l_es->flags |= DAP_SOCK_SIGNAL_CLOSE; log_it(L_INFO, "Close %s sock %u type %d by timeout",
l_es->remote_addr_str ? l_es->remote_addr_str : "", l_es->socket, l_es->type);
dap_events_socket_remove_and_delete_unsafe(l_es, true);
} else {
log_it(L_INFO, "Socket %d type %d already disposed", l_es->socket, l_es->type);
} }
return false; return false;
} }
......
...@@ -1420,7 +1420,7 @@ bool dap_events_socket_check_unsafe(dap_worker_t * a_worker,dap_events_socket_t ...@@ -1420,7 +1420,7 @@ bool dap_events_socket_check_unsafe(dap_worker_t * a_worker,dap_events_socket_t
if ( a_worker->esockets){ if ( a_worker->esockets){
dap_events_socket_t * l_es = NULL; dap_events_socket_t * l_es = NULL;
pthread_rwlock_rdlock(&a_worker->esocket_rwlock); pthread_rwlock_rdlock(&a_worker->esocket_rwlock);
HASH_FIND(hh_worker,a_worker->esockets,&a_es, sizeof(a_es), l_es ); HASH_FIND(hh_worker,a_worker->esockets,&a_es, sizeof(void*), l_es );
pthread_rwlock_unlock(&a_worker->esocket_rwlock); pthread_rwlock_unlock(&a_worker->esocket_rwlock);
return l_es == a_es; return l_es == a_es;
}else }else
......
...@@ -179,6 +179,10 @@ void *dap_worker_thread(void *arg) ...@@ -179,6 +179,10 @@ void *dap_worker_thread(void *arg)
l_flag_nval = false; l_flag_nval = false;
#elif defined ( DAP_EVENTS_CAPS_POLL) #elif defined ( DAP_EVENTS_CAPS_POLL)
short l_cur_events =l_worker->poll[n].revents; short l_cur_events =l_worker->poll[n].revents;
if (l_worker->poll[n].fd == -1) // If it was deleted on previous iterations
continue;
if (!l_cur_events) // No events for this socket if (!l_cur_events) // No events for this socket
continue; continue;
l_flag_hup = l_cur_events& POLLHUP; l_flag_hup = l_cur_events& POLLHUP;
...@@ -645,6 +649,7 @@ void *dap_worker_thread(void *arg) ...@@ -645,6 +649,7 @@ void *dap_worker_thread(void *arg)
log_it(L_NOTICE,"Worker :%u finished", l_worker->id); log_it(L_NOTICE,"Worker :%u finished", l_worker->id);
return NULL; return NULL;
} }
} }
#ifdef DAP_EVENTS_CAPS_POLL #ifdef DAP_EVENTS_CAPS_POLL
/***********************************************************/ /***********************************************************/
......
...@@ -43,6 +43,7 @@ typedef struct dap_worker ...@@ -43,6 +43,7 @@ typedef struct dap_worker
// Signal to exit // Signal to exit
bool signal_exit; bool signal_exit;
// worker control queues // worker control queues
dap_events_socket_t * queue_es_new; // Queue socket for new socket dap_events_socket_t * queue_es_new; // Queue socket for new socket
dap_events_socket_t ** queue_es_new_input; // Queue socket for new socket dap_events_socket_t ** queue_es_new_input; // Queue socket for new socket
......
...@@ -74,6 +74,7 @@ ...@@ -74,6 +74,7 @@
static SOCKET server_sockfd = -1; // network or local unix static SOCKET server_sockfd = -1; // network or local unix
uint32_t l_listen_port = 0; uint32_t l_listen_port = 0;
bool s_debug_cli = false;
#ifdef _WIN32 #ifdef _WIN32
#define poll WSAPoll #define poll WSAPoll
...@@ -249,7 +250,8 @@ char* s_get_next_str( SOCKET nSocket, int *dwLen, const char *stop_str, bool del ...@@ -249,7 +250,8 @@ char* s_get_next_str( SOCKET nSocket, int *dwLen, const char *stop_str, bool del
static void* thread_one_client_func(void *args) static void* thread_one_client_func(void *args)
{ {
SOCKET newsockfd = (SOCKET) (intptr_t) args; SOCKET newsockfd = (SOCKET) (intptr_t) args;
log_it(L_DEBUG, "new connection sockfd=%d", newsockfd); if(s_debug_cli)
log_it(L_DEBUG, "new connection sockfd=%d", newsockfd);
int str_len, marker = 0; int str_len, marker = 0;
int timeout = 5000; // 5 sec int timeout = 5000; // 5 sec
...@@ -364,7 +366,8 @@ static void* thread_one_client_func(void *args) ...@@ -364,7 +366,8 @@ static void* thread_one_client_func(void *args)
} }
// close connection // close connection
int cs = closesocket(newsockfd); int cs = closesocket(newsockfd);
log_it(L_DEBUG, "close connection=%d sockfd=%d", cs, newsockfd); if (s_debug_cli)
log_it(L_DEBUG, "close connection=%d sockfd=%d", cs, newsockfd);
return NULL; return NULL;
} }
...@@ -453,7 +456,8 @@ static void *thread_pipe_client_func( void *args ) ...@@ -453,7 +456,8 @@ static void *thread_pipe_client_func( void *args )
HANDLE hPipe = (HANDLE)args; HANDLE hPipe = (HANDLE)args;
// SOCKET newsockfd = (SOCKET) (intptr_t) args; // SOCKET newsockfd = (SOCKET) (intptr_t) args;
log_it(L_INFO, "new connection pipe = %X", hPipe ); if(s_debug_cli)
log_it(L_INFO, "new connection pipe = %X", hPipe );
int str_len, marker = 0; int str_len, marker = 0;
int timeout = 5000; // 5 sec int timeout = 5000; // 5 sec
...@@ -810,6 +814,7 @@ dap_chain_node_cmd_item_t* dap_chain_node_cli_cmd_find(const char *a_name) ...@@ -810,6 +814,7 @@ dap_chain_node_cmd_item_t* dap_chain_node_cli_cmd_find(const char *a_name)
*/ */
int dap_chain_node_cli_init(dap_config_t * g_config) int dap_chain_node_cli_init(dap_config_t * g_config)
{ {
s_debug_cli = dap_config_get_item_bool_default(g_config,"conserver","debug_cli",false);
#ifndef _WIN32 #ifndef _WIN32
struct sockaddr_un l_server_addr={0}; struct sockaddr_un l_server_addr={0};
l_server_addr.sun_family = AF_UNIX; l_server_addr.sun_family = AF_UNIX;
......
...@@ -95,8 +95,10 @@ typedef struct dap_chain_net_srv_price ...@@ -95,8 +95,10 @@ typedef struct dap_chain_net_srv_price
#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_CHECK_RESPONSE 0x41 #define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_CHECK_RESPONSE 0x41
#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_UNDEFINED 0x00000000 #define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_UNDEFINED 0x00000000
#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_SERVICE_NOT_FOUND 0x00000100 #define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_SERVICE_NOT_FOUND 0x00000100
#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_SERVICE_CH_NOT_FOUND 0x00000101 #define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_SERVICE_CH_NOT_FOUND 0x00000101
#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_SERVICE_IN_CLIENT_MODE 0x00000102
#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_NETWORK_NOT_FOUND 0x00000200 #define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_NETWORK_NOT_FOUND 0x00000200
#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_NETWORK_NO_LEDGER 0x00000201 #define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_NETWORK_NO_LEDGER 0x00000201
#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_USAGE_CANT_ADD 0x00000300 #define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_USAGE_CANT_ADD 0x00000300
......
...@@ -143,13 +143,13 @@ pthread_cond_t * s_tun_sockets_cond_started = NULL; ...@@ -143,13 +143,13 @@ pthread_cond_t * s_tun_sockets_cond_started = NULL;
uint32_t s_tun_sockets_count = 0; uint32_t s_tun_sockets_count = 0;
bool s_debug_more = false; bool s_debug_more = false;
static usage_client_t * s_clients; static usage_client_t * s_clients = NULL;
static dap_chain_net_srv_ch_vpn_t * s_ch_vpn_addrs ; static dap_chain_net_srv_ch_vpn_t * s_ch_vpn_addrs = NULL;
static pthread_rwlock_t s_clients_rwlock = PTHREAD_RWLOCK_INITIALIZER; static pthread_rwlock_t s_clients_rwlock = PTHREAD_RWLOCK_INITIALIZER;
static pthread_mutex_t s_sf_socks_mutex; static pthread_mutex_t s_sf_socks_mutex;
static pthread_cond_t s_sf_socks_cond; static pthread_cond_t s_sf_socks_cond;
static vpn_local_network_t *s_raw_server; static vpn_local_network_t *s_raw_server = NULL;
static pthread_rwlock_t s_raw_server_rwlock = PTHREAD_RWLOCK_INITIALIZER; static pthread_rwlock_t s_raw_server_rwlock = PTHREAD_RWLOCK_INITIALIZER;
// Service callbacks // Service callbacks
...@@ -1041,11 +1041,13 @@ static void s_ch_vpn_delete(dap_stream_ch_t* a_ch, void* arg) ...@@ -1041,11 +1041,13 @@ static void s_ch_vpn_delete(dap_stream_ch_t* a_ch, void* arg)
s_tun_send_msg_ip_unassigned_all(l_ch_vpn, l_ch_vpn->addr_ipv4); // Signal all the workers that we're switching off s_tun_send_msg_ip_unassigned_all(l_ch_vpn, l_ch_vpn->addr_ipv4); // Signal all the workers that we're switching off
pthread_rwlock_wrlock(& s_raw_server_rwlock); pthread_rwlock_wrlock(& s_raw_server_rwlock);
if ( s_raw_server->ipv4_lease_last.s_addr == l_ch_vpn->addr_ipv4.s_addr ){ if( s_raw_server){
s_raw_server->ipv4_lease_last.s_addr = ntohl( ntohl(s_raw_server->ipv4_lease_last.s_addr)-1 ); if ( s_raw_server->ipv4_lease_last.s_addr == l_ch_vpn->addr_ipv4.s_addr ){
s_raw_server->ipv4_lease_last.s_addr = ntohl( ntohl(s_raw_server->ipv4_lease_last.s_addr)-1 );
}
else
l_is_unleased = true;
} }
else
l_is_unleased = true;
pthread_rwlock_unlock(& s_raw_server_rwlock); pthread_rwlock_unlock(& s_raw_server_rwlock);
} }
pthread_rwlock_wrlock(&s_clients_rwlock); pthread_rwlock_wrlock(&s_clients_rwlock);
...@@ -1201,6 +1203,9 @@ static void s_ch_packet_in_vpn_address_request(dap_stream_ch_t* a_ch, dap_chain_ ...@@ -1201,6 +1203,9 @@ static void s_ch_packet_in_vpn_address_request(dap_stream_ch_t* a_ch, dap_chain_
dap_chain_net_srv_vpn_t * l_srv_vpn =(dap_chain_net_srv_vpn_t *) a_usage->service->_inhertor; dap_chain_net_srv_vpn_t * l_srv_vpn =(dap_chain_net_srv_vpn_t *) a_usage->service->_inhertor;
dap_chain_net_srv_stream_session_t * l_srv_session= DAP_CHAIN_NET_SRV_STREAM_SESSION(l_ch_vpn->ch->stream->session); dap_chain_net_srv_stream_session_t * l_srv_session= DAP_CHAIN_NET_SRV_STREAM_SESSION(l_ch_vpn->ch->stream->session);
if (! s_raw_server)
return;
if ( l_ch_vpn->addr_ipv4.s_addr ){ if ( l_ch_vpn->addr_ipv4.s_addr ){
log_it(L_WARNING,"We already have ip address leased to us"); log_it(L_WARNING,"We already have ip address leased to us");
ch_vpn_pkt_t *pkt_out = (ch_vpn_pkt_t*) calloc(1, sizeof(pkt_out->header)); ch_vpn_pkt_t *pkt_out = (ch_vpn_pkt_t*) calloc(1, sizeof(pkt_out->header));
...@@ -1376,6 +1381,7 @@ void s_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) ...@@ -1376,6 +1381,7 @@ void s_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
return; return;
} }
// TODO move address leasing to this structure // TODO move address leasing to this structure
//dap_chain_net_srv_vpn_t * l_srv_vpn =(dap_chain_net_srv_vpn_t *) l_usage->service->_inhertor; //dap_chain_net_srv_vpn_t * l_srv_vpn =(dap_chain_net_srv_vpn_t *) l_usage->service->_inhertor;
...@@ -1410,7 +1416,11 @@ void s_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) ...@@ -1410,7 +1416,11 @@ void s_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
// for server // for server
case VPN_PACKET_OP_CODE_VPN_ADDR_REQUEST: { // Client request after L3 connection the new IP address case VPN_PACKET_OP_CODE_VPN_ADDR_REQUEST: { // Client request after L3 connection the new IP address
log_it(L_INFO, "Received address request "); log_it(L_INFO, "Received address request ");
s_ch_packet_in_vpn_address_request(a_ch, l_usage); if(s_raw_server){
s_ch_packet_in_vpn_address_request(a_ch, l_usage);
}else{
dap_stream_ch_pkt_write_unsafe( l_usage->client->ch , DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_SERVICE_IN_CLIENT_MODE , NULL, 0 );
}
l_srv_session->stats.bytes_recv += l_vpn_pkt_size; l_srv_session->stats.bytes_recv += l_vpn_pkt_size;
l_srv_session->stats.packets_recv++; l_srv_session->stats.packets_recv++;
} break; } break;
......