sk_fds
int i, map_fd, err, *sk_fds;
sk_fds = malloc(sizeof(*sk_fds) * nr_sk_per_thread);
if (!sk_fds) {
sk_fds[i] = -1;
sk_fds[i] = socket(AF_INET6, SOCK_STREAM, 0);
if (sk_fds[i] == -1) {
err = bpf_map_update_elem(map_fd, &sk_fds[i], &value,
close(sk_fds[i]);
sk_fds[i] = -1;
free(sk_fds);
for (i = 0; i < nr_sk_per_thread && sk_fds[i] != -1; i++)
close(sk_fds[i]);
free(sk_fds);
static int sk_fds[REUSEPORT_ARRAY_SIZE];
srv_fd = sk_fds[ev.data.u32];
err = setsockopt(sk_fds[0], SOL_SOCKET, SO_DETACH_REUSEPORT_BPF,
err = setsockopt(sk_fds[1], SOL_SOCKET, SO_DETACH_REUSEPORT_BPF,
sk_fds[i] = socket(family, type, 0);
RET_IF(sk_fds[i] == -1, "socket()", "sk_fds[%d]:%d errno:%d\n",
i, sk_fds[i], errno);
err = setsockopt(sk_fds[i], SOL_SOCKET, SO_REUSEPORT,
err = setsockopt(sk_fds[i], SOL_SOCKET,
err = bind(sk_fds[i], (struct sockaddr *)&srv_sa, addrlen);
err = listen(sk_fds[i], 10);
err = bpf_map_update_elem(reuseport_array, &i, &sk_fds[i],
err = getsockname(sk_fds[i], (struct sockaddr *)&srv_sa,
err = epoll_ctl(epfd, EPOLL_CTL_ADD, sk_fds[i], &ev);
close(sk_fds[i]);
sk_fds->active_fd = fastopen_connect(sk_fds->srv_fd, fast,
sk_fds->active_fd = connect_to_fd(sk_fds->srv_fd, 0);
if (!ASSERT_NEQ(sk_fds->active_fd, -1, "")) {
close(sk_fds->srv_fd);
if (!ASSERT_OK(getsockname(sk_fds->srv_fd, (struct sockaddr *)&addr6,
sk_fds->passive_lport = ntohs(addr6.sin6_port);
if (!ASSERT_OK(getsockname(sk_fds->active_fd, (struct sockaddr *)&addr6,
sk_fds->active_lport = ntohs(addr6.sin6_port);
sk_fds->passive_fd = accept(sk_fds->srv_fd, NULL, 0);
if (!ASSERT_NEQ(sk_fds->passive_fd, -1, "accept(srv_fd)"))
ret = read(sk_fds->passive_fd, bytes_in, sizeof(bytes_in));
close(sk_fds->passive_fd);
close(sk_fds->active_fd);
close(sk_fds->srv_fd);
memset(sk_fds, -1, sizeof(*sk_fds));
static int check_error_linum(const struct sk_fds *sk_fds)
lport = sk_fds->passive_lport;
lport = sk_fds->active_lport;
static void check_hdr_and_close_fds(struct sk_fds *sk_fds)
if (sk_fds_shutdown(sk_fds))
if (check_hdr_stg(&exp_passive_hdr_stg, sk_fds->passive_fd,
if (check_hdr_stg(&exp_active_hdr_stg, sk_fds->active_fd,
ASSERT_FALSE(check_error_linum(sk_fds), "check_error_linum");
sk_fds_close(sk_fds);
struct sk_fds sk_fds;
if (sk_fds_connect(&sk_fds, true)) {
check_hdr_and_close_fds(&sk_fds);
struct sk_fds sk_fds;
if (sk_fds_connect(&sk_fds, false)) {
check_hdr_and_close_fds(&sk_fds);
struct sk_fds sk_fds;
if (sk_fds_connect(&sk_fds, false)) {
check_hdr_and_close_fds(&sk_fds);
struct sk_fds sk_fds;
if (sk_fds_connect(&sk_fds, false)) {
check_hdr_and_close_fds(&sk_fds);
struct sk_fds sk_fds;
if (sk_fds_connect(&sk_fds, false)) {
ret = send(sk_fds.active_fd, send_msg, sizeof(send_msg),
ret = read(sk_fds.passive_fd, recv_msg, sizeof(recv_msg));
if (sk_fds_shutdown(&sk_fds))
ASSERT_FALSE(check_error_linum(&sk_fds), "check_error_linum");
sk_fds_close(&sk_fds);
static void sk_fds_close(struct sk_fds *sk_fds)
close(sk_fds->srv_fd);
close(sk_fds->passive_fd);
close(sk_fds->active_fd);
static int sk_fds_shutdown(struct sk_fds *sk_fds)
shutdown(sk_fds->active_fd, SHUT_WR);
ret = read(sk_fds->passive_fd, &abyte, sizeof(abyte));
shutdown(sk_fds->passive_fd, SHUT_WR);
ret = read(sk_fds->active_fd, &abyte, sizeof(abyte));
static int sk_fds_connect(struct sk_fds *sk_fds, bool fast_open)
sk_fds->srv_fd = start_server(AF_INET6, SOCK_STREAM, LO_ADDR6, 0, 0);
if (!ASSERT_NEQ(sk_fds->srv_fd, -1, "start_server"))