/**
*
- * FRESCAN_REP_CHANGE MESSAGE
- * ==========================
- * This message is sent from the MASTER to a slave as a reply to a
- * FRESCAN_REQ_NEG or a FRESCAN_REQ_RENEG, to say if they were admited.
- * It contains the type 'REPNEG', the request ID of the slave, a
- * return value to say if the contract is admited or not, and the final
- * values if it was admited
+ * FRESCAN_REP_INC_BUDGET / FRESCAN_REP_DEC_BUDGET
+ * ===============================================
+ * This message is sent from the MASTER to a slave when there is a change
+ * in the budget value assigned by the spare capacity algorithm.
*
- * +----------------------------------------------+
- * | 'REPNEG' | REQ | RETURN_VALUE | FINAL_VALUES |
- * +----------------------------------------------+
+ * +---------------------------------------------------+
+ * | 'INC/DEC' | SS | NEW_B | SS | NEW_B | SS | NEW_B |
+ * +---------------------------------------------------+
*
*/
-struct frescan_rep_neg_message_t {
- frescan_request_type_t type;
- frescan_request_id_t req;
- frescan_request_retval_t return_value;
- frescan_server_params_t final_values;
-} __attribute__ ((packed));
-
-static int frescan_request_to_repneg_message(const frescan_request_data_t *data,
- uint8_t *msg)
+static int frescan_request_to_repchange_message
+ (const frescan_request_data_t *data, uint8_t *msg)
{
- struct frescan_rep_neg_message_t *repneg_msg;
+ int bytes_written;
+ struct list_head *the_mode_change_list;
+ frescan_sa_vres_t *vres;
+ uint8_t *msg_begin;
+
+ if (data->type == FRESCAN_REP_INC_BUDGET) {
+ the_mode_change_list = &the_networks[data->net].
+ mode_change_budget_inc_list_head
+ [data->request_node];
+ } else {
+ the_mode_change_list = &the_networks[data->net].
+ mode_change_budget_dec_list_head
+ [data->request_node];
+ }
- repneg_msg = (struct frescan_rep_neg_message_t *)msg;
+ if (list_empty(the_mode_change_list)) {
+ return 0; // nothing to send
+ }
- repneg_msg->type = FRESCAN_REP_NEG;
- repneg_msg->req = data->req;
- repneg_msg->return_value = data->return_value;
- repneg_msg->final_values = data->final_values;
+ msg_begin = msg;
- DEBUG(FRESCAN_MESSAGES_ENABLE_DEBUG, "type:%d req:%d ret:%d\n",
- repneg_msg->type, repneg_msg->req, repneg_msg->return_value);
+ *((frescan_request_type_t *)msg) = data->type;
+ bytes_written = sizeof(frescan_request_type_t);
+ msg = msg + bytes_written;
- return sizeof(struct frescan_rep_neg_message_t);
+ list_for_each_entry(vres,
+ the_mode_change_list,
+ mode_change_list)
+ {
+ *((frescan_ss_t *)msg) = vres->ss;
+ bytes_written = sizeof(frescan_ss_t);
+ msg = msg + bytes_written;
+
+ *((frsh_sa_time_t *)msg) = vres->old_c;
+ bytes_written = sizeof(frsh_sa_time_t);
+ msg = msg + bytes_written;
+ }
+
+ return (msg - msg_begin);
}
-static int frescan_repneg_message_to_request(const uint8_t *msg,
- frescan_request_data_t *data)
+static int frescan_repchange_message_to_request(const uint8_t *msg,
+ frescan_request_data_t *data,
+ size_t size)
{
- struct frescan_rep_neg_message_t *repneg_msg;
+ struct list_head *the_mode_change_list;
+ frescan_node_t me = the_networks[data->net].local_node;
+ frescan_sa_vres_t *vres;
+ int bytes_read;
+ uint8_t *msg_pointer;
+ frescan_ss_t ss;
+
+ data->type = *((frescan_request_type_t *)msg);
+
+ if (data->type == FRESCAN_REP_INC_BUDGET) {
+ the_mode_change_list = &the_networks[data->net].
+ mode_change_budget_inc_list_head[me];
+ } else {
+ the_mode_change_list = &the_networks[data->net].
+ mode_change_budget_dec_list_head[me];
+ }
- repneg_msg = (struct frescan_rep_neg_message_t *)msg;
+ INIT_LIST_HEAD(the_mode_change_list);
- data->type = FRESCAN_REP_NEG;
- data->req = repneg_msg->req;
- data->return_value = repneg_msg->return_value;
- data->final_values = repneg_msg->final_values;
+ msg_pointer = (uint8_t *)msg;
- DEBUG(FRESCAN_MESSAGES_ENABLE_DEBUG, "type:%d req:%d ret:%d\n",
- data->type, data->req, data->return_value);
+ while(msg_pointer < msg + size) {
+ ss = *((frescan_ss_t *)msg_pointer);
+ bytes_read = sizeof(frescan_ss_t);
+ msg_pointer = msg_pointer + bytes_read;
+
+ vres = &the_networks[data->net].scenario.vres_pool[me][ss];
+
+ vres->old_c = *((frsh_sa_time_t *)msg_pointer);
+ bytes_read = sizeof(frsh_sa_time_t);
+ msg_pointer = msg_pointer + bytes_read;
+ }
return 0;
}
size = frescan_request_to_cancel_message(req_data, msg);
send_params[req_data->net].to = FRESCAN_NEG_MASTER_NODE;
break;
- case FRESCAN_REP_CHANGE:
- size = frescan_request_to_repchange_message(req_data, msg);
+ case FRESCAN_REP_DEC_BUDGET:
+ case FRESCAN_REP_INC_BUDGET:
+ size = frescan_request_to_repchange_message
+ (req_data, msg);
send_params[req_data->net].to = req_data->request_node;
break;
case FRESCAN_REP_NEG:
recv_bytes);
case FRESCAN_REQ_CANCEL:
return frescan_cancel_message_to_request(msg, req_data);
- case FRESCAN_REP_CHANGE:
- return frescan_repchange_message_to_request(msg, req_data);
+ case FRESCAN_REP_DEC_BUDGET:
+ case FRESCAN_REP_INC_BUDGET:
+ return frescan_repchange_message_to_request(msg,
+ req_data,
+ recv_bytes);
case FRESCAN_REP_NEG:
return frescan_repneg_message_to_request(msg, req_data);
default:
{
int ret;
bool accepted;
+ frescan_sa_scenario_t *scenario;
DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, "negotiation request\n");
+ scenario = &the_networks[req_data->net].scenario;
+
if (the_networks[req_data->net].local_node == FRESCAN_NEG_MASTER_NODE) {
DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG,
"add contract to scenario\n");
ret = frescan_sa_add_contract
- (&the_networks[req_data->net].scenario,
+ (scenario,
req_data->ss,
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);
+ ret = frescan_sa_sched_test(scenario, &accepted);
assert(ret == 0);
if (accepted) {
DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG,
"schedulable! distribute spare capacity\n");
- ret = frescan_sa_spare_capacity
- (&the_networks[req_data->net].scenario);
+ ret = frescan_sa_spare_capacity(scenario);
assert(ret == 0);
req_data->return_value = FRESCAN_REQ_ACCEPTED;
"not schedulable!\n");
ret = frescan_sa_remove_contract
- (&the_networks[req_data->net].scenario,
+ (scenario,
req_data->ss,
req_data->request_node);
assert(ret == 0);
int ret;
bool is_schedulable;
frsh_contract_t old_contract;
+ frescan_sa_scenario_t *scenario;
DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, "renegotiation request\n");
+ scenario = &the_networks[req_data->net].scenario;
+
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,
+ (scenario,
req_data->ss,
req_data->request_node,
req_data->contract,
&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,
- &is_schedulable);
+ ret = frescan_sa_sched_test(scenario, &is_schedulable);
assert(ret == 0);
- if (accepted) {
+ if (is_schedulable) {
DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG,
"schedulable! distribute spare capacity\n");
- ret = frescan_sa_spare_capacity
- (&the_networks[req_data->net].scenario);
+ ret = frescan_sa_spare_capacity(scenario);
assert(ret == 0);
req_data->return_value = FRESCAN_REQ_ACCEPTED;
assert(ret == 0);
} else {
ret = frescan_sa_update_contract
- (&the_networks[req_data->net].scenario,
+ (scenario,
req_data->ss,
req_data->request_node,
&old_contract,
{
int ret;
bool is_schedulable;
+ frescan_sa_scenario_t *scenario;
DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, "cancel request\n");
+ scenario = &the_networks[req_data->net].scenario;
+
if (the_networks[req_data->net].local_node == FRESCAN_NEG_MASTER_NODE) {
ret = frescan_sa_remove_contract
- (&the_networks[req_data->net].scenario,
+ (scenario,
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);
+ ret = frescan_sa_sched_test(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);
+ ret = frescan_sa_spare_capacity(scenario);
assert(ret == 0);
ret = frescan_bwres_mode_change_protocol(req_data);