On Thu, 25 Aug 2022 11:20:31 -0700 Andrii Nakryiko <andrii.nakryiko@xxxxxxxxx> wrote: > > + * long bpf_skb_set_tunnel_opt_dynptr(struct sk_buff *skb, struct bpf_dynptr *opt, u32 len) > > why can't we rely on dynptr's len instead of specifying extra one > here? dynptr is a range of memory, so just specify that you take that > entire range? > > And then we'll have (or partially already have) generic dynptr helpers > to adjust internal dynptr offset and len. Alright. For my usecase I need to use *part* of the tunnel options that were previously stored as a dynptr. Therefore I need to introduce a new bpf helper that adjusts the dynptr. How about this suggestion (sketch, not yet tried): // adjusts the dynptr to point to *len* bytes starting from the // specified *offset* BPF_CALL_3(bpf_dynptr_slice, struct bpf_dynptr_kern *, ptr, u32, offset, u32, len) { int err; u32 size; if (!ptr->data) return -EINVAL; err = bpf_dynptr_check_off_len(ptr, offset, len); if (err) return err; ptr->offset += offset; size = bpf_dynptr_get_size(ptr) - len; ptr->size = (ptr->size & ~(u32)DYNPTR_SIZE_MASK) | size; return 0; }