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_bwres_requests.h"
19 #include "frescan_bwres_messages.h"
20 #include "frescan_bwres_threads.h"
21 #include "frescan_data.h"
22 #include "frescan_debug.h"
23 #include "frescan_config.h"
24 #include "frescan_servers.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 // TODO: initialization tree like in DTM
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);
46 if (ret != 0) return ret;
48 ret = frescan_bwres_robjs_init(FRESCAN_REPLY_OBJECTS_MX_CEILING);
49 if (ret != 0) return ret;
51 ret = frescan_requests_init(FRESCAN_REQUESTS_MX_CEILING);
52 if (ret != 0) return ret;
54 ret = frescan_manager_thread_create(net);
55 if (ret != 0) return ret;
57 ret = frescan_acceptor_thread_create(net);
58 if (ret != 0) return ret;
64 * frescan_bwres_negotiate()
66 * to negotiate a contract we follow the next steps:
68 * 1.- prepare a request
69 * 2.- enqueue the request
70 * 3.- wait in the reply object for a reply
71 * 4.- return the final values
75 int frescan_bwres_negotiate(frescan_network_t net,
76 const frescan_contract_t *contract,
79 int ret, negotiation_ret;
80 frescan_request_id_t req;
81 frescan_request_data_t *req_data;
83 DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "preparing a negotiation request\n");
85 ret = frescan_request_alloc(&req);
86 if (ret != 0) return ret;
88 ret = frescan_requests_get_data(req, &req_data);
89 if (ret != 0) return ret;
91 req_data->type = FRESCAN_REQ_NEG;
93 req_data->contract = (frescan_contract_t *)contract;
94 req_data->request_node = the_networks[net].local_node;
96 ret = frescan_bwres_robjs_alloc(&req_data->robj, FRESCAN_BWRES_MX_PRIO);
97 if (ret != 0) return ret;
99 DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "enqueue the negotiation request\n");
101 ret = frescan_requests_enqueue(req);
102 if (ret != 0) return ret;
104 DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "wait for a reply\n");
106 ret = frescan_replyobject_wait(req_data->robj);
107 if (ret != 0) return ret;
109 ret = frescan_bwres_robjs_free(req_data->robj);
110 if (ret != 0) return ret;
112 switch (req_data->return_value) {
113 case FRESCAN_REQ_ACCEPTED:
114 DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "negotiation OK\n");
119 case FRESCAN_REQ_NOT_ACCEPTED:
120 DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "negotiation FAIL\n");
124 case FRESCAN_REQ_ERROR:
125 DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "negotiation ERROR\n");
130 ERROR("return_value unknown\n");
134 frescan_request_free(req);