On Wed, Feb 27, 2019 at 7:04 PM Jakub Kicinski <jakub.kicinski@xxxxxxxxxxxxx> wrote: > > Some samples don't really need the magic of bpf_load, > switch them to libbpf. > > v2: - specify program types. thanks! Acked-by: Andrii Nakryiko <andriin@xxxxxx> > > Signed-off-by: Jakub Kicinski <jakub.kicinski@xxxxxxxxxxxxx> > Reviewed-by: Quentin Monnet <quentin.monnet@xxxxxxxxxxxxx> > --- > samples/bpf/Makefile | 6 +++--- > samples/bpf/fds_example.c | 10 +++++++--- > samples/bpf/sockex1_user.c | 23 +++++++++++++---------- > samples/bpf/sockex2_user.c | 21 ++++++++++++--------- > 4 files changed, 35 insertions(+), 25 deletions(-) > > diff --git a/samples/bpf/Makefile b/samples/bpf/Makefile > index 4dd98100678e..0c62ac39c697 100644 > --- a/samples/bpf/Makefile > +++ b/samples/bpf/Makefile > @@ -59,9 +59,9 @@ LIBBPF = $(TOOLS_PATH)/lib/bpf/libbpf.a > CGROUP_HELPERS := ../../tools/testing/selftests/bpf/cgroup_helpers.o > TRACE_HELPERS := ../../tools/testing/selftests/bpf/trace_helpers.o > > -fds_example-objs := bpf_load.o fds_example.o > -sockex1-objs := bpf_load.o sockex1_user.o > -sockex2-objs := bpf_load.o sockex2_user.o > +fds_example-objs := fds_example.o > +sockex1-objs := sockex1_user.o > +sockex2-objs := sockex2_user.o > sockex3-objs := bpf_load.o sockex3_user.o > tracex1-objs := bpf_load.o tracex1_user.o > tracex2-objs := bpf_load.o tracex2_user.o > diff --git a/samples/bpf/fds_example.c b/samples/bpf/fds_example.c > index 9854854f05d1..e51eb060244e 100644 > --- a/samples/bpf/fds_example.c > +++ b/samples/bpf/fds_example.c > @@ -14,8 +14,8 @@ > > #include <bpf/bpf.h> > > +#include "bpf/libbpf.h" > #include "bpf_insn.h" > -#include "bpf_load.h" > #include "sock_example.h" > > #define BPF_F_PIN (1 << 0) > @@ -57,10 +57,14 @@ static int bpf_prog_create(const char *object) > BPF_EXIT_INSN(), > }; > size_t insns_cnt = sizeof(insns) / sizeof(struct bpf_insn); > + char bpf_log_buf[BPF_LOG_BUF_SIZE]; > + struct bpf_object *obj; > + int prog_fd; > > if (object) { > - assert(!load_bpf_file((char *)object)); > - return prog_fd[0]; > + assert(!bpf_prog_load(object, BPF_PROG_TYPE_UNSPEC, > + &obj, &prog_fd)); > + return prog_fd; > } else { > return bpf_load_program(BPF_PROG_TYPE_SOCKET_FILTER, > insns, insns_cnt, "GPL", 0, > diff --git a/samples/bpf/sockex1_user.c b/samples/bpf/sockex1_user.c > index be8ba5686924..7f90796ae15a 100644 > --- a/samples/bpf/sockex1_user.c > +++ b/samples/bpf/sockex1_user.c > @@ -3,28 +3,31 @@ > #include <assert.h> > #include <linux/bpf.h> > #include <bpf/bpf.h> > -#include "bpf_load.h" > +#include "bpf/libbpf.h" > #include "sock_example.h" > #include <unistd.h> > #include <arpa/inet.h> > > int main(int ac, char **argv) > { > + struct bpf_object *obj; > + int map_fd, prog_fd; > char filename[256]; > - FILE *f; > int i, sock; > + FILE *f; > > snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]); > > - if (load_bpf_file(filename)) { > - printf("%s", bpf_log_buf); > + if (bpf_prog_load(filename, BPF_PROG_TYPE_SOCKET_FILTER, > + &obj, &prog_fd)) > return 1; > - } > + > + map_fd = bpf_object__find_map_fd_by_name(obj, "my_map"); > > sock = open_raw_sock("lo"); > > - assert(setsockopt(sock, SOL_SOCKET, SO_ATTACH_BPF, prog_fd, > - sizeof(prog_fd[0])) == 0); > + assert(setsockopt(sock, SOL_SOCKET, SO_ATTACH_BPF, &prog_fd, > + sizeof(prog_fd)) == 0); > > f = popen("ping -4 -c5 localhost", "r"); > (void) f; > @@ -34,13 +37,13 @@ int main(int ac, char **argv) > int key; > > key = IPPROTO_TCP; > - assert(bpf_map_lookup_elem(map_fd[0], &key, &tcp_cnt) == 0); > + assert(bpf_map_lookup_elem(map_fd, &key, &tcp_cnt) == 0); > > key = IPPROTO_UDP; > - assert(bpf_map_lookup_elem(map_fd[0], &key, &udp_cnt) == 0); > + assert(bpf_map_lookup_elem(map_fd, &key, &udp_cnt) == 0); > > key = IPPROTO_ICMP; > - assert(bpf_map_lookup_elem(map_fd[0], &key, &icmp_cnt) == 0); > + assert(bpf_map_lookup_elem(map_fd, &key, &icmp_cnt) == 0); > > printf("TCP %lld UDP %lld ICMP %lld bytes\n", > tcp_cnt, udp_cnt, icmp_cnt); > diff --git a/samples/bpf/sockex2_user.c b/samples/bpf/sockex2_user.c > index 125ee6efc913..bc257333ad92 100644 > --- a/samples/bpf/sockex2_user.c > +++ b/samples/bpf/sockex2_user.c > @@ -3,7 +3,7 @@ > #include <assert.h> > #include <linux/bpf.h> > #include <bpf/bpf.h> > -#include "bpf_load.h" > +#include "bpf/libbpf.h" > #include "sock_example.h" > #include <unistd.h> > #include <arpa/inet.h> > @@ -17,22 +17,25 @@ struct pair { > int main(int ac, char **argv) > { > struct rlimit r = {RLIM_INFINITY, RLIM_INFINITY}; > + struct bpf_object *obj; > + int map_fd, prog_fd; > char filename[256]; > - FILE *f; > int i, sock; > + FILE *f; > > snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]); > setrlimit(RLIMIT_MEMLOCK, &r); > > - if (load_bpf_file(filename)) { > - printf("%s", bpf_log_buf); > + if (bpf_prog_load(filename, BPF_PROG_TYPE_SOCKET_FILTER, > + &obj, &prog_fd)) > return 1; > - } > + > + map_fd = bpf_object__find_map_fd_by_name(obj, "hash_map"); > > sock = open_raw_sock("lo"); > > - assert(setsockopt(sock, SOL_SOCKET, SO_ATTACH_BPF, prog_fd, > - sizeof(prog_fd[0])) == 0); > + assert(setsockopt(sock, SOL_SOCKET, SO_ATTACH_BPF, &prog_fd, > + sizeof(prog_fd)) == 0); > > f = popen("ping -4 -c5 localhost", "r"); > (void) f; > @@ -41,8 +44,8 @@ int main(int ac, char **argv) > int key = 0, next_key; > struct pair value; > > - while (bpf_map_get_next_key(map_fd[0], &key, &next_key) == 0) { > - bpf_map_lookup_elem(map_fd[0], &next_key, &value); > + while (bpf_map_get_next_key(map_fd, &key, &next_key) == 0) { > + bpf_map_lookup_elem(map_fd, &next_key, &value); > printf("ip %s bytes %lld packets %lld\n", > inet_ntoa((struct in_addr){htonl(next_key)}), > value.bytes, value.packets); > -- > 2.19.2 >