Re: [PATCH v1 4/4] samples/bpf: an example of a raw IR decoder
On Mon, May 14, 2018 at 10:34:57PM -0700, Y Song wrote: > On Mon, May 14, 2018 at 2:11 PM, Sean Young wrote: > > This implements the grundig-16 IR protocol. > > > > Signed-off-by: Sean Young > > --- > > samples/bpf/Makefile | 4 + > > samples/bpf/bpf_load.c| 9 +- > > samples/bpf/grundig_decoder_kern.c| 112 ++ > > samples/bpf/grundig_decoder_user.c| 54 +++ > > tools/bpf/bpftool/prog.c | 1 + > > tools/include/uapi/linux/bpf.h| 17 +++- > > tools/testing/selftests/bpf/bpf_helpers.h | 6 ++ > > 7 files changed, 200 insertions(+), 3 deletions(-) > > create mode 100644 samples/bpf/grundig_decoder_kern.c > > create mode 100644 samples/bpf/grundig_decoder_user.c > > > > diff --git a/samples/bpf/Makefile b/samples/bpf/Makefile > > index 4d6a6edd4bf6..c6fa111f103a 100644 > > --- a/samples/bpf/Makefile > > +++ b/samples/bpf/Makefile > > @@ -44,6 +44,7 @@ hostprogs-y += xdp_monitor > > hostprogs-y += xdp_rxq_info > > hostprogs-y += syscall_tp > > hostprogs-y += cpustat > > +hostprogs-y += grundig_decoder > > > > # Libbpf dependencies > > LIBBPF := ../../tools/lib/bpf/bpf.o ../../tools/lib/bpf/nlattr.o > > @@ -95,6 +96,7 @@ xdp_monitor-objs := bpf_load.o $(LIBBPF) > > xdp_monitor_user.o > > xdp_rxq_info-objs := bpf_load.o $(LIBBPF) xdp_rxq_info_user.o > > syscall_tp-objs := bpf_load.o $(LIBBPF) syscall_tp_user.o > > cpustat-objs := bpf_load.o $(LIBBPF) cpustat_user.o > > +grundig_decoder-objs := bpf_load.o $(LIBBPF) grundig_decoder_user.o > > > > # Tell kbuild to always build the programs > > always := $(hostprogs-y) > > @@ -148,6 +150,7 @@ always += xdp_rxq_info_kern.o > > always += xdp2skb_meta_kern.o > > always += syscall_tp_kern.o > > always += cpustat_kern.o > > +always += grundig_decoder_kern.o > > > > HOSTCFLAGS += -I$(objtree)/usr/include > > HOSTCFLAGS += -I$(srctree)/tools/lib/ > > @@ -193,6 +196,7 @@ HOSTLOADLIBES_xdp_monitor += -lelf > > HOSTLOADLIBES_xdp_rxq_info += -lelf > > HOSTLOADLIBES_syscall_tp += -lelf > > HOSTLOADLIBES_cpustat += -lelf > > +HOSTLOADLIBES_grundig_decoder += -lelf > > > > # Allows pointing LLC/CLANG to a LLVM backend with bpf support, redefine > > on cmdline: > > # make samples/bpf/ LLC=~/git/llvm/build/bin/llc > > CLANG=~/git/llvm/build/bin/clang > > diff --git a/samples/bpf/bpf_load.c b/samples/bpf/bpf_load.c > > index bebe4188b4b3..0fd389e95bb9 100644 > > --- a/samples/bpf/bpf_load.c > > +++ b/samples/bpf/bpf_load.c > > @@ -69,6 +69,7 @@ static int load_and_attach(const char *event, struct > > bpf_insn *prog, int size) > > bool is_sockops = strncmp(event, "sockops", 7) == 0; > > bool is_sk_skb = strncmp(event, "sk_skb", 6) == 0; > > bool is_sk_msg = strncmp(event, "sk_msg", 6) == 0; > > + bool is_ir_decoder = strncmp(event, "ir_decoder", 10) == 0; > > size_t insns_cnt = size / sizeof(struct bpf_insn); > > enum bpf_prog_type prog_type; > > char buf[256]; > > @@ -102,6 +103,8 @@ static int load_and_attach(const char *event, struct > > bpf_insn *prog, int size) > > prog_type = BPF_PROG_TYPE_SK_SKB; > > } else if (is_sk_msg) { > > prog_type = BPF_PROG_TYPE_SK_MSG; > > + } else if (is_ir_decoder) { > > + prog_type = BPF_PROG_TYPE_RAWIR_DECODER; > > } else { > > printf("Unknown event '%s'\n", event); > > return -1; > > @@ -116,7 +119,8 @@ static int load_and_attach(const char *event, struct > > bpf_insn *prog, int size) > > > > prog_fd[prog_cnt++] = fd; > > > > - if (is_xdp || is_perf_event || is_cgroup_skb || is_cgroup_sk) > > + if (is_xdp || is_perf_event || is_cgroup_skb || is_cgroup_sk || > > + is_ir_decoder) > > return 0; > > > > if (is_socket || is_sockops || is_sk_skb || is_sk_msg) { > > @@ -607,7 +611,8 @@ static int do_load_bpf_file(const char *path, > > fixup_map_cb fixup_map) > > memcmp(shname, "cgroup/", 7) == 0 || > > memcmp(shname, "sockops", 7) == 0 || > > memcmp(shname, "sk_skb", 6) == 0 || > > - memcmp(shname, "sk_msg", 6) == 0) { > > + memcmp(shname, "sk_msg", 6) == 0 || > > + memcmp(shname, "ir_decoder", 10) == 0) { > > ret = load_and_attach(shname, data->d_buf, > > data->d_size); > > if (ret != 0) > > diff --git a/samples/bpf/grundig_decoder_kern.c > > b/samples/bpf/grundig_decoder_kern.c > > new file mode 100644 > > index ..c80f2c9cc69a > > --- /dev/null > > +++ b/samples/bpf/grundig_decoder_kern.c > > @@ -0,0 +1,112 @@ > > + > > +#include > > +#include > > +#include "bpf_helpers.h" > > +#include > > + > > +enum grundig_state { > > + STATE_INACTIVE, > > + STATE_HEADER_SPAC
Re: [PATCH v1 4/4] samples/bpf: an example of a raw IR decoder
On Mon, May 14, 2018 at 2:11 PM, Sean Young wrote: > This implements the grundig-16 IR protocol. > > Signed-off-by: Sean Young > --- > samples/bpf/Makefile | 4 + > samples/bpf/bpf_load.c| 9 +- > samples/bpf/grundig_decoder_kern.c| 112 ++ > samples/bpf/grundig_decoder_user.c| 54 +++ > tools/bpf/bpftool/prog.c | 1 + > tools/include/uapi/linux/bpf.h| 17 +++- > tools/testing/selftests/bpf/bpf_helpers.h | 6 ++ > 7 files changed, 200 insertions(+), 3 deletions(-) > create mode 100644 samples/bpf/grundig_decoder_kern.c > create mode 100644 samples/bpf/grundig_decoder_user.c > > diff --git a/samples/bpf/Makefile b/samples/bpf/Makefile > index 4d6a6edd4bf6..c6fa111f103a 100644 > --- a/samples/bpf/Makefile > +++ b/samples/bpf/Makefile > @@ -44,6 +44,7 @@ hostprogs-y += xdp_monitor > hostprogs-y += xdp_rxq_info > hostprogs-y += syscall_tp > hostprogs-y += cpustat > +hostprogs-y += grundig_decoder > > # Libbpf dependencies > LIBBPF := ../../tools/lib/bpf/bpf.o ../../tools/lib/bpf/nlattr.o > @@ -95,6 +96,7 @@ xdp_monitor-objs := bpf_load.o $(LIBBPF) xdp_monitor_user.o > xdp_rxq_info-objs := bpf_load.o $(LIBBPF) xdp_rxq_info_user.o > syscall_tp-objs := bpf_load.o $(LIBBPF) syscall_tp_user.o > cpustat-objs := bpf_load.o $(LIBBPF) cpustat_user.o > +grundig_decoder-objs := bpf_load.o $(LIBBPF) grundig_decoder_user.o > > # Tell kbuild to always build the programs > always := $(hostprogs-y) > @@ -148,6 +150,7 @@ always += xdp_rxq_info_kern.o > always += xdp2skb_meta_kern.o > always += syscall_tp_kern.o > always += cpustat_kern.o > +always += grundig_decoder_kern.o > > HOSTCFLAGS += -I$(objtree)/usr/include > HOSTCFLAGS += -I$(srctree)/tools/lib/ > @@ -193,6 +196,7 @@ HOSTLOADLIBES_xdp_monitor += -lelf > HOSTLOADLIBES_xdp_rxq_info += -lelf > HOSTLOADLIBES_syscall_tp += -lelf > HOSTLOADLIBES_cpustat += -lelf > +HOSTLOADLIBES_grundig_decoder += -lelf > > # Allows pointing LLC/CLANG to a LLVM backend with bpf support, redefine on > cmdline: > # make samples/bpf/ LLC=~/git/llvm/build/bin/llc > CLANG=~/git/llvm/build/bin/clang > diff --git a/samples/bpf/bpf_load.c b/samples/bpf/bpf_load.c > index bebe4188b4b3..0fd389e95bb9 100644 > --- a/samples/bpf/bpf_load.c > +++ b/samples/bpf/bpf_load.c > @@ -69,6 +69,7 @@ static int load_and_attach(const char *event, struct > bpf_insn *prog, int size) > bool is_sockops = strncmp(event, "sockops", 7) == 0; > bool is_sk_skb = strncmp(event, "sk_skb", 6) == 0; > bool is_sk_msg = strncmp(event, "sk_msg", 6) == 0; > + bool is_ir_decoder = strncmp(event, "ir_decoder", 10) == 0; > size_t insns_cnt = size / sizeof(struct bpf_insn); > enum bpf_prog_type prog_type; > char buf[256]; > @@ -102,6 +103,8 @@ static int load_and_attach(const char *event, struct > bpf_insn *prog, int size) > prog_type = BPF_PROG_TYPE_SK_SKB; > } else if (is_sk_msg) { > prog_type = BPF_PROG_TYPE_SK_MSG; > + } else if (is_ir_decoder) { > + prog_type = BPF_PROG_TYPE_RAWIR_DECODER; > } else { > printf("Unknown event '%s'\n", event); > return -1; > @@ -116,7 +119,8 @@ static int load_and_attach(const char *event, struct > bpf_insn *prog, int size) > > prog_fd[prog_cnt++] = fd; > > - if (is_xdp || is_perf_event || is_cgroup_skb || is_cgroup_sk) > + if (is_xdp || is_perf_event || is_cgroup_skb || is_cgroup_sk || > + is_ir_decoder) > return 0; > > if (is_socket || is_sockops || is_sk_skb || is_sk_msg) { > @@ -607,7 +611,8 @@ static int do_load_bpf_file(const char *path, > fixup_map_cb fixup_map) > memcmp(shname, "cgroup/", 7) == 0 || > memcmp(shname, "sockops", 7) == 0 || > memcmp(shname, "sk_skb", 6) == 0 || > - memcmp(shname, "sk_msg", 6) == 0) { > + memcmp(shname, "sk_msg", 6) == 0 || > + memcmp(shname, "ir_decoder", 10) == 0) { > ret = load_and_attach(shname, data->d_buf, > data->d_size); > if (ret != 0) > diff --git a/samples/bpf/grundig_decoder_kern.c > b/samples/bpf/grundig_decoder_kern.c > new file mode 100644 > index ..c80f2c9cc69a > --- /dev/null > +++ b/samples/bpf/grundig_decoder_kern.c > @@ -0,0 +1,112 @@ > + > +#include > +#include > +#include "bpf_helpers.h" > +#include > + > +enum grundig_state { > + STATE_INACTIVE, > + STATE_HEADER_SPACE, > + STATE_LEADING_PULSE, > + STATE_BITS_SPACE, > + STATE_BITS_PULSE, > +}; > + > +struct decoder_state { > + u32 bits; > + enum grundig_state state; > + u32 count; > + u32 last_space; > +}; > + > +struct bpf_map_def SEC("maps") decoder_state_map
[PATCH v1 4/4] samples/bpf: an example of a raw IR decoder
This implements the grundig-16 IR protocol. Signed-off-by: Sean Young --- samples/bpf/Makefile | 4 + samples/bpf/bpf_load.c| 9 +- samples/bpf/grundig_decoder_kern.c| 112 ++ samples/bpf/grundig_decoder_user.c| 54 +++ tools/bpf/bpftool/prog.c | 1 + tools/include/uapi/linux/bpf.h| 17 +++- tools/testing/selftests/bpf/bpf_helpers.h | 6 ++ 7 files changed, 200 insertions(+), 3 deletions(-) create mode 100644 samples/bpf/grundig_decoder_kern.c create mode 100644 samples/bpf/grundig_decoder_user.c diff --git a/samples/bpf/Makefile b/samples/bpf/Makefile index 4d6a6edd4bf6..c6fa111f103a 100644 --- a/samples/bpf/Makefile +++ b/samples/bpf/Makefile @@ -44,6 +44,7 @@ hostprogs-y += xdp_monitor hostprogs-y += xdp_rxq_info hostprogs-y += syscall_tp hostprogs-y += cpustat +hostprogs-y += grundig_decoder # Libbpf dependencies LIBBPF := ../../tools/lib/bpf/bpf.o ../../tools/lib/bpf/nlattr.o @@ -95,6 +96,7 @@ xdp_monitor-objs := bpf_load.o $(LIBBPF) xdp_monitor_user.o xdp_rxq_info-objs := bpf_load.o $(LIBBPF) xdp_rxq_info_user.o syscall_tp-objs := bpf_load.o $(LIBBPF) syscall_tp_user.o cpustat-objs := bpf_load.o $(LIBBPF) cpustat_user.o +grundig_decoder-objs := bpf_load.o $(LIBBPF) grundig_decoder_user.o # Tell kbuild to always build the programs always := $(hostprogs-y) @@ -148,6 +150,7 @@ always += xdp_rxq_info_kern.o always += xdp2skb_meta_kern.o always += syscall_tp_kern.o always += cpustat_kern.o +always += grundig_decoder_kern.o HOSTCFLAGS += -I$(objtree)/usr/include HOSTCFLAGS += -I$(srctree)/tools/lib/ @@ -193,6 +196,7 @@ HOSTLOADLIBES_xdp_monitor += -lelf HOSTLOADLIBES_xdp_rxq_info += -lelf HOSTLOADLIBES_syscall_tp += -lelf HOSTLOADLIBES_cpustat += -lelf +HOSTLOADLIBES_grundig_decoder += -lelf # Allows pointing LLC/CLANG to a LLVM backend with bpf support, redefine on cmdline: # make samples/bpf/ LLC=~/git/llvm/build/bin/llc CLANG=~/git/llvm/build/bin/clang diff --git a/samples/bpf/bpf_load.c b/samples/bpf/bpf_load.c index bebe4188b4b3..0fd389e95bb9 100644 --- a/samples/bpf/bpf_load.c +++ b/samples/bpf/bpf_load.c @@ -69,6 +69,7 @@ static int load_and_attach(const char *event, struct bpf_insn *prog, int size) bool is_sockops = strncmp(event, "sockops", 7) == 0; bool is_sk_skb = strncmp(event, "sk_skb", 6) == 0; bool is_sk_msg = strncmp(event, "sk_msg", 6) == 0; + bool is_ir_decoder = strncmp(event, "ir_decoder", 10) == 0; size_t insns_cnt = size / sizeof(struct bpf_insn); enum bpf_prog_type prog_type; char buf[256]; @@ -102,6 +103,8 @@ static int load_and_attach(const char *event, struct bpf_insn *prog, int size) prog_type = BPF_PROG_TYPE_SK_SKB; } else if (is_sk_msg) { prog_type = BPF_PROG_TYPE_SK_MSG; + } else if (is_ir_decoder) { + prog_type = BPF_PROG_TYPE_RAWIR_DECODER; } else { printf("Unknown event '%s'\n", event); return -1; @@ -116,7 +119,8 @@ static int load_and_attach(const char *event, struct bpf_insn *prog, int size) prog_fd[prog_cnt++] = fd; - if (is_xdp || is_perf_event || is_cgroup_skb || is_cgroup_sk) + if (is_xdp || is_perf_event || is_cgroup_skb || is_cgroup_sk || + is_ir_decoder) return 0; if (is_socket || is_sockops || is_sk_skb || is_sk_msg) { @@ -607,7 +611,8 @@ static int do_load_bpf_file(const char *path, fixup_map_cb fixup_map) memcmp(shname, "cgroup/", 7) == 0 || memcmp(shname, "sockops", 7) == 0 || memcmp(shname, "sk_skb", 6) == 0 || - memcmp(shname, "sk_msg", 6) == 0) { + memcmp(shname, "sk_msg", 6) == 0 || + memcmp(shname, "ir_decoder", 10) == 0) { ret = load_and_attach(shname, data->d_buf, data->d_size); if (ret != 0) diff --git a/samples/bpf/grundig_decoder_kern.c b/samples/bpf/grundig_decoder_kern.c new file mode 100644 index ..c80f2c9cc69a --- /dev/null +++ b/samples/bpf/grundig_decoder_kern.c @@ -0,0 +1,112 @@ + +#include +#include +#include "bpf_helpers.h" +#include + +enum grundig_state { + STATE_INACTIVE, + STATE_HEADER_SPACE, + STATE_LEADING_PULSE, + STATE_BITS_SPACE, + STATE_BITS_PULSE, +}; + +struct decoder_state { + u32 bits; + enum grundig_state state; + u32 count; + u32 last_space; +}; + +struct bpf_map_def SEC("maps") decoder_state_map = { + .type = BPF_MAP_TYPE_ARRAY, + .key_size = sizeof(u32), + .value_size = sizeof(struct decoder_state), + .max_entries = 1, +}; + +#define US_TO_NS(t) 1000*(t) +static inline bool eq_margin(unsigned d1, unsigned d2, unsigned margin) +{ + return ((d1 > (d2 -