projects
/
swifty.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
First step for using multiple recvs from mptp.
[swifty.git]
/
src
/
libswift
/
channel.cpp
diff --git
a/src/libswift/channel.cpp
b/src/libswift/channel.cpp
index
5313095
..
e06d83f
100644
(file)
--- a/
src/libswift/channel.cpp
+++ b/
src/libswift/channel.cpp
@@
-253,29
+253,36
@@
Address swift::BoundAddress(evutil_socket_t sock) {
}
}
-int Channel::SendTo (evutil_socket_t sock, const Address& addr, struct evbuffer *evb) {
+int Channel::SendTo (evutil_socket_t sock, const Address& addr, struct evbuffer *
*
evb) {
- int length = evbuffer_get_length(evb);
- int addr_len = sizeof(struct sockaddr_mptp) + addr.addr->count * sizeof(struct mptp_dest);
- struct iovec iov[1];
+ int count = addr.addr->count;
+ int addr_len = sizeof(struct sockaddr_mptp) + count * sizeof(struct mptp_dest);
+ struct iovec iov[count];
+ int lengths[count];
struct msghdr msg;
memset(&msg, 0, sizeof(msg));
memset(&iov, 0, sizeof(iov));
struct msghdr msg;
memset(&msg, 0, sizeof(msg));
memset(&iov, 0, sizeof(iov));
- iov[0].iov_base = evbuffer_pullup(evb, length);
- iov[0].iov_len = length;
+ for (int i=0; i<count; ++i) {
+ lengths[i] = evbuffer_get_length(evb[i]);
+ iov[i].iov_base = evbuffer_pullup(evb[i], lengths[i]);
+ iov[i].iov_len = lengths[i];
+ }
msg.msg_iov = iov;
msg.msg_iov = iov;
- msg.msg_iovlen =
1
;
+ msg.msg_iovlen =
count
;
msg.msg_name = addr.addr;
msg.msg_namelen = addr_len;
int r = sendmsg(sock, &msg, 0);
if (r<0) {
print_error("can't send");
msg.msg_name = addr.addr;
msg.msg_namelen = addr_len;
int r = sendmsg(sock, &msg, 0);
if (r<0) {
print_error("can't send");
- evbuffer_drain(evb, length); // Arno: behaviour is to pretend the packet got lost
+ for (int i=0; i<count; ++i)
+ evbuffer_drain(evb[i], lengths[i]); // Arno: behaviour is to pretend the packet got lost
}
else
}
else
- evbuffer_drain(evb,r);
- global_dgrams_up++;
- global_raw_bytes_up+=length;
+ for (int i=0; i<count; ++i)
+ evbuffer_drain(evb[i], addr.addr->dests[i].bytes);
+ global_dgrams_up+=count;
+ for (int i=0; i<count; ++i)
+ global_raw_bytes_up+=lengths[i];
Time();
return r;
}
Time();
return r;
}
@@
-322,11
+329,7
@@
int Channel::RecvFrom (evutil_socket_t sock, Address& addr, struct evbuffer **ev
print_error("error on recv");
}
length = 0;
print_error("error on recv");
}
length = 0;
- printf("Received from %d addresses in one system call.\n", addr.addr->count);
for (int i=0; i<addr.addr->count; ++i) {
for (int i=0; i<addr.addr->count; ++i) {
- struct in_addr aux;
- aux.s_addr = addr.addr->dests[i].addr;
- printf("Received from %s, %d bytes\n", inet_ntoa(aux), addr.addr->dests[i].bytes);
length += addr.addr->dests[i].bytes;
vec[i].iov_len = addr.addr->dests[i].bytes;
if (evbuffer_commit_space(evb[i], &vec[i], 1) < 0) {
length += addr.addr->dests[i].bytes;
vec[i].iov_len = addr.addr->dests[i].bytes;
if (evbuffer_commit_space(evb[i], &vec[i], 1) < 0) {