selftests/hid: add test to change the report size
Use a different report with a bigger size and ensures we are doing things properly. Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
This commit is contained in:
committed by
Jiri Kosina
parent
658ee5a64f
commit
0330f725cc
@@ -22,6 +22,17 @@ static unsigned char rdesc[] = {
|
||||
0xa1, 0x01, /* COLLECTION (Application) */
|
||||
0x09, 0x01, /* Usage (Vendor Usage 0x01) */
|
||||
0xa1, 0x00, /* COLLECTION (Physical) */
|
||||
0x85, 0x02, /* REPORT_ID (2) */
|
||||
0x19, 0x01, /* USAGE_MINIMUM (1) */
|
||||
0x29, 0x08, /* USAGE_MAXIMUM (3) */
|
||||
0x15, 0x00, /* LOGICAL_MINIMUM (0) */
|
||||
0x25, 0xff, /* LOGICAL_MAXIMUM (255) */
|
||||
0x95, 0x08, /* REPORT_COUNT (8) */
|
||||
0x75, 0x08, /* REPORT_SIZE (8) */
|
||||
0x81, 0x02, /* INPUT (Data,Var,Abs) */
|
||||
0xc0, /* END_COLLECTION */
|
||||
0x09, 0x01, /* Usage (Vendor Usage 0x01) */
|
||||
0xa1, 0x00, /* COLLECTION (Physical) */
|
||||
0x85, 0x01, /* REPORT_ID (1) */
|
||||
0x06, 0x00, 0xff, /* Usage Page (Vendor Defined Page 1) */
|
||||
0x19, 0x01, /* USAGE_MINIMUM (1) */
|
||||
@@ -645,6 +656,36 @@ TEST_F(hid_bpf, test_attach_detach)
|
||||
ASSERT_EQ(buf[2], 47);
|
||||
}
|
||||
|
||||
/*
|
||||
* Attach hid_change_report_id to the given uhid device,
|
||||
* retrieve and open the matching hidraw node,
|
||||
* inject one event in the uhid device,
|
||||
* check that the program sees it and can change the data
|
||||
*/
|
||||
TEST_F(hid_bpf, test_hid_change_report)
|
||||
{
|
||||
const struct test_program progs[] = {
|
||||
{ .name = "hid_change_report_id" },
|
||||
};
|
||||
__u8 buf[10] = {0};
|
||||
int err;
|
||||
|
||||
LOAD_PROGRAMS(progs);
|
||||
|
||||
/* inject one event */
|
||||
buf[0] = 1;
|
||||
buf[1] = 42;
|
||||
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, 9) TH_LOG("read_hidraw");
|
||||
ASSERT_EQ(buf[0], 2);
|
||||
ASSERT_EQ(buf[1], 42);
|
||||
ASSERT_EQ(buf[2], 0) TH_LOG("leftovers_from_previous_test");
|
||||
}
|
||||
|
||||
static int libbpf_print_fn(enum libbpf_print_level level,
|
||||
const char *format, va_list args)
|
||||
{
|
||||
|
||||
@@ -28,7 +28,20 @@ int BPF_PROG(hid_first_event, struct hid_bpf_ctx *hid_ctx)
|
||||
|
||||
rw_data[2] = rw_data[1] + 5;
|
||||
|
||||
return 0;
|
||||
return hid_ctx->size;
|
||||
}
|
||||
|
||||
SEC("?fmod_ret/hid_bpf_device_event")
|
||||
int BPF_PROG(hid_change_report_id, struct hid_bpf_ctx *hid_ctx)
|
||||
{
|
||||
__u8 *rw_data = hid_bpf_get_data(hid_ctx, 0 /* offset */, 3 /* size */);
|
||||
|
||||
if (!rw_data)
|
||||
return 0; /* EPERM check */
|
||||
|
||||
rw_data[0] = 2;
|
||||
|
||||
return 9;
|
||||
}
|
||||
|
||||
SEC("syscall")
|
||||
|
||||
Reference in New Issue
Block a user