lkml.org 
[lkml]   [2020]   [Dec]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH bpf-next v4 2/6] bpf: Add a bpf_sock_from_file helper
    Date
    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>
    Acked-by: KP Singh <kpsingh@google.com>
    Acked-by: Martin KaFai Lau <kafai@fb.com>
    ---
    include/uapi/linux/bpf.h | 9 +++++++++
    kernel/trace/bpf_trace.c | 20 ++++++++++++++++++++
    scripts/bpf_helpers_doc.py | 4 ++++
    tools/include/uapi/linux/bpf.h | 9 +++++++++
    4 files changed, 42 insertions(+)

    diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
    index c3458ec1f30a..a92b2b7d331b 100644
    --- a/include/uapi/linux/bpf.h
    +++ b/include/uapi/linux/bpf.h
    @@ -3817,6 +3817,14 @@ union bpf_attr {
    * The **hash_algo** is returned on success,
    * **-EOPNOTSUP** if IMA is disabled or **-EINVAL** if
    * invalid arguments are passed.
    + *
    + * struct socket *bpf_sock_from_file(struct file *file)
    + * Description
    + * If the given file represents a socket, returns the associated
    + * socket.
    + * Return
    + * A pointer to a struct socket on success or NULL if the file is
    + * not a socket.
    */
    #define __BPF_FUNC_MAPPER(FN) \
    FN(unspec), \
    @@ -3981,6 +3989,7 @@ union bpf_attr {
    FN(bprm_opts_set), \
    FN(ktime_get_coarse_ns), \
    FN(ima_inode_hash), \
    + 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 d255bc9b2bfa..d0aac9eac2d8 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)
    {
    @@ -1356,6 +1374,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 8b829748d488..867ada23281c 100755
    --- a/scripts/bpf_helpers_doc.py
    +++ b/scripts/bpf_helpers_doc.py
    @@ -437,6 +437,8 @@ class PrinterHelpers(Printer):
    'struct path',
    'struct btf_ptr',
    'struct inode',
    + 'struct socket',
    + 'struct file',
    ]
    known_types = {
    '...',
    @@ -482,6 +484,8 @@ class PrinterHelpers(Printer):
    'struct path',
    'struct btf_ptr',
    'struct inode',
    + '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 c3458ec1f30a..a92b2b7d331b 100644
    --- a/tools/include/uapi/linux/bpf.h
    +++ b/tools/include/uapi/linux/bpf.h
    @@ -3817,6 +3817,14 @@ union bpf_attr {
    * The **hash_algo** is returned on success,
    * **-EOPNOTSUP** if IMA is disabled or **-EINVAL** if
    * invalid arguments are passed.
    + *
    + * struct socket *bpf_sock_from_file(struct file *file)
    + * Description
    + * If the given file represents a socket, returns the associated
    + * socket.
    + * Return
    + * A pointer to a struct socket on success or NULL if the file is
    + * not a socket.
    */
    #define __BPF_FUNC_MAPPER(FN) \
    FN(unspec), \
    @@ -3981,6 +3989,7 @@ union bpf_attr {
    FN(bprm_opts_set), \
    FN(ktime_get_coarse_ns), \
    FN(ima_inode_hash), \
    + FN(sock_from_file), \
    /* */

    /* integer value in 'imm' field of BPF_CALL instruction selects which helper
    --
    2.29.2.454.gaff20da3a2-goog
    \
     
     \ /
      Last update: 2020-12-02 21:58    [W:4.742 / U:0.056 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site