On 09/21/2017 10:02 PM, Jesper Dangaard Brouer via iovisor-dev wrote:
Hi Daniel,

My very simple program is getting rejected on bpf loading time.  When
using another map as input for a decision, for map type BPF_MAP_TYPE_DEVMAP.

SEC("xdp_redirect_map_rr")
int xdp_prog_redirect_map_rr(struct xdp_md *ctx)
{
        void *data_end = (void *)(long)ctx->data_end;
        void *data     = (void *)(long)ctx->data;
        struct ethhdr *eth = data;
        int vport = 0;
        u32 key = 0;
        long *value;

        // count packet in global counter
        value = bpf_map_lookup_elem(&rxcnt, &key);
        if (value)
                *value += 1;

        /* Strange, verifier reject this (with LLVM version 3.9.1) */
        vport = *value % 2;

Here it's dereferenced where above it could have been NULL
from the lookup, so verifier is correct. You'd need to place
it into the if clause above or just do 'if (!value) return XDP_ABORTED'
or the like.

        if (vport >= 10)
                return XDP_ABORTED;

        return bpf_redirect_map(&tx_port, vport, 0);
}

bpf_load_program() err=13
0: (b7) r6 = 0
1: (63) *(u32 *)(r10 -4) = r6
2: (bf) r2 = r10
3: (07) r2 += -4
4: (18) r1 = 0xffff880832682700
6: (85) call bpf_map_lookup_elem#1
7: (79) r2 = *(u64 *)(r0 +0)
R0 invalid mem access 'map_value_or_null'

Are we missing something verifier code for BPF_MAP_TYPE_DEVMAP ?


_______________________________________________
iovisor-dev mailing list
[email protected]
https://lists.iovisor.org/mailman/listinfo/iovisor-dev

Reply via email to