On 11/21/22 5:48 PM, John Fastabend wrote:
Yonghong Song wrote:
On 11/20/22 6:10 PM, John Fastabend wrote:
Yonghong Song wrote:
Currenty, a non-tracing bpf program typically has a single 'context' argument
with predefined uapi struct type. Following these uapi struct, user is able
to access other fields defined in uapi header. Inside the kernel, the
user-seen 'context' argument is replaced with 'kernel context' (or 'kctx'
in short) which can access more information than what uapi header provides.
To access other info not in uapi header, people typically do two things:
(1). extend uapi to access more fields rooted from 'context'.
(2). use bpf_probe_read_kernl() helper to read particular field based on
kctx.
[...]
From myside this allows us to pull in the dev info and from that get
netns so fixes a gap we had to split into a kprobe + xdp.
If we can get a pointer to the recv queue then with a few reads we
get the hash, vlan, etc. (see timestapm thread)
Thanks, John. Glad to see it is useful.
And then last bit is if we can get a ptr to the net ns list, plus
Unfortunately, currently vmlinux btf does not have non-percpu global
variables, so net_namespace_list is not available to bpf programs.
But I think we could do the following with a little bit user space
initial involvement as a workaround.
What would you think of another kfunc, bpf_get_global_var() to fetch
the global reference and cast it with a type? I think even if you
had it in BTF you would still need some sort of helper otherwise
how would you know what scope of the var should be and get it
correct in type checker as a TRUSTED arg? I think for my use case
UNTRUSTED is find, seeing we do it with probe_reads already, but
getting a TRUSTED arg seems nicer given it can be known correct
from kernel side.
I was thinking something like,
struct net *head = bpf_get_global_var(net_namespace_list,
bpf_core_type_id_kernel(struct *net));
We cannot do this as ptr_trusted, since it's an unknown cast.
The verifier cannot trust bpf prog to do the right thing.
But we can enable this buy adding export_symbol_gpl global vars to BTF.
Then they will be trusted and their types correct.
Pretty much like per-cpu variables.