2 * @file frescan_bandwidth_reservation.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_bandwidth_reservation.h"
18 #include "frescan_data.h"
19 #include "frescan_requests_queue.h" // frescan_requests_init
20 #include "frescan_debug.h"
21 #include "frescan_config.h"
22 #include "frescan_servers.h"
23 #include "frescan_negotiation_messages.h"
24 #include "frescan_negotiation_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 (which can be
83 * local or require a network message)
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 // params.flags = FRESCAN_FP | FRESCAN_ASYNC;
168 params.flags = FRESCAN_SS | FRESCAN_ASYNC;
169 params.ss = the_networks[net].neg_messages_ss_id;
171 DEBUG(FRESCAN_BWRES_ENABLE_DEBUG,
172 "send msg to master, net:%u to:%u ss:%u\n",
173 params.net, params.to, params.ss);
175 ret = frescan_send(¶ms, msg, size);
177 ERROR("error while sending neg request to master\n");
182 DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "wait on reply object\n");
184 ret = frescan_replyobject_wait(reply);
186 ERROR("error while waiting on the reply object\n");
190 ret = frescan_replyobject_free(reply);
192 ERROR("could not free reply object\n");
196 if (return_info.error) {
197 DEBUG(FRESCAN_BWRES_ENABLE_DEBUG,
198 "negotiation was not accepted, error:%d\n",
201 DEBUG(FRESCAN_BWRES_ENABLE_DEBUG,
202 "negotiation finished succesfully ss:%d\n",
206 *id = return_info.id;
208 ret = frescan_request_free(request);
210 ERROR("could not free request\n");
214 return return_info.error;