aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/bpf/syscall.c
diff options
context:
space:
mode:
authorDaniel Borkmann <daniel@iogearbox.net>2018-05-30 06:45:12 -0400
committerDaniel Borkmann <daniel@iogearbox.net>2018-05-30 06:46:21 -0400
commitee7dbd974797e6dcbfd0df6d3c2d95a5a55ac0c8 (patch)
treea153475f8949a8c9d6340b4f52c37b8912d0622d /kernel/bpf/syscall.c
parent9ce64f192d161acff17c99ceec7d9ce3db9252fa (diff)
parent6bdd533cee9aadbcd476af30bfff079abe68fcdb (diff)
Merge branch 'bpf-ir-decoder'
Sean Young says: ==================== The kernel IR decoders (drivers/media/rc/ir-*-decoder.c) support the most widely used IR protocols, but there are many protocols which are not supported[1]. For example, the lirc-remotes[2] repo has over 2700 remotes, many of which are not supported by rc-core. There is a "long tail" of unsupported IR protocols, for which lircd is need to decode the IR . IR encoding is done in such a way that some simple circuit can decode it; therefore, bpf is ideal. In order to support all these protocols, here we have bpf based IR decoding. The idea is that user-space can define a decoder in bpf, attach it to the rc device through the lirc chardev. Separate work is underway to extend ir-keytable to have an extensive library of bpf-based decoders, and a much expanded library of rc keymaps. Another future application would be to compile IRP[3] to a IR BPF program, and so support virtually every remote without having to write a decoder for each. It might also be possible to support non-button devices such as analog directional pads or air conditioning remote controls and decode the target temperature in bpf, and pass that to an input device. [1] http://www.hifi-remote.com/wiki/index.php?title=DecodeIR [2] https://sourceforge.net/p/lirc-remotes/code/ci/master/tree/remotes/ [3] http://www.hifi-remote.com/wiki/index.php?title=IRP_Notation Changes since v4: - Renamed rc_dev_bpf_{attach,detach,query} to lirc_bpf_{attach,detach,query} - Fixed error path in lirc_bpf_query - Rebased on bpf-next Changes since v3: - Implemented review comments from Quentin Monnet and Y Song (thanks!) - More helpful and better formatted bpf helper documentation - Changed back to bpf_prog_array rather than open-coded implementation - scancodes can be 64 bit - bpf gets passed values in microseconds, not nanoseconds. microseconds is more than than enough (IR receivers support carriers upto 70kHz, at which point a single period is already 14 microseconds). Also, this makes it much more consistent with lirc mode2. - Since it looks much more like lirc mode2, rename the program type to BPF_PROG_TYPE_LIRC_MODE2. - Rebased on bpf-next Changes since v2: - Fixed locking issues - Improved self-test to cover more cases - Rebased on bpf-next again Changes since v1: - Code review comments from Y Song <ys114321@gmail.com> and Randy Dunlap <rdunlap@infradead.org> - Re-wrote sample bpf to be selftest - Renamed RAWIR_DECODER -> RAWIR_EVENT (Kconfig, context, bpf prog type) - Rebase on bpf-next - Introduced bpf_rawir_event context structure with simpler access checking ==================== Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Diffstat (limited to 'kernel/bpf/syscall.c')
-rw-r--r--kernel/bpf/syscall.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
index e254526d6744..7365d79ae00d 100644
--- a/kernel/bpf/syscall.c
+++ b/kernel/bpf/syscall.c
@@ -11,6 +11,7 @@
11 */ 11 */
12#include <linux/bpf.h> 12#include <linux/bpf.h>
13#include <linux/bpf_trace.h> 13#include <linux/bpf_trace.h>
14#include <linux/bpf_lirc.h>
14#include <linux/btf.h> 15#include <linux/btf.h>
15#include <linux/syscalls.h> 16#include <linux/syscalls.h>
16#include <linux/slab.h> 17#include <linux/slab.h>
@@ -1582,6 +1583,8 @@ static int bpf_prog_attach(const union bpf_attr *attr)
1582 case BPF_SK_SKB_STREAM_PARSER: 1583 case BPF_SK_SKB_STREAM_PARSER:
1583 case BPF_SK_SKB_STREAM_VERDICT: 1584 case BPF_SK_SKB_STREAM_VERDICT:
1584 return sockmap_get_from_fd(attr, BPF_PROG_TYPE_SK_SKB, true); 1585 return sockmap_get_from_fd(attr, BPF_PROG_TYPE_SK_SKB, true);
1586 case BPF_LIRC_MODE2:
1587 return lirc_prog_attach(attr);
1585 default: 1588 default:
1586 return -EINVAL; 1589 return -EINVAL;
1587 } 1590 }
@@ -1654,6 +1657,8 @@ static int bpf_prog_detach(const union bpf_attr *attr)
1654 case BPF_SK_SKB_STREAM_PARSER: 1657 case BPF_SK_SKB_STREAM_PARSER:
1655 case BPF_SK_SKB_STREAM_VERDICT: 1658 case BPF_SK_SKB_STREAM_VERDICT:
1656 return sockmap_get_from_fd(attr, BPF_PROG_TYPE_SK_SKB, false); 1659 return sockmap_get_from_fd(attr, BPF_PROG_TYPE_SK_SKB, false);
1660 case BPF_LIRC_MODE2:
1661 return lirc_prog_detach(attr);
1657 default: 1662 default:
1658 return -EINVAL; 1663 return -EINVAL;
1659 } 1664 }
@@ -1703,6 +1708,8 @@ static int bpf_prog_query(const union bpf_attr *attr,
1703 case BPF_CGROUP_SOCK_OPS: 1708 case BPF_CGROUP_SOCK_OPS:
1704 case BPF_CGROUP_DEVICE: 1709 case BPF_CGROUP_DEVICE:
1705 break; 1710 break;
1711 case BPF_LIRC_MODE2:
1712 return lirc_prog_query(attr, uattr);
1706 default: 1713 default:
1707 return -EINVAL; 1714 return -EINVAL;
1708 } 1715 }