X-Git-Url: https://rtime.felk.cvut.cz/gitweb/frescor/fna.git/blobdiff_plain/e408d078c1fbc67da13f89e18f5485b8f05cc7fe..0abc21283add61421dbc58d7ef12cec551af7afe:/src_frescan/frescan_bwres.c?ds=sidebyside diff --git a/src_frescan/frescan_bwres.c b/src_frescan/frescan_bwres.c index 23bc3c9..b3d0299 100644 --- a/src_frescan/frescan_bwres.c +++ b/src_frescan/frescan_bwres.c @@ -64,6 +64,7 @@ * */ +#include "frsh.h" #include "frescan_bwres.h" #include "frescan_bwres_requests.h" #include "frescan_bwres_robjs.h" @@ -84,29 +85,74 @@ int frescan_bwres_init(frescan_network_t net) { int ret; - frescan_server_params_t server_params; // TODO: improve this... - frescan_bwres_sa_init_params_t init_params; // TODO: improve this... + 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.max_prio = 30; - init_params.min_prio = 1; + 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_preemption_level + (&neg_msgs_contract, + FRESCAN_BWRES_NEG_MSG_PRIO); + if (ret != 0) return ret; + + 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; + + for(node=0; nodetype = FRESCAN_BWRES_REQ_GN; req_data->req = req; req_data->request_node = frescan_data[net].local_node; - req_data->contracts_to_neg = (frsh_contracts_group_t *) - contracts_to_neg; - req_data->contracts_to_reneg = (frsh_contracts_group_t *) - contracts_to_reneg; - req_data->ss_to_reneg = (frescan_ss_group_t *)ss_to_reneg; - req_data->ss_to_cancel = (frescan_ss_group_t *)ss_to_cancel; - req_data->ss_new = ss_new; + + 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; + } + + 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; + } + + 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; + + } + + 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;