Is there another way to look into a program array? I'm currently using
the program below:
prog = """
BPF_TABLE("prog", int, int, prog_array, 5);
int hello(struct __sk_buff* ebpf_packet) {
int key = 1;
int *value;
bpf_trace_printk("Hello, World!\\n");
value = bpf_map_lookup_elem(&prog_array, &key);
prog_array.call(ebpf_packet, 1);
bpf_trace_printk("Tail-call not executed!\\n");
return 1;
}
"""
And I get the following error:
bpf: Invalid argument
0: (bf) r6 = r1
1: (b7) r1 = 1
2: (63) *(u32 *)(r10 -4) = r1
3: (b7) r1 = 2593
4: (6b) *(u16 *)(r10 -12) = r1
5: (b7) r1 = 1684828783
6: (63) *(u32 *)(r10 -16) = r1
7: (18) r1 = 0x6c6c6548
9: (7b) *(u64 *)(r10 -24) = r1
10: (b7) r7 = 0
11: (73) *(u8 *)(r10 -10) = r7
12: (bf) r1 = r10
13: (07) r1 += -24
14: (b7) r2 = 15
15: (85) call 6
16: (bf) r2 = r10
17: (07) r2 += -4
18: (08) r0 = 0x0
invalid BPF_LD_IMM insn
Regards,
Tanja
Am 02.03.2017 um 14:35 schrieb Mauricio Vasquez:
On 02/28/2017 06:01 AM, Tanja Ulmen wrote:
Hi Mauricio,
thank you for the example program, it works and I get both outputs.
Are you calling load_func() for the program in the .c file?
Yes I'm calling load_func() for the program. My program is similar to
the endToEndTest.py of the P4 frontend
(https://github.com/iovisor/bcc/blob/0c8c179fc1283600887efa46fe428022efc4151b/src/cc/frontends/p4/test/endToEndTest.py).
Thus a small virtual network where each node has its own namespace.
I think the problem of my program is that the program with the
tail-call is executed in a namespace, but I don't know exactly why
this is a problem. I will keep on looking for the problem, but maybe
you have some further ideas?
Unfortunately I don't have any idea for it.
As a comment, it is normal that "print prog_array.items()" prints [],
the prog type array does not implement the lookup function.
Regards,
Mauricio
Regards,
Tanja
Am 23.02.2017 um 20:24 schrieb Mauricio Vasquez:
Hello Tanja,
On 02/20/2017 09:53 AM, Tanja Ulmen via iovisor-dev wrote:
Hi,
I'm new to eBPF and bcc and I hope this is the right platform for
my question.
Welcome!
I have the following problem while working with a bpf program array
map:
I have a C file that contains a program map like this:
BPF_TABLE("prog", int, int, prog_array, 2);
Later on it is called with
prog_array.call(ebpf_packet, 1);
The respective part of my python file looks like this:
b = BPF(src_file="./output.c")
prog = """
int hello(struct __sk_buff* ebpf_packet) {
bpf_trace_printk("Hello, World!\\n");
return 0;
}
"""
hw = BPF(text=prog)
hello_fn = hw.load_func("hello", BPF.SCHED_CLS)
prog_array = b["prog_array"]
prog_array[ctypes.c_int(1)] = ctypes.c_int(hello_fn.fd)
print prog_array.items()
The output of the last line is just an empty array [] and the
subprogram "hello" is not called when I run the program. There is
no error. I have also hash bpf tables where I can assign key and
leaf without any problems and these tables are accessed correctly
during the run.
Do you have any idea where my mistake could be?
Are you calling load_func() for the program in the .c file?
I modified one of the examples to add a tail call, you can see at [1].
Although print(prog_array.items()) shows an empty array, the second
eBPF program is called. I tried to print the prog array in some
other examples and I always get an empty one, I don't know why.
[1] https://gist.github.com/mvbpolito/6312896d2004efd189dff79e913df297
Regards,
Mauricio
Best regards,
Tanja
_______________________________________________
iovisor-dev mailing list
[email protected]
https://lists.iovisor.org/mailman/listinfo/iovisor-dev
_______________________________________________
iovisor-dev mailing list
[email protected]
https://lists.iovisor.org/mailman/listinfo/iovisor-dev