lkml.org 
[lkml]   [2021]   [Jan]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH bpf-next v5 4/4] selftests/bpf: Add a selftest for the tracing bpf_get_socket_cookie
    Date
    This builds up on the existing socket cookie test which checks whether
    the bpf_get_socket_cookie helpers provide the same value in
    cgroup/connect6 and sockops programs for a socket created by the
    userspace part of the test.

    Adding a tracing program to the existing objects requires a different
    attachment strategy and different headers.

    Signed-off-by: Florent Revest <revest@chromium.org>
    ---
    .../selftests/bpf/prog_tests/socket_cookie.c | 24 +++++++----
    .../selftests/bpf/progs/socket_cookie_prog.c | 41 ++++++++++++++++---
    2 files changed, 52 insertions(+), 13 deletions(-)

    diff --git a/tools/testing/selftests/bpf/prog_tests/socket_cookie.c b/tools/testing/selftests/bpf/prog_tests/socket_cookie.c
    index 53d0c44e7907..e5c5e2ea1deb 100644
    --- a/tools/testing/selftests/bpf/prog_tests/socket_cookie.c
    +++ b/tools/testing/selftests/bpf/prog_tests/socket_cookie.c
    @@ -15,8 +15,8 @@ struct socket_cookie {

    void test_socket_cookie(void)
    {
    + struct bpf_link *set_link, *update_sockops_link, *update_tracing_link;
    socklen_t addr_len = sizeof(struct sockaddr_in6);
    - struct bpf_link *set_link, *update_link;
    int server_fd, client_fd, cgroup_fd;
    struct socket_cookie_prog *skel;
    __u32 cookie_expected_value;
    @@ -39,15 +39,21 @@ void test_socket_cookie(void)
    PTR_ERR(set_link)))
    goto close_cgroup_fd;

    - update_link = bpf_program__attach_cgroup(skel->progs.update_cookie,
    - cgroup_fd);
    - if (CHECK(IS_ERR(update_link), "update-link-cg-attach", "err %ld\n",
    - PTR_ERR(update_link)))
    + update_sockops_link = bpf_program__attach_cgroup(
    + skel->progs.update_cookie_sockops, cgroup_fd);
    + if (CHECK(IS_ERR(update_sockops_link), "update-sockops-link-cg-attach",
    + "err %ld\n", PTR_ERR(update_sockops_link)))
    goto free_set_link;

    + update_tracing_link = bpf_program__attach(
    + skel->progs.update_cookie_tracing);
    + if (CHECK(IS_ERR(update_tracing_link), "update-tracing-link-attach",
    + "err %ld\n", PTR_ERR(update_tracing_link)))
    + goto free_update_sockops_link;
    +
    server_fd = start_server(AF_INET6, SOCK_STREAM, "::1", 0, 0);
    if (CHECK(server_fd < 0, "start_server", "errno %d\n", errno))
    - goto free_update_link;
    + goto free_update_tracing_link;

    client_fd = connect_to_fd(server_fd, 0);
    if (CHECK(client_fd < 0, "connect_to_fd", "errno %d\n", errno))
    @@ -71,8 +77,10 @@ void test_socket_cookie(void)
    close(client_fd);
    close_server_fd:
    close(server_fd);
    -free_update_link:
    - bpf_link__destroy(update_link);
    +free_update_tracing_link:
    + bpf_link__destroy(update_tracing_link);
    +free_update_sockops_link:
    + bpf_link__destroy(update_sockops_link);
    free_set_link:
    bpf_link__destroy(set_link);
    close_cgroup_fd:
    diff --git a/tools/testing/selftests/bpf/progs/socket_cookie_prog.c b/tools/testing/selftests/bpf/progs/socket_cookie_prog.c
    index 81e84be6f86d..1f770b732cb1 100644
    --- a/tools/testing/selftests/bpf/progs/socket_cookie_prog.c
    +++ b/tools/testing/selftests/bpf/progs/socket_cookie_prog.c
    @@ -1,11 +1,13 @@
    // SPDX-License-Identifier: GPL-2.0
    // Copyright (c) 2018 Facebook

    -#include <linux/bpf.h>
    -#include <sys/socket.h>
    +#include "vmlinux.h"

    #include <bpf/bpf_helpers.h>
    #include <bpf/bpf_endian.h>
    +#include <bpf/bpf_tracing.h>
    +
    +#define AF_INET6 10

    struct socket_cookie {
    __u64 cookie_key;
    @@ -19,6 +21,14 @@ struct {
    __type(value, struct socket_cookie);
    } socket_cookies SEC(".maps");

    +/*
    + * These three programs get executed in a row on connect() syscalls. The
    + * userspace side of the test creates a client socket, issues a connect() on it
    + * and then checks that the local storage associated with this socket has:
    + * cookie_value == local_port << 8 | 0xFF
    + * The different parts of this cookie_value are appended by those hooks if they
    + * all agree on the output of bpf_get_socket_cookie().
    + */
    SEC("cgroup/connect6")
    int set_cookie(struct bpf_sock_addr *ctx)
    {
    @@ -32,14 +42,14 @@ int set_cookie(struct bpf_sock_addr *ctx)
    if (!p)
    return 1;

    - p->cookie_value = 0xFF;
    + p->cookie_value = 0xF;
    p->cookie_key = bpf_get_socket_cookie(ctx);

    return 1;
    }

    SEC("sockops")
    -int update_cookie(struct bpf_sock_ops *ctx)
    +int update_cookie_sockops(struct bpf_sock_ops *ctx)
    {
    struct bpf_sock *sk;
    struct socket_cookie *p;
    @@ -60,9 +70,30 @@ int update_cookie(struct bpf_sock_ops *ctx)
    if (p->cookie_key != bpf_get_socket_cookie(ctx))
    return 1;

    - p->cookie_value = (ctx->local_port << 8) | p->cookie_value;
    + p->cookie_value |= (ctx->local_port << 8);

    return 1;
    }

    +SEC("fexit/inet_stream_connect")
    +int BPF_PROG(update_cookie_tracing, struct socket *sock,
    + struct sockaddr *uaddr, int addr_len, int flags)
    +{
    + struct socket_cookie *p;
    +
    + if (uaddr->sa_family != AF_INET6)
    + return 0;
    +
    + p = bpf_sk_storage_get(&socket_cookies, sock->sk, 0, 0);
    + if (!p)
    + return 0;
    +
    + if (p->cookie_key != bpf_get_socket_cookie(sock->sk))
    + return 0;
    +
    + p->cookie_value |= 0xF0;
    +
    + return 0;
    +}
    +
    char _license[] SEC("license") = "GPL";
    --
    2.30.0.284.gd98b1dd5eaa7-goog
    \
     
     \ /
      Last update: 2021-01-19 17:04    [W:4.823 / U:0.472 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site