version 1.16.2.1, 2015/01/15 20:39:11
|
version 1.17.2.2, 2015/05/18 14:50:12
|
Line 147 rpc_addPktSession(rpc_sess_t *p, rpc_sess_t *s)
|
Line 147 rpc_addPktSession(rpc_sess_t *p, rpc_sess_t *s)
|
* @type = type of socket |
* @type = type of socket |
* @flags = receive flags |
* @flags = receive flags |
* @sa = check client address, if you use udp protocol |
* @sa = check client address, if you use udp protocol |
* @buf = buffer | * @pkt = RPC packet |
* @blen = buffer length | |
* return: -1 error, 0 EOF or or >0 readed bytes into buffer |
* return: -1 error, 0 EOF or or >0 readed bytes into buffer |
*/ |
*/ |
ssize_t |
ssize_t |
rpc_Read(int sock, int type, int flags, sockaddr_t * __restrict sa, | rpc_Read(int sock, int type, int flags, sockaddr_t * __restrict sa, ait_val_t * __restrict pkt) |
u_char * __restrict buf, size_t blen) | |
{ |
{ |
struct pollfd pfd; |
struct pollfd pfd; |
sockaddr_t sa2; |
sockaddr_t sa2; |
socklen_t salen; |
socklen_t salen; |
int ret = 0, len, cx = 0; | int ret = 0, len, hlen, cx = 0; |
ait_val_t v = AIT_VAL_INIT; |
ait_val_t v = AIT_VAL_INIT; |
struct ether_header *eh; |
struct ether_header *eh; |
struct bpf_hdr *h; |
struct bpf_hdr *h; |
ether_addr_t bcst = {{ [0 ... sizeof bcst - 1] = 0xff }}; |
ether_addr_t bcst = {{ [0 ... sizeof bcst - 1] = 0xff }}; |
|
u_char *buf = AIT_GET_BUF(pkt); |
|
size_t blen = AIT_LEN(pkt); |
|
struct tagRPCCall *rpc = (struct tagRPCCall *) buf; |
|
|
if (type == SOCK_BPF && sa) { |
if (type == SOCK_BPF && sa) { |
AIT_SET_BUF(&v, NULL, blen); |
AIT_SET_BUF(&v, NULL, blen); |
Line 176 rpc_Read(int sock, int type, int flags, sockaddr_t * _
|
Line 177 rpc_Read(int sock, int type, int flags, sockaddr_t * _
|
salen = sa2.ss.ss_len = sizeof(sockaddr_t); |
salen = sa2.ss.ss_len = sizeof(sockaddr_t); |
|
|
for (len = blen; len > 0; len -= ret, buf += ret) { |
for (len = blen; len > 0; len -= ret, buf += ret) { |
|
printf("%s_0. buf=%p len=%d\n", __func__, buf, len); |
if ((ret = poll(&pfd, 1, DEF_RPC_TIMEOUT * 1000)) < 1 || |
if ((ret = poll(&pfd, 1, DEF_RPC_TIMEOUT * 1000)) < 1 || |
pfd.revents & (POLLERR | POLLHUP | POLLNVAL)) { |
pfd.revents & (POLLERR | POLLHUP | POLLNVAL)) { |
if (ret) |
if (ret) |
Line 188 rpc_Read(int sock, int type, int flags, sockaddr_t * _
|
Line 190 rpc_Read(int sock, int type, int flags, sockaddr_t * _
|
} |
} |
if (type == SOCK_STREAM) |
if (type == SOCK_STREAM) |
ret = recv(sock, buf, len, flags); |
ret = recv(sock, buf, len, flags); |
|
else if (type == SOCK_EXT) |
|
ret = read(sock, buf, len); |
else if (type == SOCK_BPF && sa) { |
else if (type == SOCK_BPF && sa) { |
ret = read(sock, AIT_GET_BUF(&v), AIT_LEN(&v)); |
ret = read(sock, AIT_GET_BUF(&v), AIT_LEN(&v)); |
if (ret > 0) { |
if (ret > 0) { |
Line 216 rpc_Read(int sock, int type, int flags, sockaddr_t * _
|
Line 220 rpc_Read(int sock, int type, int flags, sockaddr_t * _
|
return -1; |
return -1; |
} |
} |
} |
} |
#if 0 | |
else | |
e_getlinkbymac((const ether_addr_t*) eh->ether_shost, &sa2); | |
if (sa && e_addrcmp(sa, &sa2, 0)) { | |
#else | |
if (!memcmp(bcst.octet, eh->ether_dhost, sizeof bcst) || |
if (!memcmp(bcst.octet, eh->ether_dhost, sizeof bcst) || |
!memcmp(bcst.octet, eh->ether_shost, sizeof bcst)) { |
!memcmp(bcst.octet, eh->ether_shost, sizeof bcst)) { |
#endif |
|
if (cx < 3) { |
if (cx < 3) { |
cx++; |
cx++; |
ret ^= ret; |
ret ^= ret; |
Line 240 rpc_Read(int sock, int type, int flags, sockaddr_t * _
|
Line 239 rpc_Read(int sock, int type, int flags, sockaddr_t * _
|
} else { |
} else { |
ret = recvfrom(sock, buf, len, flags, &sa2.sa, &salen); |
ret = recvfrom(sock, buf, len, flags, &sa2.sa, &salen); |
if (ret > -1 && sa && e_addrcmp(sa, &sa2, 42)) { |
if (ret > -1 && sa && e_addrcmp(sa, &sa2, 42)) { |
ret ^= ret; | if (cx < 3) { |
continue; /* wait for known address */ | cx++; |
| ret ^= ret; |
| continue; /* wait for known address */ |
| } else |
| return -1; |
} |
} |
} |
} |
if (ret == -1) { | if (ret < 0) { |
LOGERR; |
LOGERR; |
if (type == SOCK_BPF) |
if (type == SOCK_BPF) |
AIT_FREE_VAL(&v); |
AIT_FREE_VAL(&v); |
Line 255 rpc_Read(int sock, int type, int flags, sockaddr_t * _
|
Line 258 rpc_Read(int sock, int type, int flags, sockaddr_t * _
|
AIT_FREE_VAL(&v); |
AIT_FREE_VAL(&v); |
return 0; |
return 0; |
} |
} |
|
|
|
/* check RPC packet header */ |
|
if ((u_char*) rpc == buf) { |
|
if (type == SOCK_RAW) { |
|
printf("raw: ret=%d\n", ret); |
|
hlen = sa->sa.sa_family == AF_INET ? sizeof(struct ip) : sizeof(struct ip6_hdr); |
|
ret -= hlen; |
|
printf("raw-cx: ret=%d\n", ret); |
|
if (ret > 0) |
|
memmove(buf, buf + hlen, blen - hlen); |
|
printf("%s ret=%d call_io=0x%x call_len=%d call_seq=%u\n", __func__, ret, rpc->call_io, ntohl(rpc->call_len), ntohl(rpc->call_seq)); |
|
fflush(stdout); |
|
} |
|
|
|
/* 1st read for RPC header */ |
|
if (ret < sizeof(struct tagRPCCall)) { |
|
rpc_SetErr(ERPCMISMATCH, "Short RPC packet %d bytes", ret); |
|
if (type == SOCK_BPF) |
|
AIT_FREE_VAL(&v); |
|
return -1; |
|
} |
|
/* check for loop request */ |
|
if (!(rpc->call_io & RPC_ACK)) { |
|
ret ^= ret; |
|
continue; |
|
} |
|
/* calc estimated length */ |
|
blen = len = ntohl(rpc->call_len); |
|
printf("blen=%d len=%d ret=%d\n", blen, len, ret); |
|
if (blen > AIT_LEN(pkt)) { |
|
AIT_RE_BUF(pkt, blen); |
|
buf = AIT_GET_BUF(pkt); |
|
rpc = (struct tagRPCCall*) buf; |
|
} |
|
} |
} |
} |
ret = blen - len; |
ret = blen - len; |
|
|
if (type == SOCK_BPF) |
if (type == SOCK_BPF) |
AIT_FREE_VAL(&v); |
AIT_FREE_VAL(&v); |
|
printf("exit from %s with ret=%d\n", __func__, ret); |
return ret; |
return ret; |
} |
} |
|
|
Line 270 rpc_Read(int sock, int type, int flags, sockaddr_t * _
|
Line 309 rpc_Read(int sock, int type, int flags, sockaddr_t * _
|
* @type = type of socket |
* @type = type of socket |
* @flags = send flags |
* @flags = send flags |
* @sa = send to client address, if you use udp protocol |
* @sa = send to client address, if you use udp protocol |
* @buf = buffer | * @pkt = RPC packet |
* @blen = buffer length |
* @blen = buffer length |
* return: -1 error, 0 EOF or >0 written bytes into buffer |
* return: -1 error, 0 EOF or >0 written bytes into buffer |
*/ |
*/ |
ssize_t |
ssize_t |
rpc_Write(int sock, int type, int flags, sockaddr_t * __restrict sa, |
rpc_Write(int sock, int type, int flags, sockaddr_t * __restrict sa, |
u_char * __restrict buf, size_t blen) | ait_val_t * __restrict pkt, size_t blen) |
{ |
{ |
struct pollfd pfd; |
struct pollfd pfd; |
int ret = 0, len = 0; |
int ret = 0, len = 0; |
ait_val_t v = AIT_VAL_INIT; |
ait_val_t v = AIT_VAL_INIT; |
struct ether_header *eh; |
struct ether_header *eh; |
|
u_char *buf = AIT_GET_BUF(pkt); |
|
|
if (type == SOCK_BPF && sa) { |
if (type == SOCK_BPF && sa) { |
AIT_SET_BUF(&v, NULL, blen + sizeof(struct ether_header)); |
AIT_SET_BUF(&v, NULL, blen + sizeof(struct ether_header)); |
Line 311 rpc_Write(int sock, int type, int flags, sockaddr_t *
|
Line 351 rpc_Write(int sock, int type, int flags, sockaddr_t *
|
} |
} |
if (type == SOCK_STREAM) |
if (type == SOCK_STREAM) |
ret = send(sock, buf, len, flags); |
ret = send(sock, buf, len, flags); |
|
else if (type == SOCK_EXT) |
|
ret = write(sock, buf, len); |
else if (type == SOCK_BPF && sa) { |
else if (type == SOCK_BPF && sa) { |
ret = write(sock, AIT_GET_BUF(&v), AIT_LEN(&v)); |
ret = write(sock, AIT_GET_BUF(&v), AIT_LEN(&v)); |
} else if (sa) |
} else if (sa) |
Line 321 rpc_Write(int sock, int type, int flags, sockaddr_t *
|
Line 363 rpc_Write(int sock, int type, int flags, sockaddr_t *
|
AIT_FREE_VAL(&v); |
AIT_FREE_VAL(&v); |
return -1; |
return -1; |
} |
} |
if (ret == -1) { | if (ret < 0) { |
LOGERR; |
LOGERR; |
if (type == SOCK_BPF) |
if (type == SOCK_BPF) |
AIT_FREE_VAL(&v); |
AIT_FREE_VAL(&v); |