diff --git a/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c b/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c index fa9319b670dc92b42cc874129c795fbc42cb2ab6..26b015536b47e46ac54332fb3040c822508d06d8 100644 --- a/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c +++ b/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c @@ -282,45 +282,43 @@ static void s_service_start(dap_stream_ch_t* a_ch , dap_stream_ch_chain_net_srv_ l_usage->net = l_net; l_usage->service = l_srv; - - dap_chain_net_srv_grace_t *l_grace = DAP_NEW_Z(dap_chain_net_srv_grace_t); - if (!l_grace) { - log_it(L_ERROR, "Memory allocation errror in s_service_start"); - l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_ALLOC_MEMORY_ERROR; - if(a_ch) - dap_stream_ch_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR, &l_err, sizeof (l_err)); - if (l_srv && l_srv->callbacks.response_error) - l_srv->callbacks.response_error(l_srv, 0, NULL, &l_err, sizeof(l_err)); - DAP_DEL_Z(l_usage->client); - DAP_DEL_Z(l_usage); - return; - } - l_grace->request = DAP_NEW_Z_SIZE(dap_stream_ch_chain_net_srv_pkt_request_t, a_request_size); - if (!l_grace->request) { - log_it(L_ERROR, "Memory allocation errror in s_service_start"); - l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_ALLOC_MEMORY_ERROR; - if(a_ch) - dap_stream_ch_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR, &l_err, sizeof (l_err)); - if (l_srv && l_srv->callbacks.response_error) - l_srv->callbacks.response_error(l_srv, 0, NULL, &l_err, sizeof(l_err)); - DAP_DEL_Z(l_usage->client); - DAP_DEL_Z(l_usage); - DAP_DEL_Z(l_grace); - return; - } - memcpy(l_grace->request, a_request, a_request_size); - l_grace->request_size = a_request_size; - l_grace->ch_uuid = a_ch->uuid; - l_grace->stream_worker = a_ch->stream_worker; - l_grace->usage = l_usage; - if (l_srv->pricelist){ // not free service + log_it( L_INFO, "Valid pricelist is founded. Start service in pay mode."); + dap_chain_net_srv_grace_t *l_grace = DAP_NEW_Z(dap_chain_net_srv_grace_t); + if (!l_grace) { + log_it(L_ERROR, "Memory allocation errror in s_service_start"); + l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_ALLOC_MEMORY_ERROR; + if(a_ch) + dap_stream_ch_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR, &l_err, sizeof (l_err)); + if (l_srv && l_srv->callbacks.response_error) + l_srv->callbacks.response_error(l_srv, 0, NULL, &l_err, sizeof(l_err)); + DAP_DEL_Z(l_usage->client); + DAP_DEL_Z(l_usage); + return; + } + l_grace->request = DAP_DUP_SIZE(a_request, a_request_size); + if (!l_grace->request) { + log_it(L_ERROR, "Memory allocation errror in s_service_start"); + l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_ALLOC_MEMORY_ERROR; + if(a_ch) + dap_stream_ch_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR, &l_err, sizeof (l_err)); + if (l_srv && l_srv->callbacks.response_error) + l_srv->callbacks.response_error(l_srv, 0, NULL, &l_err, sizeof(l_err)); + DAP_DEL_Z(l_usage->client); + DAP_DEL_Z(l_usage); + DAP_DEL_Z(l_grace); + return; + } + l_grace->request_size = a_request_size; + l_grace->ch_uuid = a_ch->uuid; + l_grace->stream_worker = a_ch->stream_worker; + l_grace->usage = l_usage; s_grace_period_start(l_grace); - } else { + } else if (l_srv->allow_free_srv){ // Start service for free - log_it( L_INFO, "Service provide for free"); - l_grace->usage->is_free = true; + log_it( L_INFO, "Can't find a valid pricelist. Service provide for free"); + l_usage->is_free = true; size_t l_success_size = sizeof (dap_stream_ch_chain_net_srv_pkt_success_hdr_t ); dap_stream_ch_chain_net_srv_pkt_success_t *l_success = DAP_NEW_Z_SIZE(dap_stream_ch_chain_net_srv_pkt_success_t, l_success_size); @@ -333,8 +331,6 @@ static void s_service_start(dap_stream_ch_t* a_ch , dap_stream_ch_chain_net_srv_ l_srv->callbacks.response_error(l_srv, 0, NULL, &l_err, sizeof(l_err)); DAP_DEL_Z(l_usage->client); DAP_DEL_Z(l_usage); - DAP_DEL_Z(l_grace->request); - DAP_DEL_Z(l_grace); return; } l_success->hdr.usage_id = l_usage->id; @@ -344,6 +340,11 @@ static void s_service_start(dap_stream_ch_t* a_ch , dap_stream_ch_chain_net_srv_ if (l_usage->service->callbacks.response_success) l_usage->service->callbacks.response_success(l_usage->service, l_usage->id, l_usage->client, NULL, 0); DAP_DELETE(l_success); + }else { + log_it( L_INFO, "No pricelists. Free service sharing is not allowed. Service stop."); + dap_stream_ch_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR, &l_err, sizeof(l_err)); + if (l_srv && l_srv->callbacks.response_error) + l_srv->callbacks.response_error(l_srv, 0, NULL, &l_err, sizeof(l_err)); } return; } diff --git a/modules/net/srv/dap_chain_net_srv.c b/modules/net/srv/dap_chain_net_srv.c index 1620a740718ad5b5a8632f26bb0f2479bd0d5878..ed48d6700f6df1d7028fb3da2ec9a559e1f7e054 100644 --- a/modules/net/srv/dap_chain_net_srv.c +++ b/modules/net/srv/dap_chain_net_srv.c @@ -821,6 +821,7 @@ int dap_chain_net_srv_price_apply_from_my_order(dap_chain_net_srv_t *a_srv, cons return -4; } a_srv->grace_period = dap_config_get_item_uint32_default(g_config, a_config_section, "grace_period", 60); + a_srv->allow_free_srv = dap_config_get_item_bool_default(g_config, a_config_section, "allow_free_srv", false); int l_err_code = 0; dap_chain_node_addr_t *l_node_addr = NULL; l_node_addr = dap_chain_net_get_cur_addr(l_net); @@ -843,10 +844,24 @@ int dap_chain_net_srv_price_apply_from_my_order(dap_chain_net_srv_t *a_srv, cons } l_price->net = l_net; l_price->net_name = dap_strdup(l_net->pub.name); + uint256_t l_max_price = GET_256_FROM_64((uint64_t)1000000000000000); // Change this value when max price wil be calculated + if (!compare256(l_order->price, uint256_0) || l_order->units == 0 ){ + DAP_DELETE(l_price); + continue; + } l_price->value_datoshi = l_order->price; dap_stpcpy(l_price->token, l_order->price_ticker); l_price->units = l_order->units; l_price->units_uid = l_order->price_unit; + if (compare256(l_max_price, uint256_0)){ + uint256_t l_price_unit = uint256_0; + DIV_256(l_price->value_datoshi, GET_256_FROM_64(l_order->units), &l_price_unit); + if (compare256(l_price_unit, l_max_price)>0){ + DAP_DELETE(l_price); + continue; + } + } + l_price->wallet = l_wallet; DL_APPEND(a_srv->pricelist, l_price); break; diff --git a/modules/net/srv/include/dap_chain_net_srv.h b/modules/net/srv/include/dap_chain_net_srv.h index b4493d9f5bba54e383f8abb79f45b9a1f8269702..faf5c86de72a17fbc1b61dbd23e28d6e3ddf6a97 100755 --- a/modules/net/srv/include/dap_chain_net_srv.h +++ b/modules/net/srv/include/dap_chain_net_srv.h @@ -247,6 +247,7 @@ typedef struct dap_chain_net_srv dap_chain_net_srv_abstract_t srv_common; dap_chain_net_srv_price_t *pricelist; + bool allow_free_srv; uint32_t grace_period; pthread_mutex_t banlist_mutex; dap_chain_net_srv_banlist_item_t *ban_list;