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
RevLine 
[21580dd]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
[a64c64d]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.
[21580dd]54 */
[a64c64d]55#define IS_IN_INTERVAL(item, first_inclusive, last_exclusive) (((item) >= (first_inclusive)) && ((item) < (last_exclusive)))
[21580dd]56
[a64c64d]57/** @name Networking message counts
[21580dd]58 */
[a64c64d]59/*@{*/
[21580dd]60
[a64c64d]61/** The number of ARP messages.
[21580dd]62 */
[a64c64d]63#define NET_ARP_COUNT 5
[21580dd]64
65/** The number of Ethernet messages.
66 */
67#define NET_ETH_COUNT 0
68
[a64c64d]69/** The number of ICMP messages.
70 */
71#define NET_ICMP_COUNT 6
72
[21580dd]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
[a64c64d]81/** The number of general networking messages.
[21580dd]82 */
[a64c64d]83#define NET_NET_COUNT 3
[21580dd]84
[a64c64d]85/** The number of network interface driver messages.
[21580dd]86 */
[a64c64d]87#define NET_NETIF_COUNT 6
[21580dd]88
[a64c64d]89/** The number of network interface layer messages.
[21580dd]90 */
[a64c64d]91#define NET_NIL_COUNT 7
[21580dd]92
[a64c64d]93/** The number of packet management system messages.
[21580dd]94 */
[a64c64d]95#define NET_PACKET_COUNT 5
96
97/** The number of socket messages.
98 */
99#define NET_SOCKET_COUNT 14
[21580dd]100
101/** The number of TCP messages.
102 */
103#define NET_TCP_COUNT 0
104
[a64c64d]105/** The number of transport layer messages.
[21580dd]106 */
[a64c64d]107#define NET_TL_COUNT 1
[21580dd]108
[a64c64d]109/** The number of UDP messages.
[21580dd]110 */
[a64c64d]111#define NET_UDP_COUNT 0
[21580dd]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 */
[aadf01e]129#define NET_NETIF_LAST (NET_NETIF_FIRST + NET_NETIF_COUNT)
[21580dd]130
131/** The first general networking message.
132 */
[aadf01e]133#define NET_NET_FIRST (NET_NETIF_LAST + 0)
[21580dd]134
135/** The last general networking message.
136 */
[aadf01e]137#define NET_NET_LAST (NET_NET_FIRST + NET_NET_COUNT)
[21580dd]138
139/** The first network interface layer message.
140 */
[aadf01e]141#define NET_NIL_FIRST (NET_NET_LAST + 0)
[21580dd]142
143/** The last network interface layer message.
144 */
[aadf01e]145#define NET_NIL_LAST (NET_NIL_FIRST + NET_NIL_COUNT)
[21580dd]146
147/** The first Ethernet message.
148 */
[aadf01e]149#define NET_ETH_FIRST (NET_NIL_LAST + 0)
[21580dd]150
151/** The last Ethernet message.
152 */
[aadf01e]153#define NET_ETH_LAST (NET_ETH_FIRST + NET_ETH_COUNT)
[21580dd]154
155/** The first inter-network message.
156 */
[aadf01e]157#define NET_IL_FIRST (NET_ETH_LAST + 0)
[21580dd]158
159/** The last inter-network message.
160 */
[aadf01e]161#define NET_IL_LAST (NET_IL_FIRST + NET_IL_COUNT)
[21580dd]162
163/** The first IP message.
164 */
[aadf01e]165#define NET_IP_FIRST (NET_IL_LAST + 0)
[21580dd]166
167/** The last IP message.
168 */
[aadf01e]169#define NET_IP_LAST (NET_IP_FIRST + NET_IP_COUNT)
[21580dd]170
171/** The first ARP message.
172 */
[aadf01e]173#define NET_ARP_FIRST (NET_IP_LAST + 0)
[21580dd]174
175/** The last ARP message.
176 */
[aadf01e]177#define NET_ARP_LAST (NET_ARP_FIRST + NET_ARP_COUNT)
[21580dd]178
179/** The first ICMP message.
180 */
[aadf01e]181#define NET_ICMP_FIRST (NET_ARP_LAST + 0)
[21580dd]182
183/** The last ICMP message.
184 */
[aadf01e]185#define NET_ICMP_LAST (NET_ICMP_FIRST + NET_ICMP_COUNT)
[21580dd]186
187/** The first ICMP message.
188 */
[aadf01e]189#define NET_TL_FIRST (NET_ICMP_LAST + 0)
[21580dd]190
191/** The last ICMP message.
192 */
[aadf01e]193#define NET_TL_LAST (NET_TL_FIRST + NET_TL_COUNT)
[21580dd]194
195/** The first UDP message.
196 */
[aadf01e]197#define NET_UDP_FIRST (NET_TL_LAST + 0)
[21580dd]198
199/** The last UDP message.
200 */
[aadf01e]201#define NET_UDP_LAST (NET_UDP_FIRST + NET_UDP_COUNT)
[21580dd]202
203/** The first TCP message.
204 */
[aadf01e]205#define NET_TCP_FIRST (NET_UDP_LAST + 0)
[21580dd]206
207/** The last TCP message.
208 */
[aadf01e]209#define NET_TCP_LAST (NET_TCP_FIRST + NET_TCP_COUNT)
[21580dd]210
211/** The first socket message.
212 */
[aadf01e]213#define NET_SOCKET_FIRST (NET_TCP_LAST + 0)
[21580dd]214
215/** The last socket message.
216 */
[aadf01e]217#define NET_SOCKET_LAST (NET_SOCKET_FIRST + NET_SOCKET_COUNT)
[21580dd]218
219/** The first packet management system message.
220 */
[aadf01e]221#define NET_PACKET_FIRST (NET_SOCKET_LAST + 0)
[21580dd]222
223/** The last packet management system message.
224 */
[aadf01e]225#define NET_PACKET_LAST (NET_PACKET_FIRST + NET_PACKET_COUNT)
[21580dd]226
227/** The last networking message.
228 */
229#define NET_LAST NET_PACKET_LAST
230
231/** The number of networking messages.
232 */
[aadf01e]233#define NET_COUNT (NET_LAST - NET_FIRST)
[21580dd]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 */
[aadf01e]238#define IS_NET_MESSAGE(call) IS_IN_INTERVAL(IPC_GET_METHOD(*call), NET_FIRST, NET_LAST)
[21580dd]239
[a64c64d]240/** Returns a value indicating whether the IPC call is an ARP message.
[21580dd]241 * @param[in] call The IPC call to be checked.
242 */
[a64c64d]243#define IS_NET_ARP_MESSAGE(call) IS_IN_INTERVAL(IPC_GET_METHOD(*call), NET_ARP_FIRST, NET_ARP_LAST)
[21580dd]244
[a64c64d]245/** Returns a value indicating whether the IPC call is an Ethernet message.
[21580dd]246 * @param[in] call The IPC call to be checked.
247 */
[a64c64d]248#define IS_NET_ETH_MESSAGE(call) IS_IN_INTERVAL(IPC_GET_METHOD(*call), NET_ETH_FIRST, NET_ETH_LAST)
[21580dd]249
[a64c64d]250/** Returns a value indicating whether the IPC call is an ICMP message.
[21580dd]251 * @param[in] call The IPC call to be checked.
252 */
[a64c64d]253#define IS_NET_ICMP_MESSAGE(call) IS_IN_INTERVAL(IPC_GET_METHOD(*call), NET_ICMP_FIRST, NET_ICMP_LAST)
[21580dd]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 */
[aadf01e]258#define IS_NET_IL_MESSAGE(call) IS_IN_INTERVAL(IPC_GET_METHOD(*call), NET_IL_FIRST, NET_IL_LAST)
[21580dd]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 */
[aadf01e]263#define IS_NET_IP_MESSAGE(call) IS_IN_INTERVAL(IPC_GET_METHOD(*call), NET_IP_FIRST, NET_IP_LAST)
[21580dd]264
[a64c64d]265/** Returns a value indicating whether the IPC call is a generic networking message.
[21580dd]266 * @param[in] call The IPC call to be checked.
267 */
[a64c64d]268#define IS_NET_NET_MESSAGE(call) IS_IN_INTERVAL(IPC_GET_METHOD(*call), NET_NET_FIRST, NET_NET_LAST)
[21580dd]269
[a64c64d]270/** Returns a value indicating whether the IPC call is a network interface layer message.
[21580dd]271 * @param[in] call The IPC call to be checked.
272 */
[a64c64d]273#define IS_NET_NIL_MESSAGE(call) IS_IN_INTERVAL(IPC_GET_METHOD(*call), NET_NIL_FIRST, NET_NIL_LAST)
[21580dd]274
[a64c64d]275/** Returns a value indicating whether the IPC call is a packet manaagement system message.
[21580dd]276 * @param[in] call The IPC call to be checked.
277 */
[a64c64d]278#define IS_NET_PACKET_MESSAGE(call) IS_IN_INTERVAL(IPC_GET_METHOD(*call), NET_PACKET_FIRST, NET_PACKET_LAST)
[21580dd]279
[a64c64d]280/** Returns a value indicating whether the IPC call is a socket message.
[21580dd]281 * @param[in] call The IPC call to be checked.
282 */
[a64c64d]283#define IS_NET_SOCKET_MESSAGE(call) IS_IN_INTERVAL(IPC_GET_METHOD(*call), NET_SOCKET_FIRST, NET_SOCKET_LAST)
[21580dd]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 */
[aadf01e]288#define IS_NET_TCP_MESSAGE(call) IS_IN_INTERVAL(IPC_GET_METHOD(*call), NET_TCP_FIRST, NET_TCP_LAST)
[21580dd]289
[a64c64d]290/** Returns a value indicating whether the IPC call is a transport layer message.
[21580dd]291 * @param[in] call The IPC call to be checked.
292 */
[a64c64d]293#define IS_NET_TL_MESSAGE(call) IS_IN_INTERVAL(IPC_GET_METHOD(*call), NET_TL_FIRST, NET_TL_LAST)
[21580dd]294
[a64c64d]295/** Returns a value indicating whether the IPC call is a UDP message.
[21580dd]296 * @param[in] call The IPC call to be checked.
297 */
[a64c64d]298#define IS_NET_UDP_MESSAGE(call) IS_IN_INTERVAL(IPC_GET_METHOD(*call), NET_UDP_FIRST, NET_UDP_LAST)
[21580dd]299
300/*@}*/
301
[a64c64d]302/** @name Networking specific message arguments definitions
[21580dd]303 */
304/*@{*/
305
[a64c64d]306/** @name First arguments
307 */
308/*@{*/
309
310/** Returns the device identifier message argument.
[21580dd]311 * @param[in] call The message call structure.
312 */
[aadf01e]313#define IPC_GET_DEVICE(call) (device_id_t) IPC_GET_ARG1(*call)
[21580dd]314
[a64c64d]315/*@}*/
316
317/** @name Second arguments
318 */
319/*@{*/
320
321/** Returns the packet identifier message argument.
[21580dd]322 * @param[in] call The message call structure.
323 */
[aadf01e]324#define IPC_GET_PACKET(call) (packet_id_t) IPC_GET_ARG2(*call)
[21580dd]325
[a64c64d]326/** Returns the count message argument.
[21580dd]327 * @param[in] call The message call structure.
328 */
[aadf01e]329#define IPC_GET_COUNT(call) (size_t) IPC_GET_ARG2(*call)
[21580dd]330
[a64c64d]331/** Returns the device state message argument.
[21580dd]332 * @param[in] call The message call structure.
333 */
[aadf01e]334#define IPC_GET_STATE(call) (device_state_t) IPC_GET_ARG2(*call)
[21580dd]335
[a64c64d]336/** Returns the maximum transmission unit message argument.
[21580dd]337 * @param[in] call The message call structure.
338 */
[aadf01e]339#define IPC_GET_MTU(call) (size_t) IPC_GET_ARG2(*call)
[21580dd]340
[a64c64d]341/*@}*/
342
343/** @name Third arguments
344 */
345/*@{*/
346
347/** Returns the device driver service message argument.
[21580dd]348 * @param[in] call The message call structure.
349 */
[aadf01e]350#define IPC_GET_SERVICE(call) (services_t) IPC_GET_ARG3(*call)
[21580dd]351
[a64c64d]352/** Returns the target service message argument.
[21580dd]353 * @param[in] call The message call structure.
354 */
[aadf01e]355#define IPC_GET_TARGET(call) (services_t) IPC_GET_ARG3(*call)
[21580dd]356
[a64c64d]357/** Returns the sender service message argument.
[21580dd]358 * @param[in] call The message call structure.
359 */
[aadf01e]360#define IPC_GET_SENDER(call) (services_t) IPC_GET_ARG3(*call)
[21580dd]361
[a64c64d]362/*@}*/
363
364/** @name Fourth arguments
365 */
366/*@{*/
367
368/** Returns the error service message argument.
[21580dd]369 * @param[in] call The message call structure.
370 */
[aadf01e]371#define IPC_GET_ERROR(call) (services_t) IPC_GET_ARG4(*call)
[21580dd]372
[a64c64d]373/*@}*/
374
375/** @name Fifth arguments
376 */
377/*@{*/
378
379/** Returns the phone message argument.
[21580dd]380 * @param[in] call The message call structure.
381 */
[aadf01e]382#define IPC_GET_PHONE(call) (int) IPC_GET_ARG5(*call)
[21580dd]383
[a64c64d]384/*@}*/
385
386/** @name First answers
387 */
388/*@{*/
389
[21580dd]390/** Sets the device identifier in the message answer.
391 * @param[out] answer The message answer structure.
392 */
[aadf01e]393#define IPC_SET_DEVICE(answer) ((device_id_t *) &IPC_GET_ARG1(*answer))
[21580dd]394
395/** Sets the minimum address length in the message answer.
396 * @param[out] answer The message answer structure.
397 */
[aadf01e]398#define IPC_SET_ADDR(answer) ((size_t *) &IPC_GET_ARG1(*answer))
[21580dd]399
[a64c64d]400/*@}*/
401
402/** @name Second answers
403 */
404/*@{*/
405
[21580dd]406/** Sets the minimum prefix size in the message answer.
407 * @param[out] answer The message answer structure.
408 */
[aadf01e]409#define IPC_SET_PREFIX(answer) ((size_t *) &IPC_GET_ARG2(*answer))
[21580dd]410
[a64c64d]411/*@}*/
412
413/** @name Third answers
414 */
415/*@{*/
416
[21580dd]417/** Sets the maximum content size in the message answer.
418 * @param[out] answer The message answer structure.
419 */
[aadf01e]420#define IPC_SET_CONTENT(answer) ((size_t *) &IPC_GET_ARG3(*answer))
[21580dd]421
[a64c64d]422/*@}*/
423
424/** @name Fourth answers
425 */
426/*@{*/
427
[21580dd]428/** Sets the minimum suffix size in the message answer.
429 * @param[out] answer The message answer structure.
430 */
[aadf01e]431#define IPC_SET_SUFFIX(answer) ((size_t *) &IPC_GET_ARG4(*answer))
[21580dd]432
433/*@}*/
434
[a64c64d]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
[21580dd]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 */
[aadf01e]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 }
[a64c64d]481
482 // request the address
[aadf01e]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
[a64c64d]487 // if not successful
[aadf01e]488 if((string == EOK) && (result != EOK)){
[a64c64d]489 // clear the data
490 free(*address);
[aadf01e]491 free(*data);
492 }
493 return (int) result;
[21580dd]494}
495
[91478aa]496/** Returns the device packet dimension for sending.
[21580dd]497 * @param[in] phone The service module phone.
498 * @param[in] message The service specific message.
499 * @param[in] device_id The device identifier.
[91478aa]500 * @param[out] packet_dimension The packet dimension.
[21580dd]501 * @returns EOK on success.
[91478aa]502 * @returns EBADMEM if the packet_dimension parameter is NULL.
[21580dd]503 * @returns Other error codes as defined for the specific service message.
504 */
[aadf01e]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;
[21580dd]521}
522
[a64c64d]523/** Passes the packet queue to the module.
[21580dd]524 * @param[in] phone The service module phone.
525 * @param[in] message The service specific message.
526 * @param[in] device_id The device identifier.
[a64c64d]527 * @param[in] packet_id The received packet or the received packet queue identifier.
[21580dd]528 * @param[in] target The target module service.
[a64c64d]529 * @param[in] error The error module service.
[21580dd]530 * @returns EOK on success.
531 */
[a64c64d]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 }
[21580dd]538 return EOK;
539}
540
[a64c64d]541/** Sends the packet queue.
[21580dd]542 * @param[in] phone The service module phone.
543 * @param[in] message The service specific message.
544 * @param[in] device_id The device identifier.
[a64c64d]545 * @param[in] packet_id The packet or the packet queue identifier.
546 * @param[in] sender The sending module service.
[21580dd]547 * @param[in] error The error module service.
548 * @returns EOK on success.
549 */
[a64c64d]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){
[aadf01e]551 if(error){
[a64c64d]552 async_msg_4(phone, (ipcarg_t) message, (ipcarg_t) device_id, (ipcarg_t) packet_id, (ipcarg_t) sender, (ipcarg_t) error);
[21580dd]553 }else{
[a64c64d]554 async_msg_3(phone, (ipcarg_t) message, (ipcarg_t) device_id, (ipcarg_t) packet_id, (ipcarg_t) sender);
[21580dd]555 }
556 return EOK;
557}
558
[a64c64d]559/** Translates the given strings.
560 * Allocates and returns the needed memory block as the data parameter.
[21580dd]561 * @param[in] phone The service module phone.
562 * @param[in] message The service specific message.
563 * @param[in] device_id The device identifier.
[a64c64d]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.
[21580dd]569 * @returns EOK on success.
[a64c64d]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.
[21580dd]573 * @returns Other error codes as defined for the specific service message.
574 */
[a64c64d]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;
[21580dd]601}
602
603#endif
604
605/** @}
606 */
Note: See TracBrowser for help on using the repository browser.