version 1.26.2.8, 2015/06/29 22:29:26
|
version 1.26.2.12, 2015/07/02 21:52:29
|
Line 70 static void *rxEXTPacket(sched_task_t *);
|
Line 70 static void *rxEXTPacket(sched_task_t *);
|
static void *txEXTPacket(sched_task_t *); |
static void *txEXTPacket(sched_task_t *); |
|
|
static sched_task_func_t cbProto[SOCK_MAX_SUPPORT][4] = { |
static sched_task_func_t cbProto[SOCK_MAX_SUPPORT][4] = { |
{ acceptClients, closeClient, rxPacket, txPacket }, /* SOCK_STREAM */ | { acceptClients, closeClient, rxPacket, txPacket }, /* SOCK_STREAM */ |
{ acceptClients, closeClient, rxPacket, txPacket }, /* SOCK_STREAM */ | { acceptClients, closeClient, rxPacket, txPacket }, /* SOCK_STREAM */ |
{ rxUDPPacket, freeClient, rxUDPPacket, txUDPPacket }, /* SOCK_DGRAM */ | { rxUDPPacket, freeClient, NULL /*rxUDPPacket*/, txUDPPacket }, /* SOCK_DGRAM */ |
{ rxRAWPacket, freeClient, rxRAWPacket, txRAWPacket }, /* SOCK_RAW */ | { rxRAWPacket, freeClient, NULL /*rxRAWPacket*/, txRAWPacket }, /* SOCK_RAW */ |
{ rxBPFPacket, freeClient, rxBPFPacket, txBPFPacket }, /* SOCK_BPF */ | { rxBPFPacket, freeClient, NULL /*rxBPFPacket*/, txBPFPacket }, /* SOCK_BPF */ |
{ rxEXTPacket, freeClient, rxEXTPacket, txEXTPacket } /* SOCK_EXT */ | { rxEXTPacket, freeClient, NULL /*rxEXTPacket*/, txEXTPacket } /* SOCK_EXT */ |
}; |
}; |
|
|
/* Global Signal Argument when kqueue support disabled */ |
/* Global Signal Argument when kqueue support disabled */ |
|
|
static volatile uintptr_t _glSigArg = 0; |
static volatile uintptr_t _glSigArg = 0; |
|
|
|
#pragma GCC visibility push(hidden) |
|
|
|
static int |
|
rpc_funcs_cmp(struct tagRPCFunc *a, struct tagRPCFunc *b) |
|
{ |
|
int ret; |
|
|
|
assert(a && b); |
|
|
|
ret = AIT_KEY(&a->func_name) - AIT_KEY(&b->func_name); |
|
|
|
if (ret < 0) |
|
return -1; |
|
else if (ret > 0) |
|
return 1; |
|
|
|
return ret; |
|
} |
|
|
|
AVL_GENERATE(tagRPCFuncs, tagRPCFunc, func_node, rpc_funcs_cmp); |
|
|
|
#pragma GCC visibility pop |
|
|
void |
void |
rpc_freeCli(rpc_cli_t * __restrict c) |
rpc_freeCli(rpc_cli_t * __restrict c) |
{ |
{ |
Line 197 txPacket(sched_task_t *task)
|
Line 219 txPacket(sched_task_t *task)
|
rpc_SetErr(EPROGUNAVAIL, "Function not found at RPC server"); |
rpc_SetErr(EPROGUNAVAIL, "Function not found at RPC server"); |
|
|
rpc->call_argc ^= rpc->call_argc; |
rpc->call_argc ^= rpc->call_argc; |
rpc->call_rep.ret = RPC_ERROR(-1); | RPC_SET_RETURN(rpc, -1); |
rpc->call_rep.eno = RPC_ERROR(rpc_Errno); | RPC_SET_ERRNO(rpc, rpc_Errno); |
} else if (rpc_pktFreeSpace(c) > s->srv_netbuf) { |
} else if (rpc_pktFreeSpace(c) > s->srv_netbuf) { |
rpc_SetErr(EMSGSIZE, "Message too long"); |
rpc_SetErr(EMSGSIZE, "Message too long"); |
|
|
rpc->call_argc ^= rpc->call_argc; |
rpc->call_argc ^= rpc->call_argc; |
rpc->call_rep.ret = RPC_ERROR(-1); | RPC_SET_RETURN(rpc, -1); |
rpc->call_rep.eno = RPC_ERROR(rpc_Errno); | RPC_SET_ERRNO(rpc, rpc_Errno); |
} else { |
} else { |
rpc->call_argc = (u_char) array_Size(RPC_RETVARS(c)); |
rpc->call_argc = (u_char) array_Size(RPC_RETVARS(c)); |
/* Go Encapsulate variables */ |
/* Go Encapsulate variables */ |
Line 214 txPacket(sched_task_t *task)
|
Line 236 txPacket(sched_task_t *task)
|
rpc_SetErr(EBADRPC, "Prepare RPC packet failed"); |
rpc_SetErr(EBADRPC, "Prepare RPC packet failed"); |
|
|
rpc->call_argc ^= rpc->call_argc; |
rpc->call_argc ^= rpc->call_argc; |
rpc->call_rep.ret = RPC_ERROR(-1); | RPC_SET_RETURN(rpc, -1); |
rpc->call_rep.eno = RPC_ERROR(rpc_Errno); | RPC_SET_ERRNO(rpc, rpc_Errno); |
} else |
} else |
wlen += ret; |
wlen += ret; |
} |
} |
Line 263 execCall(sched_task_t *task)
|
Line 285 execCall(sched_task_t *task)
|
rpc_SetErr(ERPCMISMATCH, "#%d - %s", elwix_GetErrno(), elwix_GetError()); |
rpc_SetErr(ERPCMISMATCH, "#%d - %s", elwix_GetErrno(), elwix_GetError()); |
|
|
rpc->call_argc ^= rpc->call_argc; |
rpc->call_argc ^= rpc->call_argc; |
rpc->call_rep.ret = RPC_ERROR(-1); | RPC_SET_RETURN(rpc, -1); |
rpc->call_rep.eno = RPC_ERROR(rpc_Errno); | RPC_SET_ERRNO(rpc, rpc_Errno); |
taskExit(task, NULL); |
taskExit(task, NULL); |
} |
} |
} else |
} else |
Line 274 execCall(sched_task_t *task)
|
Line 296 execCall(sched_task_t *task)
|
rpc_SetErr(EPROGUNAVAIL, "Function not found at RPC server"); |
rpc_SetErr(EPROGUNAVAIL, "Function not found at RPC server"); |
|
|
rpc->call_argc ^= rpc->call_argc; |
rpc->call_argc ^= rpc->call_argc; |
rpc->call_rep.ret = RPC_ERROR(-1); | RPC_SET_RETURN(rpc, -1); |
rpc->call_rep.eno = RPC_ERROR(rpc_Errno); | RPC_SET_ERRNO(rpc, rpc_Errno); |
} else { |
} else { |
/* if client doesn't want reply */ |
/* if client doesn't want reply */ |
rpc->call_rep.ret = RPC_ERROR(rpc_srv_execCall(c, rpc, f->func_name, arr)); | RPC_SET_RETURN(rpc, rpc_srv_execCall(c, rpc, f->func_name, arr)); |
if (rpc->call_rep.ret == htonl(-1)) { |
if (rpc->call_rep.ret == htonl(-1)) { |
if (!rpc->call_rep.eno) { |
if (!rpc->call_rep.eno) { |
LOGERR; |
LOGERR; |
rpc->call_rep.eno = RPC_ERROR(rpc_Errno); | RPC_SET_ERRNO(rpc, rpc_Errno); |
} |
} |
rpc->call_argc ^= rpc->call_argc; |
rpc->call_argc ^= rpc->call_argc; |
ait_freeVars(&c->cli_vars); |
ait_freeVars(&c->cli_vars); |
Line 313 rxPacket(sched_task_t *task)
|
Line 335 rxPacket(sched_task_t *task)
|
u_short crc; |
u_short crc; |
#endif |
#endif |
u_char *buf = AIT_GET_BUF(&c->cli_buf); |
u_char *buf = AIT_GET_BUF(&c->cli_buf); |
|
u_char b[sizeof(struct tagRPCCall)]; |
struct tagRPCCall *rpc = (struct tagRPCCall*) buf; |
struct tagRPCCall *rpc = (struct tagRPCCall*) buf; |
#ifdef TCP_SESSION_TIMEOUT |
#ifdef TCP_SESSION_TIMEOUT |
struct timespec ts = { DEF_RPC_TIMEOUT, 0 }; |
struct timespec ts = { DEF_RPC_TIMEOUT, 0 }; |
Line 322 rxPacket(sched_task_t *task)
|
Line 345 rxPacket(sched_task_t *task)
|
TASK_ARG(task), ts, TASK_ARG(task), 0); |
TASK_ARG(task), ts, TASK_ARG(task), 0); |
#endif |
#endif |
|
|
|
/* prepare rx */ |
|
len = recv(TASK_FD(task), b, sizeof b, MSG_PEEK); |
|
if (len == sizeof b) |
|
rlen = ntohl(((struct tagRPCCall*) b)->call_len); |
|
|
rlen = recv(TASK_FD(task), buf, rlen, 0); |
rlen = recv(TASK_FD(task), buf, rlen, 0); |
if (rlen == -1) { |
if (rlen == -1) { |
/* close connection */ |
/* close connection */ |
Line 333 rxPacket(sched_task_t *task)
|
Line 361 rxPacket(sched_task_t *task)
|
rpc_SetErr(ERPCMISMATCH, "Short RPC packet"); |
rpc_SetErr(ERPCMISMATCH, "Short RPC packet"); |
|
|
rpc->call_argc ^= rpc->call_argc; |
rpc->call_argc ^= rpc->call_argc; |
rpc->call_rep.ret = RPC_ERROR(-1); | RPC_SET_RETURN(rpc, -1); |
rpc->call_rep.eno = RPC_ERROR(errno); | RPC_SET_ERRNO(rpc, rpc_Errno); |
goto err; |
goto err; |
} else |
} else |
len = ntohl(rpc->call_len); |
len = ntohl(rpc->call_len); |
Line 342 rxPacket(sched_task_t *task)
|
Line 370 rxPacket(sched_task_t *task)
|
rpc_SetErr(ERPCMISMATCH, "Short RPC packet"); |
rpc_SetErr(ERPCMISMATCH, "Short RPC packet"); |
|
|
rpc->call_argc ^= rpc->call_argc; |
rpc->call_argc ^= rpc->call_argc; |
rpc->call_rep.ret = RPC_ERROR(-1); | RPC_SET_RETURN(rpc, -1); |
rpc->call_rep.eno = RPC_ERROR(errno); | RPC_SET_ERRNO(rpc, rpc_Errno); |
goto err; |
goto err; |
} |
} |
|
|
Line 361 rxPacket(sched_task_t *task)
|
Line 389 rxPacket(sched_task_t *task)
|
rpc_SetErr(ERPCMISMATCH, "Bad CRC RPC packet"); |
rpc_SetErr(ERPCMISMATCH, "Bad CRC RPC packet"); |
|
|
rpc->call_argc ^= rpc->call_argc; |
rpc->call_argc ^= rpc->call_argc; |
rpc->call_rep.ret = RPC_ERROR(-1); | RPC_SET_RETURN(rpc, -1); |
rpc->call_rep.eno = RPC_ERROR(errno); | RPC_SET_ERRNO(rpc, rpc_Errno); |
goto err; |
goto err; |
} |
} |
#endif |
#endif |
Line 372 rxPacket(sched_task_t *task)
|
Line 400 rxPacket(sched_task_t *task)
|
rpc_SetErr(ERPCMISMATCH, "Get invalid RPC session"); |
rpc_SetErr(ERPCMISMATCH, "Get invalid RPC session"); |
|
|
rpc->call_argc ^= rpc->call_argc; |
rpc->call_argc ^= rpc->call_argc; |
rpc->call_rep.ret = RPC_ERROR(-1); | RPC_SET_RETURN(rpc, -1); |
rpc->call_rep.eno = RPC_ERROR(errno); | RPC_SET_ERRNO(rpc, rpc_Errno); |
goto err; |
goto err; |
} |
} |
|
|
Line 458 txUDPPacket(sched_task_t *task)
|
Line 486 txUDPPacket(sched_task_t *task)
|
rpc_SetErr(EPROGUNAVAIL, "Function not found at RPC server"); |
rpc_SetErr(EPROGUNAVAIL, "Function not found at RPC server"); |
|
|
rpc->call_argc ^= rpc->call_argc; |
rpc->call_argc ^= rpc->call_argc; |
rpc->call_rep.ret = RPC_ERROR(-1); | RPC_SET_RETURN(rpc, -1); |
rpc->call_rep.eno = RPC_ERROR(rpc_Errno); | RPC_SET_ERRNO(rpc, rpc_Errno); |
} else if (rpc_pktFreeSpace(c) > s->srv_netbuf) { |
} else if (rpc_pktFreeSpace(c) > s->srv_netbuf) { |
rpc_SetErr(EMSGSIZE, "Message too long"); |
rpc_SetErr(EMSGSIZE, "Message too long"); |
|
|
rpc->call_argc ^= rpc->call_argc; |
rpc->call_argc ^= rpc->call_argc; |
rpc->call_rep.ret = RPC_ERROR(-1); | RPC_SET_RETURN(rpc, -1); |
rpc->call_rep.eno = RPC_ERROR(rpc_Errno); | RPC_SET_ERRNO(rpc, rpc_Errno); |
} else { |
} else { |
rpc->call_argc = (u_char) array_Size(RPC_RETVARS(c)); |
rpc->call_argc = (u_char) array_Size(RPC_RETVARS(c)); |
/* Go Encapsulate variables */ |
/* Go Encapsulate variables */ |
Line 475 txUDPPacket(sched_task_t *task)
|
Line 503 txUDPPacket(sched_task_t *task)
|
rpc_SetErr(EBADRPC, "Prepare RPC packet failed"); |
rpc_SetErr(EBADRPC, "Prepare RPC packet failed"); |
|
|
rpc->call_argc ^= rpc->call_argc; |
rpc->call_argc ^= rpc->call_argc; |
rpc->call_rep.ret = RPC_ERROR(-1); | RPC_SET_RETURN(rpc, -1); |
rpc->call_rep.eno = RPC_ERROR(rpc_Errno); | RPC_SET_ERRNO(rpc, rpc_Errno); |
} else |
} else |
wlen += ret; |
wlen += ret; |
} |
} |
Line 598 txRAWPacket(sched_task_t *task)
|
Line 626 txRAWPacket(sched_task_t *task)
|
rpc_SetErr(EPROGUNAVAIL, "Function not found at RPC server"); |
rpc_SetErr(EPROGUNAVAIL, "Function not found at RPC server"); |
|
|
rpc->call_argc ^= rpc->call_argc; |
rpc->call_argc ^= rpc->call_argc; |
rpc->call_rep.ret = RPC_ERROR(-1); | RPC_SET_RETURN(rpc, -1); |
rpc->call_rep.eno = RPC_ERROR(rpc_Errno); | RPC_SET_ERRNO(rpc, rpc_Errno); |
} else if (rpc_pktFreeSpace(c) > s->srv_netbuf) { |
} else if (rpc_pktFreeSpace(c) > s->srv_netbuf) { |
rpc_SetErr(EMSGSIZE, "Message too long"); |
rpc_SetErr(EMSGSIZE, "Message too long"); |
|
|
rpc->call_argc ^= rpc->call_argc; |
rpc->call_argc ^= rpc->call_argc; |
rpc->call_rep.ret = RPC_ERROR(-1); | RPC_SET_RETURN(rpc, -1); |
rpc->call_rep.eno = RPC_ERROR(rpc_Errno); | RPC_SET_ERRNO(rpc, rpc_Errno); |
} else { |
} else { |
rpc->call_argc = (u_char) array_Size(RPC_RETVARS(c)); |
rpc->call_argc = (u_char) array_Size(RPC_RETVARS(c)); |
/* Go Encapsulate variables */ |
/* Go Encapsulate variables */ |
Line 613 txRAWPacket(sched_task_t *task)
|
Line 641 txRAWPacket(sched_task_t *task)
|
RPC_RETVARS(c)); |
RPC_RETVARS(c)); |
if (ret == -1) { |
if (ret == -1) { |
rpc_SetErr(EBADRPC, "Prepare RPC packet failed"); |
rpc_SetErr(EBADRPC, "Prepare RPC packet failed"); |
|
|
rpc->call_argc ^= rpc->call_argc; |
rpc->call_argc ^= rpc->call_argc; |
rpc->call_rep.ret = RPC_ERROR(-1); | RPC_SET_RETURN(rpc, -1); |
rpc->call_rep.eno = RPC_ERROR(rpc_Errno); | RPC_SET_ERRNO(rpc, rpc_Errno); |
} else |
} else |
wlen += ret; |
wlen += ret; |
} |
} |
Line 758 txBPFPacket(sched_task_t *task)
|
Line 787 txBPFPacket(sched_task_t *task)
|
rpc_SetErr(EPROGUNAVAIL, "Function not found at RPC server"); |
rpc_SetErr(EPROGUNAVAIL, "Function not found at RPC server"); |
|
|
rpc->call_argc ^= rpc->call_argc; |
rpc->call_argc ^= rpc->call_argc; |
rpc->call_rep.ret = RPC_ERROR(-1); | RPC_SET_RETURN(rpc, -1); |
rpc->call_rep.eno = RPC_ERROR(rpc_Errno); | RPC_SET_ERRNO(rpc, rpc_Errno); |
} else if (rpc_pktFreeSpace(c) > s->srv_netbuf) { |
} else if (rpc_pktFreeSpace(c) > s->srv_netbuf) { |
rpc_SetErr(EMSGSIZE, "Message too long"); |
rpc_SetErr(EMSGSIZE, "Message too long"); |
|
|
rpc->call_argc ^= rpc->call_argc; |
rpc->call_argc ^= rpc->call_argc; |
rpc->call_rep.ret = RPC_ERROR(-1); | RPC_SET_RETURN(rpc, -1); |
rpc->call_rep.eno = RPC_ERROR(rpc_Errno); | RPC_SET_ERRNO(rpc, rpc_Errno); |
} else { |
} else { |
rpc->call_argc = (u_char) array_Size(RPC_RETVARS(c)); |
rpc->call_argc = (u_char) array_Size(RPC_RETVARS(c)); |
/* Go Encapsulate variables */ |
/* Go Encapsulate variables */ |
Line 775 txBPFPacket(sched_task_t *task)
|
Line 804 txBPFPacket(sched_task_t *task)
|
rpc_SetErr(EBADRPC, "Prepare RPC packet failed"); |
rpc_SetErr(EBADRPC, "Prepare RPC packet failed"); |
|
|
rpc->call_argc ^= rpc->call_argc; |
rpc->call_argc ^= rpc->call_argc; |
rpc->call_rep.ret = RPC_ERROR(-1); | RPC_SET_RETURN(rpc, -1); |
rpc->call_rep.eno = RPC_ERROR(rpc_Errno); | RPC_SET_ERRNO(rpc, rpc_Errno); |
} else |
} else |
wlen += ret; |
wlen += ret; |
} |
} |
Line 921 txEXTPacket(sched_task_t *task)
|
Line 950 txEXTPacket(sched_task_t *task)
|
rpc_SetErr(EPROGUNAVAIL, "Function not found at RPC server"); |
rpc_SetErr(EPROGUNAVAIL, "Function not found at RPC server"); |
|
|
rpc->call_argc ^= rpc->call_argc; |
rpc->call_argc ^= rpc->call_argc; |
rpc->call_rep.ret = RPC_ERROR(-1); | RPC_SET_RETURN(rpc, -1); |
rpc->call_rep.eno = RPC_ERROR(rpc_Errno); | RPC_SET_ERRNO(rpc, rpc_Errno); |
} else if (rpc_pktFreeSpace(c) > s->srv_netbuf) { |
} else if (rpc_pktFreeSpace(c) > s->srv_netbuf) { |
rpc_SetErr(EMSGSIZE, "Message too long"); |
rpc_SetErr(EMSGSIZE, "Message too long"); |
|
|
rpc->call_argc ^= rpc->call_argc; |
rpc->call_argc ^= rpc->call_argc; |
rpc->call_rep.ret = RPC_ERROR(-1); | RPC_SET_RETURN(rpc, -1); |
rpc->call_rep.eno = RPC_ERROR(rpc_Errno); | RPC_SET_ERRNO(rpc, rpc_Errno); |
} else { |
} else { |
rpc->call_argc = (u_char) array_Size(RPC_RETVARS(c)); |
rpc->call_argc = (u_char) array_Size(RPC_RETVARS(c)); |
/* Go Encapsulate variables */ |
/* Go Encapsulate variables */ |
Line 938 txEXTPacket(sched_task_t *task)
|
Line 967 txEXTPacket(sched_task_t *task)
|
rpc_SetErr(EBADRPC, "Prepare RPC packet failed"); |
rpc_SetErr(EBADRPC, "Prepare RPC packet failed"); |
|
|
rpc->call_argc ^= rpc->call_argc; |
rpc->call_argc ^= rpc->call_argc; |
rpc->call_rep.ret = RPC_ERROR(-1); | RPC_SET_RETURN(rpc, -1); |
rpc->call_rep.eno = RPC_ERROR(rpc_Errno); | RPC_SET_ERRNO(rpc, rpc_Errno); |
} else |
} else |
wlen += ret; |
wlen += ret; |
} |
} |
Line 1111 rxBLOB(sched_task_t *task)
|
Line 1140 rxBLOB(sched_task_t *task)
|
if (!(b = rpc_srv_getBLOB(s, ntohl(blob.hdr_var)))) { |
if (!(b = rpc_srv_getBLOB(s, ntohl(blob.hdr_var)))) { |
rpc_SetErr(EINVAL, "Var=%x not found", ntohl(blob.hdr_var)); |
rpc_SetErr(EINVAL, "Var=%x not found", ntohl(blob.hdr_var)); |
blob.hdr_cmd = no; |
blob.hdr_cmd = no; |
blob.hdr_ret = RPC_ERROR(-1); | RPC_SET_BLOB_RET(&blob, -1); |
break; |
break; |
} else |
} else |
blob.hdr_len = htonl(b->blob_len); |
blob.hdr_len = htonl(b->blob_len); |
Line 1122 rxBLOB(sched_task_t *task)
|
Line 1151 rxBLOB(sched_task_t *task)
|
rpc_srv_blobUnmap(b); |
rpc_srv_blobUnmap(b); |
} else { |
} else { |
blob.hdr_cmd = error; |
blob.hdr_cmd = error; |
blob.hdr_ret = RPC_ERROR(-1); | RPC_SET_BLOB_RET(&blob, -1); |
} |
} |
break; |
break; |
case set: |
case set: |
Line 1136 rxBLOB(sched_task_t *task)
|
Line 1165 rxBLOB(sched_task_t *task)
|
rpc_srv_blobUnmap(b); |
rpc_srv_blobUnmap(b); |
} else { |
} else { |
blob.hdr_cmd = error; |
blob.hdr_cmd = error; |
blob.hdr_ret = RPC_ERROR(-1); | RPC_SET_BLOB_RET(&blob, -1); |
} |
} |
break; |
break; |
case unset: |
case unset: |
if (rpc_srv_unregisterBLOB(s, ntohl(blob.hdr_var)) == -1) { |
if (rpc_srv_unregisterBLOB(s, ntohl(blob.hdr_var)) == -1) { |
blob.hdr_cmd = error; |
blob.hdr_cmd = error; |
blob.hdr_ret = RPC_ERROR(-1); | RPC_SET_BLOB_RET(&blob, -1); |
} |
} |
break; |
break; |
default: |
default: |
rpc_SetErr(EPROCUNAVAIL, "Unsupported BLOB command %d", blob.hdr_cmd); |
rpc_SetErr(EPROCUNAVAIL, "Unsupported BLOB command %d", blob.hdr_cmd); |
blob.hdr_cmd = error; |
blob.hdr_cmd = error; |
blob.hdr_ret = RPC_ERROR(-1); | RPC_SET_BLOB_RET(&blob, -1); |
} |
} |
|
|
end: |
end: |