selftests/hid: add test to change the report size
authorBenjamin Tissoires <benjamin.tissoires@redhat.com>
Thu, 3 Nov 2022 15:57:48 +0000 (16:57 +0100)
committerJiri Kosina <jkosina@suse.cz>
Tue, 15 Nov 2022 15:28:30 +0000 (16:28 +0100)
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>
tools/testing/selftests/hid/hid_bpf.c
tools/testing/selftests/hid/progs/hid.c

index 4fc7794c6f8bedf7da73776148c11d30542f4754..6c1f43ec4bddf568593785254b084714e4a2a013 100644 (file)
@@ -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)
 {
index b23ae23043463d8cd9676e78256ebbcc949696d4..b69c3f8e1ac3cca0ff6e6470b271b38ca4879606 100644 (file)
@@ -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")