2 * @file frescan_bwres.c
4 * @brief FRESCAN bandwidth reservation layer
6 * This module contains function to negotiate contracts and get the
7 * corresponding frescan sporadic servers.
13 * @author Daniel Sangorrin <daniel.sangorrin@unican.es>
17 #include "frescan_bwres.h"
18 #include "frescan_data.h"
19 #include "frescan_requests.h" // frescan_requests_init
20 #include "frescan_debug.h"
21 #include "frescan_config.h"
22 #include "frescan_servers.h"
23 #include "frescan_bwres_messages.h"
24 #include "frescan_bwres_threads.h"
27 * frescan_bwres_init()
29 * Init the frescan bandwidth reservation layer
32 int frescan_bwres_init(frescan_network_t net)
35 frescan_server_params_t params;
37 // TODO: server params must be configurable
38 params.values.budget = 5;
39 params.values.period.tv_sec = 1;
40 params.values.period.tv_nsec = 0;
41 params.prio = FRESCAN_BWRES_NEG_MESSAGES_PRIO;
43 ret = frescan_servers_create(net, ¶ms,
44 &the_networks[net].neg_messages_ss_id);
46 ERROR("could not create server for negotiation messages\n");
50 ret = frescan_requests_init(FRESCAN_REQUESTS_MX_CEILING);
52 ERROR("could not initialize the requests\n");
56 if (the_networks[net].local_node == FRESCAN_NEG_MASTER_NODE) {
57 DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "i am master node (%u)\n",
58 the_networks[net].local_node);
59 ret = frescan_master_neg_thread_create(net);
61 ERROR("could not initialize the negotiator thread\n");
65 DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "i am a slave node (%u)\n",
66 the_networks[net].local_node);
69 ret = frescan_acceptor_thread_create(net);
71 ERROR("could not create acceptor thread\n");
79 * frescan_bwres_negotiate()
81 * negotiate a contract. For that we allocate a reply object and then
82 * we enqueue our request in the master's requests queue (if we are in
83 * the master node) or send it to the master through the network.
86 int frescan_bwres_negotiate(frescan_network_t net,
87 const frescan_contract_t *contract,
91 frescan_robj_id_t reply;
92 frescan_request_id_t request;
93 frescan_neg_return_info_t return_info;
96 frescan_send_params_t params;
98 ret = frescan_replyobject_alloc(&reply, FRESCAN_BWRES_MX_PRIO);
100 ERROR("could not allocate reply object\n");
104 ret = frescan_request_alloc(&request);
106 ERROR("could not allocate request\n");
110 ret = frescan_request_set_return_info(request,
111 (void *) &return_info);
113 ERROR("could not set return_info pointer\n");
117 ret = frescan_request_set_reply(request, reply);
119 ERROR("could not set reply\n");
123 if (the_networks[net].local_node == FRESCAN_NEG_MASTER_NODE) {
124 DEBUG(FRESCAN_BWRES_ENABLE_DEBUG,
125 "I am master, negotiation in local node\n");
127 DEBUG(FRESCAN_BWRES_ENABLE_DEBUG,
128 "set FRESCAN_NEGOTIATE type: %d\n", FRESCAN_NEGOTIATE);
130 ret = frescan_request_set_type(request, FRESCAN_NEGOTIATE);
132 ERROR("could not set type\n");
136 ret = frescan_request_set_contract(request, contract);
138 ERROR("could not set contract\n");
142 ret = frescan_request_set_src(request, FRESCAN_NEG_MASTER_NODE);
144 ERROR("could not set src\n");
148 ret = frescan_requestqueue_enqueue(request);
150 ERROR("could not enqueue the request\n");
154 DEBUG(FRESCAN_BWRES_ENABLE_DEBUG,
155 "I am slave, negotiation in master node\n");
157 size = frescan_neg_message_create(msg, request, contract);
159 DEBUG(FRESCAN_BWRES_ENABLE_DEBUG,
160 "created a neg message, size: %d\n", size);
163 params.to = FRESCAN_NEG_MASTER_NODE;
164 params.channel = FRESCAN_NEG_CHANNEL;
166 // NOTE: if we sent the negotiation msgs with fp:
167 // params.flags = FRESCAN_FP | FRESCAN_ASYNC;
170 params.flags = FRESCAN_SS | FRESCAN_ASYNC;
171 params.ss = the_networks[net].neg_messages_ss_id;
173 DEBUG(FRESCAN_BWRES_ENABLE_DEBUG,
174 "send msg to master, net:%u to:%u ss:%u\n",
175 params.net, params.to, params.ss);
177 ret = frescan_send(¶ms, msg, size);
179 ERROR("error while sending neg request to master\n");
184 DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "wait on reply object\n");
186 ret = frescan_replyobject_wait(reply);
188 ERROR("error while waiting on the reply object\n");
192 ret = frescan_replyobject_free(reply);
194 ERROR("could not free reply object\n");
198 if (return_info.error) {
199 DEBUG(FRESCAN_BWRES_ENABLE_DEBUG,
200 "negotiation was not accepted, error:%d\n",
203 DEBUG(FRESCAN_BWRES_ENABLE_DEBUG,
204 "negotiation finished succesfully ss:%d\n",
208 *id = return_info.id;
210 ret = frescan_request_free(request);
212 ERROR("could not free request\n");
216 return return_info.error;
220 * frescan_bwres_renegotiate()
222 * renegotiate a contract. For that we allocate a reply object and then
223 * we enqueue our request in the master's requests queue (if we are in
224 * the master node) or send it to the master through the network.
227 int frescan_bwres_renegotiate(frescan_network_t net,
228 const frescan_contract_t *contract,
232 frescan_robj_id_t reply;
233 frescan_request_id_t request;
234 frescan_neg_return_info_t return_info;
237 frescan_send_params_t params;
239 ret = frescan_replyobject_alloc(&reply, FRESCAN_BWRES_MX_PRIO);
241 ERROR("could not allocate reply object\n");
245 ret = frescan_request_alloc(&request);
247 ERROR("could not allocate request\n");
251 ret = frescan_request_set_return_info(request,
252 (void *) &return_info);
254 ERROR("could not set return_info pointer\n");
258 ret = frescan_request_set_reply(request, reply);
260 ERROR("could not set reply\n");
264 ret = frescan_request_set_ss(request, id);
266 ERROR("could not set server id\n");
270 if (the_networks[net].local_node == FRESCAN_NEG_MASTER_NODE) {
271 DEBUG(FRESCAN_BWRES_ENABLE_DEBUG,
272 "I am master, renegotiation in local node\n");
274 DEBUG(FRESCAN_BWRES_ENABLE_DEBUG,
275 "set FRESCAN_RENEGOTIATE type: %d\n",
276 FRESCAN_RENEGOTIATE);
278 ret = frescan_request_set_type(request, FRESCAN_RENEGOTIATE);
280 ERROR("could not set type\n");
284 ret = frescan_request_set_contract(request, contract);
286 ERROR("could not set contract\n");
290 ret = frescan_request_set_src(request, FRESCAN_NEG_MASTER_NODE);
292 ERROR("could not set src\n");
296 ret = frescan_requestqueue_enqueue(request);
298 ERROR("could not enqueue the request\n");
302 DEBUG(FRESCAN_BWRES_ENABLE_DEBUG,
303 "I am slave, renegotiation in master node\n");
305 size = frescan_reneg_message_create(msg, request, contract);
307 DEBUG(FRESCAN_BWRES_ENABLE_DEBUG,
308 "created a reneg message, size: %d\n", size);
311 params.to = FRESCAN_NEG_MASTER_NODE;
312 params.channel = FRESCAN_NEG_CHANNEL;
314 // NOTE: if we sent the negotiation msgs with fp:
315 // params.flags = FRESCAN_FP | FRESCAN_ASYNC;
318 params.flags = FRESCAN_SS | FRESCAN_ASYNC;
319 params.ss = the_networks[net].neg_messages_ss_id;
321 DEBUG(FRESCAN_BWRES_ENABLE_DEBUG,
322 "send msg to master, net:%u to:%u ss:%u\n",
323 params.net, params.to, params.ss);
325 ret = frescan_send(¶ms, msg, size);
327 ERROR("error while sending neg request to master\n");
332 DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "wait on reply object\n");
334 ret = frescan_replyobject_wait(reply);
336 ERROR("error while waiting on the reply object\n");
340 ret = frescan_replyobject_free(reply);
342 ERROR("could not free reply object\n");
346 if (return_info.error) {
347 DEBUG(FRESCAN_BWRES_ENABLE_DEBUG,
348 "renegotiation was not accepted, error:%d\n",
351 DEBUG(FRESCAN_BWRES_ENABLE_DEBUG,
352 "renegotiation finished succesfully for ss:%d\n",
356 ret = frescan_request_free(request);
358 ERROR("could not free request\n");
362 return return_info.error;