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
39 params.values.budget = 5;
40 params.values.period.tv_sec = 1;
41 params.values.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 ret = frescan_request_set_return_info(request,
112 (void *) &return_info);
114 ERROR("could not set return_info pointer\n");
118 ret = frescan_request_set_reply(request, reply);
120 ERROR("could not set reply\n");
124 if (the_networks[net].local_node == FRESCAN_NEG_MASTER_NODE) {
125 DEBUG(FRESCAN_BWRES_ENABLE_DEBUG,
126 "I am master, negotiation in local node\n");
128 DEBUG(FRESCAN_BWRES_ENABLE_DEBUG,
129 "set FRESCAN_NEGOTIATE type: %d\n", FRESCAN_NEGOTIATE);
131 ret = frescan_request_set_type(request, FRESCAN_NEGOTIATE);
133 ERROR("could not set type\n");
137 ret = frescan_request_set_contract(request, contract);
139 ERROR("could not set contract\n");
143 ret = frescan_request_set_src(request, FRESCAN_NEG_MASTER_NODE);
145 ERROR("could not set src\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;
169 params.flags = FRESCAN_SS | FRESCAN_ASYNC;
170 params.ss = the_networks[net].neg_messages_ss_id;
172 DEBUG(FRESCAN_BWRES_ENABLE_DEBUG,
173 "send msg to master, net:%u to:%u ss:%u\n",
174 params.net, params.to, params.ss);
176 ret = frescan_send(¶ms, msg, size);
178 ERROR("error while sending neg request to master\n");
183 DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "wait on reply object\n");
185 ret = frescan_replyobject_wait(reply);
187 ERROR("error while waiting on the reply object\n");
191 ret = frescan_replyobject_free(reply);
193 ERROR("could not free reply object\n");
197 if (return_info.error) {
198 DEBUG(FRESCAN_BWRES_ENABLE_DEBUG,
199 "negotiation was not accepted, error:%d\n",
202 DEBUG(FRESCAN_BWRES_ENABLE_DEBUG,
203 "negotiation finished succesfully ss:%d\n",
207 *id = return_info.id;
209 ret = frescan_request_free(request);
211 ERROR("could not free request\n");
215 return return_info.error;