Skip to content

Commit f55ac2e

Browse files
Dong ChenchenNipaLocal
authored andcommitted
selftests: bpf: Add case for sockmap_ktls set when verdict attached
Cover the scenario when close a socket after inserted into the sockmap (verdict attach) and set ULP. It will trigger sock_map_close warning. Signed-off-by: Dong Chenchen <[email protected]> Reviewed-by: John Fastabend <[email protected]> Signed-off-by: NipaLocal <nipa@local>
1 parent 30d804d commit f55ac2e

File tree

1 file changed

+70
-0
lines changed

1 file changed

+70
-0
lines changed

tools/testing/selftests/bpf/prog_tests/sockmap_ktls.c

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
#define MAX_TEST_NAME 80
1111
#define TCP_ULP 31
12+
#define SOCKMAP_VERDICT_PROG "test_sockmap_skb_verdict_attach.bpf.o"
1213

1314
static int tcp_server(int family)
1415
{
@@ -132,6 +133,73 @@ static void test_sockmap_ktls_update_fails_when_sock_has_ulp(int family, int map
132133
close(s);
133134
}
134135

136+
/* close a kTLS socket after removing it from sockmap. */
137+
static void test_sockmap_ktls_close_after_delete(int family, int map)
138+
{
139+
struct sockaddr_storage addr = {0};
140+
socklen_t len = sizeof(addr);
141+
int err, cli, srv, zero = 0;
142+
struct bpf_program *prog;
143+
struct bpf_object *obj;
144+
int verdict;
145+
146+
obj = bpf_object__open_file(SOCKMAP_VERDICT_PROG, NULL);
147+
if (!ASSERT_OK(libbpf_get_error(obj), "bpf_object__open_file"))
148+
return;
149+
150+
err = bpf_object__load(obj);
151+
if (!ASSERT_OK(err, "bpf_object__load"))
152+
goto close_obj;
153+
154+
prog = bpf_object__next_program(obj, NULL);
155+
verdict = bpf_program__fd(prog);
156+
if (!ASSERT_GE(verdict, 0, "bpf_program__fd"))
157+
goto close_obj;
158+
159+
err = bpf_prog_attach(verdict, map, BPF_SK_SKB_STREAM_VERDICT, 0);
160+
if (!ASSERT_OK(err, "bpf_prog_attach"))
161+
goto close_verdict;
162+
163+
srv = tcp_server(family);
164+
if (srv == -1)
165+
goto detach;
166+
167+
err = getsockname(srv, (struct sockaddr *)&addr, &len);
168+
if (!ASSERT_OK(err, "getsockopt"))
169+
goto close_srv;
170+
171+
cli = socket(family, SOCK_STREAM, 0);
172+
if (!ASSERT_GE(cli, 0, "socket"))
173+
goto close_srv;
174+
175+
err = connect(cli, (struct sockaddr *)&addr, len);
176+
if (!ASSERT_OK(err, "connect"))
177+
goto close_cli;
178+
179+
err = bpf_map_update_elem(map, &zero, &cli, 0);
180+
if (!ASSERT_OK(err, "bpf_map_update_elem"))
181+
goto close_cli;
182+
183+
err = setsockopt(cli, IPPROTO_TCP, TCP_ULP, "tls", strlen("tls"));
184+
if (!ASSERT_OK(err, "setsockopt(TCP_ULP)"))
185+
goto close_cli;
186+
187+
err = bpf_map_delete_elem(map, &zero);
188+
if (!ASSERT_OK(err, "bpf_map_delete_elem"))
189+
goto close_cli;
190+
191+
close_cli:
192+
close(cli);
193+
close_srv:
194+
close(srv);
195+
detach:
196+
bpf_prog_detach2(verdict, map, BPF_SK_SKB_STREAM_VERDICT);
197+
close_verdict:
198+
close(verdict);
199+
close_obj:
200+
bpf_object__close(obj);
201+
}
202+
135203
static const char *fmt_test_name(const char *subtest_name, int family,
136204
enum bpf_map_type map_type)
137205
{
@@ -158,6 +226,8 @@ static void run_tests(int family, enum bpf_map_type map_type)
158226
test_sockmap_ktls_disconnect_after_delete(family, map);
159227
if (test__start_subtest(fmt_test_name("update_fails_when_sock_has_ulp", family, map_type)))
160228
test_sockmap_ktls_update_fails_when_sock_has_ulp(family, map);
229+
if (test__start_subtest(fmt_test_name("close_after_delete", family, map_type)))
230+
test_sockmap_ktls_close_after_delete(family, map);
161231

162232
close(map);
163233
}

0 commit comments

Comments
 (0)