Message ID | tencent_C0A1D82C934B5895D65788D11A4456835607@qq.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | BPF |
Headers | show |
Series | [bpf-next] samples/bpf: Fix sockex3: missing BPF prog type | expand |
On Thu, Oct 27, 2022 at 6:38 AM Rong Tao <rtoax@foxmail.com> wrote: > > From: Rong Tao <rongtao@cestc.cn> > > since commit 450b167fb9be("libbpf: clean up SEC() handling"), > sec_def_matches() does not recognize "socket/xxx" as "socket", therefore, > the BPF program type is not recognized, we should add a custom program > type handler for "socket/xxx". I don't think we should, we should just switch to SEC("socket") or whatever the right annotation has to be. Let's fix the BPF-side code. > > $ cd samples/bpf > $ sudo ./sockex3 > libbpf: prog 'bpf_func_PARSE_IP': missing BPF prog type, check ELF section name 'socket/3' > libbpf: prog 'bpf_func_PARSE_IP': failed to load: -22 > libbpf: failed to load object './sockex3_kern.o' > ERROR: loading BPF object file failed > > Signed-off-by: Rong Tao <rongtao@cestc.cn> > --- > samples/bpf/sockex3_user.c | 15 +++++++++++++++ > 1 file changed, 15 insertions(+) > > diff --git a/samples/bpf/sockex3_user.c b/samples/bpf/sockex3_user.c > index cd6fa79df900..d18d7a3600b0 100644 > --- a/samples/bpf/sockex3_user.c > +++ b/samples/bpf/sockex3_user.c > @@ -22,6 +22,14 @@ struct pair { > __u64 bytes; > }; > > +static int socket_prog_type_id; > + > +__attribute__((destructor)) > +static void unregister_socket_sec_handlers(void) > +{ > + libbpf_unregister_prog_handler(socket_prog_type_id); > +} > + > int main(int argc, char **argv) > { > int i, sock, key, fd, main_prog_fd, jmp_table_fd, hash_map_fd; > @@ -31,6 +39,13 @@ int main(int argc, char **argv) > char filename[256]; > FILE *f; > > + LIBBPF_OPTS(libbpf_prog_handler_opts, socket_opts, > + .cookie = 1, > + ); > + > + socket_prog_type_id = libbpf_register_prog_handler("socket/", > + BPF_PROG_TYPE_SOCKET_FILTER, 0, &socket_opts); > + > snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]); > > obj = bpf_object__open_file(filename, NULL); > -- > 2.31.1 >
Thanks for your reply, actually, i tried another method, which can solved this error, recognize "socket/xxx" as "socket". However, it maybe influence other BPF prog or not? What do you think the following patch? --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c @@ -8659,7 +8659,7 @@ static bool sec_def_matches(const struct bpf_sec_def *sec_def, const char *sec_n return false; } - return strcmp(sec_name, sec_def->sec) == 0; + return strncmp(sec_name, sec_def->sec, len) == 0; }
On Thu, Oct 27, 2022 at 6:01 PM Rong Tao <rtoax@foxmail.com> wrote: > > Thanks for your reply, actually, i tried another method, which can solved > this error, recognize "socket/xxx" as "socket". However, it maybe influence > other BPF prog or not? What do you think the following patch? Don't fix libbpf, it's not broken. Fix the sample. > > --- a/tools/lib/bpf/libbpf.c > +++ b/tools/lib/bpf/libbpf.c > @@ -8659,7 +8659,7 @@ static bool sec_def_matches(const struct bpf_sec_def *sec_def, const char *sec_n > return false; > } > > - return strcmp(sec_name, sec_def->sec) == 0; > + return strncmp(sec_name, sec_def->sec, len) == 0; > }
diff --git a/samples/bpf/sockex3_user.c b/samples/bpf/sockex3_user.c index cd6fa79df900..d18d7a3600b0 100644 --- a/samples/bpf/sockex3_user.c +++ b/samples/bpf/sockex3_user.c @@ -22,6 +22,14 @@ struct pair { __u64 bytes; }; +static int socket_prog_type_id; + +__attribute__((destructor)) +static void unregister_socket_sec_handlers(void) +{ + libbpf_unregister_prog_handler(socket_prog_type_id); +} + int main(int argc, char **argv) { int i, sock, key, fd, main_prog_fd, jmp_table_fd, hash_map_fd; @@ -31,6 +39,13 @@ int main(int argc, char **argv) char filename[256]; FILE *f; + LIBBPF_OPTS(libbpf_prog_handler_opts, socket_opts, + .cookie = 1, + ); + + socket_prog_type_id = libbpf_register_prog_handler("socket/", + BPF_PROG_TYPE_SOCKET_FILTER, 0, &socket_opts); + snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]); obj = bpf_object__open_file(filename, NULL);