#include "frescan_config.h"
#include "frescan_debug.h"
+#define FRESCAN_BWRES_MX_MSG_SIZE 3000 // TODO: adjust to the minimum
+
/**
* frescan_messages_init()
*/
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);
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);
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
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,
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",
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",
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) {
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;
}
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;
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;
}