@@ -21,7 +21,6 @@
static const unsigned int total_bytes = 10 * 1024 * 1024;
static int expected_stg = 0xeB9F;
-static int stop;
static int settcpca(int fd, const char *tcp_ca)
{
@@ -34,13 +33,20 @@ static int settcpca(int fd, const char *tcp_ca)
return 0;
}
+struct send_recv_arg {
+ int fd;
+ uint32_t bytes;
+ int stop;
+};
+
static void *server(void *arg)
{
- int lfd = (int)(long)arg, err = 0, fd;
+ struct send_recv_arg *a = (struct send_recv_arg *)arg;
ssize_t nr_sent = 0, bytes = 0;
char batch[1500];
+ int err = 0, fd;
- fd = accept(lfd, NULL, NULL);
+ fd = accept(a->fd, NULL, NULL);
while (fd == -1) {
if (errno == EINTR)
continue;
@@ -53,9 +59,9 @@ static void *server(void *arg)
goto done;
}
- while (bytes < total_bytes && !READ_ONCE(stop)) {
+ while (bytes < a->bytes && !READ_ONCE(a->stop)) {
nr_sent = send(fd, &batch,
- MIN(total_bytes - bytes, sizeof(batch)), 0);
+ MIN(a->bytes - bytes, sizeof(batch)), 0);
if (nr_sent == -1 && errno == EINTR)
continue;
if (nr_sent == -1) {
@@ -65,13 +71,13 @@ static void *server(void *arg)
bytes += nr_sent;
}
- ASSERT_EQ(bytes, total_bytes, "send");
+ ASSERT_EQ(bytes, a->bytes, "send");
done:
if (fd >= 0)
close(fd);
if (err) {
- WRITE_ONCE(stop, 1);
+ WRITE_ONCE(a->stop, 1);
return ERR_PTR(err);
}
return NULL;
@@ -80,18 +86,22 @@ static void *server(void *arg)
static void do_test(const char *tcp_ca, const struct bpf_map *sk_stg_map)
{
ssize_t nr_recv = 0, bytes = 0;
+ struct send_recv_arg arg = {
+ .bytes = total_bytes,
+ .stop = 0,
+ };
int lfd = -1, fd = -1;
pthread_t srv_thread;
void *thread_ret;
char batch[1500];
int err;
- WRITE_ONCE(stop, 0);
-
lfd = start_server(AF_INET6, SOCK_STREAM, NULL, 0, 0);
if (!ASSERT_NEQ(lfd, -1, "socket"))
return;
+ arg.fd = lfd;
+
fd = socket(AF_INET6, SOCK_STREAM, 0);
if (!ASSERT_NEQ(fd, -1, "socket")) {
close(lfd);
@@ -123,12 +133,12 @@ static void do_test(const char *tcp_ca, const struct bpf_map *sk_stg_map)
goto done;
}
- err = pthread_create(&srv_thread, NULL, server, (void *)(long)lfd);
+ err = pthread_create(&srv_thread, NULL, server, (void *)&arg);
if (!ASSERT_OK(err, "pthread_create"))
goto done;
/* recv total_bytes */
- while (bytes < total_bytes && !READ_ONCE(stop)) {
+ while (bytes < total_bytes && !READ_ONCE(arg.stop)) {
nr_recv = recv(fd, &batch,
MIN(total_bytes - bytes, sizeof(batch)), 0);
if (nr_recv == -1 && errno == EINTR)
@@ -140,7 +150,7 @@ static void do_test(const char *tcp_ca, const struct bpf_map *sk_stg_map)
ASSERT_EQ(bytes, total_bytes, "recv");
- WRITE_ONCE(stop, 1);
+ WRITE_ONCE(arg.stop, 1);
pthread_join(srv_thread, &thread_ret);
ASSERT_OK(IS_ERR(thread_ret), "thread_ret");