From: Arthur Fabre <afabre@xxxxxxxxxxxxxx> Add kfuncs to allow socket filter programs access to traits in an skb. Signed-off-by: Arthur Fabre <afabre@xxxxxxxxxxxxxx> --- net/core/filter.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/net/core/filter.c b/net/core/filter.c index 79b78e7cd57fd78c6cc8443da54ae96408c496b0..47f18fb0e23c2c19d26f9b408653c6756a5110c7 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -12063,6 +12063,39 @@ __bpf_kfunc int bpf_sk_assign_tcp_reqsk(struct __sk_buff *s, struct sock *sk, #endif } +__bpf_kfunc int bpf_skb_trait_set(const struct sk_buff *skb, u64 key, + const void *val, u64 val__sz, u64 flags) +{ + void *traits = skb_traits(skb); + + if (!traits) + return -EOPNOTSUPP; + + return trait_set(traits, skb_metadata_end(skb) - skb_metadata_len(skb), + key, val, val__sz, flags); +} + +__bpf_kfunc int bpf_skb_trait_get(const struct sk_buff *skb, u64 key, + void *val, u64 val__sz) +{ + void *traits = skb_traits(skb); + + if (!traits) + return -EOPNOTSUPP; + + return trait_get(traits, key, val, val__sz); +} + +__bpf_kfunc int bpf_skb_trait_del(const struct sk_buff *skb, u64 key) +{ + void *traits = skb_traits(skb); + + if (!traits) + return -EOPNOTSUPP; + + return trait_del(traits, key); +} + __bpf_kfunc_end_defs(); int bpf_dynptr_from_skb_rdonly(struct __sk_buff *skb, u64 flags, @@ -12082,6 +12115,9 @@ int bpf_dynptr_from_skb_rdonly(struct __sk_buff *skb, u64 flags, BTF_KFUNCS_START(bpf_kfunc_check_set_skb) BTF_ID_FLAGS(func, bpf_dynptr_from_skb, KF_TRUSTED_ARGS) +BTF_ID_FLAGS(func, bpf_skb_trait_set) +BTF_ID_FLAGS(func, bpf_skb_trait_get) +BTF_ID_FLAGS(func, bpf_skb_trait_del) BTF_KFUNCS_END(bpf_kfunc_check_set_skb) BTF_KFUNCS_START(bpf_kfunc_check_set_xdp) -- 2.43.0