2 * @file frescan_negotiation_threads.h
4 * @brief FRESCAN 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_negotiation_threads.h"
20 #include "frescan_config.h"
21 #include "frescan_debug.h"
22 #include "frescan_data.h"
23 #include "frescan_negotiation_messages.h"
24 #include "frescan_requests_queue.h"
25 #include "frescan_servers.h"
27 static void *frescan_acceptor_thread(void *arg);
28 static void *frescan_master_neg_thread(void *arg);
31 * frescan_acceptor_thread_create()
34 int frescan_acceptor_thread_create(frescan_network_t net)
37 fosa_thread_attr_t attr;
39 ret = fosa_thread_attr_init(&attr);
41 ERROR("could not init thread attributes\n");
45 ret = fosa_thread_attr_set_prio(&attr, FRESCAN_ACCEPTOR_THREAD_PRIO);
47 ERROR("could not set acceptor thread prio %d\n",
48 FRESCAN_ACCEPTOR_THREAD_PRIO);
52 ret = fosa_thread_create(&the_networks[net].acceptor_thread_id,
54 frescan_acceptor_thread,
55 (void *)(uint32_t)net);
58 ERROR("could not create the negotiator thread\n");
62 ret = fosa_thread_attr_destroy(&attr);
64 ERROR("could not destroy thread attributes\n");
72 * frescan_master_neg_thread_create()
75 int frescan_master_neg_thread_create(frescan_network_t net)
78 fosa_thread_attr_t attr;
80 ret = fosa_thread_attr_init(&attr);
82 ERROR("could not init thread attributes\n");
86 ret = fosa_thread_attr_set_prio(&attr, FRESCAN_NEG_THREAD_PRIO);
88 ERROR("could not set neg thread prio %d\n",
89 FRESCAN_NEG_THREAD_PRIO);
93 ret = fosa_thread_create(&the_networks[net].neg_thread_id,
95 frescan_master_neg_thread,
96 (void *)(uint32_t)net);
99 ERROR("could not create the negotiator thread\n");
103 ret = fosa_thread_attr_destroy(&attr);
105 ERROR("could not destroy thread attributes\n");
113 * frescan_acceptor_thread()
115 * a loop waiting for messages on the network and parsing them.
118 static void *frescan_acceptor_thread(void *arg)
121 frescan_recv_params_t params;
127 DEBUG(FRESCAN_ACCEPTOR_THREAD_ENABLE_DEBUG,
128 "master acceptor thread starts\n");
130 params.net = (frescan_network_t)(uint32_t)arg;
131 params.channel = FRESCAN_NEG_CHANNEL;
132 params.flags = FRESCAN_SYNC;
135 DEBUG(FRESCAN_ACCEPTOR_THREAD_ENABLE_DEBUG,
136 "waiting for msg, net:%u chan:%u flags:%u\n",
137 params.net, params.channel, params.flags);
139 ret = frescan_recv(¶ms, msg, 200,
140 &recv_bytes, &from, &prio);
143 DEBUG(FRESCAN_ACCEPTOR_THREAD_ENABLE_DEBUG,
144 "msg received, from:%u size:%u prio:%u\n",
145 from, recv_bytes, prio);
147 ret = frescan_message_parse(params.net, msg, recv_bytes, from);
155 * frescan_master_neg_thread
157 * the thread that negotiates LOCAL contracts in the MASTER node.
160 static void *frescan_master_neg_thread(void *arg)
163 frescan_request_id_t request;
164 frescan_req_type_t type;
165 frescan_robj_id_t reply;
166 frescan_contract_t *contract;
167 frescan_neg_return_info_t *neg_return_info;
168 frescan_server_params_t server_params;
170 DEBUG(FRESCAN_NEG_THREAD_ENABLE_DEBUG, "negotiator thread starts\n");
173 DEBUG(FRESCAN_NEG_THREAD_ENABLE_DEBUG, "wait for a request\n");
175 err = frescan_requestqueue_dequeue(&request);
178 err = frescan_request_get_type(request, &type);
182 case FRESCAN_NEGOTIATE:
183 DEBUG(FRESCAN_NEG_THREAD_ENABLE_DEBUG,
184 "FRESCAN_NEGOTIATE request\n");
185 err = frescan_request_get_contract(request, &contract);
187 err = frescan_request_get_reply(request, &reply);
189 err = frescan_request_get_return_info
190 (request, (void *)&neg_return_info);
193 // TODO: sched test + add contract to table
194 // so far always accepted witht he min values
195 neg_return_info->error = 0;
196 server_params.values = contract->min_values;
197 server_params.prio = contract->prio;
198 err = frescan_servers_create
199 ((frescan_network_t)(uint32_t)arg,
201 &neg_return_info->id);
204 err = frescan_replyobject_signal(reply);
208 case FRESCAN_RENEGOTIATE:
209 DEBUG(FRESCAN_NEG_THREAD_ENABLE_DEBUG,
210 "FRESCAN_RENEGOTIATE request\n");
214 DEBUG(FRESCAN_NEG_THREAD_ENABLE_DEBUG,
215 "FRESCAN_CANCEL request\n");
219 ERROR("wrong request type %d\n", type);