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"
27 static void *frescan_manager_thread(void *arg);
28 static void *frescan_acceptor_thread(void *arg);
31 * frescan_manager_thread_create()
33 * This call creates the manager thread at each node which will be waiting
34 * in a request queue for LOCAL or EXTERNAL requests.
37 int frescan_manager_thread_create(frescan_network_t net)
40 fosa_thread_attr_t attr;
42 ret = fosa_thread_attr_init(&attr);
44 ERROR("could not init thread attributes\n");
48 ret = fosa_thread_attr_set_prio(&attr, FRESCAN_NEG_THREAD_PRIO);
50 ERROR("could not set neg thread prio %d\n",
51 FRESCAN_NEG_THREAD_PRIO);
55 ret = fosa_thread_create(&the_networks[net].neg_thread_id,
57 frescan_master_neg_thread,
58 (void *)(uint32_t)net);
61 ERROR("could not create the negotiator thread\n");
65 ret = fosa_thread_attr_destroy(&attr);
67 ERROR("could not destroy thread attributes\n");
75 * frescan_acceptor_thread_create()
78 int frescan_acceptor_thread_create(frescan_network_t net)
81 fosa_thread_attr_t attr;
83 ret = fosa_thread_attr_init(&attr);
85 ERROR("could not init thread attributes\n");
89 ret = fosa_thread_attr_set_prio(&attr, FRESCAN_ACCEPTOR_THREAD_PRIO);
91 ERROR("could not set acceptor thread prio %d\n",
92 FRESCAN_ACCEPTOR_THREAD_PRIO);
96 ret = fosa_thread_create(&the_networks[net].acceptor_thread_id,
98 frescan_acceptor_thread,
99 (void *)(uint32_t)net);
102 ERROR("could not create the negotiator thread\n");
106 ret = fosa_thread_attr_destroy(&attr);
108 ERROR("could not destroy thread attributes\n");
116 * frescan_manager_thread
119 static void *frescan_manager_thread(void *arg)
122 frescan_request_id_t request;
123 frescan_req_type_t type;
124 frescan_robj_id_t reply;
125 frescan_contract_t *contract;
126 frescan_neg_return_info_t *neg_return_info;
127 frescan_server_params_t server_params;
128 frescan_network_t net = (uint32_t)arg;
130 DEBUG(FRESCAN_NEG_THREAD_ENABLE_DEBUG, "negotiator thread starts\n");
133 DEBUG(FRESCAN_NEG_THREAD_ENABLE_DEBUG, "wait for a request\n");
135 err = frescan_requestqueue_dequeue(&request);
138 err = frescan_request_get_type(request, &type);
142 case FRESCAN_NEGOTIATE:
143 DEBUG(FRESCAN_NEG_THREAD_ENABLE_DEBUG,
144 "FRESCAN_NEGOTIATE request\n");
145 err = frescan_request_get_contract(request, &contract);
147 err = frescan_request_get_reply(request, &reply);
149 err = frescan_request_get_return_info
150 (request, (void *)&neg_return_info);
153 // TODO: sched test + add contract to table
154 // so far always accepted witht he min values
155 neg_return_info->error = 0;
156 server_params.values = contract->min_values;
157 server_params.prio = contract->prio;
159 err = frescan_servers_create
162 &neg_return_info->id);
165 err = frescan_replyobject_signal(reply);
169 case FRESCAN_RENEGOTIATE:
170 DEBUG(FRESCAN_NEG_THREAD_ENABLE_DEBUG,
171 "FRESCAN_RENEGOTIATE request\n");
175 DEBUG(FRESCAN_NEG_THREAD_ENABLE_DEBUG,
176 "FRESCAN_CANCEL request\n");
180 ERROR("wrong request type %d\n", type);
188 * frescan_acceptor_thread()
191 static void *frescan_acceptor_thread(void *arg)
194 frescan_recv_params_t params;
200 DEBUG(FRESCAN_ACCEPTOR_THREAD_ENABLE_DEBUG,
201 "master acceptor thread starts\n");
203 params.net = (frescan_network_t)(uint32_t)arg;
204 params.channel = FRESCAN_NEG_CHANNEL;
205 params.flags = FRESCAN_SYNC;
208 DEBUG(FRESCAN_ACCEPTOR_THREAD_ENABLE_DEBUG,
209 "waiting for msg, net:%u chan:%u flags:%u\n",
210 params.net, params.channel, params.flags);
212 ret = frescan_recv(¶ms, msg, 200,
213 &recv_bytes, &from, &prio);
216 DEBUG(FRESCAN_ACCEPTOR_THREAD_ENABLE_DEBUG,
217 "msg received, from:%u size:%u prio:%u\n",
218 from, recv_bytes, prio);
220 ret = frescan_message_parse(params.net, msg, recv_bytes, from);