2 * @file frescan_bwres_threads.c
4 * @brief FRESCAN bandwidth reservation layer: negotiation threads
6 * This module contains the acceptor threads and the master thread for local
7 * negotiations, with functions to create them.
13 * @author Daniel Sangorrin <daniel.sangorrin@unican.es>
18 #include "fosa_threads_and_signals.h" // fosa_thread_attr_init...
19 #include "frescan_bwres_threads.h"
20 #include "frescan_bwres_messages.h"
21 #include "frescan_bwres_requests.h"
22 #include "frescan_config.h"
23 #include "frescan_debug.h"
24 #include "frescan_data.h"
25 #include "frescan_servers.h"
28 * frescan_manager_thread_create()
30 * This call creates the manager thread at each node which will be waiting
31 * in a request queue for LOCAL or EXTERNAL requests.
34 static void *frescan_manager_thread(void *arg);
36 int frescan_manager_thread_create(frescan_network_t net)
39 fosa_thread_attr_t attr;
41 ret = fosa_thread_attr_init(&attr);
42 if (ret != 0) return ret;
44 ret = fosa_thread_attr_set_prio(&attr, FRESCAN_NEG_THREAD_PRIO);
45 if (ret != 0) return ret;
47 ret = fosa_thread_create(&the_networks[net].manager_thread_id,
49 frescan_manager_thread,
50 (void *)(uint32_t)net);
51 if (ret != 0) return ret;
53 ret = fosa_thread_attr_destroy(&attr);
54 if (ret != 0) return ret;
60 * frescan_acceptor_thread_create()
62 * This call creates the acceptor thread which will be waiting negotiation
63 * messages from the network and converting them into requests.
66 static void *frescan_acceptor_thread(void *arg);
68 int frescan_acceptor_thread_create(frescan_network_t net)
71 fosa_thread_attr_t attr;
73 ret = fosa_thread_attr_init(&attr);
74 if (ret != 0) return ret;
76 ret = fosa_thread_attr_set_prio(&attr, FRESCAN_ACCEPTOR_THREAD_PRIO);
77 if (ret != 0) return ret;
79 ret = fosa_thread_create(&the_networks[net].acceptor_thread_id,
81 frescan_acceptor_thread,
82 (void *)(uint32_t)net);
83 if (ret != 0) return ret;
85 ret = fosa_thread_attr_destroy(&attr);
86 if (ret != 0) return ret;
92 * frescan_manager_thread
95 static int frescan_manager_neg(frescan_request_data_t *req_data);
96 static int frescan_manager_reneg(frescan_request_data_t *req_data);
97 static int frescan_manager_cancel(frescan_request_data_t *req_data);
98 static int frescan_manager_repneg(frescan_request_data_t *req_data);
100 static void *frescan_manager_thread(void *arg)
103 frescan_request_id_t req;
104 frescan_request_data_t *req_data;
105 frescan_network_t net = (uint32_t)arg;
107 DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, "manager thread starts\n");
110 DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, "wait for a request\n");
112 ret = frescan_requests_dequeue(&req);
115 ret = frescan_requests_get_data(req, &req_data);
118 switch(req_data->type) {
119 case FRESCAN_REQ_NEG:
120 ret = frescan_manager_neg(req_data);
123 case FRESCAN_REQ_RENEG:
124 ret = frescan_manager_reneg(req_data);
127 case FRESCAN_REQ_CANCEL:
128 ret = frescan_manager_cancel(req_data);
131 case FRESCAN_REP_NEG:
132 ret = frescan_manager_repneg(req_data);
136 ERROR("request type not supported\n");
140 if(req_data->request_node != the_networks[net].local_node) {
141 ret = frescan_requests_free(req);
148 * frescan_acceptor_thread()
151 static void *frescan_acceptor_thread(void *arg)
154 frescan_recv_params_t recv_params;
155 uint8_t msg[2000]; // TODO: use a constant with the max neg message size
159 frescan_request_id_t req;
160 frescan_request_data_t *req_data;
162 DEBUG(FRESCAN_ACCEPTOR_THREAD_ENABLE_DEBUG, "acceptor th starts\n");
164 recv_params.net = (frescan_network_t)(uint32_t)arg;
165 recv_params.channel = FRESCAN_NEG_CHANNEL;
166 recv_params.flags = FRESCAN_SYNC;
169 DEBUG(FRESCAN_ACCEPTOR_THREAD_ENABLE_DEBUG,
170 "waiting for a msg, net:%u chan:%u flags:%u\n",
171 recv_params.net, recv_params.channel, recv_params.flags);
173 ret = frescan_recv(&recv_params,
181 DEBUG(FRESCAN_ACCEPTOR_THREAD_ENABLE_DEBUG,
182 "msg received, from:%u size:%u prio:%u\n",
183 from, recv_bytes, prio);
185 ret = frescan_requests_alloc(&req);
188 ret = frescan_requests_get_data(req, &req_data);
191 ret = frescan_message_to_request(msg, req_data);
194 req_data->request_node = from;
196 ret = frescan_requests_enqueue(req);
204 * frescan_manager_neg
207 static int frescan_manager_neg(frescan_request_data_t *req_data)
209 DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, "negotiation request\n");
214 * frescan_manager_neg
217 static int frescan_manager_reneg(frescan_request_data_t *req_data)
219 DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, "renegotiation request\n");
224 * frescan_manager_neg
227 static int frescan_manager_cancel(frescan_request_data_t *req_data)
229 DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, "cancel request\n");
234 * frescan_manager_neg
237 static int frescan_manager_repneg(frescan_request_data_t *req_data)
239 DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, "reply to neg request\n");