Skip to content

Commit

Permalink
selftests/bpf: Add select for send_recv_data
Browse files Browse the repository at this point in the history
Some tests, such as the MPTCP bpf tests, require send_recv_data helper
to run in nonblock mode.

This patch adds nonblock support for send_recv_data(). Check if it is
currently in nonblock mode, and if so, ignore EWOULDBLOCK to continue
sending and receiving.

Signed-off-by: Geliang Tang <[email protected]>
  • Loading branch information
Geliang Tang committed Apr 19, 2024
1 parent b63e8ad commit dccfc0d
Showing 1 changed file with 27 additions and 6 deletions.
33 changes: 27 additions & 6 deletions tools/testing/selftests/bpf/network_helpers.c
Original file line number Diff line number Diff line change
Expand Up @@ -609,10 +609,12 @@ struct send_recv_arg {
static void *send_recv_server(void *arg)
{
struct send_recv_arg *a = (struct send_recv_arg *)arg;
int flags = fcntl(a->fd, F_GETFL);
struct timeval timeout = { .tv_sec = 3 };
ssize_t nr_sent = 0, bytes = 0;
char batch[1500];
int err = 0, fd;
fd_set wset;
int max_fd;

fd = accept(a->fd, NULL, NULL);
while (fd == -1) {
Expand All @@ -628,13 +630,22 @@ static void *send_recv_server(void *arg)
}

while (bytes < a->bytes && !READ_ONCE(a->stop)) {
/* FD sets */
FD_ZERO(&wset);
FD_SET(fd, &wset);
max_fd = fd;

if (select(max_fd + 1, NULL, &wset, NULL, &timeout) == -1) {
log_err("Failed to select");
err = -1;
break;
}

nr_sent = send(fd, &batch,
MIN(a->bytes - bytes, sizeof(batch)), 0);
if (nr_sent == -1 && errno == EINTR)
continue;
if (nr_sent == -1) {
if (flags & O_NONBLOCK && errno == EWOULDBLOCK)
continue;
err = -errno;
break;
}
Expand All @@ -659,7 +670,7 @@ static void *send_recv_server(void *arg)

int send_recv_data(int lfd, int fd, uint32_t total_bytes)
{
int flags = fcntl(lfd, F_GETFL);
struct timeval timeout = { .tv_sec = 3 };
ssize_t nr_recv = 0, bytes = 0;
struct send_recv_arg arg = {
.fd = lfd,
Expand All @@ -669,7 +680,9 @@ int send_recv_data(int lfd, int fd, uint32_t total_bytes)
pthread_t srv_thread;
void *thread_ret;
char batch[1500];
int max_fd = fd;
int err = 0;
fd_set rset;

err = pthread_create(&srv_thread, NULL, send_recv_server, (void *)&arg);
if (err) {
Expand All @@ -679,13 +692,21 @@ int send_recv_data(int lfd, int fd, uint32_t total_bytes)

/* recv total_bytes */
while (bytes < total_bytes && !READ_ONCE(arg.stop)) {
/* FD sets */
FD_ZERO(&rset);
FD_SET(fd, &rset);

if (select(max_fd + 1, &rset, NULL, NULL, &timeout) == -1) {
log_err("Failed to select");
err = -1;
break;
}

nr_recv = recv(fd, &batch,
MIN(total_bytes - bytes, sizeof(batch)), 0);
if (nr_recv == -1 && errno == EINTR)
continue;
if (nr_recv == -1) {
if (flags & O_NONBLOCK && errno == EWOULDBLOCK)
continue;
err = -errno;
break;
}
Expand Down

0 comments on commit dccfc0d

Please sign in to comment.