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_negotiator_thread.h" // frescan_negotiator_thread_create
21 #include "frescan_debug.h"
22 #include "frescan_config.h"
23 #include "frescan_acceptor_threads.h"
24 #include "frescan_servers.h"
25 #include "frescan_negotiation_messages.h"
28 * frescan_bwres_init()
30 * Init the frescan bandwidth reservation layer
33 int frescan_bwres_init(frescan_network_t net)
36 frescan_server_params_t params;
38 // TODO: server params must be configurable
40 params.period.tv_sec = 1;
41 params.period.tv_nsec = 0;
42 params.prio = FRESCAN_BWRES_NEG_MESSAGES_PRIO;
44 ret = frescan_servers_create(net, ¶ms,
45 &the_networks[net].neg_messages_ss_id);
47 ERROR("could not create server for negotiation messages\n");
51 ret = frescan_requests_init(FRESCAN_REQUESTS_MX_CEILING);
53 ERROR("could not initialize the requests\n");
57 if (the_networks[net].local_node == FRESCAN_NEG_MASTER_NODE) {
58 DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "i am master node (%u)\n",
59 the_networks[net].local_node);
60 ret = frescan_negotiator_thread_create(net);
62 ERROR("could not initialize the negotiator thread\n");
66 DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "i am a slave node (%u)\n",
67 the_networks[net].local_node);
70 ret = frescan_acceptor_thread_create(net);
72 ERROR("could not create acceptor thread\n");
80 * frescan_bwres_negotiate()
82 * negotiate a contract. For that we allocate a reply object and then
83 * we enqueue our request in the master's requests queue (which can be
84 * local or require a network message)
87 int frescan_bwres_negotiate(frescan_network_t net,
88 const frescan_contract_t *contract,
92 frescan_robj_id_t reply;
93 frescan_request_id_t request;
94 frescan_neg_return_info_t return_info;
97 frescan_send_params_t params;
99 ret = frescan_replyobject_alloc(&reply, FRESCAN_BWRES_MX_PRIO);
101 ERROR("could not allocate reply object\n");
105 ret = frescan_request_alloc(&request);
107 ERROR("could not allocate request\n");
111 if (the_networks[net].local_node == FRESCAN_NEG_MASTER_NODE) {
112 DEBUG(FRESCAN_BWRES_ENABLE_DEBUG,
113 "I am master, negotiation in local node\n");
115 DEBUG(FRESCAN_BWRES_ENABLE_DEBUG,
116 "set FRESCAN_NEGOTIATE type: %d\n", FRESCAN_NEGOTIATE);
118 ret = frescan_request_set_type(request, FRESCAN_NEGOTIATE);
120 ERROR("could not set type\n");
124 ret = frescan_request_set_reply(request, reply);
126 ERROR("could not set reply\n");
130 ret = frescan_request_set_contract(request, contract);
132 ERROR("could not set contract\n");
136 ret = frescan_request_set_src(request, FRESCAN_NEG_MASTER_NODE);
138 ERROR("could not set src\n");
142 ret = frescan_request_set_return_info(request,
143 (void *) &return_info);
145 ERROR("could not set return_info pointer\n");
149 ret = frescan_requestqueue_enqueue(request);
151 ERROR("could not enqueue the request\n");
155 DEBUG(FRESCAN_BWRES_ENABLE_DEBUG,
156 "I am slave, negotiation in master node\n");
158 size = frescan_neg_message_create(msg, request, contract);
160 DEBUG(FRESCAN_BWRES_ENABLE_DEBUG,
161 "created a neg message, size: %d\n", size);
164 params.to = FRESCAN_NEG_MASTER_NODE;
165 params.channel = FRESCAN_NEG_CHANNEL;
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 DEBUG(FRESCAN_BWRES_ENABLE_DEBUG,
199 "neg finished, error:%d ss:%d\n",
200 return_info.error, return_info.id);
202 if (return_info.error) {
203 ERROR("there was an error in the negotiation or it failed\n");
206 *id = return_info.id;
208 ret = frescan_request_free(request);
210 ERROR("could not free request\n");
214 return return_info.error;