forked from Minki/linux
1ed4d92458
This patch adds INET_DIAG support to bpf_sk_storage. 1. Although this series adds bpf_sk_storage diag capability to inet sk, bpf_sk_storage is in general applicable to all fullsock. Hence, the bpf_sk_storage logic will operate on SK_DIAG_* nlattr. The caller will pass in its specific nesting nlattr (e.g. INET_DIAG_*) as the argument. 2. The request will be like: INET_DIAG_REQ_SK_BPF_STORAGES (nla_nest) (defined in latter patch) SK_DIAG_BPF_STORAGE_REQ_MAP_FD (nla_put_u32) SK_DIAG_BPF_STORAGE_REQ_MAP_FD (nla_put_u32) ...... Considering there could have multiple bpf_sk_storages in a sk, instead of reusing INET_DIAG_INFO ("ss -i"), the user can select some specific bpf_sk_storage to dump by specifying an array of SK_DIAG_BPF_STORAGE_REQ_MAP_FD. If no SK_DIAG_BPF_STORAGE_REQ_MAP_FD is specified (i.e. an empty INET_DIAG_REQ_SK_BPF_STORAGES), it will dump all bpf_sk_storages of a sk. 3. The reply will be like: INET_DIAG_BPF_SK_STORAGES (nla_nest) (defined in latter patch) SK_DIAG_BPF_STORAGE (nla_nest) SK_DIAG_BPF_STORAGE_MAP_ID (nla_put_u32) SK_DIAG_BPF_STORAGE_MAP_VALUE (nla_reserve_64bit) SK_DIAG_BPF_STORAGE (nla_nest) SK_DIAG_BPF_STORAGE_MAP_ID (nla_put_u32) SK_DIAG_BPF_STORAGE_MAP_VALUE (nla_reserve_64bit) ...... 4. Unlike other INET_DIAG info of a sk which is pretty static, the size required to dump the bpf_sk_storage(s) of a sk is dynamic as the system adding more bpf_sk_storage_map. It is hard to set a static min_dump_alloc size. Hence, this series learns it at the runtime and adjust the cb->min_dump_alloc as it iterates all sk(s) of a system. The "unsigned int *res_diag_size" in bpf_sk_storage_diag_put() is for this purpose. The next patch will update the cb->min_dump_alloc as it iterates the sk(s). Signed-off-by: Martin KaFai Lau <kafai@fb.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org> Acked-by: Song Liu <songliubraving@fb.com> Link: https://lore.kernel.org/bpf/20200225230421.1975729-1-kafai@fb.com
51 lines
1.3 KiB
C
51 lines
1.3 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/* Copyright (c) 2019 Facebook */
|
|
#ifndef _BPF_SK_STORAGE_H
|
|
#define _BPF_SK_STORAGE_H
|
|
|
|
struct sock;
|
|
|
|
void bpf_sk_storage_free(struct sock *sk);
|
|
|
|
extern const struct bpf_func_proto bpf_sk_storage_get_proto;
|
|
extern const struct bpf_func_proto bpf_sk_storage_delete_proto;
|
|
|
|
struct bpf_sk_storage_diag;
|
|
struct sk_buff;
|
|
struct nlattr;
|
|
struct sock;
|
|
|
|
#ifdef CONFIG_BPF_SYSCALL
|
|
int bpf_sk_storage_clone(const struct sock *sk, struct sock *newsk);
|
|
struct bpf_sk_storage_diag *
|
|
bpf_sk_storage_diag_alloc(const struct nlattr *nla_stgs);
|
|
void bpf_sk_storage_diag_free(struct bpf_sk_storage_diag *diag);
|
|
int bpf_sk_storage_diag_put(struct bpf_sk_storage_diag *diag,
|
|
struct sock *sk, struct sk_buff *skb,
|
|
int stg_array_type,
|
|
unsigned int *res_diag_size);
|
|
#else
|
|
static inline int bpf_sk_storage_clone(const struct sock *sk,
|
|
struct sock *newsk)
|
|
{
|
|
return 0;
|
|
}
|
|
static inline struct bpf_sk_storage_diag *
|
|
bpf_sk_storage_diag_alloc(const struct nlattr *nla)
|
|
{
|
|
return NULL;
|
|
}
|
|
static inline void bpf_sk_storage_diag_free(struct bpf_sk_storage_diag *diag)
|
|
{
|
|
}
|
|
static inline int bpf_sk_storage_diag_put(struct bpf_sk_storage_diag *diag,
|
|
struct sock *sk, struct sk_buff *skb,
|
|
int stg_array_type,
|
|
unsigned int *res_diag_size)
|
|
{
|
|
return 0;
|
|
}
|
|
#endif
|
|
|
|
#endif /* _BPF_SK_STORAGE_H */
|