00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
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
00045
00046 #define UW1(bf, sz) ((((bf) & 0x7) << 19) | (((sz) & 0x7) << 22))
00047 #define UW2(bf, sz) ((((bf) & 0x7) << 25) | (((sz) & 0x7) << 28))
00048
00049
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
00064
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
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
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
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
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
00784
00785 #ifdef __cplusplus
00786 }
00787 #endif
00788
00789 #else
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
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
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
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
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
01545
01546 #endif
01547
01548
01549
01550
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
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