wuzongyo@xxxxxxxxxxxxxxxx writes: >> wuzongyo@xxxxxxxxxxxxxxxx writes: >> >> > Hi, >> > >> > I wrote a simple tc-bpf program like that: >> > >> > #include <linux/bpf.h> >> > #include <linux/pkt_cls.h> >> > #include <linx/types.h> >> > #include <bpf/bpf_helpers.h> >> > >> > struct { >> > __uint(type, BPF_MAP_TYPE_HASH); >> > __uint(max_entries, 1); >> > __type(key, int); >> > __type(value, int); >> > } hmap SEC(".maps"); >> > >> > SEC("classifier") >> > int _classifier(struct __sk_buff *skb) >> > { >> > int key = 0; >> > int *val; >> > >> > val = bpf_map_lookup_elem(&hmap, &key); >> > if (!val) >> > return TC_ACT_OK; >> > return TC_ACT_OK; >> > } >> > >> > char __license[] SEC("license") = "GPL"; >> > >> > Then I tried to use tc to load the program: >> > >> > tc qdisc add dev eth0 clsact >> > tc filter add dev eth0 egress bpf da obj test_bpf.o >> > >> > But the program loading failed with error messages: >> > Prog section 'classifier' rejected: Permission denied (13)! >> > - Type: 3 >> > - Instructions: 9 (0 over limit >> > - License: GPL >> > >> > Verifier analysis: >> > >> > Error fetching program/map! >> > Unable to load program >> > >> > I tried to replace the map definition with the following code and the program is loaded successfully! >> > >> > struct bpf_map_def SEC("maps") hmap = { >> > .type = BPF_MAP_TYPE_HASH, >> > .key_size = sizeof(int), >> > .value_size = sizeof(int), >> > .max_entries = 1, >> > }; >> > >> > With bpftrace, I can find that the errno -EACCES is returned by function do_check(). But I am still confused what's wrong with it. >> > >> > Linux Version: 5.17.0-rc3+ with CONFIG_DEBUG_INFO_BTF=y >> > TC Version: 5.14.0 >> > >> > Any suggestion will be appreciated! >> >> If the latter works but the former doesn't, my guess would be that >> iproute2 is compiled without libbpf support (in which case it would not >> support BTF-defined maps either). If it does have libbpf support, that >> (and the version of libbpf used) will be included in the output of `tc >> -v`. >> >> You could recompile iproute2 with enable libbpf support enabled, or as >> Andrii suggests you can write your own loader using libbpf... >> > > It works with recompiled-iproute2. Thanks very much! Great! You're welcome! :) -Toke