* [PATCH bpf-next v4 0/2] Introduced to support the ULP to get or set sockets
@ 2025-02-28 8:53 zhangmingyi
2025-02-28 8:53 ` [PATCH bpf-next v4 1/2] " zhangmingyi
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: zhangmingyi @ 2025-02-28 8:53 UTC (permalink / raw)
To: ast, daniel, andrii, martin.lau, song, yhs, john.fastabend,
kpsingh, sdf, haoluo, jolsa
Cc: bpf, linux-kernel, yanan, wuchangye, xiesongyang, liuxin350,
liwei883, tianmuyang, zhangmingyi5
From: Mingyi Zhang <zhangmingyi5@huawei.com>
We want call bpf_setsockopt to replace the kernel module in the TCP_ULP
case. The purpose is to customize the behavior in connect and sendmsg
after the user-defined ko file is loaded. We have an open source
community project kmesh (kmesh.net). Based on this, we refer to some
processes of tcp fastopen to implement delayed connet and perform HTTP
DNAT when sendmsg.In this case, we need to parse HTTP packets in the
bpf program and set TCP_ULP for the specified socket.
Note that tcp_getsockopt and tcp_setsockopt support TCP_ULP, while
bpf_getsockopt and bpf_setsockopt do not support TCP_ULP.
I'm not sure why there is such a difference, but I noticed that
tcp_setsockopt is called in bpf_setsockopt.I think we can add the
handling of this case.
Change list:
- v3 -> v4:
- fixed selftest compilation issues in kernel ci
- v2 -> v3:
- fixed some compilation issues and added TCP_ULP macro
- Move __tcp_set_ulp outside rcu_read_unlock
- v1 -> v2:
- modified the do_tcp_setsockopt(TCP_ULP) process by referring to
section do_tcp_setsockopt(TCP_CONGESTION), avoid sleep
- The selftest case is modified. An independent file is selected
for the test to avoid affecting the original file in setget_sockopt.c
- fixed some formatting errors, such as Signed and Subject
Revisions:
- v1
https://lore.kernel.org/bpf/20250127090724.3168791-1-zhangmingyi5@huawei.com/
- v2
https://lore.kernel.org/bpf/20250210134550.3189616-1-zhangmingyi5@huawei.com/
- v3
https://lore.kernel.org/bpf/20250228070628.3219087-1-zhangmingyi5@huawei.com/
Mingyi Zhang (2):
Introduced to support the ULP to get or set sockets
selftest for TCP_ULP in bpf_setsockopt
include/net/tcp.h | 2 +-
net/core/filter.c | 1 +
net/ipv4/tcp.c | 2 +-
net/ipv4/tcp_ulp.c | 28 ++++++++--------
net/mptcp/subflow.c | 2 +-
.../selftests/bpf/prog_tests/setget_sockopt.c | 32 +++++++++++++++++++
.../selftests/bpf/progs/bpf_tracing_net.h | 1 +
.../selftests/bpf/progs/setget_sockopt.c | 24 ++++++++++++++
8 files changed, 76 insertions(+), 16 deletions(-)
--
2.43.0
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH bpf-next v4 1/2] Introduced to support the ULP to get or set sockets
2025-02-28 8:53 [PATCH bpf-next v4 0/2] Introduced to support the ULP to get or set sockets zhangmingyi
@ 2025-02-28 8:53 ` zhangmingyi
2025-02-28 8:53 ` [PATCH bpf-next v4 2/2] selftest for TCP_ULP in bpf_setsockopt zhangmingyi
2025-02-28 20:08 ` [PATCH bpf-next v4 0/2] Introduced to support the ULP to get or set sockets Martin KaFai Lau
2 siblings, 0 replies; 4+ messages in thread
From: zhangmingyi @ 2025-02-28 8:53 UTC (permalink / raw)
To: ast, daniel, andrii, martin.lau, song, yhs, john.fastabend,
kpsingh, sdf, haoluo, jolsa
Cc: bpf, linux-kernel, yanan, wuchangye, xiesongyang, liuxin350,
liwei883, tianmuyang, zhangmingyi5
From: Mingyi Zhang <zhangmingyi5@huawei.com>
Note that tcp_getsockopt and tcp_setsockopt support TCP_ULP, while
bpf_getsockopt and bpf_setsockopt do not support TCP_ULP.
I think we can add the handling of this case.
We want call bpf_setsockopt to replace the kernel module in the TCP_ULP
case. The purpose is to customize the behavior in connect and sendmsg.
We have an open source community project kmesh (kmesh.net). Based on
this, we refer to some processes of tcp fastopen to implement delayed
connet and perform HTTP DNAT when sendmsg.In this case, we need to parse
HTTP packets in the bpf program and set TCP_ULP for the specified socket.
Signed-off-by: Mingyi Zhang <zhangmingyi5@huawei.com>
Signed-off-by: Xin Liu <liuxin350@huawei.com>
---
include/net/tcp.h | 2 +-
net/core/filter.c | 1 +
net/ipv4/tcp.c | 2 +-
net/ipv4/tcp_ulp.c | 28 +++++++++++++++-------------
net/mptcp/subflow.c | 2 +-
5 files changed, 19 insertions(+), 16 deletions(-)
diff --git a/include/net/tcp.h b/include/net/tcp.h
index e9b37b76e894..f26e92099b86 100644
--- a/include/net/tcp.h
+++ b/include/net/tcp.h
@@ -2582,7 +2582,7 @@ struct tcp_ulp_ops {
};
int tcp_register_ulp(struct tcp_ulp_ops *type);
void tcp_unregister_ulp(struct tcp_ulp_ops *type);
-int tcp_set_ulp(struct sock *sk, const char *name);
+int tcp_set_ulp(struct sock *sk, const char *name, bool load);
void tcp_get_available_ulp(char *buf, size_t len);
void tcp_cleanup_ulp(struct sock *sk);
void tcp_update_ulp(struct sock *sk, struct proto *p,
diff --git a/net/core/filter.c b/net/core/filter.c
index 713d6f454df3..bdb5c43d6fb0 100644
--- a/net/core/filter.c
+++ b/net/core/filter.c
@@ -5380,6 +5380,7 @@ static int sol_tcp_sockopt(struct sock *sk, int optname,
case TCP_CONGESTION:
return sol_tcp_sockopt_congestion(sk, optval, optlen, getopt);
case TCP_SAVED_SYN:
+ case TCP_ULP:
if (*optlen < 1)
return -EINVAL;
break;
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
index 0d704bda6c41..88ccd0e211f9 100644
--- a/net/ipv4/tcp.c
+++ b/net/ipv4/tcp.c
@@ -3744,7 +3744,7 @@ int do_tcp_setsockopt(struct sock *sk, int level, int optname,
name[val] = 0;
sockopt_lock_sock(sk);
- err = tcp_set_ulp(sk, name);
+ err = tcp_set_ulp(sk, name, !has_current_bpf_ctx());
sockopt_release_sock(sk);
return err;
}
diff --git a/net/ipv4/tcp_ulp.c b/net/ipv4/tcp_ulp.c
index 2aa442128630..9e828d4c2932 100644
--- a/net/ipv4/tcp_ulp.c
+++ b/net/ipv4/tcp_ulp.c
@@ -33,10 +33,7 @@ static struct tcp_ulp_ops *tcp_ulp_find(const char *name)
static const struct tcp_ulp_ops *__tcp_ulp_find_autoload(const char *name)
{
- const struct tcp_ulp_ops *ulp = NULL;
-
- rcu_read_lock();
- ulp = tcp_ulp_find(name);
+ const struct tcp_ulp_ops *ulp = tcp_ulp_find(name);
#ifdef CONFIG_MODULES
if (!ulp && capable(CAP_NET_ADMIN)) {
@@ -46,10 +43,6 @@ static const struct tcp_ulp_ops *__tcp_ulp_find_autoload(const char *name)
ulp = tcp_ulp_find(name);
}
#endif
- if (!ulp || !try_module_get(ulp->owner))
- ulp = NULL;
-
- rcu_read_unlock();
return ulp;
}
@@ -154,15 +147,24 @@ static int __tcp_set_ulp(struct sock *sk, const struct tcp_ulp_ops *ulp_ops)
return err;
}
-int tcp_set_ulp(struct sock *sk, const char *name)
+int tcp_set_ulp(struct sock *sk, const char *name, bool load)
{
const struct tcp_ulp_ops *ulp_ops;
+ int err = 0;
sock_owned_by_me(sk);
- ulp_ops = __tcp_ulp_find_autoload(name);
- if (!ulp_ops)
- return -ENOENT;
+ rcu_read_lock();
+ if (!load)
+ ulp_ops = tcp_ulp_find(name);
+ else
+ ulp_ops = __tcp_ulp_find_autoload(name);
+
+ if (!ulp_ops || !try_module_get(ulp_ops->owner))
+ err = -ENOENT;
+ rcu_read_unlock();
- return __tcp_set_ulp(sk, ulp_ops);
+ if (!err)
+ err = __tcp_set_ulp(sk, ulp_ops);
+ return err;
}
diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c
index fd021cf8286e..fb936d280b83 100644
--- a/net/mptcp/subflow.c
+++ b/net/mptcp/subflow.c
@@ -1776,7 +1776,7 @@ int mptcp_subflow_create_socket(struct sock *sk, unsigned short family,
sf->sk->sk_net_refcnt = 1;
get_net_track(net, &sf->sk->ns_tracker, GFP_KERNEL);
sock_inuse_add(net, 1);
- err = tcp_set_ulp(sf->sk, "mptcp");
+ err = tcp_set_ulp(sf->sk, "mptcp", true);
if (err)
goto err_free;
--
2.43.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH bpf-next v4 2/2] selftest for TCP_ULP in bpf_setsockopt
2025-02-28 8:53 [PATCH bpf-next v4 0/2] Introduced to support the ULP to get or set sockets zhangmingyi
2025-02-28 8:53 ` [PATCH bpf-next v4 1/2] " zhangmingyi
@ 2025-02-28 8:53 ` zhangmingyi
2025-02-28 20:08 ` [PATCH bpf-next v4 0/2] Introduced to support the ULP to get or set sockets Martin KaFai Lau
2 siblings, 0 replies; 4+ messages in thread
From: zhangmingyi @ 2025-02-28 8:53 UTC (permalink / raw)
To: ast, daniel, andrii, martin.lau, song, yhs, john.fastabend,
kpsingh, sdf, haoluo, jolsa
Cc: bpf, linux-kernel, yanan, wuchangye, xiesongyang, liuxin350,
liwei883, tianmuyang, zhangmingyi5
From: Mingyi Zhang <zhangmingyi5@huawei.com>
We try to use bpf_set/getsockopt to set/get TCP_ULP in sockops, and "tls"
need connect is established.
To avoid impacting other test cases, I have written a separate ebpf prog.
Signed-off-by: Mingyi Zhang <zhangmingyi5@huawei.com>
Signed-off-by: Xin Liu <liuxin350@huawei.com>
---
.../selftests/bpf/prog_tests/setget_sockopt.c | 32 +++++++++++++++++++
.../selftests/bpf/progs/bpf_tracing_net.h | 1 +
.../selftests/bpf/progs/setget_sockopt.c | 24 ++++++++++++++
3 files changed, 57 insertions(+)
diff --git a/tools/testing/selftests/bpf/prog_tests/setget_sockopt.c b/tools/testing/selftests/bpf/prog_tests/setget_sockopt.c
index e12255121c15..2953076bc2f0 100644
--- a/tools/testing/selftests/bpf/prog_tests/setget_sockopt.c
+++ b/tools/testing/selftests/bpf/prog_tests/setget_sockopt.c
@@ -199,6 +199,36 @@ static void test_nonstandard_opt(int family)
bpf_link__destroy(getsockopt_link);
}
+static void test_tcp_ulp(int family)
+{
+ struct setget_sockopt__bss *bss = skel->bss;
+ struct bpf_link *skops_sockopt_tcp_ulp = NULL;
+ int sfd = -1, cfd = -1;
+
+ memset(bss, 0, sizeof(*bss));
+
+ skops_sockopt_tcp_ulp =
+ bpf_program__attach_cgroup(skel->progs.skops_sockopt_tcp_ulp, cg_fd);
+ if (!ASSERT_OK_PTR(skel->links.skops_sockopt_tcp_ulp, "attach_cgroup"))
+ return;
+
+ sfd = start_server(family, SOCK_STREAM,
+ family == AF_INET6 ? addr6_str : addr4_str, 0, 0);
+ if (!ASSERT_GE(sfd, 0, "start_server"))
+ goto err_out;
+
+ cfd = connect_to_fd(sfd, 0);
+ if (!ASSERT_GE(cfd, 0, "connect_to_fd_server"))
+ goto err_out;
+ ASSERT_EQ(bss->nr_tcp_ulp, 3, "nr_tcp_ulp");
+
+err_out:
+ close(sfd);
+ if (cfd != -1)
+ close(cfd);
+ bpf_link__destroy(skops_sockopt_tcp_ulp);
+}
+
void test_setget_sockopt(void)
{
cg_fd = test__join_cgroup(CG_NAME);
@@ -238,6 +268,8 @@ void test_setget_sockopt(void)
test_ktls(AF_INET);
test_nonstandard_opt(AF_INET);
test_nonstandard_opt(AF_INET6);
+ test_tcp_ulp(AF_INET6);
+ test_tcp_ulp(AF_INET);
done:
setget_sockopt__destroy(skel);
diff --git a/tools/testing/selftests/bpf/progs/bpf_tracing_net.h b/tools/testing/selftests/bpf/progs/bpf_tracing_net.h
index 59843b430f76..f3ce0d74be18 100644
--- a/tools/testing/selftests/bpf/progs/bpf_tracing_net.h
+++ b/tools/testing/selftests/bpf/progs/bpf_tracing_net.h
@@ -47,6 +47,7 @@
#define TCP_NOTSENT_LOWAT 25
#define TCP_SAVE_SYN 27
#define TCP_SAVED_SYN 28
+#define TCP_ULP 31
#define TCP_CA_NAME_MAX 16
#define TCP_NAGLE_OFF 1
diff --git a/tools/testing/selftests/bpf/progs/setget_sockopt.c b/tools/testing/selftests/bpf/progs/setget_sockopt.c
index 6dd4318debbf..80b3179c0454 100644
--- a/tools/testing/selftests/bpf/progs/setget_sockopt.c
+++ b/tools/testing/selftests/bpf/progs/setget_sockopt.c
@@ -20,6 +20,7 @@ int nr_connect;
int nr_binddev;
int nr_socket_post_create;
int nr_fin_wait1;
+int nr_tcp_ulp;
struct sockopt_test {
int opt;
@@ -417,4 +418,27 @@ int skops_sockopt(struct bpf_sock_ops *skops)
return 1;
}
+SEC("sockops")
+int skops_sockopt_tcp_ulp(struct bpf_sock_ops *skops)
+{
+ static const char target_ulp[] = "tls";
+ char verify_ulp[sizeof(target_ulp)];
+
+ switch (skops->op) {
+ case BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB:
+ if (bpf_setsockopt(skops, IPPROTO_TCP, TCP_ULP, (void *)target_ulp,
+ sizeof(target_ulp)) != 0)
+ return 1;
+ nr_tcp_ulp++;
+ if (bpf_getsockopt(skops, IPPROTO_TCP, TCP_ULP, verify_ulp,
+ sizeof(verify_ulp)) != 0)
+ return 1;
+ nr_tcp_ulp++;
+ if (bpf_strncmp(verify_ulp, sizeof(target_ulp), "tls") != 0)
+ return 1;
+ nr_tcp_ulp++;
+ }
+ return 1;
+}
+
char _license[] SEC("license") = "GPL";
--
2.43.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH bpf-next v4 0/2] Introduced to support the ULP to get or set sockets
2025-02-28 8:53 [PATCH bpf-next v4 0/2] Introduced to support the ULP to get or set sockets zhangmingyi
2025-02-28 8:53 ` [PATCH bpf-next v4 1/2] " zhangmingyi
2025-02-28 8:53 ` [PATCH bpf-next v4 2/2] selftest for TCP_ULP in bpf_setsockopt zhangmingyi
@ 2025-02-28 20:08 ` Martin KaFai Lau
2 siblings, 0 replies; 4+ messages in thread
From: Martin KaFai Lau @ 2025-02-28 20:08 UTC (permalink / raw)
To: zhangmingyi
Cc: ast, daniel, andrii, song, yhs, john.fastabend, kpsingh, sdf,
haoluo, jolsa, bpf, linux-kernel, yanan, wuchangye, xiesongyang,
liuxin350, liwei883, tianmuyang, Network Development
On 2/28/25 12:53 AM, zhangmingyi wrote:
> From: Mingyi Zhang <zhangmingyi5@huawei.com>
>
> We want call bpf_setsockopt to replace the kernel module in the TCP_ULP
> case. The purpose is to customize the behavior in connect and sendmsg
> after the user-defined ko file is loaded. We have an open source
> community project kmesh (kmesh.net). Based on this, we refer to some
> processes of tcp fastopen to implement delayed connet and perform HTTP
> DNAT when sendmsg.In this case, we need to parse HTTP packets in the
> bpf program and set TCP_ULP for the specified socket.
>
> Note that tcp_getsockopt and tcp_setsockopt support TCP_ULP, while
> bpf_getsockopt and bpf_setsockopt do not support TCP_ULP.
> I'm not sure why there is such a difference, but I noticed that
> tcp_setsockopt is called in bpf_setsockopt.I think we can add the
> handling of this case.
Please stop sending multiple new versions while the earlier raised questions
still have not been replied [1]. Also, netdev is still not cc-ed.
[1]: https://lore.kernel.org/all/44668201-cf8b-49c1-9dd0-90e0e5a95457@linux.dev/
pw-bot: cr
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2025-02-28 20:08 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-02-28 8:53 [PATCH bpf-next v4 0/2] Introduced to support the ULP to get or set sockets zhangmingyi
2025-02-28 8:53 ` [PATCH bpf-next v4 1/2] " zhangmingyi
2025-02-28 8:53 ` [PATCH bpf-next v4 2/2] selftest for TCP_ULP in bpf_setsockopt zhangmingyi
2025-02-28 20:08 ` [PATCH bpf-next v4 0/2] Introduced to support the ULP to get or set sockets Martin KaFai Lau
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).