lkml.org 
[lkml]   [2020]   [Nov]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 2/5] bpf: Add a bpf_sock_from_file helper
    Date
    From: Florent Revest <revest@google.com>

    While eBPF programs can check whether a file is a socket by file->f_op
    == &socket_file_ops, they cannot convert the void private_data pointer
    to a struct socket BTF pointer. In order to do this a new helper
    wrapping sock_from_file is added.

    This is useful to tracing programs but also other program types
    inheriting this set of helpers such as iterators or LSM programs.

    Signed-off-by: Florent Revest <revest@google.com>
    ---
    include/uapi/linux/bpf.h | 7 +++++++
    kernel/trace/bpf_trace.c | 20 ++++++++++++++++++++
    scripts/bpf_helpers_doc.py | 4 ++++
    tools/include/uapi/linux/bpf.h | 7 +++++++
    4 files changed, 38 insertions(+)

    diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
    index 162999b12790..7d598f161dc0 100644
    --- a/include/uapi/linux/bpf.h
    +++ b/include/uapi/linux/bpf.h
    @@ -3787,6 +3787,12 @@ union bpf_attr {
    * *ARG_PTR_TO_BTF_ID* of type *task_struct*.
    * Return
    * Pointer to the current task.
    + *
    + * struct socket *bpf_sock_from_file(struct file *file)
    + * Description
    + * If the given file contains a socket, returns the associated socket.
    + * Return
    + * A pointer to a struct socket on success or NULL on failure.
    */
    #define __BPF_FUNC_MAPPER(FN) \
    FN(unspec), \
    @@ -3948,6 +3954,7 @@ union bpf_attr {
    FN(task_storage_get), \
    FN(task_storage_delete), \
    FN(get_current_task_btf), \
    + FN(sock_from_file), \
    /* */

    /* integer value in 'imm' field of BPF_CALL instruction selects which helper
    diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c
    index 02986c7b90eb..d87ca6f93c58 100644
    --- a/kernel/trace/bpf_trace.c
    +++ b/kernel/trace/bpf_trace.c
    @@ -1260,6 +1260,24 @@ const struct bpf_func_proto bpf_snprintf_btf_proto = {
    .arg5_type = ARG_ANYTHING,
    };

    +BPF_CALL_1(bpf_sock_from_file, struct file *, file)
    +{
    + return (unsigned long) sock_from_file(file);
    +}
    +
    +BTF_ID_LIST(bpf_sock_from_file_btf_ids)
    +BTF_ID(struct, socket)
    +BTF_ID(struct, file)
    +
    +static const struct bpf_func_proto bpf_sock_from_file_proto = {
    + .func = bpf_sock_from_file,
    + .gpl_only = false,
    + .ret_type = RET_PTR_TO_BTF_ID_OR_NULL,
    + .ret_btf_id = &bpf_sock_from_file_btf_ids[0],
    + .arg1_type = ARG_PTR_TO_BTF_ID,
    + .arg1_btf_id = &bpf_sock_from_file_btf_ids[1],
    +};
    +
    const struct bpf_func_proto *
    bpf_tracing_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)
    {
    @@ -1354,6 +1372,8 @@ bpf_tracing_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)
    return &bpf_per_cpu_ptr_proto;
    case BPF_FUNC_bpf_this_cpu_ptr:
    return &bpf_this_cpu_ptr_proto;
    + case BPF_FUNC_sock_from_file:
    + return &bpf_sock_from_file_proto;
    default:
    return NULL;
    }
    diff --git a/scripts/bpf_helpers_doc.py b/scripts/bpf_helpers_doc.py
    index 31484377b8b1..d609f20e8360 100755
    --- a/scripts/bpf_helpers_doc.py
    +++ b/scripts/bpf_helpers_doc.py
    @@ -435,6 +435,8 @@ class PrinterHelpers(Printer):
    'struct xdp_md',
    'struct path',
    'struct btf_ptr',
    + 'struct socket',
    + 'struct file',
    ]
    known_types = {
    '...',
    @@ -478,6 +480,8 @@ class PrinterHelpers(Printer):
    'struct task_struct',
    'struct path',
    'struct btf_ptr',
    + 'struct socket',
    + 'struct file',
    }
    mapped_types = {
    'u8': '__u8',
    diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h
    index 162999b12790..7d598f161dc0 100644
    --- a/tools/include/uapi/linux/bpf.h
    +++ b/tools/include/uapi/linux/bpf.h
    @@ -3787,6 +3787,12 @@ union bpf_attr {
    * *ARG_PTR_TO_BTF_ID* of type *task_struct*.
    * Return
    * Pointer to the current task.
    + *
    + * struct socket *bpf_sock_from_file(struct file *file)
    + * Description
    + * If the given file contains a socket, returns the associated socket.
    + * Return
    + * A pointer to a struct socket on success or NULL on failure.
    */
    #define __BPF_FUNC_MAPPER(FN) \
    FN(unspec), \
    @@ -3948,6 +3954,7 @@ union bpf_attr {
    FN(task_storage_get), \
    FN(task_storage_delete), \
    FN(get_current_task_btf), \
    + FN(sock_from_file), \
    /* */

    /* integer value in 'imm' field of BPF_CALL instruction selects which helper
    --
    2.29.2.299.gdc1121823c-goog
    \
     
     \ /
      Last update: 2020-11-19 17:30    [W:4.281 / U:0.184 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site