Message ID | 20250213-vsock-listen-sockmap-nullptr-v1-4-994b7cd2f16b@rbox.co (mailing list archive) |
---|---|
State | Accepted |
Commit | 85928e9c436398abcac32a9afa2f591895dd497d |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | sockmap, vsock: For connectible sockets allow only connected | expand |
On 2/13/25 12:58, Michal Luczaj wrote: > ... > This does not test datagram vsocks. Even though it hardly matters. VMCI is > the only transport that features VSOCK_TRANSPORT_F_DGRAM, but it has an > unimplemented vsock_transport::readskb() callback, making it unsupported by ^^^^^^^ Ugh, read_skb(). Sorry, Michal
On Thu, Feb 13, 2025 at 12:58:52PM +0100, Michal Luczaj wrote: >Verify that for a connectible AF_VSOCK socket, merely having a transport >assigned is insufficient; socket must be connected for the sockmap to >accept. > >This does not test datagram vsocks. Even though it hardly matters. VMCI is >the only transport that features VSOCK_TRANSPORT_F_DGRAM, but it has an >unimplemented vsock_transport::readskb() callback, making it unsupported by >BPF/sockmap. > >Signed-off-by: Michal Luczaj <mhal@rbox.co> >--- > .../selftests/bpf/prog_tests/sockmap_basic.c | 30 ++++++++++++++++++++++ > 1 file changed, 30 insertions(+) Acked-by: Stefano Garzarella <sgarzare@redhat.com> > >diff --git a/tools/testing/selftests/bpf/prog_tests/sockmap_basic.c b/tools/testing/selftests/bpf/prog_tests/sockmap_basic.c >index 21793d8c79e12b6e607f59ecebb26448c310044b..05eb37935c3e290ee52b8d8c7c3e3a8db026cba2 100644 >--- a/tools/testing/selftests/bpf/prog_tests/sockmap_basic.c >+++ b/tools/testing/selftests/bpf/prog_tests/sockmap_basic.c >@@ -1065,6 +1065,34 @@ static void test_sockmap_skb_verdict_vsock_poll(void) > test_sockmap_pass_prog__destroy(skel); > } > >+static void test_sockmap_vsock_unconnected(void) >+{ >+ struct sockaddr_storage addr; >+ int map, s, zero = 0; >+ socklen_t alen; >+ >+ map = bpf_map_create(BPF_MAP_TYPE_SOCKMAP, NULL, sizeof(int), >+ sizeof(int), 1, NULL); >+ if (!ASSERT_OK_FD(map, "bpf_map_create")) >+ return; >+ >+ s = xsocket(AF_VSOCK, SOCK_STREAM, 0); >+ if (s < 0) >+ goto close_map; >+ >+ /* Fail connect(), but trigger transport assignment. */ >+ init_addr_loopback(AF_VSOCK, &addr, &alen); >+ if (!ASSERT_ERR(connect(s, sockaddr(&addr), alen), "connect")) >+ goto close_sock; >+ >+ ASSERT_ERR(bpf_map_update_elem(map, &zero, &s, BPF_ANY), "map_update"); >+ >+close_sock: >+ xclose(s); >+close_map: >+ xclose(map); >+} >+ > void test_sockmap_basic(void) > { > if (test__start_subtest("sockmap create_update_free")) >@@ -1131,4 +1159,6 @@ void test_sockmap_basic(void) > test_skmsg_helpers_with_link(BPF_MAP_TYPE_SOCKHASH); > if (test__start_subtest("sockmap skb_verdict vsock poll")) > test_sockmap_skb_verdict_vsock_poll(); >+ if (test__start_subtest("sockmap vsock unconnected")) >+ test_sockmap_vsock_unconnected(); > } > >-- >2.48.1 >
diff --git a/tools/testing/selftests/bpf/prog_tests/sockmap_basic.c b/tools/testing/selftests/bpf/prog_tests/sockmap_basic.c index 21793d8c79e12b6e607f59ecebb26448c310044b..05eb37935c3e290ee52b8d8c7c3e3a8db026cba2 100644 --- a/tools/testing/selftests/bpf/prog_tests/sockmap_basic.c +++ b/tools/testing/selftests/bpf/prog_tests/sockmap_basic.c @@ -1065,6 +1065,34 @@ static void test_sockmap_skb_verdict_vsock_poll(void) test_sockmap_pass_prog__destroy(skel); } +static void test_sockmap_vsock_unconnected(void) +{ + struct sockaddr_storage addr; + int map, s, zero = 0; + socklen_t alen; + + map = bpf_map_create(BPF_MAP_TYPE_SOCKMAP, NULL, sizeof(int), + sizeof(int), 1, NULL); + if (!ASSERT_OK_FD(map, "bpf_map_create")) + return; + + s = xsocket(AF_VSOCK, SOCK_STREAM, 0); + if (s < 0) + goto close_map; + + /* Fail connect(), but trigger transport assignment. */ + init_addr_loopback(AF_VSOCK, &addr, &alen); + if (!ASSERT_ERR(connect(s, sockaddr(&addr), alen), "connect")) + goto close_sock; + + ASSERT_ERR(bpf_map_update_elem(map, &zero, &s, BPF_ANY), "map_update"); + +close_sock: + xclose(s); +close_map: + xclose(map); +} + void test_sockmap_basic(void) { if (test__start_subtest("sockmap create_update_free")) @@ -1131,4 +1159,6 @@ void test_sockmap_basic(void) test_skmsg_helpers_with_link(BPF_MAP_TYPE_SOCKHASH); if (test__start_subtest("sockmap skb_verdict vsock poll")) test_sockmap_skb_verdict_vsock_poll(); + if (test__start_subtest("sockmap vsock unconnected")) + test_sockmap_vsock_unconnected(); }
Verify that for a connectible AF_VSOCK socket, merely having a transport assigned is insufficient; socket must be connected for the sockmap to accept. This does not test datagram vsocks. Even though it hardly matters. VMCI is the only transport that features VSOCK_TRANSPORT_F_DGRAM, but it has an unimplemented vsock_transport::readskb() callback, making it unsupported by BPF/sockmap. Signed-off-by: Michal Luczaj <mhal@rbox.co> --- .../selftests/bpf/prog_tests/sockmap_basic.c | 30 ++++++++++++++++++++++ 1 file changed, 30 insertions(+)