Rev 993 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1063 | tullio | 1 | |
2 | /* |
||
3 | * This program is free software; you can redistribute it and/or modify |
||
4 | * it under the terms of the GNU General Public License as published by |
||
5 | * the Free Software Foundation; either version 2 of the License, or |
||
6 | * (at your option) any later version. |
||
7 | * |
||
8 | * This program is distributed in the hope that it will be useful, |
||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||
11 | * GNU General Public License for more details. |
||
12 | * |
||
13 | * You should have received a copy of the GNU General Public License |
||
14 | * along with this program; if not, write to the Free Software |
||
15 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||
16 | * |
||
17 | */ |
||
18 | |||
929 | lipari | 19 | /** |
20 | @file Distributed. |
||
21 | */ |
||
22 | |||
899 | trimarchi | 23 | //fsf_distributed.h |
24 | //===================================================================== |
||
25 | // FFFFFFIII RRRRR SSTTTTTTT |
||
26 | // FF IIR RR SS |
||
27 | // FF IR SS |
||
28 | // FFFFFF RRRR SSSSST |
||
29 | // FF FI RRR SS |
||
30 | // FF II RRR SS |
||
31 | // FF IIIIIR RS |
||
32 | // |
||
33 | // FSF(FIRST Scheduling Framework) |
||
34 | // distributed services functionality |
||
35 | //===================================================================== |
||
36 | |||
37 | #include "fsf_core.h" |
||
38 | |||
39 | #ifndef _FSF_DISTRIBUTED_H_ |
||
40 | #define _FSF_DISTRIBUTED_H_ |
||
41 | |||
42 | #define FSF_DISTRIBUTED_MODULE_SUPPORTED 1 |
||
43 | |||
44 | |||
929 | lipari | 45 | /** |
899 | trimarchi | 46 | |
929 | lipari | 47 | \ingroup distjmodule |
48 | |||
993 | lipari | 49 | This operation sets the network id attribute in the contract |
50 | pointed to by parameter contract, to the value specified by |
||
51 | network_id. When a contract is negotiated, if network_id is |
||
52 | FSF_NULL_NETWORK_ID (which is the default value) the contract is |
||
53 | negotiated for the processing capacity of the node making the |
||
54 | call. If network_id represents a valid network identifier, the |
||
55 | negotiation is carried out for the specified network. |
||
56 | |||
985 | julio | 57 | @param contract the pointer to the contract object |
58 | @param [in] network_id the network identifier |
||
59 | |||
60 | @retval 0 if the operation is succesful |
||
61 | @retval FSF_ERR_BAD_ARGUMENT if contract is null or the network |
||
62 | id is not valid. |
||
929 | lipari | 63 | */ |
899 | trimarchi | 64 | int |
65 | fsf_set_contract_network_id |
||
66 | (fsf_contract_parameters_t *contract, |
||
67 | fsf_network_id_t network_id); |
||
68 | |||
929 | lipari | 69 | /** |
899 | trimarchi | 70 | |
929 | lipari | 71 | \ingroup distjmodule |
985 | julio | 72 | |
73 | This operation puts the network identification |
||
74 | corresponding to the contract parameters object |
||
75 | pointed to by contract in the variable pointed |
||
76 | to by network_id. If the contract is not a network |
||
77 | one and therefore has not a network_id set, it |
||
78 | puts the FSF_NULL_NETWORK_ID constant instead. |
||
899 | trimarchi | 79 | |
985 | julio | 80 | @param [in] contract the pointer to the contract object |
81 | @param [out] network_id pointer to the variable that will contain |
||
82 | the network identifier |
||
83 | |||
84 | @retval 0 if the operation is succesful |
||
85 | @retval FSF_ERR_BAD_ARGUMENT if any of the pointers is null. |
||
929 | lipari | 86 | */ |
899 | trimarchi | 87 | int |
88 | fsf_get_contract_network_id |
||
89 | (const fsf_contract_parameters_t *contract, |
||
90 | fsf_network_id_t *network_id); |
||
91 | |||
985 | julio | 92 | |
899 | trimarchi | 93 | //Transmission services: |
94 | |||
929 | lipari | 95 | /** |
96 | |||
97 | \ingroup distjmodule |
||
98 | |||
985 | julio | 99 | This operation creates a unidirectional input |
100 | data endpoint through which, after the |
||
101 | corresponding binding, it is possible to send |
||
102 | data. network_id identifies the network to use, |
||
103 | receiver specifies the communication protocol |
||
104 | dependent information that is necessary to |
||
105 | address the receiving node, and port specifies |
||
106 | the communication protocol dependent information |
||
107 | that is necessary to get in contact with the |
||
108 | desired destination. |
||
899 | trimarchi | 109 | |
985 | julio | 110 | @param [in] network_id the identifier ot the network to use |
111 | @param [in] receiver protocol dependent information used |
||
112 | to address the receiving node |
||
113 | @param [in] port protocol dependent information used |
||
114 | to get in contact with the desired destination process |
||
115 | @param [out] endpoint pointer to the variable that will |
||
116 | contain the send endpoint |
||
117 | |||
118 | @retval 0 if the operation is succesful |
||
119 | @retval FSF_ERR_BAD_ARGUMENT if endpoint is null, netwok_id |
||
120 | is not valid or if the receiver or the port do not conform |
||
121 | to their expected formats |
||
929 | lipari | 122 | */ |
899 | trimarchi | 123 | int |
124 | fsf_create_send_endpoint |
||
125 | (fsf_network_id_t network_id, |
||
126 | fsf_node_address_t receiver, |
||
127 | fsf_port_t port, |
||
128 | fsf_send_endpoint_t *endpoint); |
||
129 | |||
929 | lipari | 130 | /** |
131 | \ingroup distjmodule |
||
132 | |||
985 | julio | 133 | This operation eliminates any resources reserved |
134 | for the referenced endpoint. If the endpoint is |
||
135 | bound to a network server, it is unbound from it |
||
136 | and can not be further used to invoke send |
||
137 | operations on it. |
||
138 | |||
139 | @param endpoint pointer to the endpoint to eliminate |
||
140 | |||
141 | @retval 0 if the operation is succesful |
||
142 | @retval FSF_ERR_BAD_ARGUMENT if endpoint is null, or not valid |
||
929 | lipari | 143 | */ |
899 | trimarchi | 144 | int |
145 | fsf_destroy_send_endpoint |
||
146 | (fsf_send_endpoint_t *endpoint); |
||
147 | |||
929 | lipari | 148 | /** |
149 | \ingroup distjmodule |
||
150 | |||
985 | julio | 151 | This operation returns (except for those NULL |
152 | arguments) in the variables pointed to by |
||
153 | network_id, receiver, or port, the corresponding |
||
154 | parameters used in the creation of the given |
||
155 | send endpoint. |
||
156 | |||
157 | @param [in] endpoint pointer to the endpoint |
||
158 | @param [out] network_id pointer to variable the will contain |
||
159 | the network id |
||
160 | @param [out] receiver pointer to variable the will contain |
||
161 | the protocol dependent information used to address the |
||
162 | receiving node |
||
163 | @param [out] port pointer to variable the will contain |
||
164 | the protocol dependent information used to get in contact |
||
165 | with the desired destination process |
||
166 | |||
167 | @retval 0 if the operation is succesful |
||
168 | @retval FSF_ERR_BAD_ARGUMENT if endpoint is null, or not valid |
||
169 | or all the other pointers are NULL. |
||
170 | |||
929 | lipari | 171 | */ |
899 | trimarchi | 172 | int |
173 | fsf_get_send_endpoint_parameters |
||
174 | (const fsf_send_endpoint_t *endpoint, |
||
175 | fsf_network_id_t *network_id, |
||
176 | fsf_node_address_t *receiver, |
||
177 | fsf_port_t *port); |
||
178 | |||
929 | lipari | 179 | /** |
180 | \ingroup distjmodule |
||
181 | |||
985 | julio | 182 | This operation associates a send endpoint with a |
183 | server, which means that messages sent through |
||
184 | that endpoint will consume the server's reserved |
||
185 | bandwidth and its packets will be sent according |
||
186 | to the contract established for that server. If |
||
187 | the endpoint is already bound to another server, |
||
188 | it is effectively unbound from it and bound to |
||
189 | the specified one. |
||
190 | |||
191 | @param [in] server server id |
||
192 | @param endpoint pointer to the endpoint |
||
193 | |||
194 | @retval 0 if the operation is succesful |
||
195 | @retval FSF_ERR_BAD_ARGUMENT if endpoint is null, or not valid |
||
196 | or server is not valid. |
||
197 | @retval FSF_ERR_ALREADY_BOUND if the server is already |
||
198 | bound to some other send endpoint |
||
199 | @retval FSF_ERR_WRONG_NETWORK if the server network id |
||
200 | is not the same as the one in the endpoint |
||
201 | */ |
||
899 | trimarchi | 202 | int |
929 | lipari | 203 | fsf_bind_endpoint_to_server |
204 | (fsf_server_id_t server, |
||
205 | fsf_send_endpoint_t *endpoint); |
||
899 | trimarchi | 206 | |
929 | lipari | 207 | /** |
208 | \ingroup distjmodule |
||
209 | |||
985 | julio | 210 | This operation unbinds a send endpoint from a |
211 | server. Endpoints with no server associated |
||
212 | cannot be used to send data, and they stay in |
||
213 | that state until they are either eliminated or |
||
214 | bound again. |
||
215 | |||
216 | @param endpoint pointer to the endpoint to unbind |
||
217 | |||
218 | @retval 0 if the operation is succesful |
||
219 | @retval FSF_ERR_BAD_ARGUMENT if endpoint is null, or not valid |
||
220 | @retval FSF_ERR_NOT_BOUND if the endpoint has no server |
||
221 | bound |
||
222 | */ |
||
899 | trimarchi | 223 | int |
224 | fsf_unbind_endpoint_from_server |
||
225 | (fsf_send_endpoint_t *endpoint); |
||
226 | |||
929 | lipari | 227 | /** |
228 | \ingroup distjmodule |
||
229 | |||
985 | julio | 230 | This operation copies the id of the server that |
231 | is bound to the specified send endpoint into the |
||
232 | variable pointed to by server. |
||
233 | |||
234 | @param [in] endpoint pointer to the endpoint |
||
235 | @param [out] server pointer to variable the will contain |
||
236 | the server id |
||
237 | |||
238 | @retval 0 if the operation is succesful |
||
239 | @retval FSF_ERR_BAD_ARGUMENT if endpoint is null, or not valid |
||
240 | or server is NULL. |
||
929 | lipari | 241 | */ |
899 | trimarchi | 242 | int |
243 | fsf_get_endpoint_server |
||
244 | (const fsf_send_endpoint_t *endpoint, |
||
245 | fsf_server_id_t *server); |
||
246 | |||
929 | lipari | 247 | |
248 | /** |
||
249 | \ingroup distjmodule |
||
250 | |||
985 | julio | 251 | This operation sends a message stored in msg and of length size |
252 | through the given endpoint. The operation is non-blocking and |
||
253 | returns immediately. An internal fsf service will schedule the |
||
254 | sending of messages and implement the communications sporadic server |
||
255 | corresponding to the network server bound to the given endpoint. |
||
256 | Messages sent through the same endpoint are received in the same |
||
257 | order in which they were sent |
||
258 | |||
259 | @param endpoint pointer to the endpoint |
||
260 | @param [in] msg pointer to the message |
||
261 | @param [in] size number of bytes to transmitt |
||
262 | |||
263 | @retval 0 if the operation is succesful |
||
264 | @retval FSF_ERR_BAD_ARGUMENT if endpoint is null, or not valid |
||
265 | or msg is NULL |
||
266 | @retval FSF_ERR_NOT_BOUND if endpoint is not bound to a valid |
||
267 | server; |
||
268 | @retval FSF_ERR_TOO_LARGE if the message is too large for the |
||
269 | network protocol |
||
270 | @retval FSF_ERR_BUFFER_FULL if the sending queue is full |
||
271 | */ |
||
899 | trimarchi | 272 | int |
273 | fsf_send |
||
274 | (const fsf_send_endpoint_t *endpoint, |
||
275 | void *msg, |
||
276 | size_t size); |
||
277 | |||
929 | lipari | 278 | /** |
279 | \ingroup distjmodule |
||
280 | |||
985 | julio | 281 | This operation creates a receive endpoint with all the information |
282 | that is necessary to receive information from the specified network |
||
283 | and port |
||
284 | |||
285 | @param [in] network_id the identifier ot the network to use |
||
286 | @param [in] port protocol dependent information used |
||
287 | to identify the calling process as an expecting destination |
||
288 | @param [out] endpoint pointer to the variable that will |
||
289 | contain the receive endpoint |
||
290 | |||
291 | @retval 0 if the operation is succesful |
||
292 | @retval FSF_ERR_BAD_ARGUMENT if endpoint is null, network_id |
||
293 | is not valid or if port do not conform to the expected format |
||
294 | */ |
||
899 | trimarchi | 295 | int |
296 | fsf_create_receive_endpoint |
||
297 | (fsf_network_id_t network_id, |
||
298 | fsf_port_t port, |
||
299 | fsf_receive_endpoint_t *endpoint); |
||
300 | |||
929 | lipari | 301 | /** |
302 | \ingroup distjmodule |
||
303 | |||
986 | julio | 304 | This operation eliminates any resources reserved for the given |
305 | endpoint. After callling this operation the endpoint can not be |
||
306 | further used to invoke receive operations on it. |
||
307 | |||
308 | @param endpoint pointer to the endpoint |
||
309 | |||
310 | @retval 0 if the operation is succesful |
||
311 | @retval FSF_ERR_BAD_ARGUMENT if endpoint is null, or not valid |
||
312 | */ |
||
313 | int |
||
314 | fsf_destroy_receive_endpoint |
||
315 | (fsf_receive_endpoint_t *endpoint); |
||
316 | |||
317 | |||
318 | /** |
||
319 | \ingroup distjmodule |
||
320 | |||
321 | This operation returns in the variables network_id, |
||
322 | and port, the corresponding parameters used in the |
||
323 | creation of the given receive endpoint. |
||
324 | |||
325 | @param [in] endpoint pointer to the endpoint |
||
326 | @param [out] network_id pointer to variable the will contain |
||
327 | the network id |
||
328 | @param [out] port pointer to variable the will contain |
||
329 | the protocol dependent information used to get in contact |
||
330 | with the desired destination process |
||
331 | |||
332 | @retval 0 if the operation is succesful |
||
333 | @retval FSF_ERR_BAD_ARGUMENT if endpoint is null, or not valid |
||
334 | or all the other pointers are NULL. |
||
335 | */ |
||
336 | int |
||
337 | fsf_get_receive_endpoint_parameters |
||
338 | (fsf_receive_endpoint_t *endpoint, |
||
339 | fsf_network_id_t *network_id, |
||
340 | fsf_port_t *port); |
||
341 | |||
342 | |||
343 | /** |
||
344 | \ingroup distjmodule |
||
345 | |||
985 | julio | 346 | If there are no messages available in the specified receive endpoint |
347 | this operation blocks the calling thread waiting for a message to be |
||
348 | received. When a message is available, if its size is less than or |
||
349 | equal to the buffersize, the function stores it in the variable |
||
350 | pointed to by buffer and puts the number of bytes received in the |
||
351 | variable pointed to by messagesize. Messages arriving at a receiver |
||
352 | buffer that is full will be silently discarded. The application is |
||
353 | responsible of reading the receive endpoints with appropriate |
||
354 | regularity, or of using a sequence number or some other mechanism |
||
355 | to detect any lost messages. |
||
356 | |||
357 | @param endpoint pointer to the endpoint |
||
358 | @param [out] buffer pointer to the place that will contain |
||
359 | the message received |
||
360 | @param [in] buffersize size of the buffer space |
||
361 | @param [out] messagesize pointer to the variable that will contain |
||
362 | the number of bytes received |
||
363 | |||
364 | @retval 0 if the operation is succesful |
||
365 | @retval FSF_ERR_BAD_ARGUMENT if endpoint is null, or not valid |
||
366 | or if buffer or messagesize are NULL. |
||
367 | @retval FSF_ERR_NO_SPACE if the buffersize is too small for the |
||
368 | message received (in which case the message is lost). |
||
369 | */ |
||
899 | trimarchi | 370 | int |
371 | fsf_receive |
||
372 | (const fsf_receive_endpoint_t *endpoint, |
||
373 | void *buffer, |
||
374 | size_t buffersize, |
||
375 | size_t *messagesize); |
||
376 | |||
929 | lipari | 377 | /** |
378 | \ingroup distjmodule |
||
379 | |||
985 | julio | 380 | This operation is the same as fsf_receive, except |
381 | that if there are no messages available in the |
||
382 | specified receive endpoint at the time of the call |
||
383 | the operation returns with an error |
||
384 | |||
385 | @param endpoint pointer to the endpoint |
||
386 | @param [out] buffer pointer to the place that will contain |
||
387 | the message received |
||
388 | @param [in] buffersize size of the buffer space |
||
389 | @param [out] messagesize pointer to the variable that will contain |
||
390 | the number of bytes received |
||
391 | |||
392 | @retval 0 if the operation is succesful |
||
393 | @retval FSF_ERR_BAD_ARGUMENT if endpoint is null, or not valid |
||
394 | or if buffer or messagesize are NULL. |
||
395 | @retval FSF_ERR_NO_SPACE if the buffersize is too small for the |
||
396 | message received (in which case the message is lost). |
||
397 | @retval FSF_ERR_NO_MESSAGES if there are no messages available |
||
398 | in the specified receive endpoint at the time of the call |
||
399 | */ |
||
899 | trimarchi | 400 | int |
401 | fsf_try_receive |
||
402 | (const fsf_receive_endpoint_t *endpoint, |
||
403 | void *buffer, |
||
404 | size_t buffersize, |
||
405 | size_t *messagesize); |
||
406 | |||
929 | lipari | 407 | /** |
408 | \ingroup distjmodule |
||
409 | |||
985 | julio | 410 | This operation is used to calculate a budget represented as |
411 | a time magnitude, for a specified network. If succesful, the |
||
412 | operation puts in the variable pointed to by budget the |
||
413 | transmission time that it takes to send a packet through the |
||
414 | network designated by network_id, when there is no contention, |
||
415 | but including any network overheads. |
||
993 | lipari | 416 | |
985 | julio | 417 | @param [in] network_id the identifier ot the network to use |
418 | @param [out] budget pointer to the variable tha will contain |
||
993 | lipari | 419 | the time it takes to transmitt a packet |
899 | trimarchi | 420 | |
985 | julio | 421 | @retval 0 if the operation is succesful |
422 | @retval FSF_ERR_BAD_ARGUMENT if network_id is not a valid |
||
993 | lipari | 423 | network identifier of if budget is a NULL pointer |
985 | julio | 424 | */ |
993 | lipari | 425 | int |
426 | fsf_packet_tx_time |
||
427 | (fsf_network_id_t network_id, |
||
428 | struct timespec *budget); |
||
985 | julio | 429 | |
929 | lipari | 430 | /** |
431 | \ingroup distjmodule |
||
432 | |||
985 | julio | 433 | This operation puts in the variable pointed to by |
434 | packet_size the maximum number of bytes that can be sent |
||
435 | in a packet through the network designated by network_id. |
||
436 | It is usually a configuration value and it helps the user |
||
437 | application to calculate the number of packets it will |
||
438 | need to reserve for the periodic transmision of its |
||
439 | messages and prepare the corresponding contracts. |
||
440 | |||
441 | @param [in] network_id the identifier ot the network to use |
||
442 | @param [out] packet_size pointer to the variable tha will contain |
||
443 | the maximum size in bytes of a packet |
||
444 | |||
445 | @retval 0 if the operation is succesful |
||
446 | @retval FSF_ERR_BAD_ARGUMENT if network_id is not a valid |
||
447 | network identifier of if packet_size is a NULL pointer |
||
448 | */ |
||
449 | int |
||
450 | fsf_packet_size |
||
451 | (fsf_network_id_t network_id, |
||
452 | size_t *packet_size); |
||
453 | |||
454 | |||
455 | /** |
||
456 | \ingroup distjmodule |
||
457 | |||
458 | This operation is used to obtain the maximum number of |
||
459 | packets of which a message can be formed, for the |
||
460 | specified network. A message is defined as the piece of |
||
461 | information used in a send operation. Since the value |
||
462 | returned by this operation is measured in packet units, |
||
463 | the effective size can be calculated multiplying this |
||
464 | value by the size of a packet. When the value returned by |
||
465 | this operation is larger than 1 it means the |
||
466 | implementation will make the partition of messages into |
||
467 | packets and its recomposition at the receiving node. |
||
468 | |||
469 | @param [in] network_id the identifier ot the network to use |
||
470 | @param [out] max_msg_size pointer to the variable tha will contain |
||
471 | the maximum number of packets sent in a single send operation |
||
472 | |||
473 | @retval 0 if the operation is succesful |
||
474 | @retval FSF_ERR_BAD_ARGUMENT if network_id is not a valid |
||
475 | network identifier of if max_msg_size is a NULL pointer |
||
476 | */ |
||
899 | trimarchi | 477 | int |
478 | fsf_max_message_size |
||
479 | (fsf_network_id_t network_id, |
||
480 | size_t *max_msg_size); |
||
481 | |||
482 | |||
985 | julio | 483 | |
899 | trimarchi | 484 | #endif // _FSF_DISTRIBUTED_H_ |