[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAH3MdRVMixv8s10gKF1jQjtSY7MHeB-Rs16hX6HwAgUOQ0g=EA@mail.gmail.com>
Date: Sat, 27 May 2017 13:23:35 -0700
From: Y Song <ys114321@...il.com>
To: Adel Fuchs <adelfuchs@...il.com>
Cc: netdev@...r.kernel.org
Subject: Re: running an eBPF program
>From verifier error message:
======
0: (bf) r6 = r1
1: (18) r9 = 0xffe0000e
3: (69) r0 = *(u16 *)(r6 +16)
invalid bpf_context access off=16 size=2
======
The offset 16 of struct __sk_buff is hash.
What instruction #3 tries to do is to access 2 bytes of the hash value
instead of full 4 bytes.
This is explicitly not allowed in verifier due to endianness issue.
Look at iproute2 example code, it looks like the following may be responsible:
bpf_tailcall.c:#define MAX_JMP_SIZE 2
bpf_tailcall.c: tail_call(skb, &jmp_tc, skb->hash & (MAX_JMP_SIZE - 1));
I am thinking of implementing something in LLVM to prevent
optimization from LD4=>LD2/DL1 for context access like this.
On Fri, May 26, 2017 at 4:00 AM, Adel Fuchs <adelfuchs@...il.com> wrote:
> Hi
>
> I'm trying to run this eBPF program:
>
> https://git.kernel.org/pub/scm/linux/kernel/git/shemminger/iproute2.git/tree/examples/bpf
>
>
> and I get this error:
>
>
> :~/iproute2/examples/bpf$sudo tc filter add dev enx00e11100329b parent
> 1: bpf obj bpf.o exp /tmp/bpf-uds flowid 1:1 action bpf obj bpf.o sec
> action-mark action bpf obj bpf.o sec action-rand ok
>
> [sudo] password for adel:
>
>
>
> Prog section 'classifier' rejected: Permission denied (13)!
>
> - Type: 3
>
> - Instructions: 218 (0 over limit)
>
> - License: GPL
>
>
>
> Verifier analysis:
>
>
>
> 0: (bf) r6 = r1
>
> 1: (18) r9 = 0xffe0000e
>
> 3: (69) r0 = *(u16 *)(r6 +16)
>
> invalid bpf_context access off=16 size=2
>
>
>
> Error fetching program/map!
>
> Failed to retrieve (e)BPF data!
>
>
> Any suggestions?
>
> Thanks,
>
> Adel
Powered by blists - more mailing lists