Skip to content

Commit

Permalink
Unify the rcv and snd buffer operations
Browse files Browse the repository at this point in the history
  • Loading branch information
wferi committed Nov 23, 2017
1 parent d3cdc11 commit 5ed221e
Showing 1 changed file with 15 additions and 28 deletions.
43 changes: 15 additions & 28 deletions libknet/transport_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -69,44 +69,31 @@ int _sendmmsg(int sockfd, struct knet_mmsghdr *msgvec, unsigned int vlen, unsign
return ((i > 0) ? (int)i : err);
}

static int _configure_rcvbuf (int sock, int value)
{
int new_value;
socklen_t value_len = sizeof new_value;

if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, &value, sizeof value) == 0 &&
getsockopt(sock, SOL_SOCKET, SO_RCVBUF, &new_value, &value_len) == 0) {
if (value_len == sizeof new_value && new_value == 2*value) {
return 0;
}
errno = EINVAL;
}

#ifdef SO_RCVBUFFORCE
return setsockopt(sock, SOL_SOCKET, SO_RCVBUFFORCE, &value, sizeof value);
#else
return -1;
#ifndef SO_RCVBUFFORCE
#define SO_RCVBUFFORCE 0
#endif
#ifndef SO_SNDBUFFORCE
#define SO_SNDBUFFORCE 0
#endif
}

static int _configure_sndbuf (int sock, int value)
static int _configure_sockbuf (int sock, int option, int force, int value)
{
int new_value;
socklen_t value_len = sizeof new_value;

if (setsockopt(sock, SOL_SOCKET, SO_SNDBUF, &value, sizeof value) == 0 &&
getsockopt(sock, SOL_SOCKET, SO_SNDBUF, &new_value, &value_len) == 0) {
if (setsockopt(sock, SOL_SOCKET, option, &value, sizeof value) == 0 &&
getsockopt(sock, SOL_SOCKET, option, &new_value, &value_len) == 0) {
if (value_len == sizeof new_value && new_value == 2*value) {
return 0;
}
errno = EINVAL;
}

#ifdef SO_SNDBUFFORCE
return setsockopt(sock, SOL_SOCKET, SO_SNDBUFFORCE, &value, sizeof value);
#else
return -1;
#endif
if (force) {
return setsockopt(sock, SOL_SOCKET, force, &value, sizeof value);
} else {
return -1;
}
}

int _configure_common_socket(knet_handle_t knet_h, int sock, uint64_t flags, const char *type)
Expand All @@ -129,15 +116,15 @@ int _configure_common_socket(knet_handle_t knet_h, int sock, uint64_t flags, con
goto exit_error;
}

if (_configure_rcvbuf (sock, KNET_RING_RCVBUFF)) {
if (_configure_sockbuf (sock, SO_RCVBUF, SO_RCVBUFFORCE, KNET_RING_RCVBUFF)) {
savederrno = errno;
err = -1;
log_err(knet_h, KNET_SUB_TRANSPORT, "Unable to set %s receive buffer: %s",
type, strerror(savederrno));
goto exit_error;
}

if (_configure_sndbuf (sock, KNET_RING_RCVBUFF)) {
if (_configure_sockbuf (sock, SO_SNDBUF, SO_SNDBUFFORCE, KNET_RING_RCVBUFF)) {
savederrno = errno;
err = -1;
log_err(knet_h, KNET_SUB_TRANSPORT, "Unable to set %s send buffer: %s",
Expand Down

0 comments on commit 5ed221e

Please sign in to comment.