All of lore.kernel.org
 help / color / mirror / Atom feed
From: Martin KaFai Lau <martin.lau@linux.dev>
To: Geliang Tang <geliang@kernel.org>
Cc: Andrii Nakryiko <andrii@kernel.org>,
	Eduard Zingerman <eddyz87@gmail.com>,
	Mykola Lysenko <mykolal@fb.com>,
	Alexei Starovoitov <ast@kernel.org>,
	Daniel Borkmann <daniel@iogearbox.net>,
	Song Liu <song@kernel.org>,
	Yonghong Song <yonghong.song@linux.dev>,
	John Fastabend <john.fastabend@gmail.com>,
	KP Singh <kpsingh@kernel.org>,
	Stanislav Fomichev <sdf@google.com>, Hao Luo <haoluo@google.com>,
	Jiri Olsa <jolsa@kernel.org>, Shuah Khan <shuah@kernel.org>,
	Jakub Sitnicki <jakub@cloudflare.com>,
	Geliang Tang <tanggeliang@kylinos.cn>,
	bpf@vger.kernel.org, linux-kselftest@vger.kernel.org
Subject: Re: [PATCH bpf-next 1/6] selftests/bpf: Add post_socket_cb for network_helper_opts
Date: Thu, 9 May 2024 13:28:02 -0700	[thread overview]
Message-ID: <0d07ca72-8353-47a2-afc6-bb18a80846b9@linux.dev> (raw)
In-Reply-To: <470cb82f209f055fc7fb39c66c6b090b5b7ed2b2.1714907662.git.tanggeliang@kylinos.cn>

On 5/5/24 4:35 AM, Geliang Tang wrote:
> From: Geliang Tang <tanggeliang@kylinos.cn>
> 
> __start_server() sets SO_REUSPORT through setsockopt() when the parameter
> 'reuseport' is set. This patch makes it more flexible by adding a function
> pointer post_socket_cb, together with 'struct post_socket_opts cb_opts'
> for future extension into struct network_helper_opts. Then 'reuseport'
> parameter can be dropped.
> 
> Now the original start_reuseport_server() can be implemented by setting a
> newly defined reuseport_cb() function pointer to post_socket_cb filed of
> struct network_helper_opts.
> 
> Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
> ---
>   tools/testing/selftests/bpf/network_helpers.c | 25 ++++++++++++-------
>   tools/testing/selftests/bpf/network_helpers.h |  4 +++
>   2 files changed, 20 insertions(+), 9 deletions(-)
> 
> diff --git a/tools/testing/selftests/bpf/network_helpers.c b/tools/testing/selftests/bpf/network_helpers.c
> index 054d26e383e0..a7ab05baedb6 100644
> --- a/tools/testing/selftests/bpf/network_helpers.c
> +++ b/tools/testing/selftests/bpf/network_helpers.c
> @@ -81,9 +81,8 @@ int settimeo(int fd, int timeout_ms)
>   #define save_errno_close(fd) ({ int __save = errno; close(fd); errno = __save; })
>   
>   static int __start_server(int type, const struct sockaddr *addr, socklen_t addrlen,
> -			  bool reuseport, const struct network_helper_opts *opts)
> +			  const struct network_helper_opts *opts)
>   {
> -	int on = 1;
>   	int fd;
>   
>   	fd = socket(addr->sa_family, type, opts->proto);
> @@ -95,9 +94,9 @@ static int __start_server(int type, const struct sockaddr *addr, socklen_t addrl
>   	if (settimeo(fd, opts->timeout_ms))
>   		goto error_close;
>   
> -	if (reuseport &&
> -	    setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &on, sizeof(on))) {
> -		log_err("Failed to set SO_REUSEPORT");
> +	if (opts->post_socket_cb &&
> +	    opts->post_socket_cb(fd, &opts->cb_opts)) {
> +		log_err("Failed to call post_socket_cb");
>   		goto error_close;
>   	}
>   
> @@ -132,7 +131,14 @@ int start_server(int family, int type, const char *addr_str, __u16 port,
>   	if (make_sockaddr(family, addr_str, port, &addr, &addrlen))
>   		return -1;
>   
> -	return __start_server(type, (struct sockaddr *)&addr, addrlen, false, &opts);
> +	return __start_server(type, (struct sockaddr *)&addr, addrlen, &opts);
> +}
> +
> +static int reuseport_cb(int fd, const struct post_socket_opts *opts)
> +{
> +	int on = 1;
> +
> +	return setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &on, sizeof(on));
>   }
>   
>   int *start_reuseport_server(int family, int type, const char *addr_str,
> @@ -140,6 +146,7 @@ int *start_reuseport_server(int family, int type, const char *addr_str,
>   {
>   	struct network_helper_opts opts = {
>   		.timeout_ms = timeout_ms,
> +		.post_socket_cb = reuseport_cb,
>   	};
>   	struct sockaddr_storage addr;
>   	unsigned int nr_fds = 0;
> @@ -156,7 +163,7 @@ int *start_reuseport_server(int family, int type, const char *addr_str,
>   	if (!fds)
>   		return NULL;
>   
> -	fds[0] = __start_server(type, (struct sockaddr *)&addr, addrlen, true, &opts);
> +	fds[0] = __start_server(type, (struct sockaddr *)&addr, addrlen, &opts);
>   	if (fds[0] == -1)
>   		goto close_fds;
>   	nr_fds = 1;
> @@ -165,7 +172,7 @@ int *start_reuseport_server(int family, int type, const char *addr_str,
>   		goto close_fds;
>   
>   	for (; nr_fds < nr_listens; nr_fds++) {
> -		fds[nr_fds] = __start_server(type, (struct sockaddr *)&addr, addrlen, true, &opts);
> +		fds[nr_fds] = __start_server(type, (struct sockaddr *)&addr, addrlen, &opts);
>   		if (fds[nr_fds] == -1)
>   			goto close_fds;
>   	}
> @@ -183,7 +190,7 @@ int start_server_addr(int type, const struct sockaddr_storage *addr, socklen_t l
>   	if (!opts)
>   		opts = &default_opts;
>   
> -	return __start_server(type, (struct sockaddr *)addr, len, 0, opts);
> +	return __start_server(type, (struct sockaddr *)addr, len, opts);
>   }
>   
>   void free_fds(int *fds, unsigned int nr_close_fds)
> diff --git a/tools/testing/selftests/bpf/network_helpers.h b/tools/testing/selftests/bpf/network_helpers.h
> index c62b54daa914..887075fbf6ec 100644
> --- a/tools/testing/selftests/bpf/network_helpers.h
> +++ b/tools/testing/selftests/bpf/network_helpers.h
> @@ -21,6 +21,8 @@ typedef __u16 __sum16;
>   #define VIP_NUM 5
>   #define MAGIC_BYTES 123
>   
> +struct post_socket_opts {};
> +
>   struct network_helper_opts {
>   	const char *cc;
>   	int timeout_ms;
> @@ -28,6 +30,8 @@ struct network_helper_opts {
>   	bool noconnect;
>   	int type;
>   	int proto;
> +	int (*post_socket_cb)(int fd, const struct post_socket_opts *opts);
> +	struct post_socket_opts cb_opts;

I am going to remove cb_opts from network_helper_opts for now. Lets wait for the 
first use case of post_socket_opts comes up. NULL is always passed to 
post_socket_cb for now.

>   };
>   
>   /* ipv4 test vector */


  reply	other threads:[~2024-05-09 20:28 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-05-05 11:35 [PATCH bpf-next 0/6] use network helpers, part 4 Geliang Tang
2024-05-05 11:35 ` [PATCH bpf-next 1/6] selftests/bpf: Add post_socket_cb for network_helper_opts Geliang Tang
2024-05-09 20:28   ` Martin KaFai Lau [this message]
2024-05-05 11:35 ` [PATCH bpf-next 2/6] selftests/bpf: Use start_server_addr in sockopt_inherit Geliang Tang
2024-05-09 20:51   ` Martin KaFai Lau
2024-05-05 11:35 ` [PATCH bpf-next 3/6] selftests/bpf: Use start_server_addr in test_tcp_check_syncookie Geliang Tang
2024-05-05 11:35 ` [PATCH bpf-next 4/6] selftests/bpf: Use connect_to_fd in sockopt_inherit Geliang Tang
2024-05-05 11:35 ` [PATCH bpf-next 5/6] selftests/bpf: Use connect_to_fd in test_tcp_check_syncookie Geliang Tang
2024-05-05 11:35 ` [PATCH bpf-next 6/6] selftests/bpf: Drop get_port " Geliang Tang
2024-05-09 20:50 ` [PATCH bpf-next 0/6] use network helpers, part 4 patchwork-bot+netdevbpf

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=0d07ca72-8353-47a2-afc6-bb18a80846b9@linux.dev \
    --to=martin.lau@linux.dev \
    --cc=andrii@kernel.org \
    --cc=ast@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=daniel@iogearbox.net \
    --cc=eddyz87@gmail.com \
    --cc=geliang@kernel.org \
    --cc=haoluo@google.com \
    --cc=jakub@cloudflare.com \
    --cc=john.fastabend@gmail.com \
    --cc=jolsa@kernel.org \
    --cc=kpsingh@kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=mykolal@fb.com \
    --cc=sdf@google.com \
    --cc=shuah@kernel.org \
    --cc=song@kernel.org \
    --cc=tanggeliang@kylinos.cn \
    --cc=yonghong.song@linux.dev \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.