Make it possible to read from skb metadata area using the bpf_dynptr_read() BPF helper. This prepares ground for access to skb metadata from all BPF hooks which operate on __sk_buff context. Signed-off-by: Jakub Sitnicki --- net/core/filter.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/net/core/filter.c b/net/core/filter.c index 3c2948517838..f71b4b6b09fb 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -11981,9 +11981,15 @@ int bpf_dynptr_skb_read(const struct bpf_dynptr_kern *src, u32 offset, case SKB_DYNPTR_PAYLOAD: return ____bpf_skb_load_bytes(skb, offset, dst, len); - case SKB_DYNPTR_METADATA: - return -EOPNOTSUPP; /* not implemented */ + case SKB_DYNPTR_METADATA: { + u32 meta_len = skb_metadata_len(skb); + + if (len > meta_len || offset > meta_len - len) + return -E2BIG; /* out of bounds */ + memmove(dst, skb_metadata_end(skb) - meta_len + offset, len); + return 0; + } default: WARN_ONCE(true, "%s: unknown skb dynptr offset %d\n", __func__, src->offset); return -EFAULT; -- 2.43.0