On Mon, Jul 12, 2021 at 11:35 PM luwei (O) <luwei32@xxxxxxxxxx> wrote: > > Hi, List: > > I am a beginner about bpf and working on XDP now. I meet a > problem and feel difficult to figure it out. > > In my following codes, I use two ways to define my_map: in SEC > maps and SEC .maps respectively. When I load the xdp_kern.o file, > > It has different results. The way I load is: ip link set dev ens3 xdp > obj xdp1_kern.o sec xdp1. > > when I define my_map using SEC maps, it loads successfully but > fails to load using SEC .maps, it reports: > > " > > [12] TYPEDEF __u32 type_id=13 > [13] INT unsigned int size=4 bits_offset=0 nr_bits=32 encoding=(none) > [14] FUNC_PROTO (anon) return=2 args=(10 ctx) > [15] FUNC xdp_prog1 type_id=14 > [16] INT char size=1 bits_offset=0 nr_bits=8 encoding=SIGNED > [17] ARRAY (anon) type_id=16 index_type_id=4 nr_elems=4 > [18] VAR _license type_id=17 linkage=1 > [19] DATASEC .maps size=0 vlen=1 size == 0 > > > Prog section 'xdp1' rejected: Permission denied (13)! > - Type: 6 > - Instructions: 9 (0 over limit) > - License: GPL > > Verifier analysis: > > 0: (b7) r1 = 0 > 1: (63) *(u32 *)(r10 -4) = r1 > last_idx 1 first_idx 0 > regs=2 stack=0 before 0: (b7) r1 = 0 > 2: (bf) r2 = r10 > 3: (07) r2 += -4 > 4: (18) r1 = 0x0 this shouldn't be 0x0. I suspect you have an old iproute2 which doesn't yet use libbpf to load BPF programs, so .maps definition is not yet supported. cc'ing netdev@vger, David and Toke > 6: (85) call bpf_map_lookup_elem#1 > R1 type=inv expected=map_ptr > processed 6 insns (limit 1000000) max_states_per_insn 0 total_states 0 > peak_states 0 mark_read 0 > > Error fetching program/map! > > " > > I tried to search google, and only found the following page: > > https://stackoverflow.com/questions/67553794/what-is-variable-attribute-sec-means > > Does anyone meet the same problem or help to explain this or provide me > some suggestions ? Thanks ! > > > === xdp1_kern.c === > > #define KBUILD_MODNAME "foo" > #include <uapi/linux/bpf.h> > #include <linux/time.h> > #include <linux/in.h> > #include <linux/if_ether.h> > #include <linux/if_packet.h> > #include <linux/if_vlan.h> > #include <linux/ip.h> > #include <linux/ipv6.h> > #include <bpf/bpf_helpers.h> > > struct { > __uint(type, BPF_MAP_TYPE_HASH); > __uint(max_entries, 1024); > __type(key, int); > __type(value, int); > } my_map SEC(".maps"); > > #if 0 > #define PIN_GLOBAL_NS 2 > struct bpf_elf_map { > __u32 type; > __u32 size_key; > __u32 size_value; > __u32 max_elem; > __u32 flags; > __u32 id; > __u32 pinning; > }; > > struct bpf_elf_map SEC("maps") my_map = { > .type = BPF_MAP_TYPE_HASH, > .size_key = sizeof(int), > .size_value = sizeof(int), > .pinning = PIN_GLOBAL_NS, > .max_elem = 65535, > }; > #endif > > SEC("xdp1") > int xdp_prog1(struct xdp_md *ctx) > { > int key = 0; > struct map_elem *val; > > val = bpf_map_lookup_elem(&my_map, &key); > if (val) { > return XDP_PASS; > } > > return XDP_PASS; > } > > char _license[] SEC("license") = "GPL"; > > -- > Best Regards, > Lu Wei >