diff options
author | Benjamin Tissoires <benjamin.tissoires@redhat.com> | 2022-11-03 16:57:53 +0100 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2022-11-15 16:28:39 +0100 |
commit | 80e189f2af37d383b4840f3f89896071392cb58f (patch) | |
tree | 04cd243e40885a7753083a983b54b0dfa39a60fd | |
parent | e8445737c0264cf4ddac682c278e0ef5b8a61a3d (diff) | |
download | linux-stable-80e189f2af37d383b4840f3f89896071392cb58f.tar.gz linux-stable-80e189f2af37d383b4840f3f89896071392cb58f.tar.bz2 linux-stable-80e189f2af37d383b4840f3f89896071392cb58f.zip |
selftests/hid: Add a test for BPF_F_INSERT_HEAD
Insert 3 programs to check that we are doing the correct thing:
'2', '1', '3' are inserted, but '1' is supposed to be executed first.
Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
-rw-r--r-- | tools/testing/selftests/hid/hid_bpf.c | 43 | ||||
-rw-r--r-- | tools/testing/selftests/hid/progs/hid.c | 55 |
2 files changed, 97 insertions, 1 deletions
diff --git a/tools/testing/selftests/hid/hid_bpf.c b/tools/testing/selftests/hid/hid_bpf.c index eb329b5d299f..6615c26fb5dd 100644 --- a/tools/testing/selftests/hid/hid_bpf.c +++ b/tools/testing/selftests/hid/hid_bpf.c @@ -88,6 +88,7 @@ struct attach_prog_args { int prog_fd; unsigned int hid; int retval; + int insert_head; }; struct hid_hw_request_syscall_args { @@ -490,6 +491,7 @@ FIXTURE_SETUP(hid_bpf) struct test_program { const char *name; + int insert_head; }; #define LOAD_PROGRAMS(progs) \ load_programs(progs, ARRAY_SIZE(progs), _metadata, self, variant) @@ -539,6 +541,7 @@ static void load_programs(const struct test_program programs[], args.prog_fd = bpf_program__fd(prog); args.hid = self->hid_id; + args.insert_head = programs[i].insert_head; err = bpf_prog_test_run_opts(attach_fd, &tattr); ASSERT_OK(args.retval) TH_LOG("attach_hid(%s): %d", programs[i].name, args.retval); } @@ -741,6 +744,46 @@ TEST_F(hid_bpf, test_hid_user_raw_request_call) } /* + * Attach hid_insert{0,1,2} to the given uhid device, + * retrieve and open the matching hidraw node, + * inject one event in the uhid device, + * check that the programs have been inserted in the correct order. + */ +TEST_F(hid_bpf, test_hid_attach_flags) +{ + const struct test_program progs[] = { + { + .name = "hid_test_insert2", + .insert_head = 0, + }, + { + .name = "hid_test_insert1", + .insert_head = 1, + }, + { + .name = "hid_test_insert3", + .insert_head = 0, + }, + }; + __u8 buf[10] = {0}; + int err; + + LOAD_PROGRAMS(progs); + + /* inject one event */ + buf[0] = 1; + uhid_send_event(_metadata, self->uhid_fd, buf, 6); + + /* read the data from hidraw */ + memset(buf, 0, sizeof(buf)); + err = read(self->hidraw_fd, buf, sizeof(buf)); + ASSERT_EQ(err, 6) TH_LOG("read_hidraw"); + ASSERT_EQ(buf[1], 1); + ASSERT_EQ(buf[2], 2); + ASSERT_EQ(buf[3], 3); +} + +/* * Attach hid_rdesc_fixup to the given uhid device, * retrieve and open the matching hidraw node, * check that the hidraw report descriptor has been updated. diff --git a/tools/testing/selftests/hid/progs/hid.c b/tools/testing/selftests/hid/progs/hid.c index 5758366a90e6..6a86af0aa545 100644 --- a/tools/testing/selftests/hid/progs/hid.c +++ b/tools/testing/selftests/hid/progs/hid.c @@ -11,6 +11,7 @@ struct attach_prog_args { int prog_fd; unsigned int hid; int retval; + int insert_head; }; __u64 callback_check = 52; @@ -49,7 +50,8 @@ int attach_prog(struct attach_prog_args *ctx) { ctx->retval = hid_bpf_attach_prog(ctx->hid, ctx->prog_fd, - 0); + ctx->insert_head ? HID_BPF_FLAG_INSERT_HEAD : + HID_BPF_FLAG_NONE); return 0; } @@ -141,3 +143,54 @@ int BPF_PROG(hid_rdesc_fixup, struct hid_bpf_ctx *hid_ctx) return sizeof(rdesc) + 73; } + +SEC("?fmod_ret/hid_bpf_device_event") +int BPF_PROG(hid_test_insert1, struct hid_bpf_ctx *hid_ctx) +{ + __u8 *data = hid_bpf_get_data(hid_ctx, 0 /* offset */, 4 /* size */); + + if (!data) + return 0; /* EPERM check */ + + /* we need to be run first */ + if (data[2] || data[3]) + return -1; + + data[1] = 1; + + return 0; +} + +SEC("?fmod_ret/hid_bpf_device_event") +int BPF_PROG(hid_test_insert2, struct hid_bpf_ctx *hid_ctx) +{ + __u8 *data = hid_bpf_get_data(hid_ctx, 0 /* offset */, 4 /* size */); + + if (!data) + return 0; /* EPERM check */ + + /* after insert0 and before insert2 */ + if (!data[1] || data[3]) + return -1; + + data[2] = 2; + + return 0; +} + +SEC("?fmod_ret/hid_bpf_device_event") +int BPF_PROG(hid_test_insert3, struct hid_bpf_ctx *hid_ctx) +{ + __u8 *data = hid_bpf_get_data(hid_ctx, 0 /* offset */, 4 /* size */); + + if (!data) + return 0; /* EPERM check */ + + /* at the end */ + if (!data[1] || !data[2]) + return -1; + + data[3] = 3; + + return 0; +} |