Rev 899 | Rev 985 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
929 | lipari | 1 | /** |
2 | @file Distributed. |
||
3 | */ |
||
4 | |||
899 | trimarchi | 5 | //fsf_distributed.h |
6 | //===================================================================== |
||
7 | // FFFFFFIII RRRRR SSTTTTTTT |
||
8 | // FF IIR RR SS |
||
9 | // FF IR SS |
||
10 | // FFFFFF RRRR SSSSST |
||
11 | // FF FI RRR SS |
||
12 | // FF II RRR SS |
||
13 | // FF IIIIIR RS |
||
14 | // |
||
15 | // FSF(FIRST Scheduling Framework) |
||
16 | // distributed services functionality |
||
17 | //===================================================================== |
||
18 | |||
19 | #include "fsf_core.h" |
||
20 | |||
21 | #ifndef _FSF_DISTRIBUTED_H_ |
||
22 | #define _FSF_DISTRIBUTED_H_ |
||
23 | |||
24 | #define FSF_DISTRIBUTED_MODULE_SUPPORTED 1 |
||
25 | |||
26 | |||
929 | lipari | 27 | /** |
899 | trimarchi | 28 | |
929 | lipari | 29 | \ingroup distjmodule |
30 | |||
31 | This operation identifies a contract as a bandwidth reservation on |
||
32 | the network identified by the network input parameter. Then the |
||
33 | contract negotiation is performed using the conventional |
||
34 | negotiation functions, including the possibility of grouping the |
||
35 | contract with others. If the network_id given is |
||
36 | FSF_NULL_NETWORK_ID, the contract is considered not to reserve |
||
37 | bandwidth in a network but to operate as any other regular |
||
38 | contract. It returns 0 if successful, or FSF_ERR_BAD_ARGUMENT if |
||
39 | contract is null or the network id is not valid. |
||
40 | */ |
||
899 | trimarchi | 41 | int |
42 | fsf_set_contract_network_id |
||
43 | (fsf_contract_parameters_t *contract, |
||
44 | fsf_network_id_t network_id); |
||
45 | |||
929 | lipari | 46 | /** |
899 | trimarchi | 47 | |
929 | lipari | 48 | \ingroup distjmodule |
899 | trimarchi | 49 | |
929 | lipari | 50 | This operation puts the network identification corresponding to the |
51 | contract parameters object pointed to by contract in the variable |
||
52 | pointed to by network_id. If the contract is a regular one and |
||
53 | therefore has not a network_id set, it puts the FSF_NULL_NETWORK_ID |
||
54 | constant instead. it returns 0 if successful, or |
||
55 | FSF_ERR_BAD_ARGUMENT if any of the pointers is null. |
||
56 | */ |
||
899 | trimarchi | 57 | int |
58 | fsf_get_contract_network_id |
||
59 | (const fsf_contract_parameters_t *contract, |
||
60 | fsf_network_id_t *network_id); |
||
61 | |||
62 | //Transmission services: |
||
63 | |||
64 | //opaque types for fsf endpoints |
||
65 | typedef FSF_SEND_ENDPOINT_T_OPAQUE fsf_send_endpoint_t; |
||
66 | typedef FSF_RECEIVE_ENDPOINT_T_OPAQUE fsf_receive_endpoint_t; |
||
67 | |||
929 | lipari | 68 | /** |
69 | \ingroup distjmodule |
||
70 | |||
71 | The node_address type specifies the node address in a |
||
72 | communication-protocol-independent way. The actual address is |
||
73 | obtained via a configuration dependent mapping function |
||
74 | */ |
||
899 | trimarchi | 75 | typedef unsigned int fsf_node_address_t; |
76 | |||
929 | lipari | 77 | /** |
78 | \ingroup distjmodule |
||
79 | |||
80 | The port type specifies the information that is necessary to get in |
||
81 | contact with the thread in the receiving node, in a |
||
82 | protocol-independent way. The actual port number is obtained via a |
||
83 | configuration dependent mapping function |
||
84 | */ |
||
899 | trimarchi | 85 | typedef unsigned int fsf_port_t; |
86 | |||
929 | lipari | 87 | /** |
88 | |||
89 | \ingroup distjmodule |
||
90 | |||
91 | This operation creates a unidirectional input data endpoint through |
||
92 | which, after the corresponding binding, it is possible to send |
||
93 | data. network_id identifies the network to use, receiver specifies |
||
94 | the communication protocol dependent information that is necessary |
||
95 | to address the receiving node, and port specifies the communication |
||
96 | protocol dependent information that is necessary to get in contact |
||
97 | with the desired destination. It returns 0 if successful. It |
||
98 | returns FSF_ERR_BAD_ARGUMENT if the endpoint is null, if the |
||
99 | network_id is not valid, or if the receiver or the port do not |
||
100 | conform to their expected formats. |
||
101 | */ |
||
899 | trimarchi | 102 | int |
103 | fsf_create_send_endpoint |
||
104 | (fsf_network_id_t network_id, |
||
105 | fsf_node_address_t receiver, |
||
106 | fsf_port_t port, |
||
107 | fsf_send_endpoint_t *endpoint); |
||
108 | |||
929 | lipari | 109 | /** |
110 | \ingroup distjmodule |
||
111 | |||
112 | This operation eliminates any resources reserved for the referenced |
||
113 | endpoint. If the endpoint is bound to a network server, it is |
||
114 | unbound from it and can not be further used to invoke send |
||
115 | operations on it. It returns 0 if successful, or |
||
116 | FSF_ERR_BAD_ARGUMENT if the endpoint is not valid. |
||
117 | */ |
||
899 | trimarchi | 118 | int |
119 | fsf_destroy_send_endpoint |
||
120 | (fsf_send_endpoint_t *endpoint); |
||
121 | |||
929 | lipari | 122 | /** |
123 | \ingroup distjmodule |
||
124 | |||
125 | This operation returns (except for those NULL arguments) in the |
||
126 | variables pointed to by network_id, receiver, or port, the |
||
127 | corresponding parameters used in the creation of the given send |
||
128 | endpoint. It returns 0 if successful, or FSF_ERR_BAD_ARGUMENT if |
||
129 | the endpoint is not valid. |
||
130 | */ |
||
899 | trimarchi | 131 | int |
132 | fsf_get_send_endpoint_parameters |
||
133 | (const fsf_send_endpoint_t *endpoint, |
||
134 | fsf_network_id_t *network_id, |
||
135 | fsf_node_address_t *receiver, |
||
136 | fsf_port_t *port); |
||
137 | |||
929 | lipari | 138 | /** |
139 | \ingroup distjmodule |
||
140 | |||
141 | This operation associates a send endpoint with a server, which |
||
142 | means that messages sent through that endpoint will consume the |
||
143 | server's reserved bandwidth and its packets will be sent according |
||
144 | to the contract established for that server. If the endpoint is |
||
145 | already bound to another server, it is effectively unbound from it |
||
146 | and bound to the specified one. The operation returns 0 if |
||
147 | successful, or FSF_ERR_BAD_ARGUMENT if the endpoint or the server |
||
148 | are not valid, it also fails with a value of FSF_ERR_ALREADY_BOUND |
||
149 | if the server is already bound to some other send endpoint. It |
||
150 | fails with FSF_ERR_WRONG_NETWORK if the server network id is not |
||
151 | the same as the one in the endpoint */ |
||
899 | trimarchi | 152 | int |
929 | lipari | 153 | fsf_bind_endpoint_to_server |
154 | (fsf_server_id_t server, |
||
155 | fsf_send_endpoint_t *endpoint); |
||
899 | trimarchi | 156 | |
929 | lipari | 157 | /** |
158 | \ingroup distjmodule |
||
159 | |||
160 | This operation unbinds a send endpoint from a server Endpoints with |
||
161 | no server associated cannot be used to send data, and they stay in |
||
162 | that state until they are either eliminated or bound again. The |
||
163 | operation fails with FSF_ERR_NOT_BOUND if the endpoint has no |
||
164 | server bound */ |
||
899 | trimarchi | 165 | int |
166 | fsf_unbind_endpoint_from_server |
||
167 | (fsf_send_endpoint_t *endpoint); |
||
168 | |||
929 | lipari | 169 | /** |
170 | \ingroup distjmodule |
||
171 | |||
172 | This operation copies the id of the server that |
||
173 | is bound to the specified send endpoint into the |
||
174 | variable pointed to by server. It returns 0 if |
||
175 | successful, or FSF_ERR_BAD_ARGUMENT if the |
||
176 | endpoint is not valid or server is NULL |
||
177 | */ |
||
899 | trimarchi | 178 | int |
179 | fsf_get_endpoint_server |
||
180 | (const fsf_send_endpoint_t *endpoint, |
||
181 | fsf_server_id_t *server); |
||
182 | |||
929 | lipari | 183 | |
184 | /** |
||
185 | \ingroup distjmodule |
||
186 | |||
187 | This operation sends a message stored in msg and of length size |
||
188 | through the given endpoint. The operation is non-blocking and |
||
189 | returns immediately. An internal fsf service will schedule the |
||
190 | sending of messages and implement the communications sporadic |
||
191 | server corresponding to the network server bound to the given |
||
192 | endpoint. Messages sent through the same endpoint are received in |
||
193 | the same order in which they were sent It returns 0 if successful, |
||
194 | but it fails with FSF_ERR_BAD_ARGUMENT if endpoint is not valid; it |
||
195 | fails with FSF_ERR_NOT_BOUND is not bound to a valid server; it |
||
196 | fails with FSF_ERR_TOO_LARGE if the message is too large for the |
||
197 | network protocol; it fails with FSF_ERR_BUFFER_FULL if the sending |
||
198 | queue is full */ |
||
899 | trimarchi | 199 | int |
200 | fsf_send |
||
201 | (const fsf_send_endpoint_t *endpoint, |
||
202 | void *msg, |
||
203 | size_t size); |
||
204 | |||
929 | lipari | 205 | /** |
206 | \ingroup distjmodule |
||
207 | |||
208 | This operation creates a receive endpoint with all the information |
||
209 | that is necessary to receive information from the specified network |
||
210 | and port It returns 0 if successful, but it fails with |
||
211 | FSF_ERR_BAD_ARGUMENT if the port or the network id are not |
||
212 | valid. */ |
||
899 | trimarchi | 213 | int |
214 | fsf_create_receive_endpoint |
||
215 | (fsf_network_id_t network_id, |
||
216 | fsf_port_t port, |
||
217 | fsf_receive_endpoint_t *endpoint); |
||
218 | |||
929 | lipari | 219 | /** |
220 | \ingroup distjmodule |
||
221 | |||
222 | If there are no messages available in the specified receive |
||
223 | endpoint this operation blocks the calling thread waiting for a |
||
224 | message to be received. When a message is available, if its size is |
||
225 | less than or equal to the buffersize, the function stores it in the |
||
226 | variable pointed to by buffer and puts the number of bytes received |
||
227 | in the variable pointed to by messagesize. The function fails with |
||
228 | FSF_ERR_NO_SPACE if the buffersize is too small for the message |
||
229 | received (in which case the message is lost), or with |
||
230 | FSF_ERR_BAD_ARGUMENT if the endpoint is not valid, or if buffer or |
||
231 | messagesize are NULL. Messages arriving at a receiver buffer that |
||
232 | is full will be silently discarded. The application is responsible |
||
233 | of reading the receive endpoints with appropriate regularity, or of |
||
234 | using a sequence number or some other mechanism to detect any lost |
||
235 | messages.*/ |
||
899 | trimarchi | 236 | int |
237 | fsf_receive |
||
238 | (const fsf_receive_endpoint_t *endpoint, |
||
239 | void *buffer, |
||
240 | size_t buffersize, |
||
241 | size_t *messagesize); |
||
242 | |||
929 | lipari | 243 | /** |
244 | \ingroup distjmodule |
||
245 | |||
246 | This operation is the same as fsf_receive, except that if there are |
||
247 | no messages available in the specified receive endpoint at the time |
||
248 | of the call the operation returns with an error of |
||
249 | FSF_ERR_NO_MESSAGES */ |
||
899 | trimarchi | 250 | int |
251 | fsf_try_receive |
||
252 | (const fsf_receive_endpoint_t *endpoint, |
||
253 | void *buffer, |
||
254 | size_t buffersize, |
||
255 | size_t *messagesize); |
||
256 | |||
929 | lipari | 257 | /** |
258 | \ingroup distjmodule |
||
259 | |||
260 | This operation is used to calculate the minimum and/or maximum |
||
261 | budgets used in the preparation of network contracts. It puts in |
||
262 | the variable pointed to by budget the transmission time that it |
||
263 | takes to send a message of size msg_size through the network |
||
264 | designated by network_id, when there is no contention, but |
||
265 | including any network overheads It returns FSF_ERR_BAD_ARGUMENT if |
||
266 | network_id is not a valid identifier or if budget is a NULL |
||
267 | pointer.*/ |
||
899 | trimarchi | 268 | int |
269 | fsf_tx_time |
||
270 | (fsf_network_id_t network_id, |
||
271 | size_t msg_size, |
||
272 | struct timespec *budget); |
||
273 | |||
929 | lipari | 274 | /** |
275 | \ingroup distjmodule |
||
276 | |||
277 | This operation is used to obtain the maximum message size for the |
||
278 | specified network It returns FSF_ERR_BAD_ARGUMENT if network_id is |
||
279 | not a valid identifier or if max_msg_size is NULL */ |
||
899 | trimarchi | 280 | int |
281 | fsf_max_message_size |
||
282 | (fsf_network_id_t network_id, |
||
283 | size_t *max_msg_size); |
||
284 | |||
285 | |||
286 | #endif // _FSF_DISTRIBUTED_H_ |