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;
222 server_params.values.budget = 69;
223 server_params.values.period.tv_sec = 33;
224 server_params.values.period.tv_nsec = 666;
225 server_params.prio = 2;
227 DEBUG(FRESCAN_BWRES_ENABLE_DEBUG,
228 "accepted:%u send results, net:%u to:%u ss:%u\n",
229 accepted, params.net, params.to, params.ss);
231 bytes_to_send = frescan_repneg_message_create
237 DEBUG(FRESCAN_BWRES_ENABLE_DEBUG,
238 "bytes_to_send:%u\n", bytes_to_send);
240 if (bytes_to_send <= 0) {
241 ERROR("creating reply_msg to neg\n");
245 ret = frescan_send(¶ms, reply_msg, bytes_to_send);
247 ERROR("error while sending neg request to master\n");
252 case FRESCAN_MSG_TYPE_REP_NEG:
253 DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
254 "FRESCAN_MSG_TYPE_REP_NEG\n");
257 memcpy(&request_id, tmp, num);
259 DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
260 "request id: %d (2 bytes)\n", request_id);
262 ret = frescan_request_get_return_info
264 (void *)&neg_return_info);
266 ERROR("error getting final_values_ref\n");
270 accepted = (int)*tmp;
274 DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
275 "contract accepted:%d\n", accepted);
276 neg_return_info->error = 0;
278 num = sizeof(frescan_budget_period_t);
279 memcpy(&server_params.values, tmp, num);
282 DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
283 "final budget:%u period:(%u,%u)\n",
284 server_params.values.budget,
285 server_params.values.period.tv_sec,
286 server_params.values.period.tv_nsec);
289 memcpy(&server_params.prio, tmp, num);
292 DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
293 "server prio:%u\n", server_params.prio);
295 DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
296 "create sporadic server with results\n");
298 ret = frescan_servers_create(net,
300 &neg_return_info->id);
302 ERROR("error creating server\n");
306 DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
307 "contract not accepted:%d\n", accepted);
308 neg_return_info->error = -1;
311 DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
312 "signal the request id with the results\n");
314 ret = frescan_request_get_reply(request_id, &reply);
316 ERROR("error getting reply object\n");
320 ret = frescan_replyobject_signal(reply);
322 ERROR("error while sending neg request to master\n");
328 ERROR("type not known %u\n", type);