2 * @file frescan_negotiation_messages.c
4 * @brief FRESCAN negotiation messages format and operations
6 * This module contains the data types that define the FRESCAN negotiation
7 * message format and operations
13 * @author Daniel Sangorrin <daniel.sangorrin@unican.es>
18 #include "frescan_negotiation_messages.h"
19 #include "frescan_config.h"
20 #include "frescan_debug.h"
21 #include "frescan_requests_queue.h"
22 #include "frescan_servers.h"
29 * +-----------------------+
30 * | 'NEG' | ID | CONTRACT |
31 * +-----------------------+
35 * +----------------------------------------+
36 * | 'REPNEG' | ID | ACCEPTED | SC_CONTRACT |
37 * +----------------------------------------+
39 * RENEGOTIATE = NEG but with different type
43 * +--------------------------------+
44 * | 'CANCEL' | ID | CONTRACT_LABEL |
45 * +--------------------------------+
49 * +---------------------------+
50 * | 'REP_CANCEL' | ID | ERROR |
51 * +---------------------------+
53 * ID: the id of the request
58 FRESCAN_MSG_TYPE_NEG = 0,
59 FRESCAN_MSG_TYPE_RENEG = 1,
60 FRESCAN_MSG_TYPE_CANCEL = 2,
61 FRESCAN_MSG_TYPE_REP_NEG = 3,
62 FRESCAN_MSG_TYPE_REP_RENEG = 4,
63 FRESCAN_MSG_TYPE_REP_CANCEL = 5
66 int frescan_neg_message_create(uint8_t *msg,
67 frescan_request_id_t id,
68 const frescan_contract_t *contract)
70 size_t num, bytes_written;
73 DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
74 "creating a negotiation request message\n");
76 *tmp = (uint8_t)FRESCAN_MSG_TYPE_NEG;
78 DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
79 "type: %d (1 byte)\n", FRESCAN_MSG_TYPE_NEG);
82 memcpy(tmp, &id, num);
84 DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
85 "request id: %d (2 bytes)\n", id);
87 num = sizeof(frescan_contract_t);
88 memcpy(tmp, contract, num);
91 DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
92 "contract (%d bytes)\n", num);
94 bytes_written = tmp - msg;
96 DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
97 "total bytes_written: %d\n", bytes_written);
99 return (int)bytes_written;
102 int frescan_repneg_message_create(uint8_t *msg,
103 frescan_request_id_t id,
105 frescan_server_params_t *params)
107 size_t num, bytes_written;
110 DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
111 "creating a negotiation reply message\n");
113 DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
114 "type: %d (1 byte)\n", FRESCAN_MSG_TYPE_REP_NEG);
115 *tmp = (uint8_t)FRESCAN_MSG_TYPE_REP_NEG;
118 DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
119 "request id: %d (2 bytes)\n", id);
121 memcpy(tmp, &id, num);
124 *tmp = (uint8_t)accepted;
125 DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG, "accepted:%u\n", *tmp);
128 num = sizeof(frescan_budget_period_t);
129 memcpy(tmp, ¶ms->values, num);
132 DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
133 "budget_period (%d bytes)\n", num);
136 memcpy(tmp, ¶ms->prio, num);
139 DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
140 "server prio:%u\n", params->prio);
142 bytes_written = tmp - msg;
144 DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
145 "total bytes_written: %d\n", bytes_written);
147 return (int)bytes_written;
150 int frescan_message_parse(frescan_network_t net,
156 frescan_msg_type_t type;
159 frescan_contract_t contract;
160 frescan_request_id_t request_id;
161 frescan_robj_id_t reply;
162 uint8_t reply_msg[200];
164 frescan_neg_return_info_t *neg_return_info;
166 frescan_send_params_t params;
167 frescan_server_params_t server_params;
170 params.channel = FRESCAN_NEG_CHANNEL;
171 params.flags = FRESCAN_SS | FRESCAN_ASYNC;
172 params.ss = the_networks[net].neg_messages_ss_id;
175 tmp = (uint8_t *)msg;
176 type = (frescan_msg_type_t)*msg;
179 DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
180 "parsing message, type:%u, size:%u\n", type, size);
183 case FRESCAN_MSG_TYPE_NEG:
184 DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
185 "FRESCAN_MSG_TYPE_NEG\n");
188 memcpy(&request_id, tmp, num);
190 DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
191 "request id: %d (2 bytes)\n", request_id);
193 num = sizeof(frescan_contract_t);
194 memcpy(&contract, tmp, num);
197 DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
198 "contract (%d bytes)\n", num);
200 DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
201 "min_budget:%u max_period:(%u,%u)\n",
202 contract.min_values.budget,
203 contract.min_values.period.tv_sec,
204 contract.min_values.period.tv_nsec);
206 DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
207 "max_budget:%u min_period:(%u,%u)\n",
208 contract.max_values.budget,
209 contract.max_values.period.tv_sec,
210 contract.max_values.period.tv_nsec);
212 DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
213 "prio:%u\n", contract.prio);
215 DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
216 "TODO: sched test and add contract to table\n");
218 // server_params.values.budget = contract.min_values.budget;
219 // server_params.values.period = contract.min_values.period;
220 // server_params.prio = contract.prio;
221 FRESCAN_ACQUIRE_LOCK(&the_networks[net].lock);
223 FRESCAN_RELEASE_LOCK(&the_networks[net].lock);
225 server_params.values.budget = 69;
226 server_params.values.period.tv_sec = 33;
227 server_params.values.period.tv_nsec = 666;
228 server_params.prio = 2;
230 DEBUG(FRESCAN_BWRES_ENABLE_DEBUG,
231 "accepted:%u send results, net:%u to:%u ss:%u\n",
232 accepted, params.net, params.to, params.ss);
234 bytes_to_send = frescan_repneg_message_create
240 DEBUG(FRESCAN_BWRES_ENABLE_DEBUG,
241 "bytes_to_send:%u\n", bytes_to_send);
243 if (bytes_to_send <= 0) {
244 ERROR("creating reply_msg to neg\n");
248 ret = frescan_send(¶ms, reply_msg, bytes_to_send);
250 ERROR("error while sending neg request to master\n");
255 case FRESCAN_MSG_TYPE_REP_NEG:
256 DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
257 "FRESCAN_MSG_TYPE_REP_NEG\n");
260 memcpy(&request_id, tmp, num);
262 DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
263 "request id: %d (2 bytes)\n", request_id);
265 ret = frescan_request_get_return_info
267 (void *)&neg_return_info);
269 ERROR("error getting final_values_ref\n");
273 accepted = (int)*tmp;
277 DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
278 "contract accepted:%d\n", accepted);
279 neg_return_info->error = 0;
281 num = sizeof(frescan_budget_period_t);
282 memcpy(&server_params.values, tmp, num);
285 DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
286 "final budget:%u period:(%u,%u)\n",
287 server_params.values.budget,
288 server_params.values.period.tv_sec,
289 server_params.values.period.tv_nsec);
292 memcpy(&server_params.prio, tmp, num);
295 DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
296 "server prio:%u\n", server_params.prio);
298 DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
299 "create sporadic server with results\n");
301 ret = frescan_servers_create(net,
303 &neg_return_info->id);
305 ERROR("error creating server\n");
309 DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
310 "contract not accepted:%d\n", accepted);
311 neg_return_info->error = -1;
314 DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
315 "signal the request id with the results\n");
317 ret = frescan_request_get_reply(request_id, &reply);
319 ERROR("error getting reply object\n");
323 ret = frescan_replyobject_signal(reply);
325 ERROR("error while sending neg request to master\n");
331 ERROR("type not known %u\n", type);