]> rtime.felk.cvut.cz Git - frescor/fna.git/blob - src_frescan/frescan_bwres.c
848ae3dc63fb018985b76341cf008ebe6dbda26e
[frescor/fna.git] / src_frescan / frescan_bwres.c
1 /*!
2  * @file frescan_bwres.c
3  *
4  * @brief FRESCAN bandwidth reservation layer
5  *
6  * This module contains function to negotiate contracts and get the
7  * corresponding frescan sporadic servers.
8  *
9  * @version 0.01
10  *
11  * @date 1-Apr-2008
12  *
13  * @author Daniel Sangorrin <daniel.sangorrin@unican.es>
14  *
15  */
16
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"
25
26 /**
27  * frescan_bwres_init()
28  *
29  * Init the frescan bandwidth reservation layer
30  */
31
32 int frescan_bwres_init(frescan_network_t net)
33 {
34         int ret;
35         frescan_server_params_t params;
36
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;
43
44         ret = frescan_servers_create(net, &params,
45                                      &the_networks[net].neg_messages_ss_id);
46         if (ret != 0) return ret;
47
48         ret = frescan_bwres_robjs_init(FRESCAN_REPLY_OBJECTS_MX_CEILING);
49         if (ret != 0) return ret;
50
51         ret = frescan_requests_init(FRESCAN_REQUESTS_MX_CEILING);
52         if (ret != 0) return ret;
53
54         ret = frescan_manager_thread_create(net);
55         if (ret != 0) return ret;
56
57         ret = frescan_acceptor_thread_create(net);
58         if (ret != 0) return ret;
59
60         return 0;
61 }
62
63 /**
64  * frescan_bwres_negotiate()
65  *
66  * to negotiate a contract we follow the next steps:
67  *
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
72  *
73  */
74
75 int frescan_bwres_negotiate(frescan_network_t net,
76                             const frescan_contract_t *contract,
77                             frescan_ss_t *id)
78 {
79         int ret, negotiation_ret;
80         frescan_request_id_t   req;
81         frescan_request_data_t *req_data;
82
83         DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "preparing a negotiation request\n");
84
85         ret = frescan_request_alloc(&req);
86         if (ret != 0) return ret;
87
88         ret = frescan_requests_get_data(req, &req_data);
89         if (ret != 0) return ret;
90
91         req_data->type         = FRESCAN_REQ_NEG;
92         req_data->req          = req;
93         req_data->contract     = (frescan_contract_t *)contract;
94         req_data->request_node = the_networks[net].local_node;
95
96         ret = frescan_bwres_robjs_alloc(&req_data->robj, FRESCAN_BWRES_MX_PRIO);
97         if (ret != 0) return ret;
98
99         DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "enqueue the negotiation request\n");
100
101         ret = frescan_requests_enqueue(req);
102         if (ret != 0) return ret;
103
104         DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "wait for a reply\n");
105
106         ret = frescan_replyobject_wait(req_data->robj);
107         if (ret != 0) return ret;
108
109         ret = frescan_bwres_robjs_free(req_data->robj);
110         if (ret != 0) return ret;
111
112         switch (req_data->return_value) {
113                 case FRESCAN_REQ_ACCEPTED:
114                         DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "negotiation OK\n");
115                         *id = req_data->ss;
116                         ret = 0;
117                         break;
118
119                 case FRESCAN_REQ_NOT_ACCEPTED:
120                         DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "negotiation FAIL\n");
121                         ret = -1;
122                         break;
123
124                 case FRESCAN_REQ_ERROR:
125                         DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "negotiation ERROR\n");
126                         ret = -1;
127                         break;
128
129                 default:
130                         ERROR("return_value unknown\n");
131                         return -1;
132         }
133
134         frescan_request_free(req);
135
136         return ret;
137 }