mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 18:51:56 -04:00
BACKPORT: net: bpf: Add netlink and ipv6_route bpf_iter targets
This patch added netlink and ipv6_route targets, using
the same seq_ops (except show() and minor changes for stop())
for /proc/net/{netlink,ipv6_route}.
The net namespace for these targets are the current net
namespace at file open stage, similar to
/proc/net/{netlink,ipv6_route} reference counting
the net namespace at seq_file open stage.
Since module is not supported for now, ipv6_route is
supported only if the IPV6 is built-in, i.e., not compiled
as a module. The restriction can be lifted once module
is properly supported for bpf_iter.
Change-Id: I07ea2bf9ae25cbca90fd56b70ef6b7bf76fe996d
Signed-off-by: Yonghong Song <[email protected]>
Signed-off-by: Alexei Starovoitov <[email protected]>
Acked-by: Andrii Nakryiko <[email protected]>
Link: https://lore.kernel.org/bpf/[email protected]
This commit is contained in:
parent
0e10ecb196
commit
0b7924ed8b
5 changed files with 206 additions and 4 deletions
|
|
@ -2613,7 +2613,7 @@ static void *netlink_seq_next(struct seq_file *seq, void *v, loff_t *pos)
|
|||
return __netlink_seq_next(seq);
|
||||
}
|
||||
|
||||
static void netlink_seq_stop(struct seq_file *seq, void *v)
|
||||
static void netlink_native_seq_stop(struct seq_file *seq, void *v)
|
||||
{
|
||||
struct nl_seq_iter *iter = seq->private;
|
||||
|
||||
|
|
@ -2624,7 +2624,7 @@ static void netlink_seq_stop(struct seq_file *seq, void *v)
|
|||
}
|
||||
|
||||
|
||||
static int netlink_seq_show(struct seq_file *seq, void *v)
|
||||
static int netlink_native_seq_show(struct seq_file *seq, void *v)
|
||||
{
|
||||
if (v == SEQ_START_TOKEN) {
|
||||
seq_puts(seq,
|
||||
|
|
@ -2651,6 +2651,68 @@ static int netlink_seq_show(struct seq_file *seq, void *v)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BPF_SYSCALL
|
||||
struct bpf_iter__netlink {
|
||||
__bpf_md_ptr(struct bpf_iter_meta *, meta);
|
||||
__bpf_md_ptr(struct netlink_sock *, sk);
|
||||
};
|
||||
|
||||
DEFINE_BPF_ITER_FUNC(netlink, struct bpf_iter_meta *meta, struct netlink_sock *sk)
|
||||
|
||||
static int netlink_prog_seq_show(struct bpf_prog *prog,
|
||||
struct bpf_iter_meta *meta,
|
||||
void *v)
|
||||
{
|
||||
struct bpf_iter__netlink ctx;
|
||||
|
||||
meta->seq_num--; /* skip SEQ_START_TOKEN */
|
||||
ctx.meta = meta;
|
||||
ctx.sk = nlk_sk((struct sock *)v);
|
||||
return bpf_iter_run_prog(prog, &ctx);
|
||||
}
|
||||
|
||||
static int netlink_seq_show(struct seq_file *seq, void *v)
|
||||
{
|
||||
struct bpf_iter_meta meta;
|
||||
struct bpf_prog *prog;
|
||||
|
||||
meta.seq = seq;
|
||||
prog = bpf_iter_get_info(&meta, false);
|
||||
if (!prog)
|
||||
return netlink_native_seq_show(seq, v);
|
||||
|
||||
if (v != SEQ_START_TOKEN)
|
||||
return netlink_prog_seq_show(prog, &meta, v);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void netlink_seq_stop(struct seq_file *seq, void *v)
|
||||
{
|
||||
struct bpf_iter_meta meta;
|
||||
struct bpf_prog *prog;
|
||||
|
||||
if (!v) {
|
||||
meta.seq = seq;
|
||||
prog = bpf_iter_get_info(&meta, true);
|
||||
if (prog)
|
||||
(void)netlink_prog_seq_show(prog, &meta, v);
|
||||
}
|
||||
|
||||
netlink_native_seq_stop(seq, v);
|
||||
}
|
||||
#else
|
||||
static int netlink_seq_show(struct seq_file *seq, void *v)
|
||||
{
|
||||
return netlink_native_seq_show(seq, v);
|
||||
}
|
||||
|
||||
static void netlink_seq_stop(struct seq_file *seq, void *v)
|
||||
{
|
||||
netlink_native_seq_stop(seq, v);
|
||||
}
|
||||
#endif
|
||||
|
||||
static const struct seq_operations netlink_seq_ops = {
|
||||
.start = netlink_seq_start,
|
||||
.next = netlink_seq_next,
|
||||
|
|
@ -2757,6 +2819,21 @@ static const struct rhashtable_params netlink_rhashtable_params = {
|
|||
.automatic_shrinking = true,
|
||||
};
|
||||
|
||||
#if defined(CONFIG_BPF_SYSCALL) && defined(CONFIG_PROC_FS)
|
||||
static int __init bpf_iter_register(void)
|
||||
{
|
||||
struct bpf_iter_reg reg_info = {
|
||||
.target = "netlink",
|
||||
.seq_ops = &netlink_seq_ops,
|
||||
.init_seq_private = bpf_iter_init_seq_net,
|
||||
.fini_seq_private = bpf_iter_fini_seq_net,
|
||||
.seq_priv_size = sizeof(struct nl_seq_iter),
|
||||
};
|
||||
|
||||
return bpf_iter_reg_target(®_info);
|
||||
}
|
||||
#endif
|
||||
|
||||
static int __init netlink_proto_init(void)
|
||||
{
|
||||
int i;
|
||||
|
|
@ -2765,6 +2842,11 @@ static int __init netlink_proto_init(void)
|
|||
if (err != 0)
|
||||
goto out;
|
||||
|
||||
#if defined(CONFIG_BPF_SYSCALL) && defined(CONFIG_PROC_FS)
|
||||
err = bpf_iter_register();
|
||||
if (err)
|
||||
goto out;
|
||||
#endif
|
||||
BUILD_BUG_ON(sizeof(struct netlink_skb_parms) > FIELD_SIZEOF(struct sk_buff, cb));
|
||||
|
||||
nl_table = kcalloc(MAX_LINKS, sizeof(*nl_table), GFP_KERNEL);
|
||||
|
|
|
|||
Loading…
Reference in a new issue