/**
*
- * 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: