source: mainline/uspace/srv/net/messages.h@ 60ab6c3

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 60ab6c3 was a64c64d, checked in by Lukas Mejdrech <lukasmejdrech@…>, 15 years ago
  • code reorganization (no functional change)
  • Property mode set to 100644
File size: 17.8 KB
Line 
1/*
2 * Copyright (c) 2009 Lukas Mejdrech
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/** @addtogroup net
30 * @{
31 */
32
33/** @file
34 * Networking common message definitions.
35 */
36
37#ifndef __NET_MESSAGES_H__
38#define __NET_MESSAGES_H__
39
40#include <async.h>
41
42#include <ipc/ipc.h>
43#include <ipc/services.h>
44
45#include "include/device.h"
46
47#include "structures/measured_strings.h"
48#include "structures/packet/packet.h"
49
50/** Returns a value indicating whether the value is in the interval.
51 * @param[in] item The value to be checked.
52 * @param[in] first_inclusive The first value in the interval inclusive.
53 * @param[in] last_exclusive The first value after the interval.
54 */
55#define IS_IN_INTERVAL(item, first_inclusive, last_exclusive) (((item) >= (first_inclusive)) && ((item) < (last_exclusive)))
56
57/** @name Networking message counts
58 */
59/*@{*/
60
61/** The number of ARP messages.
62 */
63#define NET_ARP_COUNT 5
64
65/** The number of Ethernet messages.
66 */
67#define NET_ETH_COUNT 0
68
69/** The number of ICMP messages.
70 */
71#define NET_ICMP_COUNT 6
72
73/** The number of inter-network messages.
74 */
75#define NET_IL_COUNT 6
76
77/** The number of IP messages.
78 */
79#define NET_IP_COUNT 4
80
81/** The number of general networking messages.
82 */
83#define NET_NET_COUNT 3
84
85/** The number of network interface driver messages.
86 */
87#define NET_NETIF_COUNT 6
88
89/** The number of network interface layer messages.
90 */
91#define NET_NIL_COUNT 7
92
93/** The number of packet management system messages.
94 */
95#define NET_PACKET_COUNT 5
96
97/** The number of socket messages.
98 */
99#define NET_SOCKET_COUNT 14
100
101/** The number of TCP messages.
102 */
103#define NET_TCP_COUNT 0
104
105/** The number of transport layer messages.
106 */
107#define NET_TL_COUNT 1
108
109/** The number of UDP messages.
110 */
111#define NET_UDP_COUNT 0
112
113/*@}*/
114
115/** @name Networking message intervals
116 */
117/*@{*/
118
119/** The first networking message.
120 */
121#define NET_FIRST 2000
122
123/** The first network interface layer message.
124 */
125#define NET_NETIF_FIRST NET_FIRST
126
127/** The last network interface layer message.
128 */
129#define NET_NETIF_LAST (NET_NETIF_FIRST + NET_NETIF_COUNT)
130
131/** The first general networking message.
132 */
133#define NET_NET_FIRST (NET_NETIF_LAST + 0)
134
135/** The last general networking message.
136 */
137#define NET_NET_LAST (NET_NET_FIRST + NET_NET_COUNT)
138
139/** The first network interface layer message.
140 */
141#define NET_NIL_FIRST (NET_NET_LAST + 0)
142
143/** The last network interface layer message.
144 */
145#define NET_NIL_LAST (NET_NIL_FIRST + NET_NIL_COUNT)
146
147/** The first Ethernet message.
148 */
149#define NET_ETH_FIRST (NET_NIL_LAST + 0)
150
151/** The last Ethernet message.
152 */
153#define NET_ETH_LAST (NET_ETH_FIRST + NET_ETH_COUNT)
154
155/** The first inter-network message.
156 */
157#define NET_IL_FIRST (NET_ETH_LAST + 0)
158
159/** The last inter-network message.
160 */
161#define NET_IL_LAST (NET_IL_FIRST + NET_IL_COUNT)
162
163/** The first IP message.
164 */
165#define NET_IP_FIRST (NET_IL_LAST + 0)
166
167/** The last IP message.
168 */
169#define NET_IP_LAST (NET_IP_FIRST + NET_IP_COUNT)
170
171/** The first ARP message.
172 */
173#define NET_ARP_FIRST (NET_IP_LAST + 0)
174
175/** The last ARP message.
176 */
177#define NET_ARP_LAST (NET_ARP_FIRST + NET_ARP_COUNT)
178
179/** The first ICMP message.
180 */
181#define NET_ICMP_FIRST (NET_ARP_LAST + 0)
182
183/** The last ICMP message.
184 */
185#define NET_ICMP_LAST (NET_ICMP_FIRST + NET_ICMP_COUNT)
186
187/** The first ICMP message.
188 */
189#define NET_TL_FIRST (NET_ICMP_LAST + 0)
190
191/** The last ICMP message.
192 */
193#define NET_TL_LAST (NET_TL_FIRST + NET_TL_COUNT)
194
195/** The first UDP message.
196 */
197#define NET_UDP_FIRST (NET_TL_LAST + 0)
198
199/** The last UDP message.
200 */
201#define NET_UDP_LAST (NET_UDP_FIRST + NET_UDP_COUNT)
202
203/** The first TCP message.
204 */
205#define NET_TCP_FIRST (NET_UDP_LAST + 0)
206
207/** The last TCP message.
208 */
209#define NET_TCP_LAST (NET_TCP_FIRST + NET_TCP_COUNT)
210
211/** The first socket message.
212 */
213#define NET_SOCKET_FIRST (NET_TCP_LAST + 0)
214
215/** The last socket message.
216 */
217#define NET_SOCKET_LAST (NET_SOCKET_FIRST + NET_SOCKET_COUNT)
218
219/** The first packet management system message.
220 */
221#define NET_PACKET_FIRST (NET_SOCKET_LAST + 0)
222
223/** The last packet management system message.
224 */
225#define NET_PACKET_LAST (NET_PACKET_FIRST + NET_PACKET_COUNT)
226
227/** The last networking message.
228 */
229#define NET_LAST NET_PACKET_LAST
230
231/** The number of networking messages.
232 */
233#define NET_COUNT (NET_LAST - NET_FIRST)
234
235/** Returns a value indicating whether the IPC call is a generic networking message.
236 * @param[in] call The IPC call to be checked.
237 */
238#define IS_NET_MESSAGE(call) IS_IN_INTERVAL(IPC_GET_METHOD(*call), NET_FIRST, NET_LAST)
239
240/** Returns a value indicating whether the IPC call is an ARP message.
241 * @param[in] call The IPC call to be checked.
242 */
243#define IS_NET_ARP_MESSAGE(call) IS_IN_INTERVAL(IPC_GET_METHOD(*call), NET_ARP_FIRST, NET_ARP_LAST)
244
245/** Returns a value indicating whether the IPC call is an Ethernet message.
246 * @param[in] call The IPC call to be checked.
247 */
248#define IS_NET_ETH_MESSAGE(call) IS_IN_INTERVAL(IPC_GET_METHOD(*call), NET_ETH_FIRST, NET_ETH_LAST)
249
250/** Returns a value indicating whether the IPC call is an ICMP message.
251 * @param[in] call The IPC call to be checked.
252 */
253#define IS_NET_ICMP_MESSAGE(call) IS_IN_INTERVAL(IPC_GET_METHOD(*call), NET_ICMP_FIRST, NET_ICMP_LAST)
254
255/** Returns a value indicating whether the IPC call is an inter-network layer message.
256 * @param[in] call The IPC call to be checked.
257 */
258#define IS_NET_IL_MESSAGE(call) IS_IN_INTERVAL(IPC_GET_METHOD(*call), NET_IL_FIRST, NET_IL_LAST)
259
260/** Returns a value indicating whether the IPC call is an IP message.
261 * @param[in] call The IPC call to be checked.
262 */
263#define IS_NET_IP_MESSAGE(call) IS_IN_INTERVAL(IPC_GET_METHOD(*call), NET_IP_FIRST, NET_IP_LAST)
264
265/** Returns a value indicating whether the IPC call is a generic networking message.
266 * @param[in] call The IPC call to be checked.
267 */
268#define IS_NET_NET_MESSAGE(call) IS_IN_INTERVAL(IPC_GET_METHOD(*call), NET_NET_FIRST, NET_NET_LAST)
269
270/** Returns a value indicating whether the IPC call is a network interface layer message.
271 * @param[in] call The IPC call to be checked.
272 */
273#define IS_NET_NIL_MESSAGE(call) IS_IN_INTERVAL(IPC_GET_METHOD(*call), NET_NIL_FIRST, NET_NIL_LAST)
274
275/** Returns a value indicating whether the IPC call is a packet manaagement system message.
276 * @param[in] call The IPC call to be checked.
277 */
278#define IS_NET_PACKET_MESSAGE(call) IS_IN_INTERVAL(IPC_GET_METHOD(*call), NET_PACKET_FIRST, NET_PACKET_LAST)
279
280/** Returns a value indicating whether the IPC call is a socket message.
281 * @param[in] call The IPC call to be checked.
282 */
283#define IS_NET_SOCKET_MESSAGE(call) IS_IN_INTERVAL(IPC_GET_METHOD(*call), NET_SOCKET_FIRST, NET_SOCKET_LAST)
284
285/** Returns a value indicating whether the IPC call is a TCP message.
286 * @param[in] call The IPC call to be checked.
287 */
288#define IS_NET_TCP_MESSAGE(call) IS_IN_INTERVAL(IPC_GET_METHOD(*call), NET_TCP_FIRST, NET_TCP_LAST)
289
290/** Returns a value indicating whether the IPC call is a transport layer message.
291 * @param[in] call The IPC call to be checked.
292 */
293#define IS_NET_TL_MESSAGE(call) IS_IN_INTERVAL(IPC_GET_METHOD(*call), NET_TL_FIRST, NET_TL_LAST)
294
295/** Returns a value indicating whether the IPC call is a UDP message.
296 * @param[in] call The IPC call to be checked.
297 */
298#define IS_NET_UDP_MESSAGE(call) IS_IN_INTERVAL(IPC_GET_METHOD(*call), NET_UDP_FIRST, NET_UDP_LAST)
299
300/*@}*/
301
302/** @name Networking specific message arguments definitions
303 */
304/*@{*/
305
306/** @name First arguments
307 */
308/*@{*/
309
310/** Returns the device identifier message argument.
311 * @param[in] call The message call structure.
312 */
313#define IPC_GET_DEVICE(call) (device_id_t) IPC_GET_ARG1(*call)
314
315/*@}*/
316
317/** @name Second arguments
318 */
319/*@{*/
320
321/** Returns the packet identifier message argument.
322 * @param[in] call The message call structure.
323 */
324#define IPC_GET_PACKET(call) (packet_id_t) IPC_GET_ARG2(*call)
325
326/** Returns the count message argument.
327 * @param[in] call The message call structure.
328 */
329#define IPC_GET_COUNT(call) (size_t) IPC_GET_ARG2(*call)
330
331/** Returns the device state message argument.
332 * @param[in] call The message call structure.
333 */
334#define IPC_GET_STATE(call) (device_state_t) IPC_GET_ARG2(*call)
335
336/** Returns the maximum transmission unit message argument.
337 * @param[in] call The message call structure.
338 */
339#define IPC_GET_MTU(call) (size_t) IPC_GET_ARG2(*call)
340
341/*@}*/
342
343/** @name Third arguments
344 */
345/*@{*/
346
347/** Returns the device driver service message argument.
348 * @param[in] call The message call structure.
349 */
350#define IPC_GET_SERVICE(call) (services_t) IPC_GET_ARG3(*call)
351
352/** Returns the target service message argument.
353 * @param[in] call The message call structure.
354 */
355#define IPC_GET_TARGET(call) (services_t) IPC_GET_ARG3(*call)
356
357/** Returns the sender service message argument.
358 * @param[in] call The message call structure.
359 */
360#define IPC_GET_SENDER(call) (services_t) IPC_GET_ARG3(*call)
361
362/*@}*/
363
364/** @name Fourth arguments
365 */
366/*@{*/
367
368/** Returns the error service message argument.
369 * @param[in] call The message call structure.
370 */
371#define IPC_GET_ERROR(call) (services_t) IPC_GET_ARG4(*call)
372
373/*@}*/
374
375/** @name Fifth arguments
376 */
377/*@{*/
378
379/** Returns the phone message argument.
380 * @param[in] call The message call structure.
381 */
382#define IPC_GET_PHONE(call) (int) IPC_GET_ARG5(*call)
383
384/*@}*/
385
386/** @name First answers
387 */
388/*@{*/
389
390/** Sets the device identifier in the message answer.
391 * @param[out] answer The message answer structure.
392 */
393#define IPC_SET_DEVICE(answer) ((device_id_t *) &IPC_GET_ARG1(*answer))
394
395/** Sets the minimum address length in the message answer.
396 * @param[out] answer The message answer structure.
397 */
398#define IPC_SET_ADDR(answer) ((size_t *) &IPC_GET_ARG1(*answer))
399
400/*@}*/
401
402/** @name Second answers
403 */
404/*@{*/
405
406/** Sets the minimum prefix size in the message answer.
407 * @param[out] answer The message answer structure.
408 */
409#define IPC_SET_PREFIX(answer) ((size_t *) &IPC_GET_ARG2(*answer))
410
411/*@}*/
412
413/** @name Third answers
414 */
415/*@{*/
416
417/** Sets the maximum content size in the message answer.
418 * @param[out] answer The message answer structure.
419 */
420#define IPC_SET_CONTENT(answer) ((size_t *) &IPC_GET_ARG3(*answer))
421
422/*@}*/
423
424/** @name Fourth answers
425 */
426/*@{*/
427
428/** Sets the minimum suffix size in the message answer.
429 * @param[out] answer The message answer structure.
430 */
431#define IPC_SET_SUFFIX(answer) ((size_t *) &IPC_GET_ARG4(*answer))
432
433/*@}*/
434
435/*@}*/
436
437/** Notifies the module about the device state change.
438 * @param[in] phone The service module phone.
439 * @param[in] message The service specific message.
440 * @param[in] device_id The device identifier.
441 * @param[in] state The new device state.
442 * @param[in] target The target module service.
443 * @returns EOK on success.
444 */
445static inline int generic_device_state_msg(int phone, int message, device_id_t device_id, int state, services_t target){
446 async_msg_3(phone, (ipcarg_t) message, (ipcarg_t) device_id, (ipcarg_t) state, target);
447 return EOK;
448}
449
450/** Notifies a module about the device.
451 * @param[in] phone The service module phone.
452 * @param[in] message The service specific message.
453 * @param[in] device_id The device identifier.
454 * @param[in] arg2 The second argument of the message.
455 * @param[in] service The device module service.
456 * @returns EOK on success.
457 * @returns Other error codes as defined for the specific service message.
458 */
459static inline int generic_device_req(int phone, int message, device_id_t device_id, int arg2, services_t service){
460 return (int) async_req_3_0(phone, (ipcarg_t) message, (ipcarg_t) device_id, (ipcarg_t) arg2, (ipcarg_t) service);
461}
462
463/** Returns the address.
464 * @param[in] phone The service module phone.
465 * @param[in] message The service specific message.
466 * @param[in] device_id The device identifier.
467 * @param[out] address The desired address.
468 * @param[out] data The address data container.
469 * @returns EOK on success.
470 * @returns EBADMEM if the address parameter and/or the data parameter is NULL.
471 * @returns Other error codes as defined for the specific service message.
472 */
473static inline int generic_get_addr_req(int phone, int message, device_id_t device_id, measured_string_ref * address, char ** data){
474 aid_t message_id;
475 ipcarg_t result;
476 int string;
477
478 if(!(address && data)){
479 return EBADMEM;
480 }
481
482 // request the address
483 message_id = async_send_1(phone, (ipcarg_t) message, (ipcarg_t) device_id, NULL);
484 string = measured_strings_return(phone, address, data, 1);
485 async_wait_for(message_id, &result);
486
487 // if not successful
488 if((string == EOK) && (result != EOK)){
489 // clear the data
490 free(*address);
491 free(*data);
492 }
493 return (int) result;
494}
495
496/** Returns the device packet dimension for sending.
497 * @param[in] phone The service module phone.
498 * @param[in] message The service specific message.
499 * @param[in] device_id The device identifier.
500 * @param[out] packet_dimension The packet dimension.
501 * @returns EOK on success.
502 * @returns EBADMEM if the packet_dimension parameter is NULL.
503 * @returns Other error codes as defined for the specific service message.
504 */
505static inline int generic_packet_size_req(int phone, int message, device_id_t device_id, packet_dimension_ref packet_dimension){
506 ipcarg_t result;
507 ipcarg_t prefix;
508 ipcarg_t content;
509 ipcarg_t suffix;
510 ipcarg_t addr_len;
511
512 if(! packet_dimension){
513 return EBADMEM;
514 }
515 result = async_req_1_4(phone, (ipcarg_t) message, (ipcarg_t) device_id, &addr_len, &prefix, &content, &suffix);
516 packet_dimension->prefix = (size_t) prefix;
517 packet_dimension->content = (size_t) content;
518 packet_dimension->suffix = (size_t) suffix;
519 packet_dimension->addr_len = (size_t) addr_len;
520 return (int) result;
521}
522
523/** Passes the packet queue to the module.
524 * @param[in] phone The service module phone.
525 * @param[in] message The service specific message.
526 * @param[in] device_id The device identifier.
527 * @param[in] packet_id The received packet or the received packet queue identifier.
528 * @param[in] target The target module service.
529 * @param[in] error The error module service.
530 * @returns EOK on success.
531 */
532static inline int generic_received_msg(int phone, int message, device_id_t device_id, packet_id_t packet_id, services_t target, services_t error){
533 if(error){
534 async_msg_4(phone, (ipcarg_t) message, (ipcarg_t) device_id, (ipcarg_t) packet_id, (ipcarg_t) target, (ipcarg_t) error);
535 }else{
536 async_msg_3(phone, (ipcarg_t) message, (ipcarg_t) device_id, (ipcarg_t) packet_id, (ipcarg_t) target);
537 }
538 return EOK;
539}
540
541/** Sends the packet queue.
542 * @param[in] phone The service module phone.
543 * @param[in] message The service specific message.
544 * @param[in] device_id The device identifier.
545 * @param[in] packet_id The packet or the packet queue identifier.
546 * @param[in] sender The sending module service.
547 * @param[in] error The error module service.
548 * @returns EOK on success.
549 */
550static inline int generic_send_msg(int phone, int message, device_id_t device_id, packet_id_t packet_id, services_t sender, services_t error){
551 if(error){
552 async_msg_4(phone, (ipcarg_t) message, (ipcarg_t) device_id, (ipcarg_t) packet_id, (ipcarg_t) sender, (ipcarg_t) error);
553 }else{
554 async_msg_3(phone, (ipcarg_t) message, (ipcarg_t) device_id, (ipcarg_t) packet_id, (ipcarg_t) sender);
555 }
556 return EOK;
557}
558
559/** Translates the given strings.
560 * Allocates and returns the needed memory block as the data parameter.
561 * @param[in] phone The service module phone.
562 * @param[in] message The service specific message.
563 * @param[in] device_id The device identifier.
564 * @param[in] service The module service.
565 * @param[in] configuration The key strings.
566 * @param[in] count The number of configuration keys.
567 * @param[out] translation The translated values.
568 * @param[out] data The translation data container.
569 * @returns EOK on success.
570 * @returns EINVAL if the configuration parameter is NULL.
571 * @returns EINVAL if the count parameter is zero (0).
572 * @returns EBADMEM if the translation or the data parameters are NULL.
573 * @returns Other error codes as defined for the specific service message.
574 */
575static inline int generic_translate_req(int phone, int message, device_id_t device_id, services_t service, measured_string_ref configuration, size_t count, measured_string_ref * translation, char ** data){
576 aid_t message_id;
577 ipcarg_t result;
578 int string;
579
580 if(!(configuration && (count > 0))){
581 return EINVAL;
582 }
583 if(!(translation && data)){
584 return EBADMEM;
585 }
586
587 // request the translation
588 message_id = async_send_3(phone, (ipcarg_t) message, (ipcarg_t) device_id, (ipcarg_t) count, (ipcarg_t) service, NULL);
589 measured_strings_send(phone, configuration, count);
590 string = measured_strings_return(phone, translation, data, count);
591 async_wait_for(message_id, &result);
592
593 // if not successful
594 if((string == EOK) && (result != EOK)){
595 // clear the data
596 free(*translation);
597 free(*data);
598 }
599
600 return (int) result;
601}
602
603#endif
604
605/** @}
606 */
Note: See TracBrowser for help on using the repository browser.