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 17, 2024
1 parent b5eb475 commit 7f873fd
Showing 1 changed file with 27 additions and 0 deletions.
27 changes: 27 additions & 0 deletions tools/testing/selftests/bpf/network_helpers.c
Original file line number Diff line number Diff line change
Expand Up @@ -597,9 +597,12 @@ struct send_recv_arg {
static void *send_recv_server(void *arg)
{
struct send_recv_arg *a = (struct send_recv_arg *)arg;
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 @@ -615,6 +618,17 @@ 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)
Expand Down Expand Up @@ -644,6 +658,7 @@ static void *send_recv_server(void *arg)

int send_recv_data(int lfd, int fd, uint32_t total_bytes)
{
struct timeval timeout = { .tv_sec = 3 };
ssize_t nr_recv = 0, bytes = 0;
struct send_recv_arg arg = {
.fd = lfd,
Expand All @@ -653,7 +668,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 @@ -663,6 +680,16 @@ 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)
Expand Down

0 comments on commit 7f873fd

Please sign in to comment.