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;
169 frescan_network_t net = (uint32_t)arg;
171 DEBUG(FRESCAN_NEG_THREAD_ENABLE_DEBUG, "negotiator thread starts\n");
174 DEBUG(FRESCAN_NEG_THREAD_ENABLE_DEBUG, "wait for a request\n");
176 err = frescan_requestqueue_dequeue(&request);
179 err = frescan_request_get_type(request, &type);
183 case FRESCAN_NEGOTIATE:
184 DEBUG(FRESCAN_NEG_THREAD_ENABLE_DEBUG,
185 "FRESCAN_NEGOTIATE request\n");
186 err = frescan_request_get_contract(request, &contract);
188 err = frescan_request_get_reply(request, &reply);
190 err = frescan_request_get_return_info
191 (request, (void *)&neg_return_info);
194 // TODO: sched test + add contract to table
195 // so far always accepted witht he min values
196 neg_return_info->error = 0;
197 server_params.values = contract->min_values;
198 server_params.prio = contract->prio;
200 err = frescan_servers_create
203 &neg_return_info->id);
206 err = frescan_replyobject_signal(reply);
210 case FRESCAN_RENEGOTIATE:
211 DEBUG(FRESCAN_NEG_THREAD_ENABLE_DEBUG,
212 "FRESCAN_RENEGOTIATE request\n");
216 DEBUG(FRESCAN_NEG_THREAD_ENABLE_DEBUG,
217 "FRESCAN_CANCEL request\n");
221 ERROR("wrong request type %d\n", type);