Commit 78d8e26d authored by Andrey Ignatov's avatar Andrey Ignatov Committed by Daniel Borkmann

selftests/bpf: Test case for BPF_SOCK_OPS_TCP_LISTEN_CB

Cover new TCP-BPF callback in test_tcpbpf: when listen() is called on
socket, set BPF_SOCK_OPS_STATE_CB_FLAG so that BPF_SOCK_OPS_STATE_CB
callback can be called on future state transition, and when such a
transition happens (TCP_LISTEN -> TCP_CLOSE), track it in the map and
verify it in user space later.
Signed-off-by: default avatarAndrey Ignatov <rdna@fb.com>
Acked-by: default avatarAlexei Starovoitov <ast@kernel.org>
Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
parent 2044e4ef
...@@ -12,5 +12,6 @@ struct tcpbpf_globals { ...@@ -12,5 +12,6 @@ struct tcpbpf_globals {
__u32 good_cb_test_rv; __u32 good_cb_test_rv;
__u64 bytes_received; __u64 bytes_received;
__u64 bytes_acked; __u64 bytes_acked;
__u32 num_listen;
}; };
#endif #endif
...@@ -96,15 +96,22 @@ int bpf_testcb(struct bpf_sock_ops *skops) ...@@ -96,15 +96,22 @@ int bpf_testcb(struct bpf_sock_ops *skops)
if (!gp) if (!gp)
break; break;
g = *gp; g = *gp;
g.total_retrans = skops->total_retrans; if (skops->args[0] == BPF_TCP_LISTEN) {
g.data_segs_in = skops->data_segs_in; g.num_listen++;
g.data_segs_out = skops->data_segs_out; } else {
g.bytes_received = skops->bytes_received; g.total_retrans = skops->total_retrans;
g.bytes_acked = skops->bytes_acked; g.data_segs_in = skops->data_segs_in;
g.data_segs_out = skops->data_segs_out;
g.bytes_received = skops->bytes_received;
g.bytes_acked = skops->bytes_acked;
}
bpf_map_update_elem(&global_map, &key, &g, bpf_map_update_elem(&global_map, &key, &g,
BPF_ANY); BPF_ANY);
} }
break; break;
case BPF_SOCK_OPS_TCP_LISTEN_CB:
bpf_sock_ops_cb_flags_set(skops, BPF_SOCK_OPS_STATE_CB_FLAG);
break;
default: default:
rv = -1; rv = -1;
} }
......
...@@ -37,7 +37,8 @@ int verify_result(const struct tcpbpf_globals *result) ...@@ -37,7 +37,8 @@ int verify_result(const struct tcpbpf_globals *result)
(1 << BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB) | (1 << BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB) |
(1 << BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB) | (1 << BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB) |
(1 << BPF_SOCK_OPS_NEEDS_ECN) | (1 << BPF_SOCK_OPS_NEEDS_ECN) |
(1 << BPF_SOCK_OPS_STATE_CB)); (1 << BPF_SOCK_OPS_STATE_CB) |
(1 << BPF_SOCK_OPS_TCP_LISTEN_CB));
EXPECT_EQ(expected_events, result->event_map, "#" PRIx32); EXPECT_EQ(expected_events, result->event_map, "#" PRIx32);
EXPECT_EQ(501ULL, result->bytes_received, "llu"); EXPECT_EQ(501ULL, result->bytes_received, "llu");
...@@ -46,6 +47,7 @@ int verify_result(const struct tcpbpf_globals *result) ...@@ -46,6 +47,7 @@ int verify_result(const struct tcpbpf_globals *result)
EXPECT_EQ(1, result->data_segs_out, PRIu32); EXPECT_EQ(1, result->data_segs_out, PRIu32);
EXPECT_EQ(0x80, result->bad_cb_test_rv, PRIu32); EXPECT_EQ(0x80, result->bad_cb_test_rv, PRIu32);
EXPECT_EQ(0, result->good_cb_test_rv, PRIu32); EXPECT_EQ(0, result->good_cb_test_rv, PRIu32);
EXPECT_EQ(1, result->num_listen, PRIu32);
return 0; return 0;
err: err:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment