Make it possible to read from or write to skb metadata area using the dynptr slices creates with bpf_dynptr_slice() or bpf_dynptr_slice_rdwr(). 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 | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/net/core/filter.c b/net/core/filter.c index ab6599f42bb7..020da46f93a7 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -12033,9 +12033,14 @@ void *bpf_dynptr_skb_slice(const struct bpf_dynptr_kern *ptr, u32 offset, else return skb_pointer_if_linear(skb, offset, len); - case SKB_DYNPTR_METADATA: - return NULL; /* not implemented */ + case SKB_DYNPTR_METADATA: { + u32 meta_len = skb_metadata_len(skb); + if (len > meta_len || offset > meta_len - len) + return NULL; /* out of bounds */ + + return skb_metadata_end(skb) - meta_len + offset; + } default: WARN_ONCE(true, "%s: unknown skb dynptr offset %d\n", __func__, ptr->offset); return NULL; -- 2.43.0