]> rtime.felk.cvut.cz Git - frescor/fna.git/blobdiff - src_frescan/frescan_bwres_messages.c
added message to notify a budget increase or decrease (due to spare capacity)
[frescor/fna.git] / src_frescan / frescan_bwres_messages.c
index 4c899723a6d0a284c623bbd4e53577d70c9a3112..4dff677007a2535475205ee333d644e669ed1b45 100644 (file)
@@ -316,59 +316,97 @@ static int frescan_cancel_message_to_request(const uint8_t *msg,
 
 /**
  *
- *  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;
 }
@@ -463,8 +501,10 @@ int frescan_messages_send_request(const frescan_request_data_t *req_data)
                         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:
@@ -538,8 +578,11 @@ int frescan_messages_recv_request(frescan_network_t    net,
                                                                 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: