* [PATCH v2] media: bpf: add bpf function to report mouse movement
@ 2018-11-23 11:50 Sean Young
2018-11-26 0:55 ` Daniel Borkmann
0 siblings, 1 reply; 3+ messages in thread
From: Sean Young @ 2018-11-23 11:50 UTC (permalink / raw)
To: Alexei Starovoitov, Daniel Borkmann, Roman Gushchin, Martin KaFai Lau
Cc: linux-media, netdev
Some IR remotes have a directional pad or other pointer-like thing that
can be used as a mouse. Make it possible to decode these types of IR
protocols in BPF.
Cc: netdev@vger.kernel.org
Signed-off-by: Sean Young <sean@mess.org>
---
drivers/media/rc/bpf-lirc.c | 24 +++++++++++++++++++++++
include/uapi/linux/bpf.h | 17 +++++++++++++++-
tools/testing/selftests/bpf/bpf_helpers.h | 2 ++
3 files changed, 42 insertions(+), 1 deletion(-)
diff --git a/drivers/media/rc/bpf-lirc.c b/drivers/media/rc/bpf-lirc.c
index 8b97fd1f0cea..390a722e6211 100644
--- a/drivers/media/rc/bpf-lirc.c
+++ b/drivers/media/rc/bpf-lirc.c
@@ -59,6 +59,28 @@ static const struct bpf_func_proto rc_keydown_proto = {
.arg4_type = ARG_ANYTHING,
};
+BPF_CALL_3(bpf_rc_pointer_rel, u32*, sample, s32, rel_x, s32, rel_y)
+{
+ struct ir_raw_event_ctrl *ctrl;
+
+ ctrl = container_of(sample, struct ir_raw_event_ctrl, bpf_sample);
+
+ input_report_rel(ctrl->dev->input_dev, REL_X, rel_x);
+ input_report_rel(ctrl->dev->input_dev, REL_Y, rel_y);
+ input_sync(ctrl->dev->input_dev);
+
+ return 0;
+}
+
+static const struct bpf_func_proto rc_pointer_rel_proto = {
+ .func = bpf_rc_pointer_rel,
+ .gpl_only = true,
+ .ret_type = RET_INTEGER,
+ .arg1_type = ARG_PTR_TO_CTX,
+ .arg2_type = ARG_ANYTHING,
+ .arg3_type = ARG_ANYTHING,
+};
+
static const struct bpf_func_proto *
lirc_mode2_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)
{
@@ -67,6 +89,8 @@ lirc_mode2_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)
return &rc_repeat_proto;
case BPF_FUNC_rc_keydown:
return &rc_keydown_proto;
+ case BPF_FUNC_rc_pointer_rel:
+ return &rc_pointer_rel_proto;
case BPF_FUNC_map_lookup_elem:
return &bpf_map_lookup_elem_proto;
case BPF_FUNC_map_update_elem:
diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
index 23e2031a43d4..3499a1555bbf 100644
--- a/include/uapi/linux/bpf.h
+++ b/include/uapi/linux/bpf.h
@@ -2268,6 +2268,20 @@ union bpf_attr {
*
* Return
* 0 on success, or a negative error in case of failure.
+ *
+ * int bpf_rc_pointer_rel(void *ctx, s32 rel_x, s32 rel_y)
+ * Description
+ * This helper is used in programs implementing IR decoding, to
+ * report a successfully decoded pointer movement.
+ *
+ * The *ctx* should point to the lirc sample as passed into
+ * the program.
+ *
+ * This helper is only available is the kernel was compiled with
+ * the **CONFIG_BPF_LIRC_MODE2** configuration option set to
+ * "**y**".
+ * Return
+ * 0
*/
#define __BPF_FUNC_MAPPER(FN) \
FN(unspec), \
@@ -2360,7 +2374,8 @@ union bpf_attr {
FN(map_push_elem), \
FN(map_pop_elem), \
FN(map_peek_elem), \
- FN(msg_push_data),
+ FN(msg_push_data), \
+ FN(rc_pointer_rel),
/* integer value in 'imm' field of BPF_CALL instruction selects which helper
* function eBPF program intends to call
diff --git a/tools/testing/selftests/bpf/bpf_helpers.h b/tools/testing/selftests/bpf/bpf_helpers.h
index 686e57ce40f4..5c900a917fa4 100644
--- a/tools/testing/selftests/bpf/bpf_helpers.h
+++ b/tools/testing/selftests/bpf/bpf_helpers.h
@@ -168,6 +168,8 @@ static int (*bpf_skb_vlan_push)(void *ctx, __be16 vlan_proto, __u16 vlan_tci) =
(void *) BPF_FUNC_skb_vlan_push;
static int (*bpf_skb_vlan_pop)(void *ctx) =
(void *) BPF_FUNC_skb_vlan_pop;
+static int (*bpf_rc_pointer_rel)(void *ctx, int rel_x, int rel_y) =
+ (void *) BPF_FUNC_rc_pointer_rel;
/* llvm builtin functions that eBPF C program may use to
* emit BPF_LD_ABS and BPF_LD_IND instructions
--
2.19.1
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH v2] media: bpf: add bpf function to report mouse movement
2018-11-23 11:50 [PATCH v2] media: bpf: add bpf function to report mouse movement Sean Young
@ 2018-11-26 0:55 ` Daniel Borkmann
2018-11-26 9:00 ` Sean Young
0 siblings, 1 reply; 3+ messages in thread
From: Daniel Borkmann @ 2018-11-26 0:55 UTC (permalink / raw)
To: Sean Young, Alexei Starovoitov, Roman Gushchin, Martin KaFai Lau
Cc: linux-media, netdev
Hi Sean,
On 11/23/2018 12:50 PM, Sean Young wrote:
> Some IR remotes have a directional pad or other pointer-like thing that
> can be used as a mouse. Make it possible to decode these types of IR
> protocols in BPF.
>
> Cc: netdev@vger.kernel.org
> Signed-off-by: Sean Young <sean@mess.org>
Is this patch targeted at bpf-next tree?
> ---
> drivers/media/rc/bpf-lirc.c | 24 +++++++++++++++++++++++
> include/uapi/linux/bpf.h | 17 +++++++++++++++-
> tools/testing/selftests/bpf/bpf_helpers.h | 2 ++
> 3 files changed, 42 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/media/rc/bpf-lirc.c b/drivers/media/rc/bpf-lirc.c
> index 8b97fd1f0cea..390a722e6211 100644
> --- a/drivers/media/rc/bpf-lirc.c
> +++ b/drivers/media/rc/bpf-lirc.c
> @@ -59,6 +59,28 @@ static const struct bpf_func_proto rc_keydown_proto = {
> .arg4_type = ARG_ANYTHING,
> };
>
> +BPF_CALL_3(bpf_rc_pointer_rel, u32*, sample, s32, rel_x, s32, rel_y)
> +{
> + struct ir_raw_event_ctrl *ctrl;
> +
> + ctrl = container_of(sample, struct ir_raw_event_ctrl, bpf_sample);
> +
> + input_report_rel(ctrl->dev->input_dev, REL_X, rel_x);
> + input_report_rel(ctrl->dev->input_dev, REL_Y, rel_y);
> + input_sync(ctrl->dev->input_dev);
> +
> + return 0;
> +}
> +
> +static const struct bpf_func_proto rc_pointer_rel_proto = {
> + .func = bpf_rc_pointer_rel,
> + .gpl_only = true,
> + .ret_type = RET_INTEGER,
> + .arg1_type = ARG_PTR_TO_CTX,
> + .arg2_type = ARG_ANYTHING,
> + .arg3_type = ARG_ANYTHING,
> +};
> +
> static const struct bpf_func_proto *
> lirc_mode2_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)
> {
> @@ -67,6 +89,8 @@ lirc_mode2_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)
> return &rc_repeat_proto;
> case BPF_FUNC_rc_keydown:
> return &rc_keydown_proto;
> + case BPF_FUNC_rc_pointer_rel:
> + return &rc_pointer_rel_proto;
> case BPF_FUNC_map_lookup_elem:
> return &bpf_map_lookup_elem_proto;
> case BPF_FUNC_map_update_elem:
> diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
> index 23e2031a43d4..3499a1555bbf 100644
> --- a/include/uapi/linux/bpf.h
> +++ b/include/uapi/linux/bpf.h
> @@ -2268,6 +2268,20 @@ union bpf_attr {
> *
> * Return
> * 0 on success, or a negative error in case of failure.
> + *
> + * int bpf_rc_pointer_rel(void *ctx, s32 rel_x, s32 rel_y)
> + * Description
> + * This helper is used in programs implementing IR decoding, to
> + * report a successfully decoded pointer movement.
> + *
> + * The *ctx* should point to the lirc sample as passed into
> + * the program.
> + *
> + * This helper is only available is the kernel was compiled with
> + * the **CONFIG_BPF_LIRC_MODE2** configuration option set to
> + * "**y**".
> + * Return
> + * 0
> */
> #define __BPF_FUNC_MAPPER(FN) \
> FN(unspec), \
> @@ -2360,7 +2374,8 @@ union bpf_attr {
> FN(map_push_elem), \
> FN(map_pop_elem), \
> FN(map_peek_elem), \
> - FN(msg_push_data),
> + FN(msg_push_data), \
> + FN(rc_pointer_rel),
>
> /* integer value in 'imm' field of BPF_CALL instruction selects which helper
> * function eBPF program intends to call
> diff --git a/tools/testing/selftests/bpf/bpf_helpers.h b/tools/testing/selftests/bpf/bpf_helpers.h
> index 686e57ce40f4..5c900a917fa4 100644
> --- a/tools/testing/selftests/bpf/bpf_helpers.h
> +++ b/tools/testing/selftests/bpf/bpf_helpers.h
> @@ -168,6 +168,8 @@ static int (*bpf_skb_vlan_push)(void *ctx, __be16 vlan_proto, __u16 vlan_tci) =
> (void *) BPF_FUNC_skb_vlan_push;
> static int (*bpf_skb_vlan_pop)(void *ctx) =
> (void *) BPF_FUNC_skb_vlan_pop;
> +static int (*bpf_rc_pointer_rel)(void *ctx, int rel_x, int rel_y) =
> + (void *) BPF_FUNC_rc_pointer_rel;
>
> /* llvm builtin functions that eBPF C program may use to
> * emit BPF_LD_ABS and BPF_LD_IND instructions
>
tools/include/uapi/linux/bpf.h would have to be synced as well here.
Probably would be good to extend the lirc2 BPF kselftest as well?
Thanks,
Daniel
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH v2] media: bpf: add bpf function to report mouse movement
2018-11-26 0:55 ` Daniel Borkmann
@ 2018-11-26 9:00 ` Sean Young
0 siblings, 0 replies; 3+ messages in thread
From: Sean Young @ 2018-11-26 9:00 UTC (permalink / raw)
To: Daniel Borkmann
Cc: Alexei Starovoitov, Roman Gushchin, Martin KaFai Lau,
linux-media, netdev
Hi Daniel,
On Mon, Nov 26, 2018 at 01:55:36AM +0100, Daniel Borkmann wrote:
> Hi Sean,
>
> On 11/23/2018 12:50 PM, Sean Young wrote:
> > Some IR remotes have a directional pad or other pointer-like thing that
> > can be used as a mouse. Make it possible to decode these types of IR
> > protocols in BPF.
> >
> > Cc: netdev@vger.kernel.org
> > Signed-off-by: Sean Young <sean@mess.org>
>
> Is this patch targeted at bpf-next tree?
You're right, I missed the bpf-next tag.
> > ---
> > drivers/media/rc/bpf-lirc.c | 24 +++++++++++++++++++++++
> > include/uapi/linux/bpf.h | 17 +++++++++++++++-
> > tools/testing/selftests/bpf/bpf_helpers.h | 2 ++
> > 3 files changed, 42 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/media/rc/bpf-lirc.c b/drivers/media/rc/bpf-lirc.c
> > index 8b97fd1f0cea..390a722e6211 100644
> > --- a/drivers/media/rc/bpf-lirc.c
> > +++ b/drivers/media/rc/bpf-lirc.c
> > @@ -59,6 +59,28 @@ static const struct bpf_func_proto rc_keydown_proto = {
> > .arg4_type = ARG_ANYTHING,
> > };
> >
> > +BPF_CALL_3(bpf_rc_pointer_rel, u32*, sample, s32, rel_x, s32, rel_y)
> > +{
> > + struct ir_raw_event_ctrl *ctrl;
> > +
> > + ctrl = container_of(sample, struct ir_raw_event_ctrl, bpf_sample);
> > +
> > + input_report_rel(ctrl->dev->input_dev, REL_X, rel_x);
> > + input_report_rel(ctrl->dev->input_dev, REL_Y, rel_y);
> > + input_sync(ctrl->dev->input_dev);
> > +
> > + return 0;
> > +}
> > +
> > +static const struct bpf_func_proto rc_pointer_rel_proto = {
> > + .func = bpf_rc_pointer_rel,
> > + .gpl_only = true,
> > + .ret_type = RET_INTEGER,
> > + .arg1_type = ARG_PTR_TO_CTX,
> > + .arg2_type = ARG_ANYTHING,
> > + .arg3_type = ARG_ANYTHING,
> > +};
> > +
> > static const struct bpf_func_proto *
> > lirc_mode2_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)
> > {
> > @@ -67,6 +89,8 @@ lirc_mode2_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)
> > return &rc_repeat_proto;
> > case BPF_FUNC_rc_keydown:
> > return &rc_keydown_proto;
> > + case BPF_FUNC_rc_pointer_rel:
> > + return &rc_pointer_rel_proto;
> > case BPF_FUNC_map_lookup_elem:
> > return &bpf_map_lookup_elem_proto;
> > case BPF_FUNC_map_update_elem:
> > diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
> > index 23e2031a43d4..3499a1555bbf 100644
> > --- a/include/uapi/linux/bpf.h
> > +++ b/include/uapi/linux/bpf.h
> > @@ -2268,6 +2268,20 @@ union bpf_attr {
> > *
> > * Return
> > * 0 on success, or a negative error in case of failure.
> > + *
> > + * int bpf_rc_pointer_rel(void *ctx, s32 rel_x, s32 rel_y)
> > + * Description
> > + * This helper is used in programs implementing IR decoding, to
> > + * report a successfully decoded pointer movement.
> > + *
> > + * The *ctx* should point to the lirc sample as passed into
> > + * the program.
> > + *
> > + * This helper is only available is the kernel was compiled with
> > + * the **CONFIG_BPF_LIRC_MODE2** configuration option set to
> > + * "**y**".
> > + * Return
> > + * 0
> > */
> > #define __BPF_FUNC_MAPPER(FN) \
> > FN(unspec), \
> > @@ -2360,7 +2374,8 @@ union bpf_attr {
> > FN(map_push_elem), \
> > FN(map_pop_elem), \
> > FN(map_peek_elem), \
> > - FN(msg_push_data),
> > + FN(msg_push_data), \
> > + FN(rc_pointer_rel),
> >
> > /* integer value in 'imm' field of BPF_CALL instruction selects which helper
> > * function eBPF program intends to call
> > diff --git a/tools/testing/selftests/bpf/bpf_helpers.h b/tools/testing/selftests/bpf/bpf_helpers.h
> > index 686e57ce40f4..5c900a917fa4 100644
> > --- a/tools/testing/selftests/bpf/bpf_helpers.h
> > +++ b/tools/testing/selftests/bpf/bpf_helpers.h
> > @@ -168,6 +168,8 @@ static int (*bpf_skb_vlan_push)(void *ctx, __be16 vlan_proto, __u16 vlan_tci) =
> > (void *) BPF_FUNC_skb_vlan_push;
> > static int (*bpf_skb_vlan_pop)(void *ctx) =
> > (void *) BPF_FUNC_skb_vlan_pop;
> > +static int (*bpf_rc_pointer_rel)(void *ctx, int rel_x, int rel_y) =
> > + (void *) BPF_FUNC_rc_pointer_rel;
> >
> > /* llvm builtin functions that eBPF C program may use to
> > * emit BPF_LD_ABS and BPF_LD_IND instructions
> >
>
> tools/include/uapi/linux/bpf.h would have to be synced as well here.
That's true.
> Probably would be good to extend the lirc2 BPF kselftest as well?
Again, good point.
Thank you for review! I'll post a new version when it is ready.
Sean
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2018-11-26 19:53 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-11-23 11:50 [PATCH v2] media: bpf: add bpf function to report mouse movement Sean Young
2018-11-26 0:55 ` Daniel Borkmann
2018-11-26 9:00 ` Sean Young
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).