source: mainline/uspace/lib/socket/include/net_messages.h@ 70ce016

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 70ce016 was 14f1db0, checked in by Martin Decky <martin@…>, 15 years ago

networking overhaul:

  • separation of conserns
  • removal of (almost all) overlaping symbols, libnetif is not needed anymore
  • again, it is possible to build the networking in multiple architecture configurations (however, currently only the bundling netif and nil layers is supported, more to come)
  • code style updates and fixes (still a huge amount of work to do)
  • Property mode set to 100644
File size: 18.6 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 <net_device.h>
46#include <adt/measured_strings.h>
47#include <packet/packet.h>
48
49/** Returns a value indicating whether the value is in the interval.
50 * @param[in] item The value to be checked.
51 * @param[in] first_inclusive The first value in the interval inclusive.
52 * @param[in] last_exclusive The first value after the interval.
53 */
54#define IS_IN_INTERVAL(item, first_inclusive, last_exclusive) (((item) >= (first_inclusive)) && ((item) < (last_exclusive)))
55
56/** @name Networking message counts
57 */
58/*@{*/
59
60/** The number of ARP messages.
61 */
62#define NET_ARP_COUNT 5
63
64/** The number of Ethernet messages.
65 */
66#define NET_ETH_COUNT 0
67
68/** The number of ICMP messages.
69 */
70#define NET_ICMP_COUNT 6
71
72/** The number of inter-network messages.
73 */
74#define NET_IL_COUNT 6
75
76/** The number of IP messages.
77 */
78#define NET_IP_COUNT 4
79
80/** The number of general networking messages.
81 */
82#define NET_NET_COUNT 3
83
84/** The number of network interface driver messages.
85 */
86#define NET_NETIF_COUNT 6
87
88/** The number of network interface layer messages.
89 */
90#define NET_NIL_COUNT 7
91
92/** The number of packet management system messages.
93 */
94#define NET_PACKET_COUNT 5
95
96/** The number of socket messages.
97 */
98#define NET_SOCKET_COUNT 14
99
100/** The number of TCP messages.
101 */
102#define NET_TCP_COUNT 0
103
104/** The number of transport layer messages.
105 */
106#define NET_TL_COUNT 1
107
108/** The number of UDP messages.
109 */
110#define NET_UDP_COUNT 0
111
112/*@}*/
113
114/** @name Networking message intervals
115 */
116/*@{*/
117
118/** The first networking message.
119 */
120#define NET_FIRST 2000
121
122/** The first network interface layer message.
123 */
124#define NET_NETIF_FIRST NET_FIRST
125
126/** The last network interface layer message.
127 */
128#define NET_NETIF_LAST (NET_NETIF_FIRST + NET_NETIF_COUNT)
129
130/** The first general networking message.
131 */
132#define NET_NET_FIRST (NET_NETIF_LAST + 0)
133
134/** The last general networking message.
135 */
136#define NET_NET_LAST (NET_NET_FIRST + NET_NET_COUNT)
137
138/** The first network interface layer message.
139 */
140#define NET_NIL_FIRST (NET_NET_LAST + 0)
141
142/** The last network interface layer message.
143 */
144#define NET_NIL_LAST (NET_NIL_FIRST + NET_NIL_COUNT)
145
146/** The first Ethernet message.
147 */
148#define NET_ETH_FIRST (NET_NIL_LAST + 0)
149
150/** The last Ethernet message.
151 */
152#define NET_ETH_LAST (NET_ETH_FIRST + NET_ETH_COUNT)
153
154/** The first inter-network message.
155 */
156#define NET_IL_FIRST (NET_ETH_LAST + 0)
157
158/** The last inter-network message.
159 */
160#define NET_IL_LAST (NET_IL_FIRST + NET_IL_COUNT)
161
162/** The first IP message.
163 */
164#define NET_IP_FIRST (NET_IL_LAST + 0)
165
166/** The last IP message.
167 */
168#define NET_IP_LAST (NET_IP_FIRST + NET_IP_COUNT)
169
170/** The first ARP message.
171 */
172#define NET_ARP_FIRST (NET_IP_LAST + 0)
173
174/** The last ARP message.
175 */
176#define NET_ARP_LAST (NET_ARP_FIRST + NET_ARP_COUNT)
177
178/** The first ICMP message.
179 */
180#define NET_ICMP_FIRST (NET_ARP_LAST + 0)
181
182/** The last ICMP message.
183 */
184#define NET_ICMP_LAST (NET_ICMP_FIRST + NET_ICMP_COUNT)
185
186/** The first ICMP message.
187 */
188#define NET_TL_FIRST (NET_ICMP_LAST + 0)
189
190/** The last ICMP message.
191 */
192#define NET_TL_LAST (NET_TL_FIRST + NET_TL_COUNT)
193
194/** The first UDP message.
195 */
196#define NET_UDP_FIRST (NET_TL_LAST + 0)
197
198/** The last UDP message.
199 */
200#define NET_UDP_LAST (NET_UDP_FIRST + NET_UDP_COUNT)
201
202/** The first TCP message.
203 */
204#define NET_TCP_FIRST (NET_UDP_LAST + 0)
205
206/** The last TCP message.
207 */
208#define NET_TCP_LAST (NET_TCP_FIRST + NET_TCP_COUNT)
209
210/** The first socket message.
211 */
212#define NET_SOCKET_FIRST (NET_TCP_LAST + 0)
213
214/** The last socket message.
215 */
216#define NET_SOCKET_LAST (NET_SOCKET_FIRST + NET_SOCKET_COUNT)
217
218/** The first packet management system message.
219 */
220#define NET_PACKET_FIRST (NET_SOCKET_LAST + 0)
221
222/** The last packet management system message.
223 */
224#define NET_PACKET_LAST (NET_PACKET_FIRST + NET_PACKET_COUNT)
225
226/** The last networking message.
227 */
228#define NET_LAST NET_PACKET_LAST
229
230/** The number of networking messages.
231 */
232#define NET_COUNT (NET_LAST - NET_FIRST)
233
234/** Returns a value indicating whether the IPC call is a generic networking message.
235 * @param[in] call The IPC call to be checked.
236 */
237#define IS_NET_MESSAGE(call) \
238 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) \
244 IS_IN_INTERVAL(IPC_GET_METHOD(*call), NET_ARP_FIRST, NET_ARP_LAST)
245
246/** Returns a value indicating whether the IPC call is an Ethernet message.
247 * @param[in] call The IPC call to be checked.
248 */
249#define IS_NET_ETH_MESSAGE(call) \
250 IS_IN_INTERVAL(IPC_GET_METHOD(*call), NET_ETH_FIRST, NET_ETH_LAST)
251
252/** Returns a value indicating whether the IPC call is an ICMP message.
253 * @param[in] call The IPC call to be checked.
254 */
255#define IS_NET_ICMP_MESSAGE(call) \
256 IS_IN_INTERVAL(IPC_GET_METHOD(*call), NET_ICMP_FIRST, NET_ICMP_LAST)
257
258/** Returns a value indicating whether the IPC call is an inter-network layer message.
259 * @param[in] call The IPC call to be checked.
260 */
261#define IS_NET_IL_MESSAGE(call) \
262 IS_IN_INTERVAL(IPC_GET_METHOD(*call), NET_IL_FIRST, NET_IL_LAST)
263
264/** Returns a value indicating whether the IPC call is an IP message.
265 * @param[in] call The IPC call to be checked.
266 */
267#define IS_NET_IP_MESSAGE(call) \
268 IS_IN_INTERVAL(IPC_GET_METHOD(*call), NET_IP_FIRST, NET_IP_LAST)
269
270/** Returns a value indicating whether the IPC call is a generic networking message.
271 * @param[in] call The IPC call to be checked.
272 */
273#define IS_NET_NET_MESSAGE(call) \
274 IS_IN_INTERVAL(IPC_GET_METHOD(*call), NET_NET_FIRST, NET_NET_LAST)
275
276/** Returns a value indicating whether the IPC call is a network interface layer message.
277 * @param[in] call The IPC call to be checked.
278 */
279#define IS_NET_NIL_MESSAGE(call) \
280 IS_IN_INTERVAL(IPC_GET_METHOD(*call), NET_NIL_FIRST, NET_NIL_LAST)
281
282/** Returns a value indicating whether the IPC call is a packet manaagement system message.
283 * @param[in] call The IPC call to be checked.
284 */
285#define IS_NET_PACKET_MESSAGE(call) \
286 IS_IN_INTERVAL(IPC_GET_METHOD(*call), NET_PACKET_FIRST, NET_PACKET_LAST)
287
288/** Returns a value indicating whether the IPC call is a socket message.
289 * @param[in] call The IPC call to be checked.
290 */
291#define IS_NET_SOCKET_MESSAGE(call) \
292 IS_IN_INTERVAL(IPC_GET_METHOD(*call), NET_SOCKET_FIRST, NET_SOCKET_LAST)
293
294/** Returns a value indicating whether the IPC call is a TCP message.
295 * @param[in] call The IPC call to be checked.
296 */
297#define IS_NET_TCP_MESSAGE(call) \
298 IS_IN_INTERVAL(IPC_GET_METHOD(*call), NET_TCP_FIRST, NET_TCP_LAST)
299
300/** Returns a value indicating whether the IPC call is a transport layer message.
301 * @param[in] call The IPC call to be checked.
302 */
303#define IS_NET_TL_MESSAGE(call) \
304 IS_IN_INTERVAL(IPC_GET_METHOD(*call), NET_TL_FIRST, NET_TL_LAST)
305
306/** Returns a value indicating whether the IPC call is a UDP message.
307 * @param[in] call The IPC call to be checked.
308 */
309#define IS_NET_UDP_MESSAGE(call) \
310 IS_IN_INTERVAL(IPC_GET_METHOD(*call), NET_UDP_FIRST, NET_UDP_LAST)
311
312/*@}*/
313
314/** @name Networking specific message arguments definitions
315 */
316/*@{*/
317
318/** @name First arguments
319 */
320/*@{*/
321
322/** Returns the device identifier message argument.
323 * @param[in] call The message call structure.
324 */
325#define IPC_GET_DEVICE(call) \
326 ({device_id_t device_id = (device_id_t) IPC_GET_ARG1(*call); device_id;})
327
328/*@;})*/
329
330/** @name Second arguments
331 */
332/*@({*/
333
334/** Returns the packet identifier message argument.
335 * @param[in] call The message call structure.
336 */
337#define IPC_GET_PACKET(call) \
338 ({packet_id_t packet_id = (packet_id_t) IPC_GET_ARG2(*call); packet_id;})
339
340/** Returns the count message argument.
341 * @param[in] call The message call structure.
342 */
343#define IPC_GET_COUNT(call) \
344 ({size_t size = (size_t) IPC_GET_ARG2(*call); size;})
345
346/** Returns the device state message argument.
347 * @param[in] call The message call structure.
348 */
349#define IPC_GET_STATE(call) \
350 ({device_state_t device_state = (device_state_t) IPC_GET_ARG2(*call); device_state;})
351
352/** Returns the maximum transmission unit message argument.
353 * @param[in] call The message call structure.
354 */
355#define IPC_GET_MTU(call) \
356 ({size_t size = (size_t) IPC_GET_ARG2(*call); size;})
357
358/*@;})*/
359
360/** @name Third arguments
361 */
362/*@({*/
363
364/** Returns the device driver service message argument.
365 * @param[in] call The message call structure.
366 */
367 #define IPC_GET_SERVICE(call) \
368 ({services_t service = (services_t) IPC_GET_ARG3(*call); service;})
369
370/** Returns the target service message argument.
371 * @param[in] call The message call structure.
372 */
373#define IPC_GET_TARGET(call) \
374 ({services_t service = (services_t) IPC_GET_ARG3(*call); service;})
375
376/** Returns the sender service message argument.
377 * @param[in] call The message call structure.
378 */
379#define IPC_GET_SENDER(call) \
380 ({services_t service = (services_t) IPC_GET_ARG3(*call); service;})
381
382/*@;})*/
383
384/** @name Fourth arguments
385 */
386/*@({*/
387
388/** Returns the error service message argument.
389 * @param[in] call The message call structure.
390 */
391#define IPC_GET_ERROR(call) \
392 ({services_t service = (services_t) IPC_GET_ARG4(*call); service;})
393
394/*@;})*/
395
396/** @name Fifth arguments
397 */
398/*@({*/
399
400/** Returns the phone message argument.
401 * @param[in] call The message call structure.
402 */
403#define IPC_GET_PHONE(call) \
404 ({int phone = (int) IPC_GET_ARG5(*call); phone;})
405
406/*@}*/
407
408/** @name First answers
409 */
410/*@{*/
411
412/** Sets the device identifier in the message answer.
413 * @param[out] answer The message answer structure.
414 */
415#define IPC_SET_DEVICE(answer, value) \
416 {ipcarg_t argument = (ipcarg_t) (value); IPC_SET_ARG1(*answer, argument);}
417
418/** Sets the minimum address length in the message answer.
419 * @param[out] answer The message answer structure.
420 */
421#define IPC_SET_ADDR(answer, value) \
422 {ipcarg_t argument = (ipcarg_t) (value); IPC_SET_ARG1(*answer, argument);}
423
424/*@}*/
425
426/** @name Second answers
427 */
428/*@{*/
429
430/** Sets the minimum prefix size in the message answer.
431 * @param[out] answer The message answer structure.
432 */
433#define IPC_SET_PREFIX(answer, value) \
434 {ipcarg_t argument = (ipcarg_t) (value); IPC_SET_ARG2(*answer, argument);}
435
436/*@}*/
437
438/** @name Third answers
439 */
440/*@{*/
441
442/** Sets the maximum content size in the message answer.
443 * @param[out] answer The message answer structure.
444 */
445#define IPC_SET_CONTENT(answer, value) \
446 {ipcarg_t argument = (ipcarg_t) (value); IPC_SET_ARG3(*answer, argument);}
447
448/*@}*/
449
450/** @name Fourth answers
451 */
452/*@{*/
453
454/** Sets the minimum suffix size in the message answer.
455 * @param[out] answer The message answer structure.
456 */
457#define IPC_SET_SUFFIX(answer, value) \
458 {ipcarg_t argument = (ipcarg_t) (value); IPC_SET_ARG4(*answer, argument);}
459
460/*@}*/
461
462/*@}*/
463
464/** Notify the module about the device state change.
465 *
466 * @param[in] phone The service module phone.
467 * @param[in] message The service specific message.
468 * @param[in] device_id The device identifier.
469 * @param[in] state The new device state.
470 * @param[in] target The target module service.
471 *
472 * @return EOK on success.
473 *
474 */
475static inline int generic_device_state_msg_remote(int phone, int message,
476 device_id_t device_id, int state, services_t target)
477{
478 async_msg_3(phone, (ipcarg_t) message, (ipcarg_t) device_id,
479 (ipcarg_t) state, target);
480
481 return EOK;
482}
483
484/** Notify a module about the device.
485 *
486 * @param[in] phone The service module phone.
487 * @param[in] message The service specific message.
488 * @param[in] device_id The device identifier.
489 * @param[in] arg2 The second argument of the message.
490 * @param[in] service The device module service.
491 *
492 * @return EOK on success.
493 * @return Other error codes as defined for the specific service message.
494 *
495 */
496static inline int generic_device_req_remote(int phone, int message,
497 device_id_t device_id, int arg2, services_t service)
498{
499 return (int) async_req_3_0(phone, (ipcarg_t) message, (ipcarg_t) device_id,
500 (ipcarg_t) arg2, (ipcarg_t) service);
501}
502
503/** Returns the address.
504 * @param[in] phone The service module phone.
505 * @param[in] message The service specific message.
506 * @param[in] device_id The device identifier.
507 * @param[out] address The desired address.
508 * @param[out] data The address data container.
509 * @returns EOK on success.
510 * @returns EBADMEM if the address parameter and/or the data parameter is NULL.
511 * @returns Other error codes as defined for the specific service message.
512 */
513static inline int generic_get_addr_req(int phone, int message, device_id_t device_id, measured_string_ref * address, char ** data){
514 aid_t message_id;
515 ipcarg_t result;
516 int string;
517
518 if(!(address && data)){
519 return EBADMEM;
520 }
521
522 // request the address
523 message_id = async_send_1(phone, (ipcarg_t) message, (ipcarg_t) device_id, NULL);
524 string = measured_strings_return(phone, address, data, 1);
525 async_wait_for(message_id, &result);
526
527 // if not successful
528 if((string == EOK) && (result != EOK)){
529 // clear the data
530 free(*address);
531 free(*data);
532 }
533 return (int) result;
534}
535
536/** Return the device packet dimension for sending.
537 *
538 * @param[in] phone The service module phone.
539 * @param[in] message The service specific message.
540 * @param[in] device_id The device identifier.
541 * @param[out] packet_dimension The packet dimension.
542 *
543 * @return EOK on success.
544 * @return EBADMEM if the packet_dimension parameter is NULL.
545 * @return Other error codes as defined for the specific service message.
546 *
547 */
548static inline int generic_packet_size_req_remote(int phone, int message,
549 device_id_t device_id, packet_dimension_ref packet_dimension)
550{
551 if (!packet_dimension)
552 return EBADMEM;
553
554 ipcarg_t addr_len;
555 ipcarg_t prefix;
556 ipcarg_t content;
557 ipcarg_t suffix;
558
559 ipcarg_t result = async_req_1_4(phone, (ipcarg_t) message,
560 (ipcarg_t) device_id, &addr_len, &prefix, &content, &suffix);
561
562 packet_dimension->prefix = (size_t) prefix;
563 packet_dimension->content = (size_t) content;
564 packet_dimension->suffix = (size_t) suffix;
565 packet_dimension->addr_len = (size_t) addr_len;
566
567 return (int) result;
568}
569
570/** Pass the packet queue to the module.
571 *
572 * @param[in] phone The service module phone.
573 * @param[in] message The service specific message.
574 * @param[in] device_id The device identifier.
575 * @param[in] packet_id The received packet or the received packet queue
576 * identifier.
577 * @param[in] target The target module service.
578 * @param[in] error The error module service.
579 *
580 * @return EOK on success.
581 *
582 */
583static inline int generic_received_msg_remote(int phone, int message,
584 device_id_t device_id, packet_id_t packet_id, services_t target,
585 services_t error)
586{
587 if (error)
588 async_msg_4(phone, (ipcarg_t) message, (ipcarg_t) device_id,
589 (ipcarg_t) packet_id, (ipcarg_t) target, (ipcarg_t) error);
590 else
591 async_msg_3(phone, (ipcarg_t) message, (ipcarg_t) device_id,
592 (ipcarg_t) packet_id, (ipcarg_t) target);
593
594 return EOK;
595}
596
597/** Send the packet queue.
598 *
599 * @param[in] phone The service module phone.
600 * @param[in] message The service specific message.
601 * @param[in] device_id The device identifier.
602 * @param[in] packet_id The packet or the packet queue identifier.
603 * @param[in] sender The sending module service.
604 * @param[in] error The error module service.
605 *
606 * @return EOK on success.
607 *
608 */
609static inline int generic_send_msg_remote(int phone, int message,
610 device_id_t device_id, packet_id_t packet_id, services_t sender,
611 services_t error)
612{
613 if (error)
614 async_msg_4(phone, (ipcarg_t) message, (ipcarg_t) device_id,
615 (ipcarg_t) packet_id, (ipcarg_t) sender, (ipcarg_t) error);
616 else
617 async_msg_3(phone, (ipcarg_t) message, (ipcarg_t) device_id,
618 (ipcarg_t) packet_id, (ipcarg_t) sender);
619
620 return EOK;
621}
622
623/** Translates the given strings.
624 * Allocates and returns the needed memory block as the data parameter.
625 * @param[in] phone The service module phone.
626 * @param[in] message The service specific message.
627 * @param[in] device_id The device identifier.
628 * @param[in] service The module service.
629 * @param[in] configuration The key strings.
630 * @param[in] count The number of configuration keys.
631 * @param[out] translation The translated values.
632 * @param[out] data The translation data container.
633 * @returns EOK on success.
634 * @returns EINVAL if the configuration parameter is NULL.
635 * @returns EINVAL if the count parameter is zero (0).
636 * @returns EBADMEM if the translation or the data parameters are NULL.
637 * @returns Other error codes as defined for the specific service message.
638 */
639static 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){
640 aid_t message_id;
641 ipcarg_t result;
642 int string;
643
644 if(!(configuration && (count > 0))){
645 return EINVAL;
646 }
647 if(!(translation && data)){
648 return EBADMEM;
649 }
650
651 // request the translation
652 message_id = async_send_3(phone, (ipcarg_t) message, (ipcarg_t) device_id, (ipcarg_t) count, (ipcarg_t) service, NULL);
653 measured_strings_send(phone, configuration, count);
654 string = measured_strings_return(phone, translation, data, count);
655 async_wait_for(message_id, &result);
656
657 // if not successful
658 if((string == EOK) && (result != EOK)){
659 // clear the data
660 free(*translation);
661 free(*data);
662 }
663
664 return (int) result;
665}
666
667#endif
668
669/** @}
670 */
Note: See TracBrowser for help on using the repository browser.