Skip to content

Commit

Permalink
Enable testing without root privileges
Browse files Browse the repository at this point in the history
If /proc/sys/net/core/[rw]mem_max are set to at least 8388608
(KNET_RING_RCVBUFF), the tests don't need root privileges.
  • Loading branch information
wferi committed Nov 22, 2017
1 parent e3c6d11 commit 6d5f983
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 28 deletions.
1 change: 0 additions & 1 deletion libknet/tests/test-common.c
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,6 @@ int need_root(void)
{
if (geteuid() != 0) {
printf("This test requires root privileges\n");
exit(SKIP);
}

return PASS;
Expand Down
66 changes: 39 additions & 27 deletions libknet/transport_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -69,10 +69,44 @@ int _sendmmsg(int sockfd, struct knet_mmsghdr *msgvec, unsigned int vlen, unsign
return ((i > 0) ? (int)i : err);
}

static int _configure_sockbuf (int sock, int option, int value)
{
#ifdef SO_RCVBUFFORCE
int forceopt;

switch (option) {
case SO_RCVBUF:
forceopt = SO_RCVBUFFORCE;
break;
case SO_SNDBUF:
forceopt = SO_SNDBUFFORCE;
break;
default:
return -1;
}
if (setsockopt(sock, SOL_SOCKET, forceopt, &value, sizeof value) < 0) {
if (errno == EPERM) {
#endif
int new_value;
socklen_t value_len = sizeof new_value;

if (setsockopt(sock, SOL_SOCKET, option, &value, sizeof value) < 0 ||
getsockopt(sock, SOL_SOCKET, option, &new_value, &value_len) < 0 ||
value_len != sizeof new_value || new_value < value) {
return -1;
}
#ifdef SO_RCVBUFFORCE
} else {
return -1;
}
}
#endif
return 0;
}

int _configure_common_socket(knet_handle_t knet_h, int sock, uint64_t flags, const char *type)
{
int err = 0, savederrno = 0;
int value;

if (_fdset_cloexec(sock)) {
savederrno = errno;
Expand All @@ -90,47 +124,25 @@ int _configure_common_socket(knet_handle_t knet_h, int sock, uint64_t flags, con
goto exit_error;
}

value = KNET_RING_RCVBUFF;
#ifdef SO_RCVBUFFORCE
if (setsockopt(sock, SOL_SOCKET, SO_RCVBUFFORCE, &value, sizeof(value)) < 0) {
if (_configure_sockbuf (sock, SO_RCVBUF, 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;
}
#else
if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, &value, sizeof(value)) < 0) {
savederrno = errno;
err = -1;
log_err(knet_h, KNET_SUB_TRANSPORT, "Unable to set %s SO_RECVBUF: %s",
type, strerror(savederrno));
goto exit_error;
}
#endif

value = KNET_RING_RCVBUFF;
#ifdef SO_SNDBUFFORCE
if (setsockopt(sock, SOL_SOCKET, SO_SNDBUFFORCE, &value, sizeof(value)) < 0) {
if (_configure_sockbuf (sock, SO_SNDBUF, KNET_RING_RCVBUFF)) {
savederrno = errno;
err = -1;
log_err(knet_h, KNET_SUB_TRANSPORT, "Unable to set %s send buffer: %s",
type, strerror(savederrno));
goto exit_error;
}
#else
if (setsockopt(sock, SOL_SOCKET, SO_SNDBUF, &value, sizeof(value)) < 0) {
savederrno = errno;
err = -1;
log_err(knet_h, KNET_SUB_TRANSPORT, "Unable to set %s SO_SNDBUF: %s",
type, strerror(savederrno));
goto exit_error;
}
#endif

#ifdef SO_PRIORITY
if (flags & KNET_LINK_FLAG_TRAFFICHIPRIO) {
value = 6; /* TC_PRIO_INTERACTIVE */
int value = 6; /* TC_PRIO_INTERACTIVE */
if (setsockopt(sock, SOL_SOCKET, SO_PRIORITY, &value, sizeof(value)) < 0) {
savederrno = errno;
err = -1;
Expand All @@ -142,7 +154,7 @@ int _configure_common_socket(knet_handle_t knet_h, int sock, uint64_t flags, con
#endif
#if defined(IP_TOS) && defined(IPTOS_LOWDELAY)
if (flags & KNET_LINK_FLAG_TRAFFICHIPRIO) {
value = IPTOS_LOWDELAY;
int value = IPTOS_LOWDELAY;
if (setsockopt(sock, IPPROTO_IP, IP_TOS, &value, sizeof(value)) < 0) {
savederrno = errno;
err = -1;
Expand Down

0 comments on commit 6d5f983

Please sign in to comment.