diff --git a/modules/net/srv/dap_chain_net_srv.c b/modules/net/srv/dap_chain_net_srv.c index 76bc3f3fdda6dc59c838430e96969d1d972e9185..4a4967a5843e9aaeae564cd41f3f2eee699f1d21 100644 --- a/modules/net/srv/dap_chain_net_srv.c +++ b/modules/net/srv/dap_chain_net_srv.c @@ -122,6 +122,10 @@ int dap_chain_net_srv_init() ); s_load_all(); + + dap_chain_ledger_verificator_add(DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY, dap_chain_net_srv_pay_verificator, NULL); + dap_chain_ledger_verificator_add(DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE, dap_chain_ledger_fee_verificator, NULL); + return 0; } @@ -467,8 +471,8 @@ static int s_cli_net_srv( int argc, char **argv, char **a_str_reply) dap_chain_net_srv_uid_t l_srv_uid={{0}}; dap_chain_node_addr_t l_node_addr={0}; dap_chain_hash_fast_t l_tx_cond_hash={{0}}; - dap_time_t l_expires=0; // TS when the service expires - uint256_t l_price = {}; + dap_time_t l_expires = 0; // TS when the service expires + uint256_t l_price = {0}; char l_price_token[DAP_CHAIN_TICKER_SIZE_MAX]={0}; dap_chain_net_srv_price_unit_uid_t l_price_unit={{0}}; dap_chain_net_srv_order_direction_t l_direction = SERV_DIR_UNDEFINED; @@ -512,7 +516,7 @@ static int s_cli_net_srv( int argc, char **argv, char **a_str_reply) } // create order char * l_order_new_hash_str = dap_chain_net_srv_order_create( - l_net,l_direction, l_srv_uid, l_node_addr,l_tx_cond_hash, l_price, l_price_unit, + l_net,l_direction, l_srv_uid, l_node_addr,l_tx_cond_hash, &l_price, l_price_unit, l_price_token, l_expires, (uint8_t *)l_ext, l_ext_len, l_region_str, l_continent_num, l_key); if(l_cert) dap_cert_delete(l_cert); @@ -596,8 +600,9 @@ static int s_cli_net_srv( int argc, char **argv, char **a_str_reply) return ret; } -bool dap_chain_net_srv_pay_verificator(dap_chain_tx_out_cond_t *a_cond, dap_chain_datum_tx_t *a_tx, bool a_owner) +bool dap_chain_net_srv_pay_verificator(dap_ledger_t* a_ledger, dap_chain_tx_out_cond_t *a_cond, dap_chain_datum_tx_t *a_tx, bool a_owner) { + UNUSED(a_ledger); if (!a_owner) return false; dap_chain_datum_tx_receipt_t *l_receipt = (dap_chain_datum_tx_receipt_t *) @@ -710,11 +715,7 @@ int dap_chain_net_srv_parse_pricelist(dap_chain_net_srv_t *a_srv, const char *a_ */ dap_chain_net_srv_t* dap_chain_net_srv_add(dap_chain_net_srv_uid_t a_uid, const char *a_config_section, - dap_chain_net_srv_callback_data_t a_callback_request, - dap_chain_net_srv_callback_data_t a_callback_response_success, - dap_chain_net_srv_callback_data_t a_callback_response_error, - dap_chain_net_srv_callback_data_t a_callback_receipt_next_success, - dap_chain_net_srv_callback_custom_data_t a_callback_custom_data) + dap_chain_net_srv_callbacks_t* a_callbacks) { service_list_t *l_sdata = NULL; @@ -725,11 +726,8 @@ dap_chain_net_srv_t* dap_chain_net_srv_add(dap_chain_net_srv_uid_t a_uid, if(l_sdata == NULL) { l_srv = DAP_NEW_Z(dap_chain_net_srv_t); l_srv->uid.uint64 = a_uid.uint64; - l_srv->callback_requested = a_callback_request; - l_srv->callback_response_success = a_callback_response_success; - l_srv->callback_response_error = a_callback_response_error; - l_srv->callback_receipt_next_success = a_callback_receipt_next_success; - l_srv->callback_custom_data = a_callback_custom_data; + if (a_callbacks) + memcpy(&l_srv->callbacks, a_callbacks, sizeof(*a_callbacks)); pthread_mutex_init(&l_srv->banlist_mutex, NULL); l_sdata = DAP_NEW_Z(service_list_t); memcpy(&l_sdata->uid, &l_uid, sizeof(l_uid)); @@ -744,42 +742,6 @@ dap_chain_net_srv_t* dap_chain_net_srv_add(dap_chain_net_srv_uid_t a_uid, return l_srv; } -/** - * @brief dap_chain_net_srv_set_ch_callbacks - * @param a_uid - * @param a_callback_stream_ch_opened - * @param a_callback_stream_ch_read - * @param a_callback_stream_ch_write - * @param a_callback_stream_ch_closed - * @return - */ -int dap_chain_net_srv_set_ch_callbacks(dap_chain_net_srv_uid_t a_uid, - dap_chain_net_srv_callback_ch_t a_callback_stream_ch_opened, - dap_chain_net_srv_callback_ch_t a_callback_stream_ch_closed, - dap_chain_net_srv_callback_ch_t a_callback_stream_ch_write - ) -{ - service_list_t *l_sdata = NULL; - int l_ret =0; - dap_chain_net_srv_t * l_srv = NULL; - dap_chain_net_srv_uid_t l_uid = {.uint64 = a_uid.uint64 }; // Copy to let then compiler to pass args via registers not stack - - pthread_mutex_lock(&s_srv_list_mutex); - HASH_FIND(hh, s_srv_list, &l_uid, sizeof(l_uid), l_sdata); - if( l_sdata ) { - l_srv = l_sdata->srv; - l_srv->callback_stream_ch_opened = a_callback_stream_ch_opened; - l_srv->callback_stream_ch_closed = a_callback_stream_ch_closed; - l_srv->callback_stream_ch_write = a_callback_stream_ch_write; - }else{ - log_it(L_ERROR, "Can't find service with 0x%016"DAP_UINT64_FORMAT_X, a_uid.uint64); - l_ret= -1; - } - pthread_mutex_unlock(&s_srv_list_mutex); - return l_ret; -} - - /** * @brief dap_chain_net_srv_del * @param a_srv @@ -810,8 +772,8 @@ void dap_chain_net_srv_call_write_all(dap_stream_ch_t * a_client) pthread_mutex_lock(&s_srv_list_mutex); HASH_ITER(hh, s_srv_list , l_sdata, l_sdata_tmp) { - if ( l_sdata->srv->callback_stream_ch_write) - l_sdata->srv->callback_stream_ch_write(l_sdata->srv, a_client); + if (l_sdata->srv->callbacks.stream_ch_write) + l_sdata->srv->callbacks.stream_ch_write(l_sdata->srv, a_client); } pthread_mutex_unlock(&s_srv_list_mutex); } @@ -826,8 +788,8 @@ void dap_chain_net_srv_call_opened_all(dap_stream_ch_t * a_client) pthread_mutex_lock(&s_srv_list_mutex); HASH_ITER(hh, s_srv_list , l_sdata, l_sdata_tmp) { - if ( l_sdata->srv->callback_stream_ch_opened) - l_sdata->srv->callback_stream_ch_opened(l_sdata->srv, a_client); + if (l_sdata->srv->callbacks.stream_ch_opened) + l_sdata->srv->callbacks.stream_ch_opened(l_sdata->srv, a_client); } pthread_mutex_unlock(&s_srv_list_mutex); } @@ -838,8 +800,8 @@ void dap_chain_net_srv_call_closed_all(dap_stream_ch_t * a_client) pthread_mutex_lock(&s_srv_list_mutex); HASH_ITER(hh, s_srv_list , l_sdata, l_sdata_tmp) { - if ( l_sdata->srv->callback_stream_ch_closed) - l_sdata->srv->callback_stream_ch_closed(l_sdata->srv, a_client); + if (l_sdata->srv->callbacks.stream_ch_closed) + l_sdata->srv->callbacks.stream_ch_closed(l_sdata->srv, a_client); } pthread_mutex_unlock(&s_srv_list_mutex); } diff --git a/modules/net/srv/include/dap_chain_net_srv.h b/modules/net/srv/include/dap_chain_net_srv.h index 771b664af4c2f24c5f828eb84f58bfe14f2da961..302780c367390ab04f3bb3a0f43c77e1aa0b660e 100755 --- a/modules/net/srv/include/dap_chain_net_srv.h +++ b/modules/net/srv/include/dap_chain_net_srv.h @@ -24,6 +24,8 @@ along with any CellFrame SDK based project. If not, see <http://www.gnu.org/lic */ #pragma once +#include "dap_chain_common.h" +#include "dap_chain_datum_decree.h" #include "dap_chain_net.h" #include "dap_chain_net_remote.h" #include "dap_chain_wallet.h" @@ -209,6 +211,9 @@ typedef int (*dap_chain_net_srv_callback_data_t)(dap_chain_net_srv_t *, uint32_ typedef void* (*dap_chain_net_srv_callback_custom_data_t)(dap_chain_net_srv_t *, dap_chain_net_srv_usage_t *, const void *, size_t, size_t *); typedef void (*dap_chain_net_srv_callback_ch_t)(dap_chain_net_srv_t *, dap_stream_ch_t *); +// Process service decree +typedef void (*dap_chain_net_srv_callback_decree_t)(dap_chain_net_srv_t* a_srv, dap_chain_net_t* a_net, dap_chain_t* a_chain, dap_chain_datum_decree_t* a_decree, size_t a_decree_size); + typedef struct dap_chain_net_srv_banlist_item { dap_chain_hash_fast_t client_pkey_hash; pthread_mutex_t *ht_mutex; @@ -216,6 +221,29 @@ typedef struct dap_chain_net_srv_banlist_item { UT_hash_handle hh; } dap_chain_net_srv_banlist_item_t; +typedef struct dap_chain_net_srv_callbacks { + // For traffic control + dap_chain_callback_trafic_t traffic; + // Request for usage + dap_chain_net_srv_callback_data_t requested; + // Receipt first sign successfull + dap_chain_net_srv_callback_data_t response_success; + // Response error + dap_chain_net_srv_callback_data_t response_error; + // Receipt next sign succesfull + dap_chain_net_srv_callback_data_t receipt_next_success; + // Custom data processing + dap_chain_net_srv_callback_custom_data_t custom_data; + + // Decree processing + dap_chain_net_srv_callback_decree_t decree; + + // Stream CH callbacks - channel opened, closed and write + dap_chain_net_srv_callback_ch_t stream_ch_opened; + dap_chain_net_srv_callback_ch_t stream_ch_closed; + dap_chain_net_srv_callback_ch_t stream_ch_write; +} dap_chain_net_srv_callbacks_t; + typedef struct dap_chain_net_srv { dap_chain_net_srv_uid_t uid; // Unique ID for service. @@ -226,27 +254,8 @@ typedef struct dap_chain_net_srv pthread_mutex_t banlist_mutex; dap_chain_net_srv_banlist_item_t *ban_list; - dap_chain_callback_trafic_t callback_trafic; + dap_chain_net_srv_callbacks_t callbacks; - // Request for usage - dap_chain_net_srv_callback_data_t callback_requested; - - // Receipt first sign successfull - dap_chain_net_srv_callback_data_t callback_response_success; - - // Response error - dap_chain_net_srv_callback_data_t callback_response_error; - - // Receipt next sign succesfull - dap_chain_net_srv_callback_data_t callback_receipt_next_success; - - // Custom data processing - dap_chain_net_srv_callback_custom_data_t callback_custom_data; - - // Stream CH callbacks - channel opened, closed and write - dap_chain_net_srv_callback_ch_t callback_stream_ch_opened; - dap_chain_net_srv_callback_ch_t callback_stream_ch_closed; - dap_chain_net_srv_callback_ch_t callback_stream_ch_write; // Pointer to inheritor object void *_inheritor; // Pointer to internal server structure @@ -255,21 +264,10 @@ typedef struct dap_chain_net_srv int dap_chain_net_srv_init(); void dap_chain_net_srv_deinit(void); -bool dap_chain_net_srv_pay_verificator(dap_chain_tx_out_cond_t *a_cond, dap_chain_datum_tx_t *a_tx, bool a_owner); +bool dap_chain_net_srv_pay_verificator(dap_ledger_t* a_ledger, dap_chain_tx_out_cond_t *a_cond, dap_chain_datum_tx_t *a_tx, bool a_owner); dap_chain_net_srv_t* dap_chain_net_srv_add(dap_chain_net_srv_uid_t a_uid, const char *a_config_section, - dap_chain_net_srv_callback_data_t a_callback_requested, - dap_chain_net_srv_callback_data_t a_callback_response_success, - dap_chain_net_srv_callback_data_t a_callback_response_error, - dap_chain_net_srv_callback_data_t a_callback_receipt_next_success, - dap_chain_net_srv_callback_custom_data_t a_callback_custom_data - ); - -int dap_chain_net_srv_set_ch_callbacks(dap_chain_net_srv_uid_t a_uid, - dap_chain_net_srv_callback_ch_t a_callback_stream_ch_opened, - dap_chain_net_srv_callback_ch_t a_callback_stream_ch_closed, - dap_chain_net_srv_callback_ch_t a_callback_stream_ch_write - ); + dap_chain_net_srv_callbacks_t* a_callbacks); void dap_chain_net_srv_del(dap_chain_net_srv_t * a_srv); void dap_chain_net_srv_del_all(void);