X-Git-Url: https://rtime.felk.cvut.cz/gitweb/frescor/fna.git/blobdiff_plain/e1cc80051455d1a561c136c8b04abc86c3d67d9a..d7a2d853e9a79180029bbf6e9eaa5ae37bcd861e:/src_frescan/frescan_bwres.c diff --git a/src_frescan/frescan_bwres.c b/src_frescan/frescan_bwres.c index ebffa1a..4354602 100644 --- a/src_frescan/frescan_bwres.c +++ b/src_frescan/frescan_bwres.c @@ -64,8 +64,10 @@ * */ +#include "frsh.h" #include "frescan_bwres.h" #include "frescan_bwres_requests.h" +#include "frescan_bwres_robjs.h" #include "frescan_bwres_messages.h" #include "frescan_bwres_threads.h" #include "frescan_bwres_analysis.h" @@ -83,31 +85,90 @@ int frescan_bwres_init(frescan_network_t net) { int ret; - frescan_server_params_t server_params; // TODO: improve this... - frescan_sa_init_params_t sa_init_params; // TODO: improve this... - - sa_init_params.max_prio = 30; - sa_init_params.min_prio = 1; - - ret = frescan_sa_init(&the_networks[net].scenario, - &sa_init_params); - if (ret != 0) return ret; + frescan_node_t node; + frescan_ss_t neg_msg_ss_id; + frescan_server_params_t server_params; + frescan_bwres_sa_init_params_t init_params; + frsh_contract_t neg_msgs_contract; + frsh_rel_time_t neg_msgs_budget; + frsh_rel_time_t neg_msgs_period; + + init_params.min_prio = FRESCAN_BWRES_SS_MIN_PRIO; + init_params.max_prio = FRESCAN_BWRES_SS_MAX_PRIO; + + if (frescan_data[net].local_node == FRESCAN_BWRES_MASTER_NODE) { + ret = frescan_bwres_sa_init(&frescan_data[net].scenario, + &init_params); + if (ret != 0) return ret; + + // Add contracts for the negotiation messages + ret = frsh_contract_init(&neg_msgs_contract); + if (ret != 0) return ret; + + neg_msgs_budget = frsh_usec_to_rel_time( + (long)FRESCAN_FRAME_TX_TIME_US * + FRESCAN_BWRES_NEG_MSG_BUDGET); + + neg_msgs_period = frsh_usec_to_rel_time( + (long)FRESCAN_BWRES_NEG_MSG_PERIOD); + + ret = frsh_contract_set_basic_params(&neg_msgs_contract, + &neg_msgs_budget, + &neg_msgs_period, + FRSH_WT_INDETERMINATE, + FRSH_CT_REGULAR); + if (ret != 0) return ret; + + ret = frsh_contract_set_preemption_level + (&neg_msgs_contract, FRESCAN_BWRES_NEG_MSG_PRIO); + if (ret != 0) return ret; + + for(node=0; nodetype = FRESCAN_REQ_NEG; - req_data->req = req; - req_data->contract = (frsh_contract_t *)contract; - req_data->request_node = the_networks[net].local_node; req_data->net = net; + req_data->type = FRESCAN_BWRES_REQ_GN; + req_data->req = req; + req_data->request_node = frescan_data[net].local_node; + + if (contracts_to_neg == NULL) { + req_data->contracts_to_neg = &req_data->contracts_to_neg_data; + req_data->contracts_to_neg->size = 0; + } else { + req_data->contracts_to_neg = + (frsh_contracts_group_t *)contracts_to_neg; + } - ret = frescan_bwres_robjs_alloc(&req_data->robj, FRESCAN_BWRES_MX_PRIO); - if (ret != 0) return ret; + if (contracts_to_reneg == NULL) { + req_data->contracts_to_reneg = &req_data-> + contracts_to_reneg_data; + req_data->contracts_to_reneg->size = 0; + } else { + req_data->contracts_to_reneg = (frsh_contracts_group_t *) + contracts_to_reneg; + } - // NOTE: we preallocate a server for the negotiation process - server_params.budget = 0; - server_params.period.tv_sec = 0; - server_params.period.tv_nsec = 0; - server_params.prio = 0; + if (ss_to_reneg == NULL) { + req_data->ss_to_reneg = &req_data->ss_to_reneg_data; + req_data->ss_to_reneg->size = 0; + } else { + req_data->ss_to_reneg = (frescan_ss_group_t *)ss_to_reneg; + } + + if (ss_to_cancel == NULL) { + req_data->ss_to_cancel = &req_data->ss_to_cancel_data; + req_data->ss_to_cancel->size = 0; + } else { + req_data->ss_to_cancel = (frescan_ss_group_t *)ss_to_cancel; - ret = frescan_servers_create(net, &server_params, &req_data->ss); + } + + if (ss_new == NULL) { + req_data->ss_new = &req_data->ss_new_data; + req_data->ss_new->size = 0; + } else { + req_data->ss_new = ss_new; + } + + ret = frescan_bwres_robjs_alloc(&req_data->robj, FRESCAN_BWRES_MX_PRIO); if (ret != 0) return ret; DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "enqueue the negotiation request\n"); - ret = frescan_requests_enqueue(req); + ret = frescan_bwres_requests_enqueue(req); if (ret != 0) return ret; DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "wait for a reply\n"); @@ -183,98 +275,76 @@ int frescan_bwres_negotiate(frescan_network_t net, if (ret != 0) return ret; switch (req_data->return_value) { - case FRESCAN_REQ_ACCEPTED: - DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "negotiation OK\n"); - *accepted = true; - *ss = req_data->ss; - server_params = req_data->final_values; - ret = frescan_servers_update(net, &server_params, *ss); - if (ret != 0) return ret; - break; - - case FRESCAN_REQ_NOT_ACCEPTED: - DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "negotiation FAIL\n"); - *accepted = false; - ret = frescan_servers_destroy(net, req_data->ss); - if (ret != 0) return ret; - break; - - default: - FRESCAN_ERROR("return_value unknown\n"); - return -1; + case FRESCAN_BWRES_REQ_ACCEPTED: + DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "negotiation OK\n"); + *accepted = true; + break; + + case FRESCAN_BWRES_REQ_NOT_ACCEPTED: + DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "negotiation FAIL\n"); + *accepted = false; + break; + + default: + FRESCAN_ERROR("return_value unknown\n"); + return -1; } - frescan_requests_free(req); + ret = frescan_bwres_requests_free(req); + if (ret != 0) return ret; + return 0; } /** - * frescan_bwres_renegotiate() + * frescan_bwres_negotiate() */ -int frescan_bwres_renegotiate(frescan_network_t net, - const frsh_contract_t *contract, - frescan_ss_t ss, - bool *accepted) +int frescan_bwres_negotiate(frescan_network_t net, + const frsh_contract_t *contract, + frescan_ss_t *ss, + bool *accepted) { int ret; - frescan_request_id_t req; - frescan_request_data_t *req_data; - frescan_server_params_t server_params; - - DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "preparing renegotiation request\n"); + frsh_contracts_group_t contracts_to_neg; + frescan_ss_group_t ss_new; - ret = frescan_requests_alloc(&req); - if (ret != 0) return ret; - - ret = frescan_requests_get_data(req, &req_data); - if (ret != 0) return ret; - - req_data->type = FRESCAN_REQ_RENEG; - req_data->req = req; - req_data->contract = (frsh_contract_t *)contract; - req_data->request_node = the_networks[net].local_node; - req_data->net = net; - req_data->ss = ss; + contracts_to_neg.size = 1; + contracts_to_neg.contracts[0] = *contract; - ret = frescan_bwres_robjs_alloc(&req_data->robj, FRESCAN_BWRES_MX_PRIO); + ret = frescan_bwres_group_change_mode_sync + (net, &contracts_to_neg, NULL, NULL, + NULL, &ss_new, accepted); if (ret != 0) return ret; - DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "enqueue renegotiation request\n"); + if (*accepted) { + *ss = ss_new.ss[0]; + } - ret = frescan_requests_enqueue(req); - if (ret != 0) return ret; + return 0; +} - DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "wait for a reply\n"); +/** + * frescan_bwres_renegotiate() + */ - ret = frescan_bwres_robjs_wait(req_data->robj); - if (ret != 0) return ret; +int frescan_bwres_renegotiate(frescan_network_t net, + const frsh_contract_t *contract, + frescan_ss_t ss, + bool *accepted) +{ + frsh_contracts_group_t contracts_to_reneg; + frescan_ss_group_t ss_to_reneg; - ret = frescan_bwres_robjs_free(req_data->robj); - if (ret != 0) return ret; + contracts_to_reneg.size = 1; + contracts_to_reneg.contracts[0] = *contract; - switch (req_data->return_value) { - case FRESCAN_REQ_ACCEPTED: - DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "renegotiation OK\n"); - *accepted = true; - server_params = req_data->final_values; - ret = frescan_servers_update(net, &server_params, ss); - if (ret != 0) return ret; - break; - - case FRESCAN_REQ_NOT_ACCEPTED: - DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "negotiation FAIL\n"); - *accepted = false; - if (ret != 0) return ret; - break; - - default: - FRESCAN_ERROR("return_value unknown\n"); - return -1; - } + ss_to_reneg.size = 1; + ss_to_reneg.ss[0] = ss; - frescan_requests_free(req); - return 0; + return frescan_bwres_group_change_mode_sync + (net, NULL, &contracts_to_reneg, &ss_to_reneg, + NULL, NULL, accepted); } /** @@ -284,43 +354,11 @@ int frescan_bwres_renegotiate(frescan_network_t net, int frescan_bwres_cancel(frescan_network_t net, frescan_ss_t ss) { - int ret; - frescan_request_id_t req; - frescan_request_data_t *req_data; + frescan_ss_group_t ss_to_cancel; - DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "preparing cancel request\n"); + ss_to_cancel.size = 1; + ss_to_cancel.ss[0] = ss; - ret = frescan_requests_alloc(&req); - if (ret != 0) return ret; - - ret = frescan_requests_get_data(req, &req_data); - if (ret != 0) return ret; - - req_data->type = FRESCAN_REQ_CANCEL; - req_data->req = req; - req_data->request_node = the_networks[net].local_node; - req_data->net = net; - req_data->ss = ss; - - ret = frescan_bwres_robjs_alloc(&req_data->robj, FRESCAN_BWRES_MX_PRIO); - if (ret != 0) return ret; - - DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "enqueue cancel request\n"); - - ret = frescan_requests_enqueue(req); - if (ret != 0) return ret; - - DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "wait for a signal\n"); - - ret = frescan_bwres_robjs_wait(req_data->robj); - if (ret != 0) return ret; - - ret = frescan_bwres_robjs_free(req_data->robj); - if (ret != 0) return ret; - - ret = frescan_servers_destroy(net, ss); - if (ret != 0) return ret; - - frescan_requests_free(req); - return 0; + return frescan_bwres_group_change_mode_sync + (net, NULL, NULL, NULL, &ss_to_cancel, NULL, NULL); }