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