Skip to content

Commit 5f405c0

Browse files
jrfastabborkmann
authored andcommitted
bpf, sockmap: Add tests for MSG_F_PEEK
Test that we can read with MSG_F_PEEK and then still get correct number of available bytes through FIONREAD. The recv() (without PEEK) then returns the bytes as expected. The recv() always worked though because it was just the available byte reporting that was broke before latest fixes. Signed-off-by: John Fastabend <[email protected]> Signed-off-by: Daniel Borkmann <[email protected]> Reviewed-by: Jakub Sitnicki <[email protected]> Link: https://lore.kernel.org/bpf/[email protected]
1 parent da9e915 commit 5f405c0

File tree

1 file changed

+51
-0
lines changed

1 file changed

+51
-0
lines changed

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

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -475,6 +475,55 @@ static void test_sockmap_skb_verdict_fionread(bool pass_prog)
475475
test_sockmap_drop_prog__destroy(drop);
476476
}
477477

478+
static void test_sockmap_skb_verdict_peek(void)
479+
{
480+
int err, map, verdict, s, c1, p1, zero = 0, sent, recvd, avail;
481+
struct test_sockmap_pass_prog *pass;
482+
char snd[256] = "0123456789";
483+
char rcv[256] = "0";
484+
485+
pass = test_sockmap_pass_prog__open_and_load();
486+
if (!ASSERT_OK_PTR(pass, "open_and_load"))
487+
return;
488+
verdict = bpf_program__fd(pass->progs.prog_skb_verdict);
489+
map = bpf_map__fd(pass->maps.sock_map_rx);
490+
491+
err = bpf_prog_attach(verdict, map, BPF_SK_SKB_STREAM_VERDICT, 0);
492+
if (!ASSERT_OK(err, "bpf_prog_attach"))
493+
goto out;
494+
495+
s = socket_loopback(AF_INET, SOCK_STREAM);
496+
if (!ASSERT_GT(s, -1, "socket_loopback(s)"))
497+
goto out;
498+
499+
err = create_pair(s, AF_INET, SOCK_STREAM, &c1, &p1);
500+
if (!ASSERT_OK(err, "create_pairs(s)"))
501+
goto out;
502+
503+
err = bpf_map_update_elem(map, &zero, &c1, BPF_NOEXIST);
504+
if (!ASSERT_OK(err, "bpf_map_update_elem(c1)"))
505+
goto out_close;
506+
507+
sent = xsend(p1, snd, sizeof(snd), 0);
508+
ASSERT_EQ(sent, sizeof(snd), "xsend(p1)");
509+
recvd = recv(c1, rcv, sizeof(rcv), MSG_PEEK);
510+
ASSERT_EQ(recvd, sizeof(rcv), "recv(c1)");
511+
err = ioctl(c1, FIONREAD, &avail);
512+
ASSERT_OK(err, "ioctl(FIONREAD) error");
513+
ASSERT_EQ(avail, sizeof(snd), "after peek ioctl(FIONREAD)");
514+
recvd = recv(c1, rcv, sizeof(rcv), 0);
515+
ASSERT_EQ(recvd, sizeof(rcv), "recv(p0)");
516+
err = ioctl(c1, FIONREAD, &avail);
517+
ASSERT_OK(err, "ioctl(FIONREAD) error");
518+
ASSERT_EQ(avail, 0, "after read ioctl(FIONREAD)");
519+
520+
out_close:
521+
close(c1);
522+
close(p1);
523+
out:
524+
test_sockmap_pass_prog__destroy(pass);
525+
}
526+
478527
void test_sockmap_basic(void)
479528
{
480529
if (test__start_subtest("sockmap create_update_free"))
@@ -515,4 +564,6 @@ void test_sockmap_basic(void)
515564
test_sockmap_skb_verdict_fionread(true);
516565
if (test__start_subtest("sockmap skb_verdict fionread on drop"))
517566
test_sockmap_skb_verdict_fionread(false);
567+
if (test__start_subtest("sockmap skb_verdict msg_f_peek"))
568+
test_sockmap_skb_verdict_peek();
518569
}

0 commit comments

Comments
 (0)