base/include/rtai_netrpc.h

Go to the documentation of this file.
00001 /*
00002  * Copyright (C) 1999-2008 Paolo Mantegazza <mantegazza@aero.polimi.it>
00003  *
00004  * This program is free software; you can redistribute it and/or
00005  * modify it under the terms of the GNU General Public License as
00006  * published by the Free Software Foundation; either version 2 of the
00007  * License, or (at your option) any later version.
00008  *
00009  * This program is distributed in the hope that it will be useful,
00010  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012  * GNU General Public License for more details.
00013  *
00014  * You should have received a copy of the GNU General Public License
00015  * along with this program; if not, write to the Free Software
00016  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
00017  */
00018 
00019 #ifndef _RTAI_NETRPC_H
00020 #define _RTAI_NETRPC_H
00021 
00022 #include <rtai_config.h>
00023 
00024 #include <rtai_registry.h>
00025 #include <rtai_lxrt.h>
00026 #include <rtai_sem.h>
00027 #include <rtai_mbx.h>
00028 #include <rtai_msg.h>
00029 
00030 #define MAX_STUBS     20
00031 #define MAX_SOCKS     20
00032 #define MAX_MSG_SIZE  1500
00033 
00034 #define NET_RPC_EXT  0
00035 
00036 #define NETRPC_BASEPORT  5000
00037 
00038 #define PORT_SHF  1
00039 #define PORT_INC  1
00040 #define PORT_MSK  ((1 << PORT_SHF) - 1)
00041 
00042 #define MACH_SIZE(port)  (((port) & PORT_MSK) ? 64 : 32)
00043 
00044 /* "for writes" - "for reads" below must be the same as those in rtai_lxrt.h */
00045 // for writes
00046 #define UW1(bf, sz)  ((((bf) & 0x7) << 19) | (((sz) & 0x7) << 22))
00047 #define UW2(bf, sz)  ((((bf) & 0x7) << 25) | (((sz) & 0x7) << 28))
00048 
00049 // for reads
00050 #define UR1(bf, sz)  ((((bf) & 0x7) << 3) | (((sz) & 0x7) <<  6))
00051 #define UR2(bf, sz)  ((((bf) & 0x7) << 9) | (((sz) & 0x7) << 12))
00052 
00053 #define SIZARG sizeof(arg)
00054 
00055 #define PACKPORT(port, ext, fun, timed) (((port) << 18) | ((timed) << 13) | ((ext) << 8) | (fun))
00056 
00057 #define PORT(i)   ((i) >> 18)
00058 #define FUN(i)    ((i) & 0xFF)
00059 #define EXT(i)    (((i) >> 8) & 0x1F)
00060 #define TIMED(i)  (((i) >> 13) & 0x1F)
00061 
00062 /* 
00063  * SYNC_NET_RPC is hard wired here, no need to have it elsewhere. It must 
00064  * have all the bits allowed to the "fun" field, in PACKPORT above, set.
00065  */
00066 #define SYNC_NET_RPC  0xFF  // hard wired here, no need to have it elsewhere
00067 
00068 #define PRT_REQ  1
00069 #define PRT_SRV  2
00070 #define PRT_RTR  3
00071 #define PRT_RCV  4
00072 #define RPC_REQ  5
00073 #define RPC_SRV  6
00074 #define RPC_RTR  7
00075 #define RPC_RCV  8
00076 
00077 #define ADR_CNV_MSK  (0xFFFFFFFCUL)
00078 
00079 #define OWNER(node, task) \
00080     ( (((unsigned long long)(node)) << 32)   | \
00081       (((unsigned long)(task)) & ADR_CNV_MSK) )
00082     
00083 #define TSK_FRM_WNR(i)  ((i) & 0xFFFFFFFF);
00084 
00085 #define WDW     3
00086 #define WDWMSK  ((1 << WDW) - 1)
00087 
00088 #define  SINT  1
00089 #define  UINT  2
00090 #define  VADR  3
00091 #define  RTIM  4
00092 
00093 #define PARTYPES1(a)  (a)
00094 #define PARTYPES2(a, b)  (((b) << WDW) | (a))
00095 #define PARTYPES3(a, b, c)  (((c) << 2*WDW) | ((b) << WDW) | (a))
00096 #define PARTYPES4(a, b, c, d)  (((d) << 3*WDW) | ((c) << 2*WDW) | ((b) << WDW) | (a))
00097 #define PARTYPES5(a, b, c, d, e)  (((e) << 4*WDW) | ((d) << 3*WDW) | ((c) << 2*WDW) | ((b) << WDW) | (a))
00098 #define PARTYPES6(a, b, c, d, e, f)  (((f) << 5*WDW) | ((e) << 4*WDW) | ((d) << 3*WDW) | ((c) << 2*WDW) | ((b) << WDW) | (a))
00099 #define PARTYPES7(a, b, c, d, e, f, g)  (((g) << 6*WDW) | ((f) << 5*WDW) | ((e) << 4*WDW) | ((d) << 3*WDW) | ((c) << 2*WDW) | ((b) << WDW) | (a))
00100 #define PARTYPES8(a, b, c, d, e, f, g, h)  (((h) << 7*WDW) | ((g) << 6*WDW) | ((f) << 5*WDW) | ((e) << 4*WDW) | ((d) << 3*WDW) | ((c) << 2*WDW) | ((b) << WDW) | (a))
00101 #define PARTYPES9(a, b, c, d, e, f, g, h, i)  (((i) << 8*WDW) | ((h) << 7*WDW) | ((g) << 6*WDW) | ((f) << 5*WDW) | ((e) << 4*WDW) | ((d) << 3*WDW) | ((c) << 2*WDW) | ((b) << WDW) | (a))
00102 
00103 // must be as Linux puts them, always the same likely
00104 #ifndef KERNEL_64_ADDRESS_OFFSET
00105 #define KERNEL_64_ADDRESS_OFFSET
00106 static unsigned long long kadr_ofst[] = 
00107     {0xFFFFC20000000000ULL, 0xFFFF810000000000ULL, 0xFFFFFFFF80000000ULL };
00108 static inline unsigned long reset_kadr(unsigned long val)
00109 {
00110     return (val & ADR_CNV_MSK) | kadr_ofst[val & 0x3];
00111 }
00112 #endif
00113 
00114 static inline void *RTAI_LXRT(int port, union rtai_lxrt_t retval)
00115 {
00116     if (sizeof(long) == 4 && (abs(port) & PORT_MSK)) {
00117         int i;
00118         for (i = 0; i < 3; i++) {
00119             if ((retval.rt & 0xFF0000000000ULL) == (kadr_ofst[i] & 0xFF0000000000ULL)) {
00120                 retval.rt |= i;
00121                 return retval.v[LOW];
00122             }
00123         }
00124         return (void *)RTE_OBJINV;
00125     }
00126     return retval.v[LOW];
00127 }
00128 
00129 #define RT_NET_RPC(port, retval)  RTAI_LXRT(port, (union rtai_lxrt_t)retval)
00130 
00131 #define RT_NET_ADR(port, adr) \
00132      RTAI_LXRT(port, (union rtai_lxrt_t)((long long)(adr)))
00133 
00134 #ifdef __KERNEL__
00135 
00136 #include <rtai_sched.h>
00137 
00138 #ifdef __cplusplus
00139 extern "C" {
00140 #endif /* __cplusplus */
00141 
00142 int __rtai_netrpc_init(void);
00143 
00144 void __rtai_netrpc_exit(void);
00145 
00146 RTAI_SYSCALL_MODE long long _rt_net_rpc(long fun_ext_timed,
00147                     long type,
00148                     void *args,
00149                     int argsize,
00150                     int space, 
00151                     unsigned long partypes);
00152 
00153 #define rt_net_rpc(fun_ext_timed, type, args, argsize, space, partypes) \
00154     ({ union rtai_lxrt_t retval; retval.rt = _rt_net_rpc(fun_ext_timed, type, args, argsize, space, partypes); retval; })
00155 
00156 
00157 RTAI_SYSCALL_MODE int rt_set_netrpc_timeout( int port, RTIME timeout);
00158 
00159 RTAI_SYSCALL_MODE int rt_send_req_rel_port(unsigned long node, 
00160                        int port,
00161                        unsigned long id,
00162                        MBX *mbx,
00163                        int hard);
00164 
00165 RTAI_SYSCALL_MODE unsigned long ddn2nl(const char *ddn);
00166 
00167 RTAI_SYSCALL_MODE unsigned long rt_set_this_node(const char *ddn,
00168                          unsigned long node,
00169                          int hard);
00170 
00171 RTAI_SYSCALL_MODE RT_TASK *rt_find_asgn_stub(unsigned long long owner,
00172                          int asgn);
00173 
00174 RTAI_SYSCALL_MODE int rt_rel_stub(unsigned long long owner);
00175 
00176 RTAI_SYSCALL_MODE int rt_waiting_return(unsigned long node,
00177                     int port);
00178 
00179 int rt_get_net_rpc_ret(MBX *mbx,
00180                unsigned long long *retval,
00181                void *msg1,
00182                int *msglen1,
00183                void *msg2,
00184                int *msglen2,
00185                RTIME timeout,
00186                int type);
00187 
00188 static inline int rt_sync_net_rpc(unsigned long node, int port)
00189 {
00190     if (node) {
00191         struct { long dummy; } arg = { 0 };
00192         return rt_net_rpc(PACKPORT(abs(port), NET_RPC_EXT, SYNC_NET_RPC, 0), 0, &arg, SIZARG, 1, PARTYPES1(UINT)).i[LOW];
00193     }
00194     return 1;
00195 } 
00196 
00197 static inline void *RT_get_adr(unsigned long node, int port, const char *sname)
00198 {
00199     if (node) {
00200         struct { unsigned long name; } arg = { nam2num(sname) };
00201         return RT_NET_RPC(port, rt_net_rpc(PACKPORT(port, NET_RPC_EXT, GET_ADR, 0), 0, &arg, SIZARG, 1, PARTYPES1(UINT)));
00202     }
00203     return rt_get_adr(nam2num(sname));
00204 } 
00205 
00206 static inline RTIME RT_get_time_ns(unsigned long node, int port)
00207 {
00208     if (node) {
00209         struct { long dummy; } arg = { 0 };
00210         return rt_net_rpc(PACKPORT(port, NET_RPC_EXT, GET_TIME_NS, 0), 0, &arg, SIZARG, 1, PARTYPES1(UINT)).rt;
00211     }
00212     return rt_get_time_ns();
00213 }
00214 
00215 static inline RTIME RT_get_time_ns_cpuid(unsigned long node, int port, int cpuid)
00216 {
00217     if (node) {
00218         struct { long cpuid; } arg = { cpuid };
00219         return rt_net_rpc(PACKPORT(port, NET_RPC_EXT, GET_TIME_NS_CPUID, 0), 0, &arg, SIZARG, 1, PARTYPES1(UINT)).rt;
00220     }
00221     return rt_get_time_ns_cpuid(cpuid);
00222 }
00223 
00224 static inline RTIME RT_get_cpu_time_ns(unsigned long node, int port)
00225 {
00226     if (node) {
00227         struct { long dummy; } arg = { 0 };
00228         return rt_net_rpc(PACKPORT(port, NET_RPC_EXT, GET_CPU_TIME_NS, 0), 0, &arg, SIZARG, 1, PARTYPES1(UINT)).rt;
00229     }
00230     return rt_get_cpu_time_ns();
00231 }
00232 
00233 static inline int RT_task_suspend(unsigned long node, int port, RT_TASK *task)
00234 {
00235     if (node) {
00236         struct { RT_TASK *task; } arg = { task };
00237         return rt_net_rpc(PACKPORT(port, NET_RPC_EXT, SUSPEND, 0), 0, &arg, SIZARG, 1, PARTYPES1(VADR)).i[LOW];
00238     }
00239     return rt_task_suspend(task);
00240 }
00241 
00242 static inline int RT_task_resume(unsigned long node, int port, RT_TASK *task)
00243 {
00244     if (node) {
00245         struct { RT_TASK *task; } arg = { task };
00246         return rt_net_rpc(PACKPORT(port, NET_RPC_EXT, RESUME, 0), 0, &arg, SIZARG, 1, PARTYPES1(VADR)).i[LOW];
00247     }
00248     return rt_task_resume(task);
00249 }
00250 
00251 static inline void RT_sleep(unsigned long node, int port, RTIME delay)
00252 {
00253     if (node) {
00254         struct { RTIME delay; } arg = { delay };
00255         rt_net_rpc(PACKPORT(port, NET_RPC_EXT, SLEEP, 1), 0, &arg, SIZARG, 1, PARTYPES1(RTIM));
00256         return;
00257     }
00258     rt_sleep(nano2count(delay));
00259 } 
00260 
00261 static inline void RT_sleep_until(unsigned long node, int port, RTIME time)
00262 {
00263     if (node) {
00264         struct { RTIME time; } arg = { time };
00265         rt_net_rpc(PACKPORT(port, NET_RPC_EXT, SLEEP_UNTIL, 1), 0, &arg, SIZARG, 1, PARTYPES1(RTIM));
00266         return;
00267     }
00268     rt_sleep_until(nano2count(time));
00269 } 
00270 
00271 #if CONFIG_RTAI_SEM
00272 
00273 static inline SEM *RT_typed_named_sem_init(unsigned long node, int port, const char *sem_name, int value, int type)
00274 {
00275     if (node) {
00276         struct { unsigned long sem_name; long value; long type; unsigned long *handle; } arg = { nam2num(sem_name), value, type, NULL };
00277         return (SEM *)RT_NET_RPC(port, rt_net_rpc(PACKPORT(port, NET_RPC_EXT, NAMED_SEM_INIT, 0), 0, &arg, SIZARG, 1, PARTYPES3(VADR, SINT, SINT)));
00278     }
00279     return rt_typed_named_sem_init(sem_name, value, type);
00280 }
00281 
00282 static inline int RT_named_sem_delete(unsigned long node, int port, SEM *sem)
00283 {
00284     if (node) {
00285         struct { SEM *sem; } arg = { sem };
00286         return rt_net_rpc(PACKPORT(port, NET_RPC_EXT, NAMED_SEM_DELETE, 0), 0, &arg, SIZARG, 1, PARTYPES1(VADR)).i[LOW];
00287     }
00288     return rt_named_sem_delete(sem);
00289 }
00290 
00291 static inline int RT_sem_signal(unsigned long node, int port, SEM *sem)
00292 {
00293     if (node) {
00294         struct { SEM *sem; } arg = { sem };
00295         return rt_net_rpc(PACKPORT(port, NET_RPC_EXT, SEM_SIGNAL, 0), 0, &arg, SIZARG, 1, PARTYPES1(VADR)).i[LOW];
00296     }
00297     return rt_sem_signal(sem);
00298 } 
00299 
00300 static inline int RT_sem_broadcast(unsigned long node, int port, SEM *sem)
00301 {
00302     if (node) {
00303         struct { SEM *sem; } arg = { sem };
00304         return rt_net_rpc(PACKPORT(port, NET_RPC_EXT, SEM_BROADCAST, 0), 0, &arg, SIZARG, 1, PARTYPES1(VADR)).i[LOW];
00305     }
00306     return rt_sem_broadcast(sem);
00307 } 
00308 
00309 static inline int RT_sem_wait(unsigned long node, int port, SEM *sem)
00310 {
00311     if (node) {
00312         struct { SEM *sem; } arg = { sem };
00313         return rt_net_rpc(PACKPORT(port, NET_RPC_EXT, SEM_WAIT, 0), 0, &arg, SIZARG, 1, PARTYPES1(VADR)).i[LOW];
00314     }
00315     return rt_sem_wait(sem);
00316 } 
00317 
00318 static inline int RT_sem_wait_if(unsigned long node, int port, SEM *sem)
00319 {
00320     if (node) {
00321         struct { SEM *sem; } arg = { sem };
00322         return rt_net_rpc(PACKPORT(port, NET_RPC_EXT, SEM_WAIT_IF, 0), 0, &arg, SIZARG, 1, PARTYPES1(VADR)).i[LOW];
00323     }
00324     return rt_sem_wait_if(sem);
00325 } 
00326 
00327 static inline int RT_sem_wait_until(unsigned long node, int port, SEM *sem, RTIME time)
00328 {
00329     if (node) {
00330         struct { SEM *sem; RTIME time; } arg = { sem, time };
00331         return rt_net_rpc(PACKPORT(port, NET_RPC_EXT, SEM_WAIT_UNTIL, 2), 0, &arg, SIZARG, 1, PARTYPES2(VADR, RTIM)).i[LOW];
00332     }
00333     return rt_sem_wait_until(sem, nano2count(time));
00334 } 
00335 
00336 static inline int RT_sem_wait_timed(unsigned long node, int port, SEM *sem, RTIME delay)
00337 {
00338     if (node) {
00339         struct { SEM *sem; RTIME delay; } arg = { sem, delay };
00340         return rt_net_rpc(PACKPORT(port, NET_RPC_EXT, SEM_WAIT_TIMED, 2), 0, &arg, SIZARG, 1, PARTYPES2(VADR, RTIM)).i[LOW];
00341     }
00342     return rt_sem_wait_timed(sem, nano2count(delay));
00343 } 
00344 
00345 #ifdef CONFIG_RTAI_RT_POLL
00346 
00347 static inline int RT_poll_4to8(unsigned long node, int port, struct rt_poll_s *pdsain, unsigned long nr, RTIME timeout)
00348 {
00349     unsigned int i;
00350     int retval;
00351     struct rt_poll_lls { unsigned long long what, forwhat; } pdsa[nr];
00352     struct { void *pdsa1; void *pdsa2; unsigned long pdsa_size; RTIME timeout; } arg = { pdsa, pdsa, nr*sizeof(struct rt_poll_lls), timeout };
00353     for (i = 0; i < nr; i++) {
00354         pdsa[i].what    = (unsigned long)pdsain[i].what;
00355         pdsa[i].forwhat = pdsain[i].forwhat;
00356     }
00357     retval = rt_net_rpc(PACKPORT(port, NET_RPC_EXT, RT_POLL_NETRPC, 4), UR1(1, 3) | UW1(2, 3), &arg, SIZARG, 1, PARTYPES4(UINT, UINT, UINT, RTIM)).i[LOW];
00358     for (i = 0; i < nr; i++) {
00359         pdsain[i].what    = (void *)(unsigned long)pdsa[i].what;
00360         pdsain[i].forwhat = pdsa[i].forwhat;
00361     }
00362     return retval;
00363 } 
00364 
00365 static inline int RT_poll_8to4(unsigned long node, int port, struct rt_poll_s *pdsain, unsigned long nr, RTIME timeout)
00366 {
00367     unsigned int i;
00368     int retval;
00369     struct rt_poll_is { unsigned int what, forwhat; } pdsa[nr];
00370     struct { void *pdsa1; void *pdsa2; unsigned long pdsa_size; RTIME timeout; } arg = { pdsa, pdsa, nr*sizeof(struct rt_poll_is), timeout };
00371     for (i = 0; i < nr; i++) {
00372         pdsa[i].what    = (unsigned int)(unsigned long)pdsain[i].what;
00373         pdsa[i].forwhat = pdsain[i].forwhat;
00374     }
00375     retval = rt_net_rpc(PACKPORT(port, NET_RPC_EXT, RT_POLL_NETRPC, 4), UR1(1, 3) | UW1(2, 3), &arg, SIZARG, 1, PARTYPES4(UINT, UINT, UINT, RTIM)).i[LOW];
00376     for (i = 0; i < nr; i++) {
00377         pdsain[i].what    = (void *)(unsigned long)pdsa[i].what;
00378         pdsain[i].forwhat = pdsa[i].forwhat;
00379     }
00380     return retval;
00381 } 
00382 
00383 static inline int RT_poll(unsigned long node, int port, struct rt_poll_s *pdsa, unsigned long nr, RTIME timeout)
00384 {
00385     if (node) {
00386         if (sizeof(long) == 4 && (abs(port) & PORT_MSK)) {
00387             return RT_poll_4to8(node, port, pdsa, nr, timeout);
00388         } else if (sizeof(long) == 8 && !(abs(port) & PORT_MSK)) {
00389             return RT_poll_8to4(node, port, pdsa, nr, timeout);
00390         } else {
00391             struct { struct rt_poll_s *pdsa1; struct rt_poll_s *pdsa2; unsigned long pdsa_size; RTIME timeout; } arg = { pdsa, pdsa, nr*sizeof(struct rt_poll_s), timeout };
00392             return rt_net_rpc(PACKPORT(port, NET_RPC_EXT, RT_POLL_NETRPC, 4), UR1(1, 3) | UW1(2, 3), &arg, SIZARG, 1, PARTYPES4(UINT, UINT, UINT, RTIM)).i[LOW];
00393         }
00394     }
00395     return rt_poll(pdsa, nr, nano2count(timeout));
00396 } 
00397 
00398 #endif
00399 
00400 #endif /* CONFIG_RTAI_SEM */
00401 
00402 #if CONFIG_RTAI_MSG
00403 
00404 static inline RT_TASK *RT_send(unsigned long node, int port, RT_TASK *task, unsigned long msg)
00405 {
00406     if (node) {
00407         struct { RT_TASK *task; unsigned long msg; } arg = { task, msg };
00408         return (RT_TASK *)RT_NET_RPC(port, rt_net_rpc(PACKPORT(port, NET_RPC_EXT, SENDMSG, 0), 0, &arg, SIZARG, 1, PARTYPES2(VADR, UINT)));
00409     }
00410     return rt_send(task, msg);
00411 }
00412 
00413 static inline RT_TASK *RT_send_if(unsigned long node, int port, RT_TASK *task, unsigned long msg)
00414 {
00415     if (node) {
00416         struct { RT_TASK *task; unsigned long msg; } arg = { task, msg };
00417         return (RT_TASK *)RT_NET_RPC(port, rt_net_rpc(PACKPORT(port, NET_RPC_EXT, SEND_IF, 0), 0, &arg, SIZARG, 1, PARTYPES2(VADR, UINT)));
00418     }
00419     return rt_send_if(task, msg);
00420 }
00421 
00422 static inline RT_TASK *RT_send_until(unsigned long node, int port, RT_TASK *task, unsigned long msg, RTIME time)
00423 {
00424     if (node) {
00425         struct { RT_TASK *task; unsigned long msg; RTIME time; } arg = { task, msg, time };
00426         return (RT_TASK *)RT_NET_RPC(port, rt_net_rpc(PACKPORT(port, NET_RPC_EXT, SEND_UNTIL, 3), 0, &arg, SIZARG, 1, PARTYPES3(VADR, UINT, RTIM)));
00427     }
00428     return rt_send_until(task, msg, nano2count(time));
00429 }
00430 
00431 static inline RT_TASK *RT_send_timed(unsigned long node, int port, RT_TASK *task, unsigned long msg, RTIME delay)
00432 {
00433     if (node) {
00434         struct { RT_TASK *task; unsigned long msg; RTIME delay; } arg = { task, msg, delay };
00435         return (RT_TASK *)RT_NET_RPC(port, rt_net_rpc(PACKPORT(port, NET_RPC_EXT, SEND_TIMED, 3), 0, &arg, SIZARG, 1, PARTYPES3(VADR, UINT, RTIM)));
00436     }
00437     return rt_send_timed(task, msg, nano2count(delay));
00438 }
00439 
00440 static inline RT_TASK *RT_receive(unsigned long node, int port, RT_TASK *task, unsigned long *msg)
00441 {
00442     if (!task || !node) {
00443         return rt_receive(task, msg);
00444     }
00445     return rt_receive(rt_find_asgn_stub(OWNER(node, task), 1), msg) ? task : 0;
00446 }
00447 
00448 static inline RT_TASK *RT_receive_if(unsigned long node, int port, RT_TASK *task, unsigned long *msg)
00449 {
00450     if (!task || !node) {
00451         return rt_receive_if(task, msg);
00452     }
00453     return rt_receive_if(rt_find_asgn_stub(OWNER(node, task), 1), msg) ? task : 0;
00454 }
00455 
00456 static inline RT_TASK *RT_receive_until(unsigned long node, int port, RT_TASK *task, unsigned long *msg, RTIME time)
00457 {
00458     if (!task || !node) {
00459         return rt_receive_until(task, msg, nano2count(time));
00460     }
00461     return rt_receive_until(rt_find_asgn_stub(OWNER(node, task), 1), msg, nano2count(time)) ? task : 0;
00462 }
00463 
00464 static inline RT_TASK *RT_receive_timed(unsigned long node, int port, RT_TASK *task, unsigned long *msg, RTIME delay)
00465 {
00466     if (!task || !node) {
00467         return rt_receive_timed(task, msg, nano2count(delay));
00468     }
00469     return rt_receive_timed(rt_find_asgn_stub(OWNER(node, task), 1), msg, nano2count(delay)) ? task : 0;
00470 }
00471 
00472 static inline RT_TASK *RT_rpc(unsigned long node, int port, RT_TASK *task, unsigned long msg, unsigned long *ret)
00473 {
00474     if (node) {
00475         struct { RT_TASK *task; unsigned long msg; unsigned long *ret; } arg = { task, msg, ret };
00476         return (RT_TASK *)RT_NET_RPC(port, rt_net_rpc(PACKPORT(port, NET_RPC_EXT, RPCMSG, 0), UW1(3, 0), &arg, SIZARG, 1, PARTYPES3(VADR, UINT, UINT)));
00477     }
00478     return rt_rpc(task, msg, ret);
00479 }
00480 
00481 static inline RT_TASK *RT_rpc_if(unsigned long node, int port, RT_TASK *task, unsigned long msg, unsigned long *ret)
00482 {
00483     if (node) {
00484         struct { RT_TASK *task; unsigned long msg; unsigned long *ret; } arg = { task, msg };
00485         return (RT_TASK *)RT_NET_RPC(port, rt_net_rpc(PACKPORT(port, NET_RPC_EXT, RPC_IF, 0), UW1(3, 0), &arg, SIZARG, 1, PARTYPES3(VADR, UINT, UINT)));
00486     }
00487     return rt_rpc_if(task, msg, ret);
00488 }
00489 
00490 static inline RT_TASK *RT_rpc_until(unsigned long node, int port, RT_TASK *task, unsigned long msg, unsigned long *ret, RTIME time)
00491 {
00492     if (node) {
00493         struct { RT_TASK *task; unsigned long msg; unsigned long *ret; RTIME time; } arg = { task, msg, ret, time };
00494         return (RT_TASK *)RT_NET_RPC(port, rt_net_rpc(PACKPORT(port, NET_RPC_EXT, RPC_UNTIL, 4), UW1(3, 0), &arg, SIZARG, 1, PARTYPES4(VADR, UINT, UINT, RTIM)));
00495     }
00496     return rt_rpc_until(task, msg, ret, nano2count(time));
00497 }
00498 
00499 static inline RT_TASK *RT_rpc_timed(unsigned long node, int port, RT_TASK *task, unsigned long msg, unsigned long *ret, RTIME delay)
00500 {
00501     if (node) {
00502         struct { RT_TASK *task; unsigned long msg; unsigned long *ret; RTIME delay; } arg = { task, msg, ret, delay };
00503         return (RT_TASK *)RT_NET_RPC(port, rt_net_rpc(PACKPORT(port, NET_RPC_EXT, RPC_TIMED, 4), UW1(3, 0), &arg, SIZARG, 1, PARTYPES4(VADR, UINT, UINT, RTIM)));
00504     }
00505     return rt_rpc_timed(task, msg, ret, nano2count(delay));
00506 }
00507 
00508 static inline int RT_isrpc(unsigned long node, int port, RT_TASK *task)
00509 {
00510         if (node) {
00511                 struct { RT_TASK *task; } arg = { task };
00512                 return rt_net_rpc(PACKPORT(port, NET_RPC_EXT, ISRPC, 0), 0, &arg, SIZARG, 1, PARTYPES1(VADR)).i[LOW];
00513         }
00514         return rt_isrpc(task);
00515 }
00516 
00517 static inline RT_TASK *RT_return(unsigned long node, int port, RT_TASK *task, unsigned long result)
00518 {
00519     if (!task || !node) {
00520         return rt_return(task, result);
00521         }
00522     return rt_return(rt_find_asgn_stub(OWNER(node, task), 1), result) ? task : 0;
00523 }
00524 
00525 static inline RT_TASK *RT_evdrp(unsigned long node, int port, RT_TASK *task, unsigned long *msg)
00526 {
00527     if (!task || !node) {
00528         return rt_evdrp(task, msg);
00529     }
00530     return rt_evdrp(rt_find_asgn_stub(OWNER(node, task), 1), msg) ? task : 0;
00531 }
00532 
00533 static inline RT_TASK *RT_rpcx(unsigned long node, int port, RT_TASK *task, void *smsg, void *rmsg, int ssize, int rsize)
00534 {
00535     if (node) {
00536         struct { RT_TASK *task; void *smsg; void *rmsg; long ssize; long rsize; } arg = { task, smsg, rmsg, ssize, rsize };
00537         return (RT_TASK *)RT_NET_RPC(port, rt_net_rpc(PACKPORT(port, NET_RPC_EXT, RPCX, 0), UR1(2, 4) | UW1(3, 5), &arg, SIZARG, 1, PARTYPES5(VADR, UINT, UINT, UINT, UINT)));
00538     }
00539     return rt_rpcx(task, smsg, rmsg, ssize, rsize);
00540 }
00541 
00542 static inline RT_TASK *RT_rpcx_if(unsigned long node, int port, RT_TASK *task, void *smsg, void *rmsg, int ssize, int rsize)
00543 {
00544     if (node) {
00545         struct { RT_TASK *task; void *smsg; void *rmsg; long ssize; long rsize; } arg = { task, smsg, rmsg, ssize, rsize };
00546         return (RT_TASK *)RT_NET_RPC(port, rt_net_rpc(PACKPORT(port, NET_RPC_EXT, RPCX_IF, 0), UR1(2, 4) | UW1(3, 5), &arg, SIZARG, 1, PARTYPES5(VADR, UINT, UINT, UINT, UINT)));
00547     }
00548     return rt_rpcx_if(task, smsg, rmsg, ssize, rsize);
00549 }
00550 
00551 static inline RT_TASK *RT_rpcx_until(unsigned long node, int port, RT_TASK *task, void *smsg, void *rmsg, int ssize, int rsize, RTIME time)
00552 {
00553     if (node) {
00554         struct { RT_TASK *task; void *smsg; void *rmsg; long ssize; long rsize; RTIME time; } arg = { task, smsg, rmsg, ssize, rsize, time };
00555         return (RT_TASK *)RT_NET_RPC(port, rt_net_rpc(PACKPORT(port, NET_RPC_EXT, RPCX_UNTIL, 6), UR1(2, 4) | UW1(3, 5), &arg, SIZARG, 1, PARTYPES6(VADR, UINT, UINT, UINT, UINT, RTIM)));
00556     }
00557     return rt_rpcx_until(task, smsg, rmsg, ssize, rsize, nano2count(time));
00558 }
00559 
00560 static inline RT_TASK *RT_rpcx_timed(unsigned long node, int port, RT_TASK *task, void *smsg, void *rmsg, int ssize, int rsize, RTIME delay)
00561 {
00562     if (node) {
00563         struct { RT_TASK *task; void *smsg; void *rmsg; long ssize; long rsize; RTIME delay; } arg = { task, smsg, rmsg, ssize, rsize, delay };
00564         return (RT_TASK *)RT_NET_RPC(port, rt_net_rpc(PACKPORT(port, NET_RPC_EXT, RPCX_TIMED, 6), UR1(2, 4) | UW1(3, 5), &arg, SIZARG, 1, PARTYPES6(VADR, UINT, UINT, UINT, UINT, RTIM)));
00565     }
00566     return rt_rpcx_timed(task, smsg, rmsg, ssize, rsize, nano2count(delay));
00567 }
00568 
00569 static inline RT_TASK *RT_sendx(unsigned long node, int port, RT_TASK *task, void *msg, int size)
00570 {
00571     if (node) {
00572         struct { RT_TASK *task; void *msg; long size; } arg = { task, msg, size };
00573         return (RT_TASK *)RT_NET_RPC(port, rt_net_rpc(PACKPORT(port, NET_RPC_EXT, SENDX, 0), UR1(2, 3), &arg, SIZARG, 1, PARTYPES3(VADR, UINT, UINT)));
00574     }
00575     return rt_sendx(task, msg, size);
00576 }
00577 
00578 static inline RT_TASK *RT_sendx_if(unsigned long node, int port, RT_TASK *task, void *msg, int size)
00579 {
00580     if (node) {
00581         struct { RT_TASK *task; void *msg; long size; } arg = { task, msg, size };
00582         return (RT_TASK *)RT_NET_RPC(port, rt_net_rpc(PACKPORT(port, NET_RPC_EXT, SENDX_IF, 0), UR1(2, 3), &arg, SIZARG, 1, PARTYPES3(VADR, UINT, UINT)));
00583     }
00584     return rt_sendx_if(task, msg, size);
00585 }
00586 
00587 static inline RT_TASK *RT_sendx_until(unsigned long node, int port, RT_TASK *task, void *msg, int size, RTIME time)
00588 {
00589     if (node) {
00590         struct { RT_TASK *task; void *msg; long size; RTIME time; } arg = { task, msg, size, time };
00591         return (RT_TASK *)RT_NET_RPC(port, rt_net_rpc(PACKPORT(port, NET_RPC_EXT, SENDX_UNTIL, 4), UR1(2, 3), &arg, SIZARG, 1, PARTYPES4(VADR, UINT, UINT, RTIM)));
00592     }
00593     return rt_sendx_until(task, msg, size, nano2count(time));
00594 }
00595 
00596 static inline RT_TASK *RT_sendx_timed(unsigned long node, int port, RT_TASK *task, void *msg, int size, RTIME delay)
00597 {
00598     if (node) {
00599         struct { RT_TASK *task; void *msg; long size; RTIME delay; } arg = { task, msg, size, delay };
00600         return (RT_TASK *)RT_NET_RPC(port, rt_net_rpc(PACKPORT(port, NET_RPC_EXT, SENDX_TIMED, 4), UR1(2, 3), &arg, SIZARG, 1, PARTYPES4(VADR, UINT, UINT, RTIM)));
00601     }
00602     return rt_sendx_timed(task, msg, size, nano2count(delay));
00603 }
00604 
00605 static inline RT_TASK *RT_returnx(unsigned long node, int port, RT_TASK *task, void *msg, int size)
00606 {
00607     if (!task || !node) {
00608         return rt_returnx(task, msg, size);
00609     }
00610     return rt_returnx(rt_find_asgn_stub(OWNER(node, task), 1), msg, size) ? task : 0;
00611 }
00612 
00613 static inline RT_TASK *RT_evdrpx(unsigned long node, int port, RT_TASK *task, void *msg, int size, long *len)
00614 {
00615     if (!task || !node) {
00616         return rt_evdrpx(task, msg, size, len);
00617     }
00618     return rt_evdrpx(rt_find_asgn_stub(OWNER(node, task), 1), msg, size, len) ? task : 0;
00619 }
00620 
00621 static inline RT_TASK *RT_receivex(unsigned long node, int port, RT_TASK *task, void *msg, int size, long *len)
00622 {
00623     if (!task || !node) {
00624         return rt_receivex(task, msg, size, len);
00625     }
00626     return rt_receivex(rt_find_asgn_stub(OWNER(node, task), 1), msg, size, len) ? task : 0;
00627 }
00628 
00629 static inline RT_TASK *RT_receivex_if(unsigned long node, int port, RT_TASK *task, void *msg, int size, long *len)
00630 {
00631     if (!task || !node) {
00632         return rt_receivex_if(task, msg, size, len);
00633     }
00634     return rt_receivex_if(rt_find_asgn_stub(OWNER(node, task), 1), msg, size, len) ? task : 0;
00635 }
00636 
00637 static inline RT_TASK *RT_receivex_until(unsigned long node, int port, RT_TASK *task, void *msg, int size, long *len, RTIME time)
00638 {
00639     if (!task || !node) {
00640         return rt_receivex_until(task, msg, size, len, nano2count(time));
00641     }
00642     return rt_receivex_until(rt_find_asgn_stub(OWNER(node, task), 1), msg, size, len, nano2count(time)) ? task : 0;
00643 }
00644 
00645 static inline RT_TASK *RT_receivex_timed(unsigned long node, int port, RT_TASK *task, void *msg, int size, long *len, RTIME delay)
00646 {
00647     if (!task || !node) {
00648         return rt_receivex_timed(task, msg, size, len, nano2count(delay));
00649     }
00650     return rt_receivex_timed(rt_find_asgn_stub(OWNER(node, task), 1), msg, size, len, nano2count(delay)) ? task : 0;
00651 }
00652 
00653 #endif /* CONFIG_RTAI_MSG */
00654 
00655 #if CONFIG_RTAI_MBX
00656 
00657 static inline MBX *RT_typed_named_mbx_init(unsigned long node, int port, const char *mbx_name, int size, int qtype)
00658 {
00659     if (node) {
00660         struct { unsigned long mbx_name; long size; long qype; } arg = { nam2num(mbx_name), size, qtype };
00661         return (MBX *)RT_NET_RPC(port, rt_net_rpc(PACKPORT(port, NET_RPC_EXT, NAMED_MBX_INIT, 0), 0, &arg, SIZARG, 1, PARTYPES3(UINT, UINT, UINT)));
00662     }
00663     return rt_typed_named_mbx_init(mbx_name, size, qtype);
00664 }
00665 
00666 static inline int RT_named_mbx_delete(unsigned long node, int port, MBX *mbx)
00667 {
00668     if (node) {
00669         struct { MBX *mbx; } arg = { mbx };
00670         return rt_net_rpc(PACKPORT(port, NET_RPC_EXT, NAMED_MBX_DELETE, 0), 0, &arg, SIZARG, 1, PARTYPES1(VADR)).i[LOW];
00671     }
00672     return rt_named_mbx_delete(mbx);
00673 }
00674 
00675 static inline int RT_mbx_send(unsigned long node, int port, MBX *mbx, void *msg, int msg_size)
00676 {
00677     if (node) {
00678         struct { MBX *mbx; void *msg; long msg_size; long space; } arg = { mbx, msg, msg_size, 1 };
00679         return rt_net_rpc(PACKPORT(port, NET_RPC_EXT, MBX_SEND, 0), UR1(2, 3), &arg, SIZARG, 1, PARTYPES4(VADR, UINT, UINT, UINT)).i[LOW];
00680     }
00681     return rt_mbx_send(mbx, msg, msg_size);
00682 } 
00683 
00684 static inline int RT_mbx_send_wp(unsigned long node, int port, MBX *mbx, void *msg, int msg_size)
00685 {
00686     if (node) {
00687         struct { MBX *mbx; void *msg; long msg_size; long space; } arg = { mbx, msg, msg_size, 1 };
00688         return rt_net_rpc(PACKPORT(port, NET_RPC_EXT, MBX_SEND_WP, 0), UR1(2, 3), &arg, SIZARG, 1, PARTYPES4(VADR, UINT, UINT, UINT)).i[LOW];
00689     }
00690     return rt_mbx_send_wp(mbx, msg, msg_size);
00691 } 
00692 
00693 static inline int RT_mbx_send_if(unsigned long node, int port, MBX *mbx, void *msg, int msg_size)
00694 {
00695     if (node) {
00696         struct { MBX *mbx; void *msg; long msg_size; long space; } arg = { mbx, msg, msg_size, 1 };
00697         return rt_net_rpc(PACKPORT(port, NET_RPC_EXT, MBX_SEND_IF, 0), UR1(2, 3), &arg, SIZARG, 1, PARTYPES4(VADR, UINT, UINT, UINT)).i[LOW];
00698     }
00699     return rt_mbx_send_if(mbx, msg, msg_size);
00700 } 
00701 
00702 static inline int RT_mbx_ovrwr_send(unsigned long node, int port, MBX *mbx, void *msg, int msg_size)
00703 {
00704     if (node) {
00705         struct { MBX *mbx; void *msg; long msg_size; long space; } arg = { mbx, msg, msg_size, 1 };
00706         return rt_net_rpc(PACKPORT(port, NET_RPC_EXT, MBX_OVRWR_SEND, 0), UR1(2, 3), &arg, SIZARG, 1, PARTYPES4(VADR, UINT, UINT, UINT)).i[LOW];
00707     }
00708     return rt_mbx_ovrwr_send(mbx, msg, msg_size);
00709 } 
00710 
00711 static inline int RT_mbx_send_until(unsigned long node, int port, MBX *mbx, void *msg, int msg_size, RTIME time)
00712 {
00713     if (node) {
00714         struct { MBX *mbx; void *msg; long msg_size; RTIME time; long space; } arg = { mbx, msg, msg_size, time, 1 };
00715         return rt_net_rpc(PACKPORT(port, NET_RPC_EXT, MBX_SEND_UNTIL, 4), UR1(2, 3), &arg, SIZARG, 1, PARTYPES5(VADR, UINT, UINT, RTIM, UINT)).i[LOW];
00716     }
00717     return rt_mbx_send_until(mbx, msg, msg_size, nano2count(time));
00718 } 
00719 
00720 static inline int RT_mbx_send_timed(unsigned long node, int port, MBX *mbx, void *msg, int msg_size, RTIME delay)
00721 {
00722     if (node) {
00723         struct { MBX *mbx; void *msg; long msg_size; RTIME delay; long space; } arg = { mbx, msg, msg_size, delay, 1 };
00724         return rt_net_rpc(PACKPORT(port, NET_RPC_EXT, MBX_SEND_TIMED, 4), UR1(2, 3), &arg, SIZARG, 1, PARTYPES5(VADR, UINT, UINT, RTIM, UINT)).i[LOW];
00725     }
00726     return rt_mbx_send_timed(mbx, msg, msg_size, nano2count(delay));
00727 } 
00728 
00729 static inline int RT_mbx_evdrp(unsigned long node, int port, MBX *mbx, void *msg, int msg_size)
00730 {
00731     if (node) {
00732         struct { MBX *mbx; void *msg; long msg_size; long space; } arg = { mbx, msg, msg_size, 1 };
00733         return rt_net_rpc(PACKPORT(port, NET_RPC_EXT, MBX_EVDRP, 0), UW1(2, 3), &arg, SIZARG, 1, PARTYPES4(VADR, UINT, UINT, UINT)).i[LOW];
00734     }
00735     return rt_mbx_evdrp(mbx, msg, msg_size);
00736 } 
00737 
00738 static inline int RT_mbx_receive(unsigned long node, int port, MBX *mbx, void *msg, int msg_size)
00739 {
00740     if (node) {
00741         struct { MBX *mbx; void *msg; long msg_size; long space; } arg = { mbx, msg, msg_size, 1 };
00742         return rt_net_rpc(PACKPORT(port, NET_RPC_EXT, MBX_RECEIVE, 0), UW1(2, 3), &arg, SIZARG, 1, PARTYPES4(VADR, UINT, UINT, UINT)).i[LOW];
00743     }
00744     return rt_mbx_receive(mbx, msg, msg_size);
00745 } 
00746 
00747 static inline int RT_mbx_receive_wp(unsigned long node, int port, MBX *mbx, void *msg, int msg_size)
00748 {
00749     if (node) {
00750         struct { MBX *mbx; void *msg; long msg_size; long space; } arg = { mbx, msg, msg_size, 1 };
00751         return rt_net_rpc(PACKPORT(port, NET_RPC_EXT, MBX_RECEIVE_WP, 0), UW1(2, 3), &arg, SIZARG, 1, PARTYPES4(VADR, UINT, UINT, UINT)).i[LOW];
00752     }
00753     return rt_mbx_receive_wp(mbx, msg, msg_size);
00754 } 
00755 
00756 static inline int RT_mbx_receive_if(unsigned long node, int port, MBX *mbx, void *msg, int msg_size)
00757 {
00758     if (node) {
00759         struct { MBX *mbx; void *msg; long msg_size; long space; } arg = { mbx, msg, msg_size, 1 };
00760         return rt_net_rpc(PACKPORT(port, NET_RPC_EXT, MBX_RECEIVE_IF, 0), UW1(2, 3), &arg, SIZARG, 1, PARTYPES4(VADR, UINT, UINT, UINT)).i[LOW];
00761     }
00762     return rt_mbx_receive_if(mbx, msg, msg_size);
00763 } 
00764 
00765 static inline int RT_mbx_receive_until(unsigned long node, int port, MBX *mbx, void *msg, int msg_size, RTIME time)
00766 {
00767     if (node) {
00768         struct { MBX *mbx; void *msg; long msg_size; RTIME time; long space; } arg = { mbx, msg, msg_size, time, 1 };
00769         return rt_net_rpc(PACKPORT(port, NET_RPC_EXT, MBX_RECEIVE_UNTIL, 4), UW1(2, 3), &arg, SIZARG, 1, PARTYPES5(VADR, UINT, UINT, RTIM, UINT)).i[LOW];
00770     }
00771     return rt_mbx_receive_until(mbx, msg, msg_size, nano2count(time));
00772 } 
00773 
00774 static inline int RT_mbx_receive_timed(unsigned long node, int port, MBX *mbx, void *msg, int msg_size, RTIME delay)
00775 {
00776     if (node) {
00777         struct { MBX *mbx; void *msg; long msg_size; RTIME delay; long space; } arg = { mbx, msg, msg_size, delay, 1 };
00778         return rt_net_rpc(PACKPORT(port, NET_RPC_EXT, MBX_RECEIVE_TIMED, 4), UW1(2, 3), &arg, SIZARG, 1, PARTYPES5(VADR, UINT, UINT, RTIM, UINT)).i[LOW];
00779     }
00780     return rt_mbx_receive_timed(mbx, msg, msg_size, nano2count(delay));
00781 } 
00782 
00783 #endif /* CONFIG_RTAI_MBX */
00784 
00785 #ifdef __cplusplus
00786 }
00787 #endif /* __cplusplus */
00788 
00789 #else /* !__KERNEL__ */
00790 
00791 #include <stdlib.h>
00792 
00793 #define NET_RPC_IDX  0
00794 
00795 #define SIZARGS sizeof(args)
00796 
00797 static inline int rt_send_req_rel_port(unsigned long node, int port, unsigned long id, MBX *mbx, int hard)
00798 {
00799     struct { unsigned long node, port; unsigned long id; MBX *mbx; long hard; } args = { node, port, id, mbx, hard };
00800     return rtai_lxrt(NET_RPC_IDX, SIZARGS, SEND_REQ_REL_PORT, &args).i[LOW];
00801 } 
00802 
00803 static inline int rt_set_netrpc_timeout(int port, RTIME timeout)
00804 {
00805     struct { long port; RTIME timeout; } args = { port, timeout };
00806     return rtai_lxrt(NET_RPC_IDX, SIZARGS, SET_NETRPC_TIMEOUT, &args).i[LOW];
00807 }
00808 
00809 static inline unsigned long ddn2nl(const char *ddn)
00810 {
00811     struct { const char *ddn; } args = { ddn };
00812     return rtai_lxrt(NET_RPC_IDX, SIZARGS, DDN2NL, &args).i[LOW];
00813 } 
00814 
00815 static inline unsigned long rt_set_this_node(const char *ddn, unsigned long node, int hard)
00816 {
00817     struct { const char *ddn; unsigned long node; long hard; } args = { ddn, node, hard };
00818     return rtai_lxrt(NET_RPC_IDX, SIZARGS, SET_THIS_NODE, &args).i[LOW];
00819 } 
00820 
00821 static inline RT_TASK *rt_find_asgn_stub(unsigned long long owner, int asgn)
00822 {
00823     struct { unsigned long long owner; long asgn; } args = { owner, asgn };
00824     return (RT_TASK *)rtai_lxrt(NET_RPC_IDX, SIZARGS, FIND_ASGN_STUB, &args).v[LOW];
00825 } 
00826 
00827 static inline int rt_rel_stub(unsigned long long owner)
00828 {
00829     struct { unsigned long long owner; } args = { owner };
00830     return rtai_lxrt(NET_RPC_IDX, SIZARGS, REL_STUB, &args).i[LOW];
00831 } 
00832 
00833 static inline int rt_waiting_return(unsigned long node, int port)
00834 {
00835     struct { unsigned long node; long port; } args = { node, port };
00836     return rtai_lxrt(NET_RPC_IDX, SIZARGS, WAITING_RETURN, &args).i[LOW];
00837 } 
00838 
00839 static inline int rt_sync_net_rpc(unsigned long node, int port)
00840 {
00841     if (node) {
00842                 struct { long dummy; } arg = { 0 };
00843         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(abs(port), NET_RPC_EXT, SYNC_NET_RPC, 0), 0, &arg, SIZARG, 0, PARTYPES1(UINT) };
00844         return rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args).i[LOW];
00845     } 
00846     return 1;
00847 } 
00848 
00849 static inline void *RT_get_adr(unsigned long node, int port, const char *sname)
00850 {
00851     if (node) {
00852         struct { unsigned long name; } arg = { nam2num(sname) };
00853         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, GET_ADR, 0), 0, &arg, SIZARG, 0, PARTYPES1(UINT) };
00854 //      return rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args).v[LOW];
00855         return RTAI_LXRT(port, rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args));
00856     } 
00857     return rt_get_adr(nam2num(sname));
00858 } 
00859 
00860 static inline RTIME RT_get_time_ns(unsigned long node, int port)
00861 {
00862     if (node) {
00863         struct { long dummy; } arg = { 0 };
00864         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, GET_TIME_NS, 0), 0, &arg, SIZARG, 0, PARTYPES1(UINT) };
00865         return rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args).rt;
00866     }
00867     return rt_get_time_ns();
00868 } 
00869 
00870 static inline RTIME RT_get_time_ns_cpuid(unsigned long node, int port, int cpuid)
00871 {
00872     if (node) {
00873         struct { long cpuid; } arg = { cpuid };
00874         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, GET_TIME_NS_CPUID, 0), 0, &arg, SIZARG, 0, PARTYPES1(UINT) };
00875         return rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args).rt;
00876     }
00877     return rt_get_time_ns_cpuid(cpuid);
00878 } 
00879 
00880 static inline RTIME RT_get_cpu_time_ns(unsigned long node, int port)
00881 {
00882     if (node) {
00883         struct { long dummy; } arg = { 0 };
00884         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, GET_CPU_TIME_NS, 0), 0, &arg, SIZARG, 0, PARTYPES1(UINT) };
00885         return rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args).rt;
00886     }
00887     return rt_get_cpu_time_ns();
00888 } 
00889 
00890 static inline void RT_task_suspend(unsigned long node, int port, RT_TASK *task)
00891 {
00892     if (node) {
00893         struct { RT_TASK *task; } arg = { task };
00894         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, SUSPEND, 0), 0, &arg, SIZARG, 0, PARTYPES1(VADR) };
00895         rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args);
00896         return;
00897     }
00898     rt_task_suspend(task);
00899 } 
00900 
00901 static inline void RT_task_resume(unsigned long node, int port, RT_TASK *task)
00902 {
00903     if (node) {
00904         struct { RT_TASK *task; } arg = { task };
00905         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, RESUME, 0), 0, &arg, SIZARG, 0, PARTYPES1(VADR) };
00906         rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args);
00907         return;
00908     }
00909     rt_task_resume(task);
00910 } 
00911 
00912 static inline void RT_sleep(unsigned long node, int port, RTIME delay)
00913 {
00914     if (node) {
00915         struct { RTIME delay; } arg = { delay };
00916         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, SLEEP, 1), 0, &arg, SIZARG, 0, PARTYPES1(RTIM) };
00917         rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args);
00918         return;
00919     }
00920     rt_sleep(nano2count(delay));
00921 } 
00922 
00923 static inline void RT_sleep_until(unsigned long node, int port, RTIME time)
00924 {
00925     if (node) {
00926         struct { RTIME time; } arg = { time };
00927         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, SLEEP_UNTIL, 1), 0, &arg, SIZARG, 0, PARTYPES1(RTIM) };
00928         rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args);
00929         return;
00930     }
00931     rt_sleep(nano2count(time));
00932 } 
00933 
00934 #if CONFIG_RTAI_SEM
00935 
00936 static inline SEM *RT_typed_named_sem_init(unsigned long node, int port, const char *sem_name, int value, int type)
00937 {
00938     if (node) {
00939         struct { unsigned long sem_name; long value; long type; unsigned long *handle; } arg = { nam2num(sem_name), value, type, NULL };
00940         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, NAMED_SEM_INIT, 0), 0, &arg, SIZARG, 0, PARTYPES3(VADR, SINT, SINT) };
00941         return (SEM *)RTAI_LXRT(port, rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args));
00942     }
00943     return rt_typed_named_sem_init(sem_name, value, type);
00944 }
00945 
00946 static inline int RT_named_sem_delete(unsigned long node, int port, SEM *sem)
00947 {
00948     if (node) {
00949         struct { SEM *sem; } arg = { sem };
00950         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, NAMED_SEM_DELETE, 0), 0, &arg, SIZARG, 0, PARTYPES1(VADR) };
00951         return rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args).i[LOW];
00952     }
00953     return rt_named_sem_delete(sem);
00954 }
00955 
00956 static inline int RT_sem_signal(unsigned long node, int port, SEM *sem)
00957 {
00958     if (node) {
00959         struct { SEM *sem; } arg = { sem };
00960         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, SEM_SIGNAL, 0), 0, &arg, SIZARG, 0, PARTYPES1(VADR) };
00961         return rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args).i[LOW];
00962     } 
00963     return rt_sem_signal(sem);
00964 } 
00965 
00966 static inline int RT_sem_broadcast(unsigned long node, int port, SEM *sem)
00967 {
00968     if (node) {
00969         struct { SEM *sem; } arg = { sem };
00970         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, SEM_BROADCAST, 0), 0, &arg, SIZARG, 0, PARTYPES1(VADR) };
00971         return rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args).i[LOW];
00972     }
00973     return rt_sem_broadcast(sem);
00974 } 
00975 
00976 static inline int RT_sem_wait(unsigned long node, int port, SEM *sem)
00977 {
00978     if (node) {
00979         struct { SEM *sem; } arg = { sem };
00980         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, SEM_WAIT, 0), 0, &arg, SIZARG, 0, PARTYPES1(VADR) };
00981         return rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args).i[LOW];
00982     } 
00983     return rt_sem_wait(sem);
00984 } 
00985 
00986 static inline int RT_sem_wait_if(unsigned long node, int port, SEM *sem)
00987 {
00988     if (node) {
00989         struct { SEM *sem; } arg = { sem };
00990         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, SEM_WAIT_IF, 0), 0, &arg, SIZARG, 0, PARTYPES1(VADR) };
00991         return rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args).i[LOW];
00992     }
00993     return rt_sem_wait_if(sem);
00994 } 
00995 
00996 static inline int RT_sem_wait_until(unsigned long node, int port, SEM *sem, RTIME time)
00997 {
00998     if (node) {
00999         struct { SEM *sem; RTIME time; } arg = { sem, time };
01000         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, SEM_WAIT_UNTIL, 2), 0, &arg, SIZARG, 0, PARTYPES2(VADR, RTIM) };
01001         return rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args).i[LOW];
01002     }
01003     return rt_sem_wait_until(sem, nano2count(time));
01004 } 
01005 
01006 static inline int RT_sem_wait_timed(unsigned long node, int port, SEM *sem, RTIME delay)
01007 {
01008     if (node) {
01009         struct { SEM *sem; RTIME delay; } arg = { sem, delay };
01010         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, SEM_WAIT_TIMED, 2), 0, &arg, SIZARG, 0, PARTYPES2(VADR, RTIM) };
01011         return rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args).i[LOW];
01012     } 
01013     return rt_sem_wait_timed(sem, nano2count(delay));
01014 } 
01015 
01016 #ifdef CONFIG_RTAI_RT_POLL
01017 
01018 static inline int RT_poll_4to8(unsigned long node, int port, struct rt_poll_s *pdsain, unsigned long nr, RTIME timeout)
01019 {
01020     unsigned int i;
01021     int retval;
01022     struct rt_poll_lls { unsigned long long what, forwhat; } pdsa[nr];
01023     struct { void *pdsa1; void *pdsa2; unsigned long pdsa_size; RTIME timeout; } arg = { pdsa, pdsa, nr*sizeof(struct rt_poll_lls), timeout };
01024     struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, RT_POLL_NETRPC, 4), UR1(1, 3) | UW1(2, 3), &arg, SIZARG, 0, PARTYPES4(UINT, UINT, UINT, RTIM) };
01025     for (i = 0; i < nr; i++) {
01026         pdsa[i].what    = (unsigned long)pdsain[i].what;
01027         pdsa[i].forwhat = pdsain[i].forwhat;
01028     }
01029     retval = rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args).i[LOW];
01030     for (i = 0; i < nr; i++) {
01031         pdsain[i].what    = (void *)(unsigned long)pdsa[i].what;
01032         pdsain[i].forwhat = pdsa[i].forwhat;
01033     }
01034     return retval;
01035 } 
01036 
01037 static inline int RT_poll_8to4(unsigned long node, int port, struct rt_poll_s *pdsain, unsigned long nr, RTIME timeout)
01038 {
01039     unsigned int i;
01040     int retval;
01041     struct rt_poll_is { unsigned int what, forwhat; } pdsa[nr];
01042     struct { void *pdsa1; void *pdsa2; unsigned long pdsa_size; RTIME timeout; } arg = { pdsa, pdsa, nr*sizeof(struct rt_poll_is), timeout };
01043     struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, RT_POLL_NETRPC, 4), UR1(1, 3) | UW1(2, 3), &arg, SIZARG, 0, PARTYPES4(VADR, UINT, UINT, RTIM) };
01044     for (i = 0; i < nr; i++) {
01045         pdsa[i].what    = (unsigned int)(unsigned long)pdsain[i].what;
01046         pdsa[i].forwhat = pdsain[i].forwhat;
01047     }
01048     retval = rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args).i[LOW];
01049     for (i = 0; i < nr; i++) {
01050         pdsain[i].what    = (void *)(unsigned long)pdsa[i].what;
01051         pdsain[i].forwhat = pdsa[i].forwhat;
01052     }
01053     return retval;
01054 } 
01055 
01056 static inline int RT_poll(unsigned long node, int port, struct rt_poll_s *pdsa, unsigned long nr, RTIME timeout)
01057 {
01058     if (node) {
01059         if (sizeof(long) == 4 && (abs(port) & PORT_MSK)) {
01060             return RT_poll_4to8(node, port, pdsa, nr, timeout);
01061         } else if (sizeof(long) == 8 && !(abs(port) & PORT_MSK)) {
01062             return RT_poll_8to4(node, port, pdsa, nr, timeout);
01063         } else {
01064             struct { struct rt_poll_s *pdsa1; struct rt_poll_s *pdsa2; unsigned long pdsa_size; RTIME timeout; } arg = { pdsa, pdsa, nr*sizeof(struct rt_poll_s), timeout };
01065             struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, RT_POLL_NETRPC, 4), UR1(1, 3) | UW1(2, 3), &arg, SIZARG, 0, PARTYPES4(VADR, VADR, UINT, RTIM) };
01066             return rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args).i[LOW];
01067         }
01068     }
01069     return rt_poll(pdsa, nr, nano2count(timeout));
01070 } 
01071 
01072 #endif
01073 
01074 #endif /* CONFIG_RTAI_SEM */
01075 
01076 #if CONFIG_RTAI_MSG
01077 
01078 static inline RT_TASK *RT_send(unsigned long node, int port, RT_TASK *task, unsigned long msg)
01079 {
01080     if (node) {
01081         struct { RT_TASK *task; unsigned long msg; } arg = { task, msg };
01082         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, SENDMSG, 0), 0, &arg, SIZARG, 0, PARTYPES2(VADR, UINT) };
01083         return (RT_TASK *)RTAI_LXRT(port, rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args));
01084     } 
01085     return rt_send(task, msg);
01086 } 
01087 
01088 static inline RT_TASK *RT_send_if(unsigned long node, int port, RT_TASK *task, unsigned long msg)
01089 {
01090     if (node) {
01091         struct { RT_TASK *task; unsigned long msg; } arg = { task, msg };
01092         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, SEND_IF, 0), 0, &arg, SIZARG, 0, PARTYPES2(VADR, UINT) };
01093         return (RT_TASK *)RTAI_LXRT(port, rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args));
01094     } 
01095     return rt_send_if(task, msg);
01096 } 
01097 
01098 static inline RT_TASK *RT_send_until(unsigned long node, int port, RT_TASK *task, unsigned long msg, RTIME time)
01099 {
01100     if (node) {
01101         struct { RT_TASK *task; unsigned long msg; RTIME time; } arg = { task, msg, time };
01102         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, SEND_UNTIL, 3), 0, &arg, SIZARG, 0, PARTYPES3(VADR, UINT, RTIM) };
01103         return (RT_TASK *)RTAI_LXRT(port, rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args));
01104     } 
01105     return rt_send_until(task, msg, nano2count(time));
01106 } 
01107 
01108 static inline RT_TASK *RT_send_timed(unsigned long node, int port, RT_TASK *task, unsigned long msg, RTIME delay)
01109 {
01110     if (node) {
01111         struct { RT_TASK *task; unsigned long msg; RTIME delay; } arg = { task, msg, delay };
01112         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, SEND_TIMED, 3), 0, &arg, SIZARG, 0, PARTYPES3(VADR, UINT, RTIM) };
01113         return (RT_TASK *)RTAI_LXRT(port, rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args));
01114     } 
01115     return rt_send_timed(task, msg, nano2count(delay));
01116 } 
01117 
01118 static inline RT_TASK *RT_evdrp(unsigned long node, int port, RT_TASK *task, void *msg)
01119 {
01120         if (!task || !node) {
01121         return rt_evdrp(task, msg);
01122     } 
01123     return rt_evdrp(rt_find_asgn_stub(OWNER(node, task), 1), msg) ? task : 0;
01124 } 
01125 
01126 static inline RT_TASK *RT_receive(unsigned long node, int port, RT_TASK *task, void *msg)
01127 {
01128         if (!task || !node) {
01129         return rt_receive(task, msg);
01130     } 
01131     return rt_receive(rt_find_asgn_stub(OWNER(node, task), 1), msg) ? task : 0;
01132 } 
01133 
01134 static inline RT_TASK *RT_receive_if(unsigned long node, int port, RT_TASK *task, void *msg)
01135 {
01136         if (!task || !node) {
01137         return rt_receive_if(task, msg);
01138     } 
01139     return rt_receive_if(rt_find_asgn_stub(OWNER(node, task), 1), msg) ? task : 0;
01140 } 
01141 
01142 static inline RT_TASK *RT_receive_until(unsigned long node, int port, RT_TASK *task, void *msg, RTIME time)
01143 {
01144         if (!task || !node) {
01145         return rt_receive_until(task, msg, nano2count(time));
01146     } 
01147     return rt_receive_until(rt_find_asgn_stub(OWNER(node, task), 1), msg, nano2count(time)) ? task : 0;
01148 } 
01149 
01150 static inline RT_TASK *RT_receive_timed(unsigned long node, int port, RT_TASK *task, void *msg, RTIME delay)
01151 {
01152         if (!task || !node) {
01153         return rt_receive_timed(task, msg, nano2count(delay));
01154     } 
01155     return rt_receive_timed(rt_find_asgn_stub(OWNER(node, task), 1), msg, nano2count(delay)) ? task : 0;
01156 } 
01157 
01158 static inline RT_TASK *RT_rpc(unsigned long node, int port, RT_TASK *task, unsigned long msg, void *ret)
01159 {
01160     if (node) {
01161         struct { RT_TASK *task; unsigned long msg; void *ret; } arg = { task, msg, ret };
01162         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, RPCMSG, 0), UW1(3, 0), &arg, SIZARG, 0, PARTYPES3(VADR, UINT, UINT) };
01163         return (RT_TASK *)RTAI_LXRT(port, rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args));
01164     }
01165     return rt_rpc(task, msg, ret);
01166 } 
01167 
01168 static inline RT_TASK *RT_rpc_if(unsigned long node, int port, RT_TASK *task, unsigned long msg, void *ret)
01169 {
01170     if (node) {
01171         struct { RT_TASK *task; unsigned long msg; void *ret; } arg = { task, msg, ret };
01172         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, RPC_IF, 0), UW1(3, 0), &arg, SIZARG, 0, PARTYPES3(VADR, UINT, UINT) };
01173         return (RT_TASK *)RTAI_LXRT(port, rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args));
01174     }
01175     return rt_rpc_if(task, msg, ret);
01176 } 
01177 
01178 static inline RT_TASK *RT_rpc_until(unsigned long node, int port, RT_TASK *task, unsigned long msg, void *ret, RTIME time)
01179 {
01180     if (node) {
01181         struct { RT_TASK *task; unsigned long msg; void *ret; RTIME time; } arg = { task, msg, ret, time };
01182         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, RPC_UNTIL, 4), UW1(3, 0), &arg, SIZARG, 0, PARTYPES4(VADR, UINT, UINT, RTIM) };
01183         return (RT_TASK *)RTAI_LXRT(port, rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args));
01184     }
01185     return rt_rpc_until(task, msg, ret, nano2count(time));
01186 } 
01187 
01188 static inline RT_TASK *RT_rpc_timed(unsigned long node, int port, RT_TASK *task, unsigned long msg, void *ret, RTIME delay)
01189 {
01190     if (node) {
01191         struct { RT_TASK *task; unsigned long msg; void *ret; RTIME delay; } arg = { task, msg, ret, delay };
01192         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, RPC_TIMED, 4), UW1(3, 0), &arg, SIZARG, 0, PARTYPES4(VADR, UINT, UINT, RTIM) };
01193         return (RT_TASK *)RTAI_LXRT(port, rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args));
01194     }
01195     return rt_rpc_timed(task, msg, ret, nano2count(delay));
01196 } 
01197 
01198 static inline int RT_isrpc(unsigned long node, int port, RT_TASK *task)
01199 {
01200     if (node) {
01201         struct { RT_TASK *task; } arg = { task };
01202         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, ISRPC, 0), 0, &arg, SIZARG, 0, PARTYPES1(VADR) };
01203         return rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args).i[LOW];
01204     } 
01205     return rt_isrpc(task);
01206 } 
01207 
01208 static inline RT_TASK *RT_return(unsigned long node, int port, RT_TASK *task, unsigned long result)
01209 {
01210 
01211         if (!task || !node) {
01212         return rt_return(task, result);
01213     } 
01214     return rt_return(rt_find_asgn_stub(OWNER(node, task), 1), result) ? task : 0;
01215 } 
01216 
01217 static inline RT_TASK *RT_rpcx(unsigned long node, int port, RT_TASK *task, void *smsg, void *rmsg, int ssize, int rsize)
01218 {
01219     if (node) {
01220         struct { RT_TASK *task; void *smsg, *rmsg; long ssize, rsize; } arg = { task, smsg, rmsg, ssize, rsize };
01221         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, RPCX, 0), UR1(2, 4) | UW1(3, 5), &arg, SIZARG, 0, PARTYPES5(VADR, UINT, UINT, UINT, UINT) };
01222         return (RT_TASK *)RTAI_LXRT(port, rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args));
01223     }
01224     return rt_rpcx(task, smsg, rmsg, ssize, rsize);
01225 } 
01226 
01227 static inline RT_TASK *RT_rpcx_if(unsigned long node, int port, RT_TASK *task, void *smsg, void *rmsg, int ssize, int rsize)
01228 {
01229     if (node) {
01230         struct { RT_TASK *task; void *smsg, *rmsg; long ssize, rsize; } arg = { task, smsg, rmsg, ssize, rsize };
01231         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, RPCX_IF, 0), UR1(2, 4) | UW1(3, 5), &arg, SIZARG, 0, PARTYPES5(VADR, UINT, UINT, UINT, UINT) };
01232         return (RT_TASK *)RTAI_LXRT(port, rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args));
01233     }
01234     return rt_rpcx_if(task, smsg, rmsg, ssize, rsize);
01235 } 
01236 
01237 static inline RT_TASK *RT_rpcx_until(unsigned long node, int port, RT_TASK *task, void *smsg, void *rmsg, int ssize, int rsize, RTIME time)
01238 {
01239     if (node) {
01240         struct { RT_TASK *task; void *smsg, *rmsg; long ssize, rsize; RTIME time; } arg = { task, smsg, rmsg, ssize, rsize, time };
01241         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, RPCX_UNTIL, 6), UR1(2, 4) | UW1(3, 5), &arg, SIZARG, 0, PARTYPES6(VADR, UINT, UINT, UINT, UINT, RTIM) };
01242         return (RT_TASK *)RTAI_LXRT(port, rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args));
01243     }
01244     return rt_rpcx_until(task, smsg, rmsg, ssize, rsize, nano2count(time));
01245 } 
01246 
01247 static inline RT_TASK *RT_rpcx_timed(unsigned long node, int port, RT_TASK *task, void *smsg, void *rmsg, int ssize, int rsize, RTIME delay)
01248 {
01249     if (node) {
01250         struct { RT_TASK *task; void *smsg, *rmsg; long ssize, rsize; RTIME delay; } arg = { task, smsg, rmsg, ssize, rsize, delay };
01251         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, RPCX_TIMED, 6), UR1(2, 4) | UW1(3, 5), &arg, SIZARG, 0, PARTYPES6(VADR, UINT, UINT, UINT, UINT, RTIM) };
01252         return (RT_TASK *)RTAI_LXRT(port, rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args));
01253     }
01254     return rt_rpcx_timed(task, smsg, rmsg, ssize, rsize, nano2count(delay));
01255 } 
01256 
01257 static inline RT_TASK *RT_sendx(unsigned long node, int port, RT_TASK *task, void *msg, int size)
01258 {
01259     if (node) {
01260         struct { RT_TASK *task; void *msg; long size; } arg = { task, msg, size };
01261         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, SENDX, 0), UR1(2, 3), &arg, SIZARG, 0, PARTYPES3(VADR, UINT, UINT) };
01262         return (RT_TASK *)RTAI_LXRT(port, rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args));
01263     }
01264     return rt_sendx(task, msg, size);
01265 } 
01266 
01267 static inline RT_TASK *RT_sendx_if(unsigned long node, int port, RT_TASK *task, void *msg, int size)
01268 {
01269     if (node) {
01270         struct { RT_TASK *task; void *msg; long size; } arg = { task, msg, size };
01271         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, SENDX_IF, 0), UR1(2, 3), &arg, SIZARG, 0, PARTYPES3(VADR, UINT, UINT) };
01272 //      return (RT_TASK *)rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args).v[LOW];
01273         return (RT_TASK *)RTAI_LXRT(port, rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args));
01274     }
01275     return rt_sendx_if(task, msg, size);
01276 } 
01277 
01278 static inline RT_TASK *RT_sendx_until(unsigned long node, int port, RT_TASK *task, void *msg, int size, RTIME time)
01279 {
01280     if (node) {
01281         struct { RT_TASK *task; void *msg; long size; RTIME time; } arg = { task, msg, size, time };
01282         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, SENDX_UNTIL, 4), UR1(2, 3), &arg, SIZARG, 0, PARTYPES4(VADR, UINT, UINT, RTIM) };
01283         return (RT_TASK *)RTAI_LXRT(port, rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args));
01284     }
01285     return rt_sendx_until(task, msg, size, nano2count(time));
01286 } 
01287 
01288 static inline RT_TASK *RT_sendx_timed(unsigned long node, int port, RT_TASK *task, void *msg, int size, RTIME delay)
01289 {
01290     if (node) {
01291         struct { RT_TASK *task; void *msg; long size; RTIME delay; } arg = { task, msg, size, delay };
01292         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, SENDX_TIMED, 4), UR1(2, 3), &arg, SIZARG, 0, PARTYPES4(VADR, UINT, UINT, RTIM) };
01293         return (RT_TASK *)RTAI_LXRT(port, rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args));
01294     }
01295     return rt_sendx_timed(task, msg, size, nano2count(delay));
01296 } 
01297 
01298 static inline RT_TASK *RT_returnx(unsigned long node, int port, RT_TASK *task, void *msg, int size)
01299 {
01300 
01301         if (!task || !node) {
01302         return rt_returnx(task, msg, size);
01303     } 
01304     return rt_returnx(rt_find_asgn_stub(OWNER(node, task), 1), msg, size) ? task : 0;
01305 } 
01306 
01307 static inline RT_TASK *RT_evdrpx(unsigned long node, int port, RT_TASK *task, void *msg, int size, long *len)
01308 {
01309         if (!task || !node) {
01310         return rt_evdrpx(task, msg, size, len);
01311     } 
01312     return rt_evdrpx(rt_find_asgn_stub(OWNER(node, task), 1), msg, size, len) ? task : 0;
01313 } 
01314 
01315 static inline RT_TASK *RT_receivex(unsigned long node, int port, RT_TASK *task, void *msg, int size, long *len)
01316 {
01317         if (!task || !node) {
01318         return rt_receivex(task, msg, size, len);
01319     } 
01320     return rt_receivex(rt_find_asgn_stub(OWNER(node, task), 1), msg, size, len) ? task : 0;
01321 } 
01322 
01323 static inline RT_TASK *RT_receivex_if(unsigned long node, int port, RT_TASK *task, void *msg, int size, long *len)
01324 {
01325         if (!task || !node) {
01326         return rt_receivex_if(task, msg, size, len);
01327     } 
01328     return rt_receivex_if(rt_find_asgn_stub(OWNER(node, task), 1), msg, size, len) ? task : 0;
01329 } 
01330 
01331 static inline RT_TASK *RT_receivex_until(unsigned long node, int port, RT_TASK *task, void *msg, int size, long *len, RTIME time)
01332 {
01333         if (!task || !node) {
01334         return rt_receivex_until(task, msg, size, len, nano2count(time));
01335     } 
01336     return rt_receivex_until(rt_find_asgn_stub(OWNER(node, task), 1), msg, size, len, nano2count(time)) ? task : 0;
01337 } 
01338 
01339 static inline RT_TASK *RT_receivex_timed(unsigned long node, int port, RT_TASK *task, void *msg, int size, long *len, RTIME delay)
01340 {
01341         if (!task || !node) {
01342         return rt_receivex_timed(task, msg, size, len, nano2count(delay));
01343     } 
01344     return rt_receivex_timed(rt_find_asgn_stub(OWNER(node, task), 1), msg, size, len, nano2count(delay)) ? task : 0;
01345 } 
01346 
01347 #endif /* CONFIG_RTAI_MSG */
01348 
01349 #if CONFIG_RTAI_MBX
01350 
01351 static inline MBX *RT_typed_named_mbx_init(unsigned long node, int port, const char *mbx_name, int size, int qtype)
01352 {
01353     if (node) {
01354         struct { unsigned long mbx_name; long size; long qype; } arg = { nam2num(mbx_name), size, qtype };
01355         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, NAMED_MBX_INIT, 0), 0, &arg, SIZARG, 0, PARTYPES3(UINT, UINT, UINT) };
01356         return (MBX *)RTAI_LXRT(port, rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args));
01357     }
01358     return (MBX *)rt_typed_named_mbx_init(mbx_name, size, qtype);
01359 }
01360 
01361 static inline int RT_named_mbx_delete(unsigned long node, int port, MBX *mbx)
01362 {
01363     if (node) {
01364         struct { MBX *mbx; } arg = { mbx };
01365         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, NAMED_MBX_DELETE, 0), 0, &arg, SIZARG, 0, PARTYPES1(VADR) };
01366         return rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args).i[LOW];
01367     }
01368     return rt_named_mbx_delete(mbx);
01369 }
01370 
01371 static inline int RT_mbx_send(unsigned long node, int port, MBX *mbx, void *msg, int msg_size)
01372 {
01373     if (node) {
01374         struct { MBX *mbx; void *msg; long msg_size; long space; } arg = { mbx, msg, msg_size, 1 };
01375         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, MBX_SEND, 0), UR1(2, 3), &arg, SIZARG, 0, PARTYPES4(VADR, UINT, SINT, SINT) };
01376         return rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args).i[LOW];
01377     } 
01378     return rt_mbx_send(mbx, msg, msg_size);
01379 } 
01380 
01381 static inline int RT_mbx_send_wp(unsigned long node, int port, MBX *mbx, void *msg, int msg_size)
01382 {
01383     if (node) {
01384         struct { MBX *mbx; void *msg; long msg_size; long space; } arg = { mbx, msg, msg_size, 1 };
01385         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, MBX_SEND_WP, 0), UR1(2, 3), &arg, SIZARG, 0, PARTYPES4(VADR, UINT, SINT, SINT) };
01386         return rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args).i[LOW];
01387     } 
01388     return rt_mbx_send_wp(mbx, msg, msg_size);
01389 } 
01390 
01391 static inline int RT_mbx_send_if(unsigned long node, int port, MBX *mbx, void *msg, int msg_size)
01392 {
01393     if (node) {
01394         struct { MBX *mbx; void *msg; long msg_size; long space; } arg = { mbx, msg, msg_size, 1 };
01395         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, MBX_SEND_IF, 0), UR1(2, 3), &arg, SIZARG, 0, PARTYPES4(VADR, UINT, SINT, SINT) };
01396         return rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args).i[LOW];
01397     } 
01398     return rt_mbx_send_if(mbx, msg, msg_size);
01399 } 
01400 
01401 static inline int RT_mbx_ovrwr_send(unsigned long node, int port, MBX *mbx, void *msg, int msg_size)
01402 {
01403     if (node) {
01404         struct { MBX *mbx; void *msg; long msg_size; long space; } arg = { mbx, msg, msg_size, 1 };
01405         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, MBX_OVRWR_SEND, 0), UR1(2, 3), &arg, SIZARG, 0, PARTYPES4(VADR, UINT, SINT, SINT) };
01406         return rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args).i[LOW];
01407     } 
01408     return rt_mbx_ovrwr_send(mbx, msg, msg_size);
01409 } 
01410 
01411 static inline int RT_mbx_send_until(unsigned long node, int port, MBX *mbx, void *msg, int msg_size, RTIME time)
01412 {
01413     if (node) {
01414         struct { MBX *mbx; void *msg; long msg_size; RTIME time; long space; } arg = { mbx, msg, msg_size, time, 1 };
01415         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, MBX_SEND_UNTIL, 4), UR1(2, 3), &arg, SIZARG, 0, PARTYPES5(VADR, UINT, SINT, RTIM, SINT) };
01416         return rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args).i[LOW];
01417     } 
01418     return rt_mbx_send_until(mbx, msg, msg_size, nano2count(time));
01419 } 
01420 
01421 static inline int RT_mbx_send_timed(unsigned long node, int port, MBX *mbx, void *msg, int msg_size, RTIME delay)
01422 {
01423     if (node) {
01424         struct { MBX *mbx; void *msg; long msg_size; RTIME delay; long space; } arg = { mbx, msg, msg_size, delay, 1 };
01425         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, MBX_SEND_TIMED, 4), UR1(2, 3), &arg, SIZARG, 0, PARTYPES5(VADR, UINT, SINT, RTIM, SINT) };
01426         return rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args).i[LOW];
01427     } 
01428     return rt_mbx_send_until(mbx, msg, msg_size, nano2count(delay));
01429 } 
01430 
01431 static inline int RT_mbx_evdrp(unsigned long node, int port, MBX *mbx, void *msg, int msg_size)
01432 {
01433     if (node) {
01434         struct { MBX *mbx; void *msg; long msg_size; long space; } arg = { mbx, msg, msg_size, 1 };
01435         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, MBX_EVDRP, 0), UW1(2, 3), &arg, SIZARG, 0, PARTYPES4(VADR, UINT, SINT, SINT) };
01436         return rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args).i[LOW];
01437     } 
01438     return rt_mbx_evdrp(mbx, msg, msg_size);
01439 } 
01440 
01441 static inline int RT_mbx_receive(unsigned long node, int port, MBX *mbx, void *msg, int msg_size)
01442 {
01443     if (node) {
01444         struct { MBX *mbx; void *msg; long msg_size; long space; } arg = { mbx, msg, msg_size, 1 };
01445         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, MBX_RECEIVE, 0), UW1(2, 3), &arg, SIZARG, 0, PARTYPES4(VADR, UINT, SINT, SINT) };
01446         return rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args).i[LOW];
01447     } 
01448     return rt_mbx_receive(mbx, msg, msg_size);
01449 } 
01450 
01451 static inline int RT_mbx_receive_wp(unsigned long node, int port, MBX *mbx, void *msg, int msg_size)
01452 {
01453     if (node) {
01454         struct { MBX *mbx; void *msg; long msg_size; long space; } arg = { mbx, msg, msg_size, 1 };
01455         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, MBX_RECEIVE_WP, 0), UW1(2, 3), &arg, SIZARG, 0, PARTYPES4(VADR, UINT, SINT, SINT) };
01456         return rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args).i[LOW];
01457     } 
01458     return rt_mbx_receive_wp(mbx, msg, msg_size);
01459 } 
01460 
01461 static inline int RT_mbx_receive_if(unsigned long node, int port, MBX *mbx, void *msg, int msg_size)
01462 {
01463     if (node) {
01464         struct { MBX *mbx; void *msg; long msg_size; long space; } arg = { mbx, msg, msg_size, 1 };
01465         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, MBX_RECEIVE_IF, 0), UW1(2, 3), &arg, SIZARG, 0, PARTYPES4(VADR, UINT, SINT, SINT) };
01466         return rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args).i[LOW];
01467     } 
01468     return rt_mbx_receive_if(mbx, msg, msg_size);
01469 } 
01470 
01471 static inline int RT_mbx_receive_until(unsigned long node, int port, MBX *mbx, void *msg, int msg_size, RTIME time)
01472 {
01473     if (node) {
01474         struct { MBX *mbx; void *msg; long msg_size; RTIME time; long space; } arg = { mbx, msg, msg_size, time, 1 };
01475         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, MBX_RECEIVE_UNTIL, 4), UW1(2, 3), &arg, SIZARG, 0, PARTYPES5(VADR, UINT, SINT, RTIM, SINT) };
01476         return rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args).i[LOW];
01477     }
01478     return rt_mbx_receive_until(mbx, msg, msg_size, nano2count(time));
01479 } 
01480 
01481 static inline int RT_mbx_receive_timed(unsigned long node, int port, MBX *mbx, void *msg, int msg_size, RTIME delay)
01482 {
01483     if (node) {
01484         struct { MBX *mbx; void *msg; long msg_size; RTIME delay; long space; } arg = { mbx, msg, msg_size, delay, 1 };
01485         struct { unsigned long fun; long type; void *args; long argsize; long space; unsigned long partypes; } args = { PACKPORT(port, NET_RPC_EXT, MBX_RECEIVE_TIMED, 4), UW1(2, 3), &arg, SIZARG, 0, PARTYPES5(VADR, UINT, SINT, RTIM, SINT) };
01486         return rtai_lxrt(NET_RPC_IDX, SIZARGS, NETRPC, &args).i[LOW];
01487     }
01488     return rt_mbx_receive_timed(mbx, msg, msg_size, nano2count(delay));
01489 } 
01490 
01491 #include <stddef.h>
01492 
01493 static inline int rt_get_net_rpc_ret(MBX *mbx, unsigned long long *retval, void *msg1, int *msglen1, void *msg2, int *msglen2, RTIME timeout, int type)
01494 {
01495     struct reply_t { long long wsize, w2size, myport; unsigned long long retval; char msg[1], msg1[1]; };
01496     struct reply_t reply;
01497     int ret;
01498 
01499     switch (type) {
01500         case MBX_RECEIVE:
01501             ret = rt_mbx_receive(mbx, &reply, offsetof(struct reply_t, msg));
01502             break;
01503         case MBX_RECEIVE_WP:
01504             ret = rt_mbx_receive_wp(mbx, &reply, offsetof(struct reply_t, msg));
01505             break;
01506         case MBX_RECEIVE_IF:
01507             ret = rt_mbx_receive_if(mbx, &reply, offsetof(struct reply_t, msg));
01508             break;
01509         case MBX_RECEIVE_UNTIL:
01510             ret = rt_mbx_receive_until(mbx, &reply, offsetof(struct reply_t, msg), timeout);
01511             break;
01512         case MBX_RECEIVE_TIMED:
01513             ret = rt_mbx_receive_timed(mbx, &reply, offsetof(struct reply_t, msg), timeout);
01514         default:
01515             ret = -1;
01516     }
01517     if (!ret) {
01518         *retval = (unsigned long)reply.retval;
01519         if (reply.wsize) {
01520             char msg[reply.wsize];
01521             rt_mbx_receive(mbx, msg, reply.wsize);
01522             if (*msglen1 > reply.wsize) {
01523                 *msglen1 = reply.wsize;
01524             }
01525             memcpy(msg1, msg, *msglen1);
01526         } else {
01527             *msglen1 = 0;
01528         }
01529         if (reply.w2size) {
01530             char msg[reply.w2size];
01531             rt_mbx_receive(mbx, msg, reply.w2size);
01532             if (*msglen2 > reply.w2size) {
01533                 *msglen2 = reply.w2size;
01534             }
01535             memcpy(msg2, msg, *msglen2);
01536         } else {
01537             *msglen2 = 0;
01538         }
01539         return 0;
01540     }
01541     return ret;
01542 }
01543 
01544 #endif /* CONFIG_RTAI_MBX */
01545 
01546 #endif /* __KERNEL__ */
01547 
01548 /*
01549  * A set of compatibility defines for APIs that can be interpreted in various
01550  * ways but do the same the same things always.
01551  */
01552 
01553 #define RT_isrpcx(task)  RT_isrpc(task)
01554 
01555 #define RT_waiting_return            rt_waiting_return
01556 
01557 #define RT_sync_net_rpc              rt_sync_net_rpc
01558 
01559 #define RT_request_port              rt_request_port
01560 
01561 #define RT_request_port_id           rt_request_port_id
01562 
01563 #define RT_request_port_mbx          rt_request_port_mbx
01564 
01565 #define RT_request_port_id_mbx       rt_request_port_id_mbx
01566 
01567 #define RT_request_soft_port         rt_request_soft_port
01568 
01569 #define RT_request_soft_port_id      rt_request_soft_port_id
01570 
01571 #define RT_request_soft_port_mbx     rt_request_soft_port_mbx
01572 
01573 #define RT_request_soft_port_id_mbx  rt_request_soft_port_id_mbx
01574 
01575 #define RT_request_hard_port         rt_request_hard_port
01576 
01577 #define RT_request_hard_port_id      rt_request_hard_port_id
01578 
01579 #define RT_request_hard_port_mbx     rt_request_hard_port_mbx
01580 
01581 #define RT_request_hard_port_id_mbx  rt_request_hard_port_id_mbx
01582 
01583 #define RT_release_port              rt_release_port
01584 
01585 #define rt_request_port              rt_request_soft_port 
01586 
01587 #define rt_request_port_id           rt_request_soft_port_id
01588 
01589 #define rt_request_port_mbx          rt_request_soft_port_mbx
01590 
01591 #define rt_request_port_id_mbx       rt_request_soft_port_id_mbx
01592 
01593 /*
01594  * End of compatibility defines.
01595  */
01596 
01597 #define rt_request_soft_port(node) \
01598     rt_send_req_rel_port(node, 0, 0, 0, 0)
01599 
01600 #define rt_request_soft_port_id(node, id) \
01601     rt_send_req_rel_port(node, 0, id, 0, 0)
01602 
01603 #define rt_request_soft_port_mbx(node, mbx) \
01604     rt_send_req_rel_port(node, 0, 0, mbx, 0)
01605 
01606 #define rt_request_soft_port_id_mbx(node, id, mbx) \
01607     rt_send_req_rel_port(node, 0, id, mbx, 0)
01608 
01609 #define rt_request_hard_port(node) \
01610     rt_send_req_rel_port(node, 0, 0, 0, 1)
01611 
01612 #define rt_request_hard_port_id(node, id) \
01613     rt_send_req_rel_port(node, 0, id, 0, 1)
01614 
01615 #define rt_request_hard_port_mbx(node, mbx) \
01616     rt_send_req_rel_port(node, 0, 0, mbx, 1)
01617 
01618 #define rt_request_hard_port_id_mbx(node, id, mbx) \
01619     rt_send_req_rel_port(node, 0, id, mbx, 1)
01620 
01621 #define rt_release_port(node, port) \
01622     rt_send_req_rel_port(node, port, 0, 0, 0) 
01623 
01624 #endif /*_RTAI_NETRPC_H */

Generated on Tue Feb 2 17:46:05 2010 for RTAI API by  doxygen 1.4.7