bpf: selftests: Add connect_to_fd_opts to network_helpers
authorMartin KaFai Lau <kafai@fb.com>
Tue, 24 Aug 2021 17:30:19 +0000 (10:30 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Thu, 26 Aug 2021 00:40:35 +0000 (17:40 -0700)
The next test requires to setsockopt(TCP_CONGESTION) before
connect(), so a new arg is needed for the connect_to_fd() to specify
the cc's name.

This patch adds a new "struct network_helper_opts" for the future
option needs.  It starts with the "cc" and "timeout_ms" option.
A new helper connect_to_fd_opts() is added to take the new
"const struct network_helper_opts *opts" as an arg.

Signed-off-by: Martin KaFai Lau <kafai@fb.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/20210824173019.3977910-1-kafai@fb.com
tools/testing/selftests/bpf/network_helpers.c
tools/testing/selftests/bpf/network_helpers.h

index d685768..7e9f637 100644 (file)
@@ -218,13 +218,18 @@ static int connect_fd_to_addr(int fd,
        return 0;
 }
 
-int connect_to_fd(int server_fd, int timeout_ms)
+static const struct network_helper_opts default_opts;
+
+int connect_to_fd_opts(int server_fd, const struct network_helper_opts *opts)
 {
        struct sockaddr_storage addr;
        struct sockaddr_in *addr_in;
        socklen_t addrlen, optlen;
        int fd, type;
 
+       if (!opts)
+               opts = &default_opts;
+
        optlen = sizeof(type);
        if (getsockopt(server_fd, SOL_SOCKET, SO_TYPE, &type, &optlen)) {
                log_err("getsockopt(SOL_TYPE)");
@@ -244,7 +249,12 @@ int connect_to_fd(int server_fd, int timeout_ms)
                return -1;
        }
 
-       if (settimeo(fd, timeout_ms))
+       if (settimeo(fd, opts->timeout_ms))
+               goto error_close;
+
+       if (opts->cc && opts->cc[0] &&
+           setsockopt(fd, SOL_TCP, TCP_CONGESTION, opts->cc,
+                      strlen(opts->cc) + 1))
                goto error_close;
 
        if (connect_fd_to_addr(fd, &addr, addrlen))
@@ -257,6 +267,15 @@ error_close:
        return -1;
 }
 
+int connect_to_fd(int server_fd, int timeout_ms)
+{
+       struct network_helper_opts opts = {
+               .timeout_ms = timeout_ms,
+       };
+
+       return connect_to_fd_opts(server_fd, &opts);
+}
+
 int connect_fd_to_fd(int client_fd, int server_fd, int timeout_ms)
 {
        struct sockaddr_storage addr;
index c59a8f6..da7e132 100644 (file)
@@ -17,6 +17,11 @@ typedef __u16 __sum16;
 #define VIP_NUM 5
 #define MAGIC_BYTES 123
 
+struct network_helper_opts {
+       const char *cc;
+       int timeout_ms;
+};
+
 /* ipv4 test vector */
 struct ipv4_packet {
        struct ethhdr eth;
@@ -41,6 +46,7 @@ int *start_reuseport_server(int family, int type, const char *addr_str,
                            unsigned int nr_listens);
 void free_fds(int *fds, unsigned int nr_close_fds);
 int connect_to_fd(int server_fd, int timeout_ms);
+int connect_to_fd_opts(int server_fd, const struct network_helper_opts *opts);
 int connect_fd_to_fd(int client_fd, int server_fd, int timeout_ms);
 int fastopen_connect(int server_fd, const char *data, unsigned int data_len,
                     int timeout_ms);