From: sangorrin Date: Wed, 23 Apr 2008 09:23:29 +0000 (+0000) Subject: added the functions to renegotiate and cancel a contract. TODO: there is a bug when... X-Git-Url: http://rtime.felk.cvut.cz/gitweb/frescor/fna.git/commitdiff_plain/7ebdd8b62d5f50250007c4eeab9659266cb53590 added the functions to renegotiate and cancel a contract. TODO: there is a bug when cancelling contracts, reneg async, reserve-commit, spare capacity, measurements git-svn-id: http://www.frescor.org/private/svn/frescor/fna/trunk@1137 35b4ef3e-fd22-0410-ab77-dab3279adceb --- diff --git a/src_frescan/frescan_bwres.c b/src_frescan/frescan_bwres.c index 33918f2..f45fb8a 100644 --- a/src_frescan/frescan_bwres.c +++ b/src_frescan/frescan_bwres.c @@ -81,12 +81,11 @@ int frescan_bwres_init(frescan_network_t net) * 2.- enqueue the request * 3.- wait in the reply object for a reply * 4.- return the final values and free the request - * */ int frescan_bwres_negotiate(frescan_network_t net, const frescan_contract_t *contract, - frescan_ss_t *id, + frescan_ss_t *ss, bool *accepted) { int ret; @@ -133,27 +132,146 @@ 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; - *id = req_data->ss; - server_params.prio = req_data->final_values.server_prio; - ret = frescan_servers_update(net, &server_params, *id); - 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: - ERROR("return_value unknown\n"); - return -1; + case FRESCAN_REQ_ACCEPTED: + DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "negotiation OK\n"); + *accepted = true; + *ss = req_data->ss; + server_params.prio = req_data->final_values.server_prio; + 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: + ERROR("return_value unknown\n"); + return -1; } frescan_requests_free(req); return 0; } + +/** + * frescan_bwres_renegotiate() + */ + +int frescan_bwres_renegotiate(frescan_network_t net, + const frescan_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"); + + 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 = (frescan_contract_t *)contract; + 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 renegotiation request\n"); + + ret = frescan_requests_enqueue(req); + if (ret != 0) return ret; + + DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "wait for a reply\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; + + switch (req_data->return_value) { + case FRESCAN_REQ_ACCEPTED: + DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "renegotiation OK\n"); + *accepted = true; + server_params.values.budget = contract->min_values.budget; + server_params.values.period = contract->min_values.period; + server_params.prio = req_data->final_values.server_prio; + 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: + ERROR("return_value unknown\n"); + return -1; + } + + frescan_requests_free(req); + return 0; +} + +/** + * frescan_bwres_cancel() + */ + +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; + + DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "preparing cancel request\n"); + + 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; +} diff --git a/src_frescan/frescan_bwres.h b/src_frescan/frescan_bwres.h index af476d6..a8b3b59 100644 --- a/src_frescan/frescan_bwres.h +++ b/src_frescan/frescan_bwres.h @@ -24,9 +24,17 @@ extern int frescan_bwres_init(frescan_network_t net); extern int frescan_bwres_negotiate(frescan_network_t net, const frescan_contract_t *contract, - frescan_ss_t *id, + frescan_ss_t *ss, bool *accepted); -// TODO: add other functions: renegotiate, cancel... +extern int frescan_bwres_renegotiate(frescan_network_t net, + const frescan_contract_t *contract, + frescan_ss_t ss, + bool *accepted); + +extern int frescan_bwres_cancel(frescan_network_t net, + frescan_ss_t ss); + +// TODO: add other functions: renegotiate_async #endif // _FRESCAN_BANDWIDTH_RESERVATION_H_ diff --git a/src_frescan/frescan_bwres_analysis.c b/src_frescan/frescan_bwres_analysis.c index 5c8c7bc..00d5fe6 100644 --- a/src_frescan/frescan_bwres_analysis.c +++ b/src_frescan/frescan_bwres_analysis.c @@ -135,14 +135,16 @@ int frescan_sa_add_contract(frescan_sa_scenario_t *scenario, * * @scenario: the scenario (in out) * @ss: the ss identificator (in) - * @contract: the values to update the contract (in) * @node: the node this contract belongs to (in) + * @contract: the values to update the contract (in) + * @old_contract: the values of the previous contract. Can be NULL (out) */ int frescan_sa_update_contract(frescan_sa_scenario_t *scenario, frescan_ss_t ss, + frescan_node_t node, const frescan_contract_t *contract, - frescan_node_t node) + frescan_contract_t *old_contract) { // int ret; // @@ -152,9 +154,11 @@ int frescan_sa_update_contract(frescan_sa_scenario_t *scenario, sa_contract = &scenario->contracts[node][ss]; + if (old_contract != NULL) { + *old_contract = sa_contract->contract; + } + sa_contract->contract = *contract; - sa_contract->node = node; - sa_contract->ss = ss; return 0; } @@ -221,7 +225,7 @@ int frescan_sa_sched_test(frescan_sa_scenario_t *scenario, int num_contracts; double utilization, max_utilization, budget, period; - WARNING("simplified ub test (no blockings, prio ordered)\n"); + WARNING("simplified ub test (no blocks, prio ordered)\n"); utilization = 0.0; num_contracts = 0; diff --git a/src_frescan/frescan_bwres_analysis.h b/src_frescan/frescan_bwres_analysis.h index ad9fca6..9058f56 100644 --- a/src_frescan/frescan_bwres_analysis.h +++ b/src_frescan/frescan_bwres_analysis.h @@ -107,14 +107,16 @@ extern int frescan_sa_add_contract(frescan_sa_scenario_t *scenario, * * @scenario: the scenario (in out) * @ss: the ss identificator (in) - * @contract: the values to update the contract (in) * @node: the node this contract belongs to (in) + * @contract: the values to update the contract (in) + * @old_contract: the values of the previous contract. Can be NULL (out) */ -extern int frescan_sa_update_contract(frescan_sa_scenario_t *scenario, - frescan_ss_t ss, +extern int frescan_sa_update_contract(frescan_sa_scenario_t *scenario, + frescan_ss_t ss, + frescan_node_t node, const frescan_contract_t *contract, - frescan_node_t node); + frescan_contract_t *old_contract); /** * frescan_sa_remove_contract() - remove a contract from the scenario diff --git a/src_frescan/frescan_bwres_messages.c b/src_frescan/frescan_bwres_messages.c index 6d1982a..870af2b 100644 --- a/src_frescan/frescan_bwres_messages.c +++ b/src_frescan/frescan_bwres_messages.c @@ -293,6 +293,9 @@ int frescan_messages_send_request(const frescan_request_data_t *req_data) return -1; } + DEBUG(true, "request type %X sent, size %d\n", + *(frescan_request_type_t *)msg, size); + ret = frescan_send(&send_params[req_data->net], msg, size); if (ret != 0) return ret; @@ -354,7 +357,8 @@ int frescan_messages_recv_request(frescan_network_t net, case FRESCAN_REP_NEG: return frescan_repneg_message_to_request(msg, req_data); default: - ERROR("request type not supported\n"); + ERROR("request type %X not supported\n", + *(frescan_request_type_t *)msg); return -1; } } diff --git a/src_frescan/frescan_bwres_threads.c b/src_frescan/frescan_bwres_threads.c index 3216a1b..ef750b8 100644 --- a/src_frescan/frescan_bwres_threads.c +++ b/src_frescan/frescan_bwres_threads.c @@ -135,7 +135,7 @@ static void *frescan_manager_thread(void *arg) } if(req_data->request_node != the_networks[net].local_node) { - ret = frescan_requests_free(req); + ret = frescan_requests_free(req); // acceptor request assert(ret == 0); } } @@ -233,20 +233,98 @@ static void frescan_manager_neg(frescan_request_data_t *req_data) static void frescan_manager_reneg(frescan_request_data_t *req_data) { + int ret; + bool accepted; + frescan_contract_t old_contract; + DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, "renegotiation request\n"); + + if (the_networks[req_data->net].local_node == FRESCAN_NEG_MASTER_NODE) { + // scheduling analysis + ret = frescan_sa_update_contract + (&the_networks[req_data->net].scenario, + req_data->ss, + req_data->request_node, + req_data->contract, + &old_contract); + assert(ret == 0); + + ret = frescan_sa_sched_test + (&the_networks[req_data->net].scenario, + &accepted); + assert(ret == 0); + + if (accepted) { + ret = frescan_sa_get_final_values + (&the_networks[req_data->net].scenario, + req_data->ss, + req_data->request_node, + &req_data->final_values); + assert(ret == 0); + req_data->return_value = FRESCAN_REQ_ACCEPTED; + } else { + ret = frescan_sa_update_contract + (&the_networks[req_data->net].scenario, + req_data->ss, + req_data->request_node, + &old_contract, + NULL); + assert(ret == 0); + req_data->return_value = FRESCAN_REQ_NOT_ACCEPTED; + } + + // signal or reply the results + if (req_data->request_node == FRESCAN_NEG_MASTER_NODE) { + DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, "master local\n"); + ret = frescan_bwres_robjs_signal(req_data->robj); + assert(ret == 0); + } else { + DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, + "master external, sending reply\n"); + + req_data->type = FRESCAN_REP_NEG; + ret = frescan_messages_send_request(req_data); + assert(ret == 0); + } + } else { + DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, + "send renegotiation request to master\n"); + ret = frescan_messages_send_request(req_data); + assert(ret == 0); + } } /** - * frescan_manager_neg + * frescan_manager_cancel */ static void frescan_manager_cancel(frescan_request_data_t *req_data) { + int ret; + DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, "cancel request\n"); + + if (the_networks[req_data->net].local_node == FRESCAN_NEG_MASTER_NODE) { + ret = frescan_sa_remove_contract + (&the_networks[req_data->net].scenario, + req_data->ss, + req_data->request_node); + assert(ret == 0); + } else { + DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, + "send cancel request to master\n"); + ret = frescan_messages_send_request(req_data); + assert(ret == 0); + } + + if (req_data->request_node == the_networks[req_data->net].local_node) { + ret = frescan_bwres_robjs_signal(req_data->robj); + assert(ret == 0); + } } /** - * frescan_manager_neg + * frescan_manager_repneg */ static void frescan_manager_repneg(frescan_request_data_t *req_data) diff --git a/tests/tests_frescan/test_frescan_bwres_cancel_in_master.c b/tests/tests_frescan/test_frescan_bwres_cancel_in_master.c new file mode 100644 index 0000000..5c6e803 --- /dev/null +++ b/tests/tests_frescan/test_frescan_bwres_cancel_in_master.c @@ -0,0 +1,113 @@ +#include // perror +#include // exit +#include // sleep + +#include "frescan.h" +#include "frescan_bwres.h" +#include "frescan_servers.h" + +#define ERROR(s) {perror (s); exit (-1);} + +#define NETWORK 0 +#define LOCAL_NODE 0 + +int main () +{ + int ret; + frescan_init_params_t init_params; + frescan_ss_t ss1, ss2, ss3; + frescan_contract_t contract; + bool accepted; + frescan_server_params_t server_params; + + init_params.net = NETWORK; + init_params.node = LOCAL_NODE; + init_params.tx_fp_max_prio = 10; + init_params.rx_num_of_channels = 10; + init_params.rx_channel_max_prio = NULL; + + printf("Initializing FRESCAN\n"); + ret = frescan_init(&init_params); + if (ret != 0) ERROR ("could not init FRESCAN"); + + printf("Initializing BWRES\n"); + ret = frescan_bwres_init(NETWORK); + if (ret != 0) ERROR ("could not init BWRES"); + + contract.min_values.budget = 5; + contract.min_values.period.tv_sec = 3; + contract.min_values.period.tv_nsec = 69; + contract.prio = 7; + + ret = frescan_bwres_negotiate(NETWORK, &contract, &ss1, &accepted); + if (ret != 0) ERROR ("could not negotiate"); + + if (accepted) { + printf("The contract was accepted, ss:%u\n", ss1); + ret = frescan_servers_get_data(NETWORK, &server_params, ss1); + if (ret != 0) ERROR ("could not get servers data"); + + printf("B:%u, T=(%u,%u), P:%u\n", + server_params.values.budget, + server_params.values.period.tv_sec, + server_params.values.period.tv_nsec, + server_params.prio); + } else { + printf("The contract was not accepted\n"); + } + + contract.min_values.budget = 6; + contract.min_values.period.tv_sec = 2; + contract.min_values.period.tv_nsec = 6; + contract.prio = 4; + + ret = frescan_bwres_negotiate(NETWORK, &contract, &ss2, &accepted); + if (ret != 0) ERROR ("could not negotiate"); + + if (accepted) { + printf("The contract was accepted, ss:%u\n", ss2); + ret = frescan_servers_get_data(NETWORK, &server_params, ss2); + if (ret != 0) ERROR ("could not get servers data"); + + printf("B:%u, T=(%u,%u), P:%u\n", + server_params.values.budget, + server_params.values.period.tv_sec, + server_params.values.period.tv_nsec, + server_params.prio); + } else { + printf("The contract was not accepted\n"); + } + + ret = frescan_bwres_cancel(NETWORK, ss1); + if (ret != 0) ERROR ("could not cancel server"); + + contract.min_values.budget = 1; + contract.min_values.period.tv_sec = 6; + contract.min_values.period.tv_nsec = 666; + contract.prio = 3; + + ret = frescan_bwres_negotiate(NETWORK, &contract, &ss3, &accepted); + if (ret != 0) ERROR ("could not negotiate"); + + if (accepted) { + printf("The contract was accepted, ss:%u\n", ss3); + ret = frescan_servers_get_data(NETWORK, &server_params, ss3); + if (ret != 0) ERROR ("could not get servers data"); + + printf("B:%u, T=(%u,%u), P:%u\n", + server_params.values.budget, + server_params.values.period.tv_sec, + server_params.values.period.tv_nsec, + server_params.prio); + } else { + printf("The contract was not accepted\n"); + } + + while (1) { + sleep(1); + } + + return 0; +} + + diff --git a/tests/tests_frescan/test_frescan_bwres_cancel_in_slave.c b/tests/tests_frescan/test_frescan_bwres_cancel_in_slave.c new file mode 100644 index 0000000..4b4c5e2 --- /dev/null +++ b/tests/tests_frescan/test_frescan_bwres_cancel_in_slave.c @@ -0,0 +1,117 @@ +#include // perror +#include // exit +#include // sleep + +#include "frescan.h" +#include "frescan_bwres.h" +#include "frescan_servers.h" + +#define ERROR(s) {perror (s); exit (-1);} + +#define NETWORK 0 +#define LOCAL_NODE 1 + +int main () +{ + int ret; + frescan_init_params_t init_params; + frescan_ss_t ss1, ss2, ss3; + frescan_contract_t contract; + frescan_server_params_t server_params; + bool accepted; + + init_params.net = NETWORK; + init_params.node = LOCAL_NODE; + init_params.tx_fp_max_prio = 10; + init_params.rx_num_of_channels = 10; + init_params.rx_channel_max_prio = NULL; + + printf("Initializing FRESCAN\n"); + ret = frescan_init(&init_params); + if (ret != 0) ERROR ("could not init FRESCAN"); + + printf("Initializing BWRES\n"); + ret = frescan_bwres_init(NETWORK); + if (ret != 0) ERROR ("could not init BWRES"); + + contract.min_values.budget = 5; + contract.min_values.period.tv_sec = 3; + contract.min_values.period.tv_nsec = 0; + contract.prio = 5; + + printf("Negotiating a contract 1\n"); + ret = frescan_bwres_negotiate(NETWORK, &contract, &ss1, &accepted); + if (ret != 0) ERROR ("could not negotiate succesfully"); + + if (accepted) { + printf("The contract was accepted, ss:%u\n", ss1); + ret = frescan_servers_get_data(NETWORK, &server_params, ss1); + if (ret != 0) ERROR ("could not get servers data"); + + printf("B:%u, T=(%u,%u), P:%u\n", + server_params.values.budget, + server_params.values.period.tv_sec, + server_params.values.period.tv_nsec, + server_params.prio); + } else { + printf("The contract was not accepted\n"); + } + + contract.min_values.budget = 6; + contract.min_values.period.tv_sec = 2; + contract.min_values.period.tv_nsec = 6; + contract.prio = 4; + + printf("Negotiating a contract 2\n"); + ret = frescan_bwres_negotiate(NETWORK, &contract, &ss2, &accepted); + if (ret != 0) ERROR ("could not negotiate"); + + if (accepted) { + printf("The contract was accepted, ss:%u\n", ss2); + ret = frescan_servers_get_data(NETWORK, &server_params, ss2); + if (ret != 0) ERROR ("could not get servers data"); + + printf("B:%u, T=(%u,%u), P:%u\n", + server_params.values.budget, + server_params.values.period.tv_sec, + server_params.values.period.tv_nsec, + server_params.prio); + } else { + printf("The contract was not accepted\n"); + } + + printf("cancelling contract for ss:%u\n", ss1); + ret = frescan_bwres_cancel(NETWORK, ss1); + if (ret != 0) ERROR ("could not cancel server"); + + contract.min_values.budget = 1; + contract.min_values.period.tv_sec = 6; + contract.min_values.period.tv_nsec = 666; + contract.prio = 3; + + printf("Negotiating a contract 3\n"); + ret = frescan_bwres_negotiate(NETWORK, &contract, &ss3, &accepted); + if (ret != 0) ERROR ("could not negotiate"); + + if (accepted) { + printf("The contract was accepted, ss:%u\n", ss3); + ret = frescan_servers_get_data(NETWORK, &server_params, ss3); + if (ret != 0) ERROR ("could not get servers data"); + + printf("B:%u, T=(%u,%u), P:%u\n", + server_params.values.budget, + server_params.values.period.tv_sec, + server_params.values.period.tv_nsec, + server_params.prio); + } else { + printf("The contract was not accepted\n"); + } + + while (1) { + sleep(1); + } + + return 0; +} + + diff --git a/tests/tests_frescan/test_frescan_bwres_renegotiate_in_master.c b/tests/tests_frescan/test_frescan_bwres_renegotiate_in_master.c new file mode 100644 index 0000000..98db77c --- /dev/null +++ b/tests/tests_frescan/test_frescan_bwres_renegotiate_in_master.c @@ -0,0 +1,90 @@ +#include // perror +#include // exit +#include // sleep + +#include "frescan.h" +#include "frescan_bwres.h" +#include "frescan_servers.h" + +#define ERROR(s) {perror (s); exit (-1);} + +#define NETWORK 0 +#define LOCAL_NODE 0 + +int main () +{ + int ret; + frescan_init_params_t init_params; + frescan_ss_t ss; + frescan_contract_t contract; + bool accepted; + frescan_server_params_t server_params; + + init_params.net = NETWORK; + init_params.node = LOCAL_NODE; + init_params.tx_fp_max_prio = 10; + init_params.rx_num_of_channels = 10; + init_params.rx_channel_max_prio = NULL; + + printf("Initializing FRESCAN\n"); + ret = frescan_init(&init_params); + if (ret != 0) ERROR ("could not init FRESCAN"); + + printf("Initializing BWRES\n"); + ret = frescan_bwres_init(NETWORK); + if (ret != 0) ERROR ("could not init BWRES"); + + contract.min_values.budget = 5; + contract.min_values.period.tv_sec = 3; + contract.min_values.period.tv_nsec = 69; + contract.prio = 7; + + ret = frescan_bwres_negotiate(NETWORK, &contract, &ss, &accepted); + if (ret != 0) ERROR ("could not negotiate"); + + if (accepted) { + printf("The contract was accepted, ss:%u\n", ss); + ret = frescan_servers_get_data(NETWORK, &server_params, ss); + if (ret != 0) ERROR ("could not get servers data"); + + printf("B:%u, T=(%u,%u), P:%u\n", + server_params.values.budget, + server_params.values.period.tv_sec, + server_params.values.period.tv_nsec, + server_params.prio); + } else { + printf("The contract was not accepted\n"); + } + + printf("Renegotiate the contract in 2 seconds\n"); + sleep(2); + + contract.min_values.budget = 7; + contract.min_values.period.tv_sec = 2; + contract.min_values.period.tv_nsec = 45; + contract.prio = 8; + + ret = frescan_bwres_renegotiate(NETWORK, &contract, ss, &accepted); + if (ret != 0) ERROR ("could not renegotiate"); + + if (accepted) { + printf("The contract renegotiation was accepted, ss:%u\n", ss); + ret = frescan_servers_get_data(NETWORK, &server_params, ss); + if (ret != 0) ERROR ("could not get servers data"); + + printf("B:%u, T=(%u,%u), P:%u\n", + server_params.values.budget, + server_params.values.period.tv_sec, + server_params.values.period.tv_nsec, + server_params.prio); + } else { + printf("The contract was not accepted\n"); + } + + + while (1) { + sleep(1); + } + + return 0; +} diff --git a/tests/tests_frescan/test_frescan_bwres_renegotiate_in_slave.c b/tests/tests_frescan/test_frescan_bwres_renegotiate_in_slave.c new file mode 100644 index 0000000..0996408 --- /dev/null +++ b/tests/tests_frescan/test_frescan_bwres_renegotiate_in_slave.c @@ -0,0 +1,92 @@ +#include // perror +#include // exit +#include // sleep + +#include "frescan.h" +#include "frescan_bwres.h" +#include "frescan_servers.h" + +#define ERROR(s) {perror (s); exit (-1);} + +#define NETWORK 0 +#define LOCAL_NODE 1 + +int main () +{ + int ret; + frescan_init_params_t init_params; + frescan_ss_t ss; + frescan_contract_t contract; + frescan_server_params_t server_params; + bool accepted; + + init_params.net = NETWORK; + init_params.node = LOCAL_NODE; + init_params.tx_fp_max_prio = 10; + init_params.rx_num_of_channels = 10; + init_params.rx_channel_max_prio = NULL; + + printf("Initializing FRESCAN\n"); + ret = frescan_init(&init_params); + if (ret != 0) ERROR ("could not init FRESCAN"); + + printf("Initializing BWRES\n"); + ret = frescan_bwres_init(NETWORK); + if (ret != 0) ERROR ("could not init BWRES"); + + contract.min_values.budget = 5; + contract.min_values.period.tv_sec = 3; + contract.min_values.period.tv_nsec = 0; + contract.prio = 5; + + printf("Negotiating a contract\n"); + ret = frescan_bwres_negotiate(NETWORK, &contract, &ss, &accepted); + if (ret != 0) ERROR ("could not negotiate succesfully"); + + if (accepted) { + printf("The contract was accepted, ss:%u\n", ss); + ret = frescan_servers_get_data(NETWORK, &server_params, ss); + if (ret != 0) ERROR ("could not get servers data"); + + printf("B:%u, T=(%u,%u), P:%u\n", + server_params.values.budget, + server_params.values.period.tv_sec, + server_params.values.period.tv_nsec, + server_params.prio); + } else { + printf("The contract was not accepted\n"); + } + + printf("Renegotiate the contract in 2 seconds\n"); + sleep(2); + + contract.min_values.budget = 2; + contract.min_values.period.tv_sec = 6; + contract.min_values.period.tv_nsec = 43; + contract.prio = 2; + + ret = frescan_bwres_renegotiate(NETWORK, &contract, ss, &accepted); + if (ret != 0) ERROR ("could not renegotiate"); + + if (accepted) { + printf("The contract renegotiation was accepted, ss:%u\n", ss); + ret = frescan_servers_get_data(NETWORK, &server_params, ss); + if (ret != 0) ERROR ("could not get servers data"); + + printf("B:%u, T=(%u,%u), P:%u\n", + server_params.values.budget, + server_params.values.period.tv_sec, + server_params.values.period.tv_nsec, + server_params.prio); + } else { + printf("The contract was not accepted\n"); + } + + while (1) { + sleep(1); + } + + return 0; +} + +