>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 <adelfu...@gmail.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