int ret;
frescan_request_id_t req;
frescan_request_data_t *req_data;
+ frescan_server_params_t server_params;
DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "preparing a negotiation request\n");
ret = frescan_bwres_robjs_alloc(&req_data->robj, FRESCAN_BWRES_MX_PRIO);
if (ret != 0) return ret;
+ // NOTE: we preallocate a server for the negotiation process
+ server_params.values.budget = contract->min_values.budget;
+ server_params.values.period = contract->min_values.period;
+ server_params.prio = contract->prio;
+
+ ret = frescan_servers_create(net, &server_params, &req_data->ss);
+ if (ret != 0) return ret;
+
DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "enqueue the negotiation request\n");
ret = frescan_requests_enqueue(req);
case FRESCAN_REQ_NOT_ACCEPTED:
DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "negotiation FAIL\n");
+ ret = frescan_servers_destroy(net, req_data->ss);
+ if (ret != 0) return ret;
ret = -1;
break;
case FRESCAN_REQ_ERROR:
DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "negotiation ERROR\n");
+ ret = frescan_servers_destroy(net, req_data->ss);
+ if (ret != 0) return ret;
ret = -1;
break;
return -1;
}
- DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "free the request\n");
-
frescan_requests_free(req);
- return ret;
+ return ret; // TODO: distinguish errors and failed negotiations
}
switch(req_data->type) {
case FRESCAN_REQ_NEG:
size = frescan_request_to_neg_message(req_data, msg);
+ send_params[req_data->net].to = FRESCAN_NEG_MASTER_NODE;
break;
case FRESCAN_REQ_RENEG:
size = frescan_request_to_reneg_message(req_data, msg);
+ send_params[req_data->net].to = FRESCAN_NEG_MASTER_NODE;
break;
case FRESCAN_REQ_CANCEL:
size = frescan_request_to_cancel_message(req_data, msg);
+ send_params[req_data->net].to = FRESCAN_NEG_MASTER_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");
return -1;
}
}
-
-/*
-
-int frescan_message_parse(frescan_network_t net,
- const uint8_t *msg,
- size_t size,
- frescan_node_t from)
-{
- int ret;
- frescan_msg_type_t type;
- size_t num;
- uint8_t *tmp;
- frescan_contract_t contract;
- frescan_request_id_t request_id;
- frescan_robj_id_t reply;
- uint8_t reply_msg[200];
- int accepted;
- frescan_neg_return_info_t *neg_return_info;
- int bytes_to_send;
- frescan_send_params_t params;
- frescan_server_params_t server_params;
-
- params.net = net;
- params.channel = FRESCAN_NEG_CHANNEL;
- params.flags = FRESCAN_SS | FRESCAN_ASYNC;
- params.ss = the_networks[net].neg_messages_ss_id;
- params.to = from;
-
- tmp = (uint8_t *)msg;
- type = (frescan_msg_type_t)*msg;
- tmp++;
-
- DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
- "parsing message, type:%u, size:%u\n", type, size);
-
- switch (type) {
- case FRESCAN_MSG_TYPE_NEG:
- DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
- "FRESCAN_MSG_TYPE_NEG\n");
-
- num = 2;
- memcpy(&request_id, tmp, num);
- tmp = tmp + num;
- DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
- "request id: %d (2 bytes)\n", request_id);
-
- num = sizeof(frescan_contract_t);
- memcpy(&contract, tmp, num);
- tmp = tmp + num;
-
- DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
- "contract (%d bytes)\n", num);
-
- DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
- "min_budget:%u max_period:(%u,%u)\n",
- contract.min_values.budget,
- contract.min_values.period.tv_sec,
- contract.min_values.period.tv_nsec);
-
- DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
- "max_budget:%u min_period:(%u,%u)\n",
- contract.max_values.budget,
- contract.max_values.period.tv_sec,
- contract.max_values.period.tv_nsec);
-
- DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
- "prio:%u\n", contract.prio);
-
- DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
- "TODO: sched test and add contract to table\n");
-// accepted = 1;
-// server_params.values.budget = contract.min_values.budget;
-// server_params.values.period = contract.min_values.period;
-// server_params.prio = contract.prio;
- FRESCAN_ACQUIRE_LOCK(&the_networks[net].lock);
- accepted = 1;
- FRESCAN_RELEASE_LOCK(&the_networks[net].lock);
-
- server_params.values.budget = 69;
- server_params.values.period.tv_sec = 33;
- server_params.values.period.tv_nsec = 666;
- server_params.prio = 2;
-
- DEBUG(FRESCAN_BWRES_ENABLE_DEBUG,
- "accepted:%u send results, net:%u to:%u ss:%u\n",
- accepted, params.net, params.to, params.ss);
-
- bytes_to_send = frescan_repneg_message_create
- (reply_msg,
- request_id,
- accepted,
- &server_params);
-
- DEBUG(FRESCAN_BWRES_ENABLE_DEBUG,
- "bytes_to_send:%u\n", bytes_to_send);
-
- if (bytes_to_send <= 0) {
- ERROR("creating reply_msg to neg\n");
- return -1;
- }
-
- ret = frescan_send(¶ms, reply_msg, bytes_to_send);
- if (ret != 0) {
- ERROR("error while sending neg request to master\n");
- return ret;
- }
- break;
-
- case FRESCAN_MSG_TYPE_REP_NEG:
- DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
- "FRESCAN_MSG_TYPE_REP_NEG\n");
-
- num = 2;
- memcpy(&request_id, tmp, num);
- tmp = tmp + num;
- DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
- "request id: %d (2 bytes)\n", request_id);
-
- ret = frescan_request_get_return_info
- (request_id,
- (void *)&neg_return_info);
- if (ret != 0) {
- ERROR("error getting final_values_ref\n");
- return ret;
- }
-
- accepted = (int)*tmp;
- tmp++;
-
- if (accepted) {
- DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
- "contract accepted:%d\n", accepted);
- neg_return_info->error = 0;
-
- num = sizeof(frescan_budget_period_t);
- memcpy(&server_params.values, tmp, num);
- tmp = tmp + num;
-
- DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
- "final budget:%u period:(%u,%u)\n",
- server_params.values.budget,
- server_params.values.period.tv_sec,
- server_params.values.period.tv_nsec);
-
- num = 1;
- memcpy(&server_params.prio, tmp, num);
- tmp = tmp + num;
-
- DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
- "server prio:%u\n", server_params.prio);
-
- DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
- "create sporadic server with results\n");
-
- ret = frescan_servers_create(net,
- &server_params,
- &neg_return_info->id);
- if (ret != 0) {
- ERROR("error creating server\n");
- return ret;
- }
- } else {
- DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
- "contract not accepted:%d\n", accepted);
- neg_return_info->error = -1;
- }
-
- DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
- "signal the request id with the results\n");
-
- ret = frescan_request_get_reply(request_id, &reply);
- if (ret != 0) {
- ERROR("error getting reply object\n");
- return ret;
- }
-
- ret = frescan_replyobject_signal(reply);
- if (ret != 0) {
- ERROR("error while sending neg request to master\n");
- return ret;
- }
- break;
-
- default:
- ERROR("type not known %u\n", type);
- return -1;
- }
-
- return 0;
-}*/
if (the_networks[req_data->net].local_node == FRESCAN_NEG_MASTER_NODE) {
+ // NOTE: req_data->ss is an INPUT parameter
accepted = true; // TODO: sched analysis
ret = 0; // TODO: sched analysis
}
if (req_data->request_node == FRESCAN_NEG_MASTER_NODE) {
- DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, "local\n");
+ DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, "master local\n");
ret = frescan_bwres_robjs_signal(req_data->robj);
assert(ret == 0);
} else {
- DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, "external\n");
- req_data->type = FRESCAN_REP_NEG;
+ DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG,
+ "master external, sending reply\n");
+ req_data->type = FRESCAN_REP_NEG;
ret = frescan_messages_send_request(req_data);
assert(ret == 0);
}
} else {
+ DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG,
+ "send negotiation request to master\n");
ret = frescan_messages_send_request(req_data);
assert(ret == 0);
}
static void frescan_manager_repneg(frescan_request_data_t *req_data)
{
+ int ret;
+ frescan_request_data_t *neg_req_data;
+
DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, "reply to neg request\n");
+
+ ret = frescan_requests_get_data(req_data->req, &neg_req_data);
+ assert(ret == 0);
+
+ neg_req_data->return_value = req_data->return_value;
+
+ ret = frescan_bwres_robjs_signal(neg_req_data->robj);
+ assert(ret == 0);
}