Martin KaFai Lau <kafai@xxxxxx> writes: > On Sat, Oct 09, 2021 at 12:20:27AM +0200, Toke Høiland-Jørgensen wrote: >> So if we can't fix the verifier, maybe we could come up with a more >> general helper for packet parsing? Something like: >> >> bpf_for_each_pkt_chunk(ctx, offset, callback_fn, callback_arg) >> { >> ptr = ctx->data + offset; >> while (ptr < ctx->data_end) { >> offset = callback_fn(ptr, ctx->data_end, callback_arg); >> if (offset == 0) >> return 0; >> ptr += offset; >> } >> >> // out of bounds before callback was done >> return -EINVAL; >> } >> >> This would work for parsing any kind of packet header or TLV-style data >> without having to teach the kernel about each header type. It'll have >> quite a bit of overhead if all the callbacks happen via indirect calls, >> but maybe the verifier can inline the calls (or at least turn them into >> direct CALL instructions)? > Direct call different callback_fn? bpf_for_each_pkt_chunk() is a kernel > function. It would be nice if the verifier could do that. Ohh, right, think-o on my part. It could be done if the helper was inlined in its entirety, though? Not sure if that's feasible? > This for_each helper had been considered also. Other than the need to > callback in a loop, the thought was to extend the existing > bpf_load_hdr_opt() because our initial feedback is the same header > handling logic cannot be used in xdp which is confusing. TBH, I had not noticed this helper before. Now that I have, it does seems like the kind of thing that belongs as a BPF library function rather than a helper in the first place :) > I don't mind to go with the for_each helper. However, with another > thought, if it needs to call a function in the loop anyway, I think > it could also be done in bpf by putting a global function in a loop. > Need to try and double check. Hmm, that would be interesting if possible! -Toke