#include "frescan_bwres_messages.h"
#include "frescan_bwres_requests.h"
#include "frescan_bwres_analysis.h"
+#include "frescan_bwres_mode_change.h"
#include "frescan_config.h"
#include "frescan_debug.h"
#include "frescan_data.h"
frescan_manager_repneg(req_data);
break;
default:
- ERROR("request type not supported\n");
+ FRESCAN_ERROR("request type not supported\n");
assert(0);
}
DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, "negotiation request\n");
if (the_networks[req_data->net].local_node == FRESCAN_NEG_MASTER_NODE) {
- // scheduling analysis
+ DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG,
+ "add contract to scenario\n");
+
ret = frescan_sa_add_contract
(&the_networks[req_data->net].scenario,
- req_data->contract,
req_data->ss,
- req_data->request_node);
+ req_data->request_node,
+ req_data->contract);
+ assert(ret == 0);
+
+ DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG,
+ "assign priorities\n");
+
+ ret = frsh_sa_assign_priorities
+ (&the_networks[req_data->net].scenario);
assert(ret == 0);
+ DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG,
+ "perform sched analysis\n");
+
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);
+ DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG,
+ "schedulable! distribute spare capacity\n");
+
+ ret = frescan_sa_spare_capacity
+ (&the_networks[req_data->net].scenario);
assert(ret == 0);
+
req_data->return_value = FRESCAN_REQ_ACCEPTED;
+
+ DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG,
+ "perform the mode change protocol!\n");
+
+ ret = frescan_bwres_mode_change_protocol(req_data);
+ assert(ret == 0);
} else {
+ DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG,
+ "not schedulable!\n");
+
ret = frescan_sa_remove_contract
(&the_networks[req_data->net].scenario,
req_data->ss,
req_data->request_node);
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->return_value = FRESCAN_REQ_NOT_ACCEPTED;
- req_data->type = FRESCAN_REP_NEG;
- ret = frescan_messages_send_request(req_data);
- assert(ret == 0);
+ if (req_data->request_node == FRESCAN_NEG_MASTER_NODE) {
+ DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG,
+ "signal local request\n");
+ ret = frescan_bwres_robjs_signal(req_data->robj);
+ assert(ret == 0);
+ } else {
+ DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG,
+ "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,
static void frescan_manager_reneg(frescan_request_data_t *req_data)
{
int ret;
- bool accepted;
- frescan_contract_t old_contract;
+ bool is_schedulable;
+ frsh_contract_t old_contract;
DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, "renegotiation request\n");
&old_contract);
assert(ret == 0);
+ DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG,
+ "assign priorities\n");
+
+ ret = frsh_sa_assign_priorities
+ (&the_networks[req_data->net].scenario);
+ assert(ret == 0);
+
+ DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG,
+ "perform sched analysis\n");
+
ret = frescan_sa_sched_test
(&the_networks[req_data->net].scenario,
- &accepted);
+ &is_schedulable);
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);
+ DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG,
+ "schedulable! distribute spare capacity\n");
+
+ ret = frescan_sa_spare_capacity
+ (&the_networks[req_data->net].scenario);
assert(ret == 0);
+
req_data->return_value = FRESCAN_REQ_ACCEPTED;
+
+ DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG,
+ "perform the mode change protocol!\n");
+
+ ret = frescan_bwres_mode_change_protocol(req_data);
+ assert(ret == 0);
} else {
ret = frescan_sa_update_contract
(&the_networks[req_data->net].scenario,
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,
static void frescan_manager_cancel(frescan_request_data_t *req_data)
{
int ret;
+ bool is_schedulable;
DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, "cancel request\n");
req_data->ss,
req_data->request_node);
assert(ret == 0);
+
+ DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG,
+ "assign priorities\n");
+
+ ret = frsh_sa_assign_priorities
+ (&the_networks[req_data->net].scenario);
+ assert(ret == 0);
+
+ DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG,
+ "perform sched analysis\n");
+
+ ret = frescan_sa_sched_test
+ (&the_networks[req_data->net].scenario,
+ &is_schedulable);
+ assert(ret == 0);
+
+ assert(is_schedulable == true);
+
+ DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG,
+ "redistribute spare capacity\n");
+
+ ret = frescan_sa_spare_capacity
+ (&the_networks[req_data->net].scenario);
+ assert(ret == 0);
+
+ ret = frescan_bwres_mode_change_protocol(req_data);
+ assert(ret == 0);
} else {
DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG,
"send cancel request to master\n");