Re: loop in eBPF kernel program

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 





On 02/27/2018 01:52 AM, Daniel Borkmann wrote:
On 02/27/2018 01:32 AM, Tushar Dave wrote:
Hello,

I am writing sample eBPF kernel program that uses kprobe
e.g.
SEC("kprobe/xyz")
int bpf_prog1(struct pt_regs *ctx)
{
.
..
}

And with pt_regs context I retrieved pointer to 'struct sk_buff_head'.
 From here on, I want to iterate over all skbs in the skb queue and
print/gather packet data. This certainly involves loop and that causes
my ebpf kernel program to fail with error,
e.g.
bpf_load_program() err=22
back-edge from insn 51 to 39
back-edge from insn 51 to 39

Any other alternative so that I can retrieve all packet data from skb queue?

Apology as this is not pure xdp query but I feel it should be okay to
ask here.
Bounded loops are still wip in BPF core, but today you can make use of
loop unrolling like the following when <X> is a known constant:

#pragma unroll
	for (i = 0; i < <X>; i++) {
		[...]
	}
Ok. Thanks.

I presume you're walking the skb via bpf_probe_read() helper from tracing
side, right? Other option could be to add a networking program (e.g. via
cls_bpf) and dump the full skb to perf RB via bpf_skb_event_output() helper.
Potentially if you already dump other data from tracing side via perf RB,
then the networking program can reuse/share the very same perf event map
as well.
yes I am using bpf_probe_read to walk over skb list. I will look into
cls_bpf option you mentioned. Thanks for suggestion :)

-Tushar

Cheers,
Daniel




[Index of Archives]     [Linux Networking Development]     [Fedora Linux Users]     [Linux SCTP]     [DCCP]     [Gimp]     [Yosemite Campsites]

  Powered by Linux