aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeliang Tang <tanggeliang@kylinos.cn>2024-04-22 09:44:00 +0800
committerGeliang Tang <tanggeliang@kylinos.cn>2024-04-22 10:56:43 +0800
commitd60e6884b066d7d0703ba653ae5e9d2f708b22bd (patch)
tree875082a65ab01fab7d47366e1cf185cce9c4f465
parenta234d8ee3a2be879866d0554927087d814467461 (diff)
downloadmptcp_net-next-d60e6884b066d7d0703ba653ae5e9d2f708b22bd.tar.gz
selftests/bpf: Use start_server_addr in sk_lookup
fix Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
-rw-r--r--tools/testing/selftests/bpf/prog_tests/sk_lookup.c120
1 files changed, 48 insertions, 72 deletions
diff --git a/tools/testing/selftests/bpf/prog_tests/sk_lookup.c b/tools/testing/selftests/bpf/prog_tests/sk_lookup.c
index 389aef5b5b37f6..be5855f33cca80 100644
--- a/tools/testing/selftests/bpf/prog_tests/sk_lookup.c
+++ b/tools/testing/selftests/bpf/prog_tests/sk_lookup.c
@@ -102,59 +102,20 @@ static int attach_reuseport(int sock_fd, struct bpf_program *reuseport_prog)
return 0;
}
-static socklen_t inetaddr_len(const struct sockaddr_storage *addr)
-{
- return (addr->ss_family == AF_INET ? sizeof(struct sockaddr_in) :
- addr->ss_family == AF_INET6 ? sizeof(struct sockaddr_in6) : 0);
-}
-
-static int make_socket(int sotype, const char *ip, int port,
- struct sockaddr_storage *addr)
-{
- struct timeval timeo = { .tv_sec = IO_TIMEOUT_SEC };
- int err, family, fd;
-
- family = is_ipv6(ip) ? AF_INET6 : AF_INET;
- err = make_sockaddr(family, ip, port, addr, NULL);
- if (CHECK(err, "make_address", "failed\n"))
- return -1;
-
- fd = socket(addr->ss_family, sotype, 0);
- if (CHECK(fd < 0, "socket", "failed\n")) {
- log_err("failed to make socket");
- return -1;
- }
-
- err = setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, &timeo, sizeof(timeo));
- if (CHECK(err, "setsockopt(SO_SNDTIMEO)", "failed\n")) {
- log_err("failed to set SNDTIMEO");
- close(fd);
- return -1;
- }
-
- err = setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &timeo, sizeof(timeo));
- if (CHECK(err, "setsockopt(SO_RCVTIMEO)", "failed\n")) {
- log_err("failed to set RCVTIMEO");
- close(fd);
- return -1;
- }
-
- return fd;
-}
+struct vals {
+ int family;
+ int sotype;
+ bool reuseport;
+};
-static int make_server(int sotype, const char *ip, int port,
- struct bpf_program *reuseport_prog)
+static int setsockopts(int fd, const void *optval, socklen_t optlen)
{
- struct sockaddr_storage addr = {0};
+ struct vals *vs = (struct vals *)optval;
const int one = 1;
- int err, fd = -1;
-
- fd = make_socket(sotype, ip, port, &addr);
- if (fd < 0)
- return -1;
+ int err = 0;
/* Enabled for UDPv6 sockets for IPv4-mapped IPv6 to work. */
- if (sotype == SOCK_DGRAM) {
+ if (vs->sotype == SOCK_DGRAM) {
err = setsockopt(fd, SOL_IP, IP_RECVORIGDSTADDR, &one,
sizeof(one));
if (CHECK(err, "setsockopt(IP_RECVORIGDSTADDR)", "failed\n")) {
@@ -163,7 +124,7 @@ static int make_server(int sotype, const char *ip, int port,
}
}
- if (sotype == SOCK_DGRAM && addr.ss_family == AF_INET6) {
+ if (vs->sotype == SOCK_DGRAM && vs->family == AF_INET6) {
err = setsockopt(fd, SOL_IPV6, IPV6_RECVORIGDSTADDR, &one,
sizeof(one));
if (CHECK(err, "setsockopt(IPV6_RECVORIGDSTADDR)", "failed\n")) {
@@ -172,7 +133,7 @@ static int make_server(int sotype, const char *ip, int port,
}
}
- if (sotype == SOCK_STREAM) {
+ if (vs->sotype == SOCK_STREAM) {
err = setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &one,
sizeof(one));
if (CHECK(err, "setsockopt(SO_REUSEADDR)", "failed\n")) {
@@ -181,7 +142,7 @@ static int make_server(int sotype, const char *ip, int port,
}
}
- if (reuseport_prog) {
+ if (vs->reuseport) {
err = setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &one,
sizeof(one));
if (CHECK(err, "setsockopt(SO_REUSEPORT)", "failed\n")) {
@@ -190,19 +151,35 @@ static int make_server(int sotype, const char *ip, int port,
}
}
- err = bind(fd, (void *)&addr, inetaddr_len(&addr));
- if (CHECK(err, "bind", "failed\n")) {
- log_err("failed to bind listen socket");
- goto fail;
- }
+ return 0;
+fail:
+ return -1;
+}
- if (sotype == SOCK_STREAM) {
- err = listen(fd, SOMAXCONN);
- if (CHECK(err, "make_server", "listen")) {
- log_err("failed to listen on port %d", port);
- goto fail;
- }
- }
+static int make_server(int sotype, const char *ip, int port,
+ struct bpf_program *reuseport_prog)
+{
+ struct vals vs = {
+ .family = is_ipv6(ip) ? AF_INET6 : AF_INET,
+ .sotype = sotype,
+ .reuseport = !!reuseport_prog,
+ };
+ struct network_helper_opts opts = {
+ .setsockopt = setsockopts,
+ .optval = &vs,
+ .optlen = sizeof(vs),
+ };
+ struct sockaddr_storage addr = {0};
+ socklen_t addrlen;
+ int err, fd = -1;
+
+ err = make_sockaddr(vs.family, ip, port, &addr, &addrlen);
+ if (CHECK(err, "make_address", "failed\n"))
+ return -1;
+
+ fd = start_server_addr(sotype, &addr, addrlen, &opts);
+ if (CHECK(err, "make_address", "failed\n"))
+ return -1;
/* Late attach reuseport prog so we can have one init path */
if (reuseport_prog) {
@@ -222,22 +199,21 @@ fail:
static int make_client(int sotype, const char *ip, int port)
{
struct sockaddr_storage addr = {0};
- int err, fd;
+ int err, family, fd;
+ socklen_t addrlen;
- fd = make_socket(sotype, ip, port, &addr);
- if (fd < 0)
+ family = is_ipv6(ip) ? AF_INET6 : AF_INET;
+ err = make_sockaddr(family, ip, port, &addr, &addrlen);
+ if (CHECK(err, "make_address", "failed\n"))
return -1;
- err = connect(fd, (void *)&addr, inetaddr_len(&addr));
- if (CHECK(err, "make_client", "connect")) {
+ fd = connect_to_addr(sotype, &addr, addrlen, NULL);
+ if (fd < 0) {
log_err("failed to connect client socket");
- goto fail;
+ return -1;
}
return fd;
-fail:
- close(fd);
- return -1;
}
static __u64 socket_cookie(int fd)