]> rtime.felk.cvut.cz Git - frescor/fna.git/blobdiff - src_frescan/frescan_bwres_messages.c
changes to use the FRSH FSA module to do the analysis and spare capacity. TODO: finis...
[frescor/fna.git] / src_frescan / frescan_bwres_messages.c
index 4fea7a117fad9fb04a7a670a330bcd88dcd1defa..4c899723a6d0a284c623bbd4e53577d70c9a3112 100644 (file)
@@ -72,6 +72,8 @@
 #include "frescan_config.h"
 #include "frescan_debug.h"
 
+#define FRESCAN_BWRES_MX_MSG_SIZE 3000  // TODO: adjust to the minimum
+
 /**
  * frescan_messages_init()
  */
@@ -119,38 +121,59 @@ struct frescan_req_neg_message_t {
         frescan_request_type_t   type;
         frescan_request_id_t     req;
         frescan_ss_t             ss;
-        frescan_contract_t       contract;
 }  __attribute__ ((packed));
 
 static int frescan_request_to_neg_message(const frescan_request_data_t *data,
                                           uint8_t *msg)
 {
+        int ret;
         struct frescan_req_neg_message_t *neg_msg;
+        size_t req_size, contract_size;
 
         neg_msg = (struct frescan_req_neg_message_t *)msg;
+        req_size = sizeof(struct frescan_req_neg_message_t);
 
         neg_msg->type     = FRESCAN_REQ_NEG;
         neg_msg->req      = data->req;
         neg_msg->ss       = data->ss;
-        neg_msg->contract = *(data->contract);
 
-        DEBUG(FRESCAN_MESSAGES_ENABLE_DEBUG, "type:%d req:%d ss:%d\n",
-              neg_msg->type, neg_msg->req, neg_msg->ss);
+        ret = frsh_contract_marshal(data->contract,
+                                    msg + req_size,
+                                    FRESCAN_BWRES_MX_MSG_SIZE - req_size,
+                                    &contract_size);
+        if (ret != 0) {
+                FRESCAN_ERROR("frsh_contract_marshal return -1\n");
+                return -1;
+        }
+
+        DEBUG(FRESCAN_MESSAGES_ENABLE_DEBUG, "type:%d req:%d ss:%d csize:%u\n",
+              neg_msg->type, neg_msg->req, neg_msg->ss, contract_size);
 
-        return sizeof(struct frescan_req_neg_message_t);
+        return req_size + contract_size;
 }
 
 static int frescan_neg_message_to_request(const uint8_t *msg,
-                                          frescan_request_data_t *data)
+                                          frescan_request_data_t *data,
+                                          size_t size)
 {
+        int ret;
         struct frescan_req_neg_message_t *neg_msg;
+        size_t req_size;
 
         neg_msg = (struct frescan_req_neg_message_t *)msg;
+        req_size = sizeof(struct frescan_req_neg_message_t);
 
         data->type        = FRESCAN_REQ_NEG;
         data->req         = neg_msg->req;
         data->ss          = neg_msg->ss;
-        *(data->contract) = neg_msg->contract;
+
+        ret = frsh_contract_unmarshal(data->contract,
+                                      msg  + req_size,  // pointer to contract
+                                      size - req_size); // size marshal '   '
+        if (ret != 0) {
+                FRESCAN_ERROR("frsh_contract_unmarshal return -1\n");
+                return -1;
+        }
 
         DEBUG(FRESCAN_MESSAGES_ENABLE_DEBUG, "type:%d req:%d ss:%d\n",
               data->type, data->req, data->ss);
@@ -180,38 +203,59 @@ struct frescan_req_reneg_message_t {
         frescan_request_type_t   type;
         frescan_request_id_t     req;
         frescan_ss_t             ss;
-        frescan_contract_t       contract;
 }  __attribute__ ((packed));
 
 static int frescan_request_to_reneg_message(const frescan_request_data_t *data,
                                             uint8_t *msg)
 {
+        int ret;
+        size_t req_size, contract_size;
         struct frescan_req_reneg_message_t *reneg_msg;
 
         reneg_msg = (struct frescan_req_reneg_message_t *)msg;
+        req_size = sizeof(struct frescan_req_reneg_message_t);
 
         reneg_msg->type     = FRESCAN_REQ_RENEG;
         reneg_msg->req      = data->req;
         reneg_msg->ss       = data->ss;
-        reneg_msg->contract = *(data->contract);
 
-        DEBUG(FRESCAN_MESSAGES_ENABLE_DEBUG, "type:%d req:%d ss:%d\n",
-              reneg_msg->type, reneg_msg->req, reneg_msg->ss);
+        ret = frsh_contract_marshal(data->contract,
+                                    msg + req_size,
+                                    FRESCAN_BWRES_MX_MSG_SIZE - req_size,
+                                    &contract_size);
+        if (ret != 0) {
+                FRESCAN_ERROR("frsh_contract_marshal return -1\n");
+                return -1;
+        }
+
+        DEBUG(FRESCAN_MESSAGES_ENABLE_DEBUG, "type:%d req:%d ss:%d csize:%u\n",
+              reneg_msg->type, reneg_msg->req, reneg_msg->ss, contract_size);
 
-        return sizeof(struct frescan_req_reneg_message_t);
+        return req_size + contract_size;
 }
 
 static int frescan_reneg_message_to_request(const uint8_t *msg,
-                                            frescan_request_data_t *data)
+                                            frescan_request_data_t *data,
+                                            size_t size)
 {
+        int ret;
         struct frescan_req_reneg_message_t *reneg_msg;
+        size_t req_size;
 
         reneg_msg = (struct frescan_req_reneg_message_t *)msg;
+        req_size = sizeof(struct frescan_req_neg_message_t);
 
         data->type        = FRESCAN_REQ_RENEG;
         data->req         = reneg_msg->req;
         data->ss          = reneg_msg->ss;
-        *(data->contract) = reneg_msg->contract;
+
+        ret = frsh_contract_unmarshal(data->contract,
+                                      msg  + req_size,
+                                      size - req_size);
+        if (ret != 0) {
+                FRESCAN_ERROR("frsh_contract_unmarshal return -1\n");
+                return -1;
+        }
 
         DEBUG(FRESCAN_MESSAGES_ENABLE_DEBUG, "type:%d req:%d ss:%d\n",
               data->type, data->req, data->ss);
@@ -270,6 +314,65 @@ static int frescan_cancel_message_to_request(const uint8_t *msg,
         return 0;
 }
 
+/**
+ *
+ *  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
+ *
+ *  +----------------------------------------------+
+ *  | 'REPNEG' | REQ | RETURN_VALUE | FINAL_VALUES |
+ *  +----------------------------------------------+
+ *
+ */
+
+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)
+{
+        struct frescan_rep_neg_message_t *repneg_msg;
+
+        repneg_msg = (struct frescan_rep_neg_message_t *)msg;
+
+        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;
+
+        DEBUG(FRESCAN_MESSAGES_ENABLE_DEBUG, "type:%d req:%d ret:%d\n",
+              repneg_msg->type, repneg_msg->req, repneg_msg->return_value);
+
+        return sizeof(struct frescan_rep_neg_message_t);
+}
+
+static int frescan_repneg_message_to_request(const uint8_t *msg,
+                                             frescan_request_data_t *data)
+{
+        struct frescan_rep_neg_message_t *repneg_msg;
+
+        repneg_msg = (struct frescan_rep_neg_message_t *)msg;
+
+        data->type         = FRESCAN_REP_NEG;
+        data->req          = repneg_msg->req;
+        data->return_value = repneg_msg->return_value;
+        data->final_values = repneg_msg->final_values;
+
+        DEBUG(FRESCAN_MESSAGES_ENABLE_DEBUG, "type:%d req:%d ret:%d\n",
+              data->type, data->req, data->return_value);
+
+        return 0;
+}
+
 /**
  *
  *  FRESCAN_REP_NEG MESSAGE
@@ -290,7 +393,7 @@ struct frescan_rep_neg_message_t {
         frescan_request_type_t    type;
         frescan_request_id_t      req;
         frescan_request_retval_t  return_value;
-        frescan_sa_final_values_t final_values;
+        frescan_server_params_t   final_values;
 }  __attribute__ ((packed));
 
 static int frescan_request_to_repneg_message(const frescan_request_data_t *data,
@@ -303,6 +406,7 @@ static int frescan_request_to_repneg_message(const frescan_request_data_t *data,
         repneg_msg->type         = FRESCAN_REP_NEG;
         repneg_msg->req          = data->req;
         repneg_msg->return_value = data->return_value;
+        // TODO: use final values only if it was accepted!
         repneg_msg->final_values = data->final_values;
 
         DEBUG(FRESCAN_MESSAGES_ENABLE_DEBUG, "type:%d req:%d ret:%d\n",
@@ -321,6 +425,7 @@ static int frescan_repneg_message_to_request(const uint8_t *msg,
         data->type         = FRESCAN_REP_NEG;
         data->req          = repneg_msg->req;
         data->return_value = repneg_msg->return_value;
+        // TODO: use final values only if it was accepted!
         data->final_values = repneg_msg->final_values;
 
         DEBUG(FRESCAN_MESSAGES_ENABLE_DEBUG, "type:%d req:%d ret:%d\n",
@@ -342,7 +447,7 @@ static int frescan_repneg_message_to_request(const uint8_t *msg,
 int frescan_messages_send_request(const frescan_request_data_t *req_data)
 {
         int ret;
-        uint8_t msg[2000]; // TODO: use a constant for max neg message size
+        uint8_t msg[FRESCAN_BWRES_MX_MSG_SIZE];
         size_t size;
 
         switch(req_data->type) {
@@ -358,12 +463,16 @@ 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);
+                        send_params[req_data->net].to = req_data->request_node;
+                        break;
                 case FRESCAN_REP_NEG:
                         size = frescan_request_to_repneg_message(req_data, msg);
                         send_params[req_data->net].to = req_data->request_node;
                         break;
                 default:
-                        ERROR("request type not supported\n");
+                        FRESCAN_ERROR("request type not supported\n");
                         return -1;
         }
 
@@ -390,7 +499,7 @@ int frescan_messages_recv_request(frescan_network_t    net,
                                   frescan_request_id_t *req)
 {
         int ret;
-        uint8_t msg[2000]; // TODO: use a constant with the max neg message size
+        uint8_t msg[FRESCAN_BWRES_MX_MSG_SIZE];
         size_t recv_bytes;
         frescan_node_t from;
         frescan_prio_t prio;
@@ -420,15 +529,21 @@ int frescan_messages_recv_request(frescan_network_t    net,
 
         switch(*((frescan_request_type_t *)msg)) {
                 case FRESCAN_REQ_NEG:
-                        return frescan_neg_message_to_request(msg, req_data);
+                        return frescan_neg_message_to_request(msg,
+                                                              req_data,
+                                                              recv_bytes);
                 case FRESCAN_REQ_RENEG:
-                        return frescan_reneg_message_to_request(msg, req_data);
+                        return frescan_reneg_message_to_request(msg,
+                                                                req_data,
+                                                                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_NEG:
                         return frescan_repneg_message_to_request(msg, req_data);
                 default:
-                        ERROR("request type %X not supported\n",
+                        FRESCAN_ERROR("request type %X not supported\n",
                               *(frescan_request_type_t *)msg);
                         return -1;
         }