* [RESEND PATCH liburing v1 00/12] Introducing t_bind_ephemeral_port() function
@ 2022-09-02 1:17 Ammar Faizi
2022-09-02 1:17 ` [RESEND PATCH liburing v1 01/12] test/helpers: Add `t_bind_ephemeral_port()` function Ammar Faizi
` (12 more replies)
0 siblings, 13 replies; 21+ messages in thread
From: Ammar Faizi @ 2022-09-02 1:17 UTC (permalink / raw)
To: Jens Axboe
Cc: Ammar Faizi, Dylan Yudaken, Facebook Kernel Team, Pavel Begunkov,
io-uring Mailing List, GNU/Weeb Mailing List, Kanna Scarlet,
Muhammad Rizki
From: Ammar Faizi <[email protected]>
[ RESEND to the correct address now. ]
Hi,
After discussing an intermittent bind() issue with Dylan, I decided to
introduce a new helper function, t_bind_ephemeral_port().
## Problem:
We have many places where we need to bind() a socket to any unused port
number. To achieve that, the current approach does one of the following
mechanisms:
1) Randomly brute force the port number until the bind() syscall
succeeds.
2) Use a static port at compile time (randomly chosen too).
This is not reliable and it results in an intermittent issue (test
fails when the selected port is in use).
## Solution:
Setting @addr->sin_port to zero on a bind() syscall lets the kernel
choose a port number that is not in use. The caller then can know the
port number to be bound by invoking a getsockname() syscall after
bind() succeeds.
Wrap this procedure in a new function called t_bind_ephemeral_port().
The selected port will be returned into @addr->sin_port, the caller
can use it later to connect() or whatever they need.
## Patchset summary:
There are 12 patches in this series, summary:
1) Patch #1 introduces a new helper function t_bind_ephemeral_port().
2) Patch #2 to #6 get rid of the port number brute force mechanism.
3) Patch #7 to #12 stop using a static port number.
Link: https://lore.kernel.org/r/[email protected]
Cc: Dylan Yudaken <[email protected]>
Cc: Facebook Kernel Team <[email protected]>
Cc: Pavel Begunkov <[email protected]>
Signed-off-by: Ammar Faizi <[email protected]>
---
Ammar Faizi (12):
test/helpers: Add `t_bind_ephemeral_port()` function
t/poll-link: Don't brute force the port number
t/socket-rw: Don't brute force the port number
t/socket-rw-eagain: Don't brute force the port number
t/socket-rw-offset: Don't brute force the port number
t/files-exit-hang-poll: Don't brute force the port number
t/socket: Don't use a static port number
t/connect: Don't use a static port number
t/shutdown: Don't use a static port number
t/recv-msgall: Don't use a static port number
t/232c93d07b74: Don't use a static port number
t/recv-msgall-stream: Don't use a static port number
test/232c93d07b74.c | 10 ++++------
test/accept.c | 5 +----
test/files-exit-hang-poll.c | 23 +++--------------------
test/helpers.c | 18 ++++++++++++++++++
test/helpers.h | 7 +++++++
test/poll-link.c | 20 ++++++--------------
test/recv-msgall-stream.c | 22 ++++++++++------------
test/recv-msgall.c | 10 ++++------
test/shutdown.c | 7 +++----
test/socket-rw-eagain.c | 14 ++------------
test/socket-rw-offset.c | 13 ++-----------
test/socket-rw.c | 13 ++-----------
test/socket.c | 11 ++++++-----
13 files changed, 68 insertions(+), 105 deletions(-)
base-commit: b8c37f02662faa4f2b61840b123201ccc5678fb1
--
Ammar Faizi
^ permalink raw reply [flat|nested] 21+ messages in thread
* [RESEND PATCH liburing v1 01/12] test/helpers: Add `t_bind_ephemeral_port()` function
2022-09-02 1:17 [RESEND PATCH liburing v1 00/12] Introducing t_bind_ephemeral_port() function Ammar Faizi
@ 2022-09-02 1:17 ` Ammar Faizi
2022-09-02 5:56 ` Alviro Iskandar Setiawan
2022-09-02 1:17 ` [RESEND PATCH liburing v1 02/12] t/poll-link: Don't brute force the port number Ammar Faizi
` (11 subsequent siblings)
12 siblings, 1 reply; 21+ messages in thread
From: Ammar Faizi @ 2022-09-02 1:17 UTC (permalink / raw)
To: Jens Axboe
Cc: Ammar Faizi, Dylan Yudaken, Facebook Kernel Team, Pavel Begunkov,
io-uring Mailing List, GNU/Weeb Mailing List, Kanna Scarlet,
Muhammad Rizki
From: Ammar Faizi <[email protected]>
This is a prep patch to fix an intermittent issue with the port number.
We have many places where we need to bind() a socket to any unused port
number. To achieve that, the current approach does one of the following
mechanisms:
1) Randomly brute force the port number until the bind() syscall
succeeds.
2) Use a static port at compile time (randomly chosen too).
This is not reliable and it results in an intermittent issue (test
fails when the selected port is in use).
Setting @addr->sin_port to zero on a bind() syscall lets the kernel
choose a port number that is not in use. The caller then can know the
port number to be bound by invoking a getsockname() syscall after
bind() succeeds.
Wrap this procedure in a new function called t_bind_ephemeral_port().
The selected port will be returned into @addr->sin_port, the caller
can use it later to connect() or whatever they need.
Link: https://lore.kernel.org/r/[email protected]
Cc: Dylan Yudaken <[email protected]>
Cc: Facebook Kernel Team <[email protected]>
Cc: Pavel Begunkov <[email protected]>
Signed-off-by: Ammar Faizi <[email protected]>
---
test/helpers.c | 18 ++++++++++++++++++
test/helpers.h | 7 +++++++
2 files changed, 25 insertions(+)
diff --git a/test/helpers.c b/test/helpers.c
index 0146533..4d5c402 100644
--- a/test/helpers.c
+++ b/test/helpers.c
@@ -19,24 +19,42 @@
/*
* Helper for allocating memory in tests.
*/
void *t_malloc(size_t size)
{
void *ret;
ret = malloc(size);
assert(ret);
return ret;
}
+/*
+ * Helper for binding socket to an ephemeral port.
+ * The port number to be bound is returned in @addr->sin_port.
+ */
+int t_bind_ephemeral_port(int fd, struct sockaddr_in *addr)
+{
+ socklen_t addrlen;
+
+ addr->sin_port = 0;
+ if (bind(fd, (struct sockaddr *)addr, sizeof(*addr)))
+ return -errno;
+
+ addrlen = sizeof(*addr);
+ assert(!getsockname(fd, (struct sockaddr *)addr, &addrlen));
+ assert(addr->sin_port != 0);
+ return 0;
+}
+
/*
* Helper for allocating size bytes aligned on a boundary.
*/
void t_posix_memalign(void **memptr, size_t alignment, size_t size)
{
int ret;
ret = posix_memalign(memptr, alignment, size);
assert(!ret);
}
/*
* Helper for allocating space for an array of nmemb elements
diff --git a/test/helpers.h b/test/helpers.h
index 6d5726c..9ad9947 100644
--- a/test/helpers.h
+++ b/test/helpers.h
@@ -13,24 +13,31 @@ extern "C" {
enum t_setup_ret {
T_SETUP_OK = 0,
T_SETUP_SKIP,
};
enum t_test_result {
T_EXIT_PASS = 0,
T_EXIT_FAIL = 1,
T_EXIT_SKIP = 77,
};
+/*
+ * Helper for binding socket to an ephemeral port.
+ * The port number to be bound is returned in @addr->sin_port.
+ */
+int t_bind_ephemeral_port(int fd, struct sockaddr_in *addr);
+
+
/*
* Helper for allocating memory in tests.
*/
void *t_malloc(size_t size);
/*
* Helper for allocating size bytes aligned on a boundary.
*/
void t_posix_memalign(void **memptr, size_t alignment, size_t size);
--
Ammar Faizi
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [RESEND PATCH liburing v1 02/12] t/poll-link: Don't brute force the port number
2022-09-02 1:17 [RESEND PATCH liburing v1 00/12] Introducing t_bind_ephemeral_port() function Ammar Faizi
2022-09-02 1:17 ` [RESEND PATCH liburing v1 01/12] test/helpers: Add `t_bind_ephemeral_port()` function Ammar Faizi
@ 2022-09-02 1:17 ` Ammar Faizi
2022-09-02 6:04 ` Alviro Iskandar Setiawan
2022-09-02 1:17 ` [RESEND PATCH liburing v1 03/12] t/socket-rw: " Ammar Faizi
` (10 subsequent siblings)
12 siblings, 1 reply; 21+ messages in thread
From: Ammar Faizi @ 2022-09-02 1:17 UTC (permalink / raw)
To: Jens Axboe
Cc: Ammar Faizi, Dylan Yudaken, Facebook Kernel Team, Pavel Begunkov,
io-uring Mailing List, GNU/Weeb Mailing List, Kanna Scarlet,
Muhammad Rizki
From: Ammar Faizi <[email protected]>
Don't brute force the port number, use `t_bind_ephemeral_port()`,
much simpler and reliable for choosing a port number that is not
in use.
Cc: Dylan Yudaken <[email protected]>
Cc: Facebook Kernel Team <[email protected]>
Cc: Pavel Begunkov <[email protected]>
Signed-off-by: Ammar Faizi <[email protected]>
---
test/poll-link.c | 20 ++++++--------------
1 file changed, 6 insertions(+), 14 deletions(-)
diff --git a/test/poll-link.c b/test/poll-link.c
index 197ad77..a6fe0de 100644
--- a/test/poll-link.c
+++ b/test/poll-link.c
@@ -4,24 +4,25 @@
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <assert.h>
#include <pthread.h>
#include <sys/socket.h>
#include <netinet/tcp.h>
#include <netinet/in.h>
#include <poll.h>
#include <arpa/inet.h>
+#include "helpers.h"
#include "liburing.h"
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
static int recv_thread_ready = 0;
static int recv_thread_done = 0;
static void signal_var(int *var)
{
pthread_mutex_lock(&mutex);
*var = 1;
@@ -80,45 +81,37 @@ void *recv_thread(void *arg)
ret = io_uring_queue_init(8, &ring, 0);
assert(ret == 0);
int s0 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
assert(s0 != -1);
int32_t val = 1;
ret = setsockopt(s0, SOL_SOCKET, SO_REUSEPORT, &val, sizeof(val));
assert(ret != -1);
ret = setsockopt(s0, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
assert(ret != -1);
- struct sockaddr_in addr;
+ struct sockaddr_in addr = { };
addr.sin_family = AF_INET;
data->addr = inet_addr("127.0.0.1");
addr.sin_addr.s_addr = data->addr;
- i = 0;
- do {
- data->port = htons(1025 + (rand() % 64510));
- addr.sin_port = data->port;
-
- if (bind(s0, (struct sockaddr*)&addr, sizeof(addr)) != -1)
- break;
- } while (++i < 100);
-
- if (i >= 100) {
- fprintf(stderr, "Can't find good port, skipped\n");
+ if (t_bind_ephemeral_port(s0, &addr)) {
+ perror("bind");
data->stop = 1;
signal_var(&recv_thread_ready);
- goto out;
+ goto err;
}
+ data->port = addr.sin_port;
ret = listen(s0, 128);
assert(ret != -1);
signal_var(&recv_thread_ready);
sqe = io_uring_get_sqe(&ring);
assert(sqe != NULL);
io_uring_prep_poll_add(sqe, s0, POLLIN | POLLHUP | POLLERR);
sqe->flags |= IOSQE_IO_LINK;
sqe->user_data = 1;
@@ -149,25 +142,24 @@ void *recv_thread(void *arg)
(uint64_t) cqe->user_data, cqe->res,
data->expected[idx]);
goto err;
} else if (!data->is_mask[idx] && cqe->res != data->expected[idx]) {
fprintf(stderr, "cqe %" PRIu64 " got %d, wanted %d\n",
(uint64_t) cqe->user_data, cqe->res,
data->expected[idx]);
goto err;
}
io_uring_cqe_seen(&ring, cqe);
}
-out:
signal_var(&recv_thread_done);
close(s0);
io_uring_queue_exit(&ring);
return NULL;
err:
signal_var(&recv_thread_done);
close(s0);
io_uring_queue_exit(&ring);
return (void *) 1;
}
static int test_poll_timeout(int do_connect, unsigned long timeout)
--
Ammar Faizi
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [RESEND PATCH liburing v1 03/12] t/socket-rw: Don't brute force the port number
2022-09-02 1:17 [RESEND PATCH liburing v1 00/12] Introducing t_bind_ephemeral_port() function Ammar Faizi
2022-09-02 1:17 ` [RESEND PATCH liburing v1 01/12] test/helpers: Add `t_bind_ephemeral_port()` function Ammar Faizi
2022-09-02 1:17 ` [RESEND PATCH liburing v1 02/12] t/poll-link: Don't brute force the port number Ammar Faizi
@ 2022-09-02 1:17 ` Ammar Faizi
2022-09-02 6:07 ` Alviro Iskandar Setiawan
2022-09-02 1:17 ` [RESEND PATCH liburing v1 04/12] t/socket-rw-eagain: " Ammar Faizi
` (9 subsequent siblings)
12 siblings, 1 reply; 21+ messages in thread
From: Ammar Faizi @ 2022-09-02 1:17 UTC (permalink / raw)
To: Jens Axboe
Cc: Ammar Faizi, Dylan Yudaken, Facebook Kernel Team, Pavel Begunkov,
io-uring Mailing List, GNU/Weeb Mailing List, Kanna Scarlet,
Muhammad Rizki
From: Ammar Faizi <[email protected]>
Don't brute force the port number, use `t_bind_ephemeral_port()`,
much simpler and reliable for choosing a port number that is not
in use.
Cc: Dylan Yudaken <[email protected]>
Cc: Facebook Kernel Team <[email protected]>
Cc: Pavel Begunkov <[email protected]>
Signed-off-by: Ammar Faizi <[email protected]>
---
test/socket-rw.c | 13 ++-----------
1 file changed, 2 insertions(+), 11 deletions(-)
diff --git a/test/socket-rw.c b/test/socket-rw.c
index 4fbf032..6211b01 100644
--- a/test/socket-rw.c
+++ b/test/socket-rw.c
@@ -11,58 +11,49 @@
#include <assert.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <netinet/tcp.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "liburing.h"
+#include "helpers.h"
int main(int argc, char *argv[])
{
int p_fd[2], ret;
int32_t recv_s0;
int32_t val = 1;
struct sockaddr_in addr;
struct iovec iov_r[1], iov_w[1];
if (argc > 1)
return 0;
srand(getpid());
recv_s0 = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
ret = setsockopt(recv_s0, SOL_SOCKET, SO_REUSEPORT, &val, sizeof(val));
assert(ret != -1);
ret = setsockopt(recv_s0, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
assert(ret != -1);
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
-
- do {
- addr.sin_port = htons((rand() % 61440) + 4096);
- ret = bind(recv_s0, (struct sockaddr*)&addr, sizeof(addr));
- if (!ret)
- break;
- if (errno != EADDRINUSE) {
- perror("bind");
- exit(1);
- }
- } while (1);
+ assert(!t_bind_ephemeral_port(recv_s0, &addr));
ret = listen(recv_s0, 128);
assert(ret != -1);
p_fd[1] = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
val = 1;
ret = setsockopt(p_fd[1], IPPROTO_TCP, TCP_NODELAY, &val, sizeof(val));
assert(ret != -1);
int32_t flags = fcntl(p_fd[1], F_GETFL, 0);
assert(flags != -1);
--
Ammar Faizi
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [RESEND PATCH liburing v1 04/12] t/socket-rw-eagain: Don't brute force the port number
2022-09-02 1:17 [RESEND PATCH liburing v1 00/12] Introducing t_bind_ephemeral_port() function Ammar Faizi
` (2 preceding siblings ...)
2022-09-02 1:17 ` [RESEND PATCH liburing v1 03/12] t/socket-rw: " Ammar Faizi
@ 2022-09-02 1:17 ` Ammar Faizi
2022-09-02 6:08 ` Alviro Iskandar Setiawan
2022-09-02 1:17 ` [RESEND PATCH liburing v1 05/12] t/socket-rw-offset: " Ammar Faizi
` (8 subsequent siblings)
12 siblings, 1 reply; 21+ messages in thread
From: Ammar Faizi @ 2022-09-02 1:17 UTC (permalink / raw)
To: Jens Axboe
Cc: Ammar Faizi, Dylan Yudaken, Facebook Kernel Team, Pavel Begunkov,
io-uring Mailing List, GNU/Weeb Mailing List, Kanna Scarlet,
Muhammad Rizki
From: Ammar Faizi <[email protected]>
Don't brute force the port number, use `t_bind_ephemeral_port()`,
much simpler and reliable for choosing a port number that is not
in use.
Cc: Dylan Yudaken <[email protected]>
Cc: Facebook Kernel Team <[email protected]>
Cc: Pavel Begunkov <[email protected]>
Signed-off-by: Ammar Faizi <[email protected]>
---
test/socket-rw-eagain.c | 14 ++------------
1 file changed, 2 insertions(+), 12 deletions(-)
diff --git a/test/socket-rw-eagain.c b/test/socket-rw-eagain.c
index 2d6a817..a12c70d 100644
--- a/test/socket-rw-eagain.c
+++ b/test/socket-rw-eagain.c
@@ -9,59 +9,49 @@
#include <assert.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <netinet/tcp.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "liburing.h"
+#include "helpers.h"
int main(int argc, char *argv[])
{
int p_fd[2], ret;
int32_t recv_s0;
int32_t val = 1;
struct sockaddr_in addr;
struct iovec iov_r[1], iov_w[1];
if (argc > 1)
return 0;
srand(getpid());
recv_s0 = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
ret = setsockopt(recv_s0, SOL_SOCKET, SO_REUSEPORT, &val, sizeof(val));
assert(ret != -1);
ret = setsockopt(recv_s0, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
assert(ret != -1);
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
-
- do {
- addr.sin_port = htons((rand() % 61440) + 4096);
- ret = bind(recv_s0, (struct sockaddr*)&addr, sizeof(addr));
- if (!ret)
- break;
- if (errno != EADDRINUSE) {
- perror("bind");
- exit(1);
- }
- } while (1);
-
+ assert(!t_bind_ephemeral_port(recv_s0, &addr));
ret = listen(recv_s0, 128);
assert(ret != -1);
p_fd[1] = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
val = 1;
ret = setsockopt(p_fd[1], IPPROTO_TCP, TCP_NODELAY, &val, sizeof(val));
assert(ret != -1);
int32_t flags = fcntl(p_fd[1], F_GETFL, 0);
assert(flags != -1);
--
Ammar Faizi
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [RESEND PATCH liburing v1 05/12] t/socket-rw-offset: Don't brute force the port number
2022-09-02 1:17 [RESEND PATCH liburing v1 00/12] Introducing t_bind_ephemeral_port() function Ammar Faizi
` (3 preceding siblings ...)
2022-09-02 1:17 ` [RESEND PATCH liburing v1 04/12] t/socket-rw-eagain: " Ammar Faizi
@ 2022-09-02 1:17 ` Ammar Faizi
2022-09-02 6:17 ` Alviro Iskandar Setiawan
2022-09-02 1:17 ` [RESEND PATCH liburing v1 06/12] t/files-exit-hang-poll: " Ammar Faizi
` (7 subsequent siblings)
12 siblings, 1 reply; 21+ messages in thread
From: Ammar Faizi @ 2022-09-02 1:17 UTC (permalink / raw)
To: Jens Axboe
Cc: Ammar Faizi, Dylan Yudaken, Facebook Kernel Team, Pavel Begunkov,
io-uring Mailing List, GNU/Weeb Mailing List, Kanna Scarlet,
Muhammad Rizki
From: Ammar Faizi <[email protected]>
Don't brute force the port number, use `t_bind_ephemeral_port()`,
much simpler and reliable for choosing a port number that is not
in use.
Cc: Dylan Yudaken <[email protected]>
Cc: Facebook Kernel Team <[email protected]>
Cc: Pavel Begunkov <[email protected]>
Signed-off-by: Ammar Faizi <[email protected]>
---
test/socket-rw-offset.c | 13 ++-----------
1 file changed, 2 insertions(+), 11 deletions(-)
diff --git a/test/socket-rw-offset.c b/test/socket-rw-offset.c
index 987b6c9..c422442 100644
--- a/test/socket-rw-offset.c
+++ b/test/socket-rw-offset.c
@@ -11,58 +11,49 @@
#include <assert.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <netinet/tcp.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "liburing.h"
+#include "helpers.h"
int main(int argc, char *argv[])
{
int p_fd[2], ret;
int32_t recv_s0;
int32_t val = 1;
struct sockaddr_in addr;
struct iovec iov_r[1], iov_w[1];
if (argc > 1)
return 0;
srand(getpid());
recv_s0 = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
ret = setsockopt(recv_s0, SOL_SOCKET, SO_REUSEPORT, &val, sizeof(val));
assert(ret != -1);
ret = setsockopt(recv_s0, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
assert(ret != -1);
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
-
- do {
- addr.sin_port = htons((rand() % 61440) + 4096);
- ret = bind(recv_s0, (struct sockaddr*)&addr, sizeof(addr));
- if (!ret)
- break;
- if (errno != EADDRINUSE) {
- perror("bind");
- exit(1);
- }
- } while (1);
+ assert(!t_bind_ephemeral_port(recv_s0, &addr));
ret = listen(recv_s0, 128);
assert(ret != -1);
p_fd[1] = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
val = 1;
ret = setsockopt(p_fd[1], IPPROTO_TCP, TCP_NODELAY, &val, sizeof(val));
assert(ret != -1);
int32_t flags = fcntl(p_fd[1], F_GETFL, 0);
assert(flags != -1);
--
Ammar Faizi
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [RESEND PATCH liburing v1 06/12] t/files-exit-hang-poll: Don't brute force the port number
2022-09-02 1:17 [RESEND PATCH liburing v1 00/12] Introducing t_bind_ephemeral_port() function Ammar Faizi
` (4 preceding siblings ...)
2022-09-02 1:17 ` [RESEND PATCH liburing v1 05/12] t/socket-rw-offset: " Ammar Faizi
@ 2022-09-02 1:17 ` Ammar Faizi
2022-09-02 6:20 ` Alviro Iskandar Setiawan
2022-09-02 1:17 ` [RESEND PATCH liburing v1 07/12] t/socket: Don't use a static " Ammar Faizi
` (6 subsequent siblings)
12 siblings, 1 reply; 21+ messages in thread
From: Ammar Faizi @ 2022-09-02 1:17 UTC (permalink / raw)
To: Jens Axboe
Cc: Ammar Faizi, Dylan Yudaken, Facebook Kernel Team, Pavel Begunkov,
io-uring Mailing List, GNU/Weeb Mailing List, Kanna Scarlet,
Muhammad Rizki
From: Ammar Faizi <[email protected]>
Don't brute force the port number, use `t_bind_ephemeral_port()`,
much simpler and reliable for choosing a port number that is not
in use.
Cc: Dylan Yudaken <[email protected]>
Cc: Facebook Kernel Team <[email protected]>
Cc: Pavel Begunkov <[email protected]>
Signed-off-by: Ammar Faizi <[email protected]>
---
test/files-exit-hang-poll.c | 23 +++--------------------
1 file changed, 3 insertions(+), 20 deletions(-)
diff --git a/test/files-exit-hang-poll.c b/test/files-exit-hang-poll.c
index 0c609f1..04febc8 100644
--- a/test/files-exit-hang-poll.c
+++ b/test/files-exit-hang-poll.c
@@ -10,26 +10,24 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <sys/socket.h>
#include <unistd.h>
#include <poll.h>
#include "liburing.h"
#include "helpers.h"
#define BACKLOG 512
-#define PORT 9100
-
static struct io_uring ring;
static void add_poll(struct io_uring *ring, int fd)
{
struct io_uring_sqe *sqe;
sqe = io_uring_get_sqe(ring);
io_uring_prep_poll_add(sqe, fd, POLLIN);
sqe->flags |= IOSQE_IO_LINK;
}
static void add_accept(struct io_uring *ring, int fd)
@@ -55,55 +53,43 @@ static int setup_io_uring(void)
static void alarm_sig(int sig)
{
exit(0);
}
int main(int argc, char *argv[])
{
struct sockaddr_in serv_addr;
struct io_uring_cqe *cqe;
int ret, sock_listen_fd;
const int val = 1;
- int i;
if (argc > 1)
return T_EXIT_SKIP;
sock_listen_fd = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0);
if (sock_listen_fd < 0) {
perror("socket");
return T_EXIT_FAIL;
}
setsockopt(sock_listen_fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
- for (i = 0; i < 100; i++) {
- serv_addr.sin_port = htons(PORT + i);
-
- ret = bind(sock_listen_fd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
- if (!ret)
- break;
- if (errno != EADDRINUSE) {
- fprintf(stderr, "bind: %s\n", strerror(errno));
- return T_EXIT_FAIL;
- }
- if (i == 99) {
- printf("Gave up on finding a port, skipping\n");
- goto skip;
- }
+ if (t_bind_ephemeral_port(sock_listen_fd, &serv_addr)) {
+ perror("bind");
+ return T_EXIT_FAIL;
}
if (listen(sock_listen_fd, BACKLOG) < 0) {
perror("Error listening on socket\n");
return T_EXIT_FAIL;
}
if (setup_io_uring())
return T_EXIT_FAIL;
add_poll(&ring, sock_listen_fd);
add_accept(&ring, sock_listen_fd);
@@ -116,16 +102,13 @@ int main(int argc, char *argv[])
signal(SIGALRM, alarm_sig);
alarm(1);
ret = io_uring_wait_cqe(&ring, &cqe);
if (ret) {
fprintf(stderr, "wait_cqe=%d\n", ret);
return T_EXIT_FAIL;
}
io_uring_queue_exit(&ring);
return T_EXIT_PASS;
-skip:
- io_uring_queue_exit(&ring);
- return T_EXIT_SKIP;
}
--
Ammar Faizi
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [RESEND PATCH liburing v1 07/12] t/socket: Don't use a static port number
2022-09-02 1:17 [RESEND PATCH liburing v1 00/12] Introducing t_bind_ephemeral_port() function Ammar Faizi
` (5 preceding siblings ...)
2022-09-02 1:17 ` [RESEND PATCH liburing v1 06/12] t/files-exit-hang-poll: " Ammar Faizi
@ 2022-09-02 1:17 ` Ammar Faizi
2022-09-02 1:17 ` [RESEND PATCH liburing v1 08/12] t/connect: " Ammar Faizi
` (5 subsequent siblings)
12 siblings, 0 replies; 21+ messages in thread
From: Ammar Faizi @ 2022-09-02 1:17 UTC (permalink / raw)
To: Jens Axboe
Cc: Ammar Faizi, Dylan Yudaken, Facebook Kernel Team, Pavel Begunkov,
io-uring Mailing List, GNU/Weeb Mailing List, Kanna Scarlet,
Muhammad Rizki
From: Ammar Faizi <[email protected]>
Don't use a static port number. It might already be in use, resulting
in a test failure. Use an ephemeral port to make this test reliable.
Cc: Dylan Yudaken <[email protected]>
Cc: Facebook Kernel Team <[email protected]>
Cc: Pavel Begunkov <[email protected]>
Signed-off-by: Ammar Faizi <[email protected]>
---
test/socket.c | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/test/socket.c b/test/socket.c
index 6a3ea09..94c8e9f 100644
--- a/test/socket.c
+++ b/test/socket.c
@@ -2,63 +2,63 @@
/*
* Simple test case using the socket op
*/
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <pthread.h>
+#include <assert.h>
#include "liburing.h"
#include "helpers.h"
static char str[] = "This is a test of send and recv over io_uring!";
#define MAX_MSG 128
-#define PORT 10202
#define HOST "127.0.0.1"
static int no_socket;
+static __be32 g_port;
static int recv_prep(struct io_uring *ring, struct iovec *iov, int *sock,
int registerfiles)
{
struct sockaddr_in saddr;
struct io_uring_sqe *sqe;
int sockfd, ret, val, use_fd;
memset(&saddr, 0, sizeof(saddr));
saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr = htonl(INADDR_ANY);
- saddr.sin_port = htons(PORT);
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0) {
perror("socket");
return 1;
}
val = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
- ret = bind(sockfd, (struct sockaddr *)&saddr, sizeof(saddr));
- if (ret < 0) {
+ if (t_bind_ephemeral_port(sockfd, &saddr)) {
perror("bind");
goto err;
}
+ g_port = saddr.sin_port;
if (registerfiles) {
ret = io_uring_register_files(ring, &sockfd, 1);
if (ret) {
fprintf(stderr, "file reg failed\n");
goto err;
}
use_fd = 0;
} else {
use_fd = sockfd;
}
@@ -235,27 +235,28 @@ static int do_send(int socket_direct, int alloc)
fprintf(stderr, "queue init failed: %d\n", ret);
return 1;
}
if (socket_direct) {
ret = io_uring_register_files(&ring, &fd, 1);
if (ret) {
fprintf(stderr, "file register %d\n", ret);
return 1;
}
}
+ assert(g_port != 0);
memset(&saddr, 0, sizeof(saddr));
saddr.sin_family = AF_INET;
- saddr.sin_port = htons(PORT);
+ saddr.sin_port = g_port;
inet_pton(AF_INET, HOST, &saddr.sin_addr);
sqe = io_uring_get_sqe(&ring);
if (socket_direct) {
unsigned file_index = 0;
if (alloc)
file_index = IORING_FILE_INDEX_ALLOC - 1;
io_uring_prep_socket_direct(sqe, AF_INET, SOCK_DGRAM, 0,
file_index, 0);
} else {
io_uring_prep_socket(sqe, AF_INET, SOCK_DGRAM, 0, 0);
}
--
Ammar Faizi
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [RESEND PATCH liburing v1 08/12] t/connect: Don't use a static port number
2022-09-02 1:17 [RESEND PATCH liburing v1 00/12] Introducing t_bind_ephemeral_port() function Ammar Faizi
` (6 preceding siblings ...)
2022-09-02 1:17 ` [RESEND PATCH liburing v1 07/12] t/socket: Don't use a static " Ammar Faizi
@ 2022-09-02 1:17 ` Ammar Faizi
2022-09-02 1:17 ` [RESEND PATCH liburing v1 09/12] t/shutdown: " Ammar Faizi
` (4 subsequent siblings)
12 siblings, 0 replies; 21+ messages in thread
From: Ammar Faizi @ 2022-09-02 1:17 UTC (permalink / raw)
To: Jens Axboe
Cc: Ammar Faizi, Dylan Yudaken, Facebook Kernel Team, Pavel Begunkov,
io-uring Mailing List, GNU/Weeb Mailing List, Kanna Scarlet,
Muhammad Rizki
From: Ammar Faizi <[email protected]>
Don't use a static port number. It might already be in use, resulting
in a test failure. Use an ephemeral port to make this test reliable.
Cc: Dylan Yudaken <[email protected]>
Cc: Facebook Kernel Team <[email protected]>
Cc: Pavel Begunkov <[email protected]>
Signed-off-by: Ammar Faizi <[email protected]>
---
test/accept.c | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/test/accept.c b/test/accept.c
index b35ded4..1821faa 100644
--- a/test/accept.c
+++ b/test/accept.c
@@ -185,29 +185,26 @@ static int start_accept_listen(struct sockaddr_in *addr, int port_off,
int32_t val = 1;
ret = setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &val, sizeof(val));
assert(ret != -1);
ret = setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
assert(ret != -1);
struct sockaddr_in laddr;
if (!addr)
addr = &laddr;
addr->sin_family = AF_INET;
- addr->sin_port = htons(0x1235 + port_off);
addr->sin_addr.s_addr = inet_addr("127.0.0.1");
-
- ret = bind(fd, (struct sockaddr*)addr, sizeof(*addr));
- assert(ret != -1);
+ assert(!t_bind_ephemeral_port(fd, addr));
ret = listen(fd, 128);
assert(ret != -1);
return fd;
}
static int set_client_fd(struct sockaddr_in *addr)
{
int32_t val;
int fd, ret;
fd = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
--
Ammar Faizi
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [RESEND PATCH liburing v1 09/12] t/shutdown: Don't use a static port number
2022-09-02 1:17 [RESEND PATCH liburing v1 00/12] Introducing t_bind_ephemeral_port() function Ammar Faizi
` (7 preceding siblings ...)
2022-09-02 1:17 ` [RESEND PATCH liburing v1 08/12] t/connect: " Ammar Faizi
@ 2022-09-02 1:17 ` Ammar Faizi
2022-09-02 1:17 ` [RESEND PATCH liburing v1 10/12] t/recv-msgall: " Ammar Faizi
` (3 subsequent siblings)
12 siblings, 0 replies; 21+ messages in thread
From: Ammar Faizi @ 2022-09-02 1:17 UTC (permalink / raw)
To: Jens Axboe
Cc: Ammar Faizi, Dylan Yudaken, Facebook Kernel Team, Pavel Begunkov,
io-uring Mailing List, GNU/Weeb Mailing List, Kanna Scarlet,
Muhammad Rizki
From: Ammar Faizi <[email protected]>
Don't use a static port number. It might already be in use, resulting
in a test failure. Use an ephemeral port to make this test reliable.
Cc: Dylan Yudaken <[email protected]>
Cc: Facebook Kernel Team <[email protected]>
Cc: Pavel Begunkov <[email protected]>
Signed-off-by: Ammar Faizi <[email protected]>
---
test/shutdown.c | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/test/shutdown.c b/test/shutdown.c
index 14c7407..064ee36 100644
--- a/test/shutdown.c
+++ b/test/shutdown.c
@@ -10,54 +10,53 @@
#include <assert.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <netinet/tcp.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "liburing.h"
+#include "helpers.h"
static void sig_pipe(int sig)
{
}
int main(int argc, char *argv[])
{
int p_fd[2], ret;
int32_t recv_s0;
int32_t val = 1;
- struct sockaddr_in addr;
+ struct sockaddr_in addr = { };
if (argc > 1)
return 0;
srand(getpid());
recv_s0 = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
ret = setsockopt(recv_s0, SOL_SOCKET, SO_REUSEPORT, &val, sizeof(val));
assert(ret != -1);
ret = setsockopt(recv_s0, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
assert(ret != -1);
addr.sin_family = AF_INET;
- addr.sin_port = htons((rand() % 61440) + 4096);
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
- ret = bind(recv_s0, (struct sockaddr*)&addr, sizeof(addr));
- assert(ret != -1);
+ assert(!t_bind_ephemeral_port(recv_s0, &addr));
ret = listen(recv_s0, 128);
assert(ret != -1);
p_fd[1] = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
val = 1;
ret = setsockopt(p_fd[1], IPPROTO_TCP, TCP_NODELAY, &val, sizeof(val));
assert(ret != -1);
int32_t flags = fcntl(p_fd[1], F_GETFL, 0);
assert(flags != -1);
--
Ammar Faizi
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [RESEND PATCH liburing v1 10/12] t/recv-msgall: Don't use a static port number
2022-09-02 1:17 [RESEND PATCH liburing v1 00/12] Introducing t_bind_ephemeral_port() function Ammar Faizi
` (8 preceding siblings ...)
2022-09-02 1:17 ` [RESEND PATCH liburing v1 09/12] t/shutdown: " Ammar Faizi
@ 2022-09-02 1:17 ` Ammar Faizi
2022-09-02 1:17 ` [RESEND PATCH liburing v1 11/12] t/232c93d07b74: " Ammar Faizi
` (2 subsequent siblings)
12 siblings, 0 replies; 21+ messages in thread
From: Ammar Faizi @ 2022-09-02 1:17 UTC (permalink / raw)
To: Jens Axboe
Cc: Ammar Faizi, Dylan Yudaken, Facebook Kernel Team, Pavel Begunkov,
io-uring Mailing List, GNU/Weeb Mailing List, Kanna Scarlet,
Muhammad Rizki
From: Ammar Faizi <[email protected]>
Don't use a static port number. It might already be in use, resulting
in a test failure. Use an ephemeral port to make this test reliable.
Cc: Dylan Yudaken <[email protected]>
Cc: Facebook Kernel Team <[email protected]>
Cc: Pavel Begunkov <[email protected]>
Signed-off-by: Ammar Faizi <[email protected]>
---
test/recv-msgall.c | 10 ++++------
1 file changed, 4 insertions(+), 6 deletions(-)
diff --git a/test/recv-msgall.c b/test/recv-msgall.c
index a6f7cfc..ae123e4 100644
--- a/test/recv-msgall.c
+++ b/test/recv-msgall.c
@@ -7,55 +7,53 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <pthread.h>
#include "liburing.h"
#include "helpers.h"
#define MAX_MSG 128
-
-#define PORT 10201
#define HOST "127.0.0.1"
+static __be16 bind_port;
static int recv_prep(struct io_uring *ring, struct iovec *iov, int *sock,
int use_recvmsg)
{
struct sockaddr_in saddr;
struct io_uring_sqe *sqe;
int sockfd, ret, val;
struct msghdr msg = { };
memset(&saddr, 0, sizeof(saddr));
saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr = htonl(INADDR_ANY);
- saddr.sin_port = htons(PORT);
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0) {
perror("socket");
return 1;
}
val = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
- ret = bind(sockfd, (struct sockaddr *)&saddr, sizeof(saddr));
- if (ret < 0) {
+ if (t_bind_ephemeral_port(sockfd, &saddr)) {
perror("bind");
goto err;
}
+ bind_port = saddr.sin_port;
sqe = io_uring_get_sqe(ring);
if (!use_recvmsg) {
io_uring_prep_recv(sqe, sockfd, iov->iov_base, iov->iov_len,
MSG_WAITALL);
} else {
msg.msg_namelen = sizeof(struct sockaddr_in);
msg.msg_iov = iov;
msg.msg_iovlen = 1;
io_uring_prep_recvmsg(sqe, sockfd, &msg, MSG_WAITALL);
}
@@ -156,25 +154,25 @@ static int do_send(void)
ret = io_uring_queue_init(2, &ring, 0);
if (ret) {
fprintf(stderr, "queue init failed: %d\n", ret);
return 1;
}
buf = malloc(MAX_MSG * sizeof(int));
for (i = 0; i < MAX_MSG; i++)
buf[i] = i;
memset(&saddr, 0, sizeof(saddr));
saddr.sin_family = AF_INET;
- saddr.sin_port = htons(PORT);
+ saddr.sin_port = bind_port;
inet_pton(AF_INET, HOST, &saddr.sin_addr);
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0) {
perror("socket");
return 1;
}
ret = connect(sockfd, (struct sockaddr *)&saddr, sizeof(saddr));
if (ret < 0) {
perror("connect");
return 1;
--
Ammar Faizi
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [RESEND PATCH liburing v1 11/12] t/232c93d07b74: Don't use a static port number
2022-09-02 1:17 [RESEND PATCH liburing v1 00/12] Introducing t_bind_ephemeral_port() function Ammar Faizi
` (9 preceding siblings ...)
2022-09-02 1:17 ` [RESEND PATCH liburing v1 10/12] t/recv-msgall: " Ammar Faizi
@ 2022-09-02 1:17 ` Ammar Faizi
2022-09-02 1:17 ` [RESEND PATCH liburing v1 12/12] t/recv-msgall-stream: " Ammar Faizi
2022-09-02 6:35 ` [RESEND PATCH liburing v1 00/12] Introducing t_bind_ephemeral_port() function Alviro Iskandar Setiawan
12 siblings, 0 replies; 21+ messages in thread
From: Ammar Faizi @ 2022-09-02 1:17 UTC (permalink / raw)
To: Jens Axboe
Cc: Ammar Faizi, Dylan Yudaken, Facebook Kernel Team, Pavel Begunkov,
io-uring Mailing List, GNU/Weeb Mailing List, Kanna Scarlet,
Muhammad Rizki
From: Ammar Faizi <[email protected]>
Don't use a static port number. It might already be in use, resulting
in a test failure. Use an ephemeral port to make this test reliable.
Cc: Dylan Yudaken <[email protected]>
Cc: Facebook Kernel Team <[email protected]>
Cc: Pavel Begunkov <[email protected]>
Signed-off-by: Ammar Faizi <[email protected]>
---
test/232c93d07b74.c | 10 ++++------
1 file changed, 4 insertions(+), 6 deletions(-)
diff --git a/test/232c93d07b74.c b/test/232c93d07b74.c
index c99491f..74cc063 100644
--- a/test/232c93d07b74.c
+++ b/test/232c93d07b74.c
@@ -18,29 +18,28 @@
#include <sys/socket.h>
#include <sys/un.h>
#include <netinet/tcp.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "helpers.h"
#include "liburing.h"
#define RECV_BUFF_SIZE 2
#define SEND_BUFF_SIZE 3
-#define PORT 0x1234
-
struct params {
int tcp;
int non_blocking;
+ __be16 bind_port;
};
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int rcv_ready = 0;
static void set_rcv_ready(void)
{
pthread_mutex_lock(&mutex);
rcv_ready = 1;
pthread_cond_signal(&cond);
@@ -68,28 +67,27 @@ static void *rcv(void *arg)
int val = 1;
s0 = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
res = setsockopt(s0, SOL_SOCKET, SO_REUSEPORT, &val, sizeof(val));
assert(res != -1);
res = setsockopt(s0, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
assert(res != -1);
struct sockaddr_in addr;
addr.sin_family = AF_INET;
- addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
- res = bind(s0, (struct sockaddr *) &addr, sizeof(addr));
- assert(res != -1);
+ assert(t_bind_ephemeral_port(s0, &addr) == 0);
+ p->bind_port = addr.sin_port;
} else {
s0 = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
assert(s0 != -1);
struct sockaddr_un addr;
memset(&addr, 0, sizeof(addr));
addr.sun_family = AF_UNIX;
memcpy(addr.sun_path, "\0sock", 6);
res = bind(s0, (struct sockaddr *) &addr, sizeof(addr));
assert(res != -1);
}
@@ -183,25 +181,25 @@ static void *snd(void *arg)
wait_for_rcv_ready();
if (p->tcp) {
int val = 1;
s0 = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
ret = setsockopt(s0, IPPROTO_TCP, TCP_NODELAY, &val, sizeof(val));
assert(ret != -1);
struct sockaddr_in addr;
addr.sin_family = AF_INET;
- addr.sin_port = htons(PORT);
+ addr.sin_port = p->bind_port;
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
ret = connect(s0, (struct sockaddr*) &addr, sizeof(addr));
assert(ret != -1);
} else {
s0 = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
assert(s0 != -1);
struct sockaddr_un addr;
memset(&addr, 0, sizeof(addr));
addr.sun_family = AF_UNIX;
memcpy(addr.sun_path, "\0sock", 6);
--
Ammar Faizi
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [RESEND PATCH liburing v1 12/12] t/recv-msgall-stream: Don't use a static port number
2022-09-02 1:17 [RESEND PATCH liburing v1 00/12] Introducing t_bind_ephemeral_port() function Ammar Faizi
` (10 preceding siblings ...)
2022-09-02 1:17 ` [RESEND PATCH liburing v1 11/12] t/232c93d07b74: " Ammar Faizi
@ 2022-09-02 1:17 ` Ammar Faizi
2022-09-02 6:35 ` [RESEND PATCH liburing v1 00/12] Introducing t_bind_ephemeral_port() function Alviro Iskandar Setiawan
12 siblings, 0 replies; 21+ messages in thread
From: Ammar Faizi @ 2022-09-02 1:17 UTC (permalink / raw)
To: Jens Axboe
Cc: Ammar Faizi, Dylan Yudaken, Facebook Kernel Team, Pavel Begunkov,
io-uring Mailing List, GNU/Weeb Mailing List, Kanna Scarlet,
Muhammad Rizki
From: Ammar Faizi <[email protected]>
Don't use a static port number. It might already be in use, resulting
in a test failure. Use an ephemeral port to make this test reliable.
Cc: Dylan Yudaken <[email protected]>
Cc: Facebook Kernel Team <[email protected]>
Cc: Pavel Begunkov <[email protected]>
Signed-off-by: Ammar Faizi <[email protected]>
---
test/recv-msgall-stream.c | 22 ++++++++++------------
1 file changed, 10 insertions(+), 12 deletions(-)
diff --git a/test/recv-msgall-stream.c b/test/recv-msgall-stream.c
index a188cc1..65b4d22 100644
--- a/test/recv-msgall-stream.c
+++ b/test/recv-msgall-stream.c
@@ -1,67 +1,65 @@
/* SPDX-License-Identifier: MIT */
/*
* Test MSG_WAITALL for recv/recvmsg and include normal sync versions just
* for comparison.
*/
+#include <assert.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <pthread.h>
#include "liburing.h"
#include "helpers.h"
#define MAX_MSG 128
-static int port = 31200;
-
struct recv_data {
pthread_mutex_t mutex;
int use_recvmsg;
int use_sync;
- int port;
+ __be16 port;
};
static int get_conn_sock(struct recv_data *rd, int *sockout)
{
struct sockaddr_in saddr;
int sockfd, ret, val;
memset(&saddr, 0, sizeof(saddr));
saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr = htonl(INADDR_ANY);
- saddr.sin_port = htons(rd->port);
sockfd = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
if (sockfd < 0) {
perror("socket");
goto err;
}
val = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
setsockopt(sockfd, SOL_SOCKET, SO_REUSEPORT, &val, sizeof(val));
- ret = bind(sockfd, (struct sockaddr *)&saddr, sizeof(saddr));
- if (ret < 0) {
+ if (t_bind_ephemeral_port(sockfd, &saddr)) {
perror("bind");
goto err;
}
+ rd->port = saddr.sin_port;
ret = listen(sockfd, 16);
if (ret < 0) {
perror("listen");
goto err;
}
pthread_mutex_unlock(&rd->mutex);
ret = accept(sockfd, NULL, NULL);
if (ret < 0) {
perror("accept");
@@ -270,36 +268,36 @@ static int do_send(struct recv_data *rd)
int *buf;
ret = io_uring_queue_init(2, &ring, 0);
if (ret) {
fprintf(stderr, "queue init failed: %d\n", ret);
return 1;
}
buf = malloc(MAX_MSG * sizeof(int));
for (i = 0; i < MAX_MSG; i++)
buf[i] = i;
- memset(&saddr, 0, sizeof(saddr));
- saddr.sin_family = AF_INET;
- saddr.sin_port = htons(rd->port);
- inet_pton(AF_INET, "127.0.0.1", &saddr.sin_addr);
-
sockfd = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
if (sockfd < 0) {
perror("socket");
return 1;
}
pthread_mutex_lock(&rd->mutex);
+ assert(rd->port != 0);
+ memset(&saddr, 0, sizeof(saddr));
+ saddr.sin_family = AF_INET;
+ saddr.sin_port = rd->port;
+ inet_pton(AF_INET, "127.0.0.1", &saddr.sin_addr);
ret = connect(sockfd, (struct sockaddr *)&saddr, sizeof(saddr));
if (ret < 0) {
perror("connect");
return 1;
}
iov.iov_base = buf;
iov.iov_len = MAX_MSG * sizeof(int) / 2;
for (i = 0; i < 2; i++) {
sqe = io_uring_get_sqe(&ring);
io_uring_prep_send(sqe, sockfd, iov.iov_base, iov.iov_len, 0);
@@ -342,25 +340,25 @@ static int test(int use_recvmsg, int use_sync)
pthread_mutexattr_t attr;
pthread_t recv_thread;
struct recv_data rd;
int ret;
void *retval;
pthread_mutexattr_init(&attr);
pthread_mutexattr_setpshared(&attr, 1);
pthread_mutex_init(&rd.mutex, &attr);
pthread_mutex_lock(&rd.mutex);
rd.use_recvmsg = use_recvmsg;
rd.use_sync = use_sync;
- rd.port = port++;
+ rd.port = 0;
ret = pthread_create(&recv_thread, NULL, recv_fn, &rd);
if (ret) {
fprintf(stderr, "Thread create failed: %d\n", ret);
pthread_mutex_unlock(&rd.mutex);
return 1;
}
do_send(&rd);
pthread_join(recv_thread, &retval);
return (intptr_t)retval;
}
--
Ammar Faizi
^ permalink raw reply related [flat|nested] 21+ messages in thread
* Re: [RESEND PATCH liburing v1 01/12] test/helpers: Add `t_bind_ephemeral_port()` function
2022-09-02 1:17 ` [RESEND PATCH liburing v1 01/12] test/helpers: Add `t_bind_ephemeral_port()` function Ammar Faizi
@ 2022-09-02 5:56 ` Alviro Iskandar Setiawan
0 siblings, 0 replies; 21+ messages in thread
From: Alviro Iskandar Setiawan @ 2022-09-02 5:56 UTC (permalink / raw)
To: Ammar Faizi
Cc: Jens Axboe, Dylan Yudaken, Facebook Kernel Team, Pavel Begunkov,
io-uring Mailing List, GNU/Weeb Mailing List, Kanna Scarlet,
Muhammad Rizki
On Fri, Sep 2, 2022 at 8:18 AM Ammar Faizi wrote:
> From: Ammar Faizi <[email protected]>
>
> This is a prep patch to fix an intermittent issue with the port number.
>
> We have many places where we need to bind() a socket to any unused port
> number. To achieve that, the current approach does one of the following
> mechanisms:
>
> 1) Randomly brute force the port number until the bind() syscall
> succeeds.
>
> 2) Use a static port at compile time (randomly chosen too).
>
> This is not reliable and it results in an intermittent issue (test
> fails when the selected port is in use).
>
> Setting @addr->sin_port to zero on a bind() syscall lets the kernel
> choose a port number that is not in use. The caller then can know the
> port number to be bound by invoking a getsockname() syscall after
> bind() succeeds.
>
> Wrap this procedure in a new function called t_bind_ephemeral_port().
> The selected port will be returned into @addr->sin_port, the caller
> can use it later to connect() or whatever they need.
>
> Link: https://lore.kernel.org/r/[email protected]
> Cc: Dylan Yudaken <[email protected]>
> Cc: Facebook Kernel Team <[email protected]>
> Cc: Pavel Begunkov <[email protected]>
> Signed-off-by: Ammar Faizi <[email protected]>
Reviewed-by: Alviro Iskandar Setiawan <[email protected]>
tq
-- Viro
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [RESEND PATCH liburing v1 02/12] t/poll-link: Don't brute force the port number
2022-09-02 1:17 ` [RESEND PATCH liburing v1 02/12] t/poll-link: Don't brute force the port number Ammar Faizi
@ 2022-09-02 6:04 ` Alviro Iskandar Setiawan
2022-09-02 6:18 ` Ammar Faizi
0 siblings, 1 reply; 21+ messages in thread
From: Alviro Iskandar Setiawan @ 2022-09-02 6:04 UTC (permalink / raw)
To: Ammar Faizi
Cc: Jens Axboe, Dylan Yudaken, Facebook Kernel Team, Pavel Begunkov,
io-uring Mailing List, GNU/Weeb Mailing List, Kanna Scarlet,
Muhammad Rizki
On Fri, Sep 2, 2022 at 8:18 AM Ammar Faizi wrote:
> static void signal_var(int *var)
> {
> pthread_mutex_lock(&mutex);
> *var = 1;
> @@ -80,45 +81,37 @@ void *recv_thread(void *arg)
> ret = io_uring_queue_init(8, &ring, 0);
> assert(ret == 0);
>
> int s0 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
> assert(s0 != -1);
>
> int32_t val = 1;
> ret = setsockopt(s0, SOL_SOCKET, SO_REUSEPORT, &val, sizeof(val));
> assert(ret != -1);
> ret = setsockopt(s0, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
> assert(ret != -1);
>
> - struct sockaddr_in addr;
> + struct sockaddr_in addr = { };
move this variable to the top plz, with that fixed:
Reviewed-by: Alviro Iskandar Setiawan <[email protected]>
tq
-- Viro
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [RESEND PATCH liburing v1 03/12] t/socket-rw: Don't brute force the port number
2022-09-02 1:17 ` [RESEND PATCH liburing v1 03/12] t/socket-rw: " Ammar Faizi
@ 2022-09-02 6:07 ` Alviro Iskandar Setiawan
0 siblings, 0 replies; 21+ messages in thread
From: Alviro Iskandar Setiawan @ 2022-09-02 6:07 UTC (permalink / raw)
To: Ammar Faizi
Cc: Jens Axboe, Dylan Yudaken, Facebook Kernel Team, Pavel Begunkov,
io-uring Mailing List, GNU/Weeb Mailing List, Kanna Scarlet,
Muhammad Rizki
On Fri, Sep 2, 2022 at 8:18 AM Ammar Faizi wrote:
> From: Ammar Faizi <[email protected]>
>
> Don't brute force the port number, use `t_bind_ephemeral_port()`,
> much simpler and reliable for choosing a port number that is not
> in use.
>
> Cc: Dylan Yudaken <[email protected]>
> Cc: Facebook Kernel Team <[email protected]>
> Cc: Pavel Begunkov <[email protected]>
> Signed-off-by: Ammar Faizi <[email protected]>
Reviewed-by: Alviro Iskandar Setiawan <[email protected]>
tq
-- Viro
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [RESEND PATCH liburing v1 04/12] t/socket-rw-eagain: Don't brute force the port number
2022-09-02 1:17 ` [RESEND PATCH liburing v1 04/12] t/socket-rw-eagain: " Ammar Faizi
@ 2022-09-02 6:08 ` Alviro Iskandar Setiawan
0 siblings, 0 replies; 21+ messages in thread
From: Alviro Iskandar Setiawan @ 2022-09-02 6:08 UTC (permalink / raw)
To: Ammar Faizi
Cc: Jens Axboe, Dylan Yudaken, Facebook Kernel Team, Pavel Begunkov,
io-uring Mailing List, GNU/Weeb Mailing List, Kanna Scarlet,
Muhammad Rizki
On Fri, Sep 2, 2022 at 8:18 AM Ammar Faizi wrote:
> From: Ammar Faizi <[email protected]>
>
> Don't brute force the port number, use `t_bind_ephemeral_port()`,
> much simpler and reliable for choosing a port number that is not
> in use.
>
> Cc: Dylan Yudaken <[email protected]>
> Cc: Facebook Kernel Team <[email protected]>
> Cc: Pavel Begunkov <[email protected]>
> Signed-off-by: Ammar Faizi <[email protected]>
Reviewed-by: Alviro Iskandar Setiawan <[email protected]>
tq
-- Viro
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [RESEND PATCH liburing v1 05/12] t/socket-rw-offset: Don't brute force the port number
2022-09-02 1:17 ` [RESEND PATCH liburing v1 05/12] t/socket-rw-offset: " Ammar Faizi
@ 2022-09-02 6:17 ` Alviro Iskandar Setiawan
0 siblings, 0 replies; 21+ messages in thread
From: Alviro Iskandar Setiawan @ 2022-09-02 6:17 UTC (permalink / raw)
To: Ammar Faizi
Cc: Jens Axboe, Dylan Yudaken, Facebook Kernel Team, Pavel Begunkov,
io-uring Mailing List, GNU/Weeb Mailing List, Kanna Scarlet,
Muhammad Rizki
On Fri, Sep 2, 2022 at 8:18 AM Ammar Faizi wrote:
> From: Ammar Faizi <[email protected]>
>
> Don't brute force the port number, use `t_bind_ephemeral_port()`,
> much simpler and reliable for choosing a port number that is not
> in use.
>
> Cc: Dylan Yudaken <[email protected]>
> Cc: Facebook Kernel Team <[email protected]>
> Cc: Pavel Begunkov <[email protected]>
> Signed-off-by: Ammar Faizi <[email protected]>
Reviewed-by: Alviro Iskandar Setiawan <[email protected]>
tq
-- Viro
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [RESEND PATCH liburing v1 02/12] t/poll-link: Don't brute force the port number
2022-09-02 6:04 ` Alviro Iskandar Setiawan
@ 2022-09-02 6:18 ` Ammar Faizi
0 siblings, 0 replies; 21+ messages in thread
From: Ammar Faizi @ 2022-09-02 6:18 UTC (permalink / raw)
To: Alviro Iskandar Setiawan
Cc: Jens Axboe, Dylan Yudaken, Facebook Kernel Team, Pavel Begunkov,
io-uring Mailing List, GNU/Weeb Mailing List, Kanna Scarlet,
Muhammad Rizki
On 9/2/22 1:04 PM, Alviro Iskandar Setiawan wrote:
> On Fri, Sep 2, 2022 at 8:18 AM Ammar Faizi wrote:
>> static void signal_var(int *var)
>> {
>> pthread_mutex_lock(&mutex);
>> *var = 1;
>> @@ -80,45 +81,37 @@ void *recv_thread(void *arg)
>> ret = io_uring_queue_init(8, &ring, 0);
>> assert(ret == 0);
>>
>> int s0 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
>> assert(s0 != -1);
>>
>> int32_t val = 1;
>> ret = setsockopt(s0, SOL_SOCKET, SO_REUSEPORT, &val, sizeof(val));
>> assert(ret != -1);
>> ret = setsockopt(s0, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
>> assert(ret != -1);
>>
>> - struct sockaddr_in addr;
>> + struct sockaddr_in addr = { };
>
> move this variable to the top plz, with that fixed:
>
> Reviewed-by: Alviro Iskandar Setiawan <[email protected]>
Will do that in v2 revision. Thanks!
--
Ammar Faizi
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [RESEND PATCH liburing v1 06/12] t/files-exit-hang-poll: Don't brute force the port number
2022-09-02 1:17 ` [RESEND PATCH liburing v1 06/12] t/files-exit-hang-poll: " Ammar Faizi
@ 2022-09-02 6:20 ` Alviro Iskandar Setiawan
0 siblings, 0 replies; 21+ messages in thread
From: Alviro Iskandar Setiawan @ 2022-09-02 6:20 UTC (permalink / raw)
To: Ammar Faizi
Cc: Jens Axboe, Dylan Yudaken, Facebook Kernel Team, Pavel Begunkov,
io-uring Mailing List, GNU/Weeb Mailing List, Kanna Scarlet,
Muhammad Rizki
On Fri, Sep 2, 2022 at 8:18 AM Ammar Faizi wrote:
> From: Ammar Faizi <[email protected]>
>
> Don't brute force the port number, use `t_bind_ephemeral_port()`,
> much simpler and reliable for choosing a port number that is not
> in use.
>
> Cc: Dylan Yudaken <[email protected]>
> Cc: Facebook Kernel Team <[email protected]>
> Cc: Pavel Begunkov <[email protected]>
> Signed-off-by: Ammar Faizi <[email protected]>
Reviewed-by: Alviro Iskandar Setiawan <[email protected]>
tq
-- Viro
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [RESEND PATCH liburing v1 00/12] Introducing t_bind_ephemeral_port() function
2022-09-02 1:17 [RESEND PATCH liburing v1 00/12] Introducing t_bind_ephemeral_port() function Ammar Faizi
` (11 preceding siblings ...)
2022-09-02 1:17 ` [RESEND PATCH liburing v1 12/12] t/recv-msgall-stream: " Ammar Faizi
@ 2022-09-02 6:35 ` Alviro Iskandar Setiawan
12 siblings, 0 replies; 21+ messages in thread
From: Alviro Iskandar Setiawan @ 2022-09-02 6:35 UTC (permalink / raw)
To: Ammar Faizi
Cc: Jens Axboe, Dylan Yudaken, Facebook Kernel Team, Pavel Begunkov,
io-uring Mailing List, GNU/Weeb Mailing List, Kanna Scarlet,
Muhammad Rizki
On Fri, Sep 2, 2022 at 8:18 AM Ammar Faizi wrote:
> ## Solution:
> Setting @addr->sin_port to zero on a bind() syscall lets the kernel
> choose a port number that is not in use. The caller then can know the
> port number to be bound by invoking a getsockname() syscall after
> bind() succeeds.
>
> Wrap this procedure in a new function called t_bind_ephemeral_port().
> The selected port will be returned into @addr->sin_port, the caller
> can use it later to connect() or whatever they need.
with variable placement fix, for all patches:
Reviewed-by: Alviro Iskandar Setiawan <[email protected]>
Tested-by: Alviro Iskandar Setiawan <[email protected]>
(tested on 5.19)
tq
-- Viro
^ permalink raw reply [flat|nested] 21+ messages in thread
end of thread, other threads:[~2022-09-02 6:36 UTC | newest]
Thread overview: 21+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-09-02 1:17 [RESEND PATCH liburing v1 00/12] Introducing t_bind_ephemeral_port() function Ammar Faizi
2022-09-02 1:17 ` [RESEND PATCH liburing v1 01/12] test/helpers: Add `t_bind_ephemeral_port()` function Ammar Faizi
2022-09-02 5:56 ` Alviro Iskandar Setiawan
2022-09-02 1:17 ` [RESEND PATCH liburing v1 02/12] t/poll-link: Don't brute force the port number Ammar Faizi
2022-09-02 6:04 ` Alviro Iskandar Setiawan
2022-09-02 6:18 ` Ammar Faizi
2022-09-02 1:17 ` [RESEND PATCH liburing v1 03/12] t/socket-rw: " Ammar Faizi
2022-09-02 6:07 ` Alviro Iskandar Setiawan
2022-09-02 1:17 ` [RESEND PATCH liburing v1 04/12] t/socket-rw-eagain: " Ammar Faizi
2022-09-02 6:08 ` Alviro Iskandar Setiawan
2022-09-02 1:17 ` [RESEND PATCH liburing v1 05/12] t/socket-rw-offset: " Ammar Faizi
2022-09-02 6:17 ` Alviro Iskandar Setiawan
2022-09-02 1:17 ` [RESEND PATCH liburing v1 06/12] t/files-exit-hang-poll: " Ammar Faizi
2022-09-02 6:20 ` Alviro Iskandar Setiawan
2022-09-02 1:17 ` [RESEND PATCH liburing v1 07/12] t/socket: Don't use a static " Ammar Faizi
2022-09-02 1:17 ` [RESEND PATCH liburing v1 08/12] t/connect: " Ammar Faizi
2022-09-02 1:17 ` [RESEND PATCH liburing v1 09/12] t/shutdown: " Ammar Faizi
2022-09-02 1:17 ` [RESEND PATCH liburing v1 10/12] t/recv-msgall: " Ammar Faizi
2022-09-02 1:17 ` [RESEND PATCH liburing v1 11/12] t/232c93d07b74: " Ammar Faizi
2022-09-02 1:17 ` [RESEND PATCH liburing v1 12/12] t/recv-msgall-stream: " Ammar Faizi
2022-09-02 6:35 ` [RESEND PATCH liburing v1 00/12] Introducing t_bind_ephemeral_port() function Alviro Iskandar Setiawan
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox