mirror of
https://github.com/torvalds/linux.git
synced 2026-05-12 16:18:45 +02:00
selftests/bpf: Test TCP_NODELAY in TCP hdr opt callbacks
Add a sockops selftest for the TCP_NODELAY restriction in BPF_SOCK_OPS_HDR_OPT_LEN_CB and BPF_SOCK_OPS_WRITE_HDR_OPT_CB. With BPF_SOCK_OPS_WRITE_HDR_OPT_CB_FLAG enabled, bpf_setsockopt(TCP_NODELAY) returns -EOPNOTSUPP from BPF_SOCK_OPS_HDR_OPT_LEN_CB and BPF_SOCK_OPS_WRITE_HDR_OPT_CB, avoiding unbounded recursion and kernel stack overflow. Other cases continue to work as before, including BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB. Signed-off-by: KaFai Wan <kafai.wan@linux.dev> Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org> Reviewed-by: Jiayuan Chen <jiayuan.chen@linux.dev> Link: https://patch.msgid.link/20260421155804.135786-4-kafai.wan@linux.dev
This commit is contained in:
parent
54377fcab5
commit
52b6b53349
|
|
@ -507,6 +507,10 @@ static void misc(void)
|
|||
|
||||
ASSERT_EQ(misc_skel->bss->nr_hwtstamp, 0, "nr_hwtstamp");
|
||||
|
||||
ASSERT_TRUE(misc_skel->bss->nodelay_est_ok, "nodelay_est_ok");
|
||||
ASSERT_TRUE(misc_skel->bss->nodelay_hdr_len_reject, "nodelay_hdr_len_reject");
|
||||
ASSERT_TRUE(misc_skel->bss->nodelay_write_hdr_reject, "nodelay_write_hdr_reject");
|
||||
|
||||
check_linum:
|
||||
ASSERT_FALSE(check_error_linum(&sk_fds), "check_error_linum");
|
||||
sk_fds_close(&sk_fds);
|
||||
|
|
|
|||
|
|
@ -29,6 +29,10 @@ unsigned int nr_syn = 0;
|
|||
unsigned int nr_fin = 0;
|
||||
unsigned int nr_hwtstamp = 0;
|
||||
|
||||
bool nodelay_est_ok = false;
|
||||
bool nodelay_hdr_len_reject = false;
|
||||
bool nodelay_write_hdr_reject = false;
|
||||
|
||||
/* Check the header received from the active side */
|
||||
static int __check_active_hdr_in(struct bpf_sock_ops *skops, bool check_syn)
|
||||
{
|
||||
|
|
@ -300,7 +304,7 @@ static int handle_passive_estab(struct bpf_sock_ops *skops)
|
|||
SEC("sockops")
|
||||
int misc_estab(struct bpf_sock_ops *skops)
|
||||
{
|
||||
int true_val = 1;
|
||||
int true_val = 1, false_val = 0, ret;
|
||||
|
||||
switch (skops->op) {
|
||||
case BPF_SOCK_OPS_TCP_LISTEN_CB:
|
||||
|
|
@ -316,10 +320,19 @@ int misc_estab(struct bpf_sock_ops *skops)
|
|||
case BPF_SOCK_OPS_PARSE_HDR_OPT_CB:
|
||||
return handle_parse_hdr(skops);
|
||||
case BPF_SOCK_OPS_HDR_OPT_LEN_CB:
|
||||
ret = bpf_setsockopt(skops, SOL_TCP, TCP_NODELAY, &true_val, sizeof(true_val));
|
||||
if (ret == -EOPNOTSUPP)
|
||||
nodelay_hdr_len_reject = true;
|
||||
return handle_hdr_opt_len(skops);
|
||||
case BPF_SOCK_OPS_WRITE_HDR_OPT_CB:
|
||||
ret = bpf_setsockopt(skops, SOL_TCP, TCP_NODELAY, &true_val, sizeof(true_val));
|
||||
if (ret == -EOPNOTSUPP)
|
||||
nodelay_write_hdr_reject = true;
|
||||
return handle_write_hdr_opt(skops);
|
||||
case BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB:
|
||||
ret = bpf_setsockopt(skops, SOL_TCP, TCP_NODELAY, &false_val, sizeof(false_val));
|
||||
if (!ret)
|
||||
nodelay_est_ok = true;
|
||||
return handle_passive_estab(skops);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user