selftests/hid: add tests for hid_bpf_input_report
authorBenjamin Tissoires <bentiss@kernel.org>
Fri, 15 Mar 2024 14:44:43 +0000 (15:44 +0100)
committerBenjamin Tissoires <bentiss@kernel.org>
Wed, 10 Apr 2024 14:38:37 +0000 (16:38 +0200)
Usual way of testing, we call the function and ensures we receive
the event

Link: https://lore.kernel.org/r/20240315-b4-hid-bpf-new-funcs-v4-6-079c282469d3@kernel.org
Signed-off-by: Benjamin Tissoires <bentiss@kernel.org>
tools/testing/selftests/hid/hid_bpf.c
tools/testing/selftests/hid/progs/hid.c
tools/testing/selftests/hid/progs/hid_bpf_helpers.h

index 8332014838b0906843f72140892fa36e83edc1b2..f825623e3edce834e8fd483027e778cca4fbb7c1 100644 (file)
@@ -749,6 +749,52 @@ TEST_F(hid_bpf, test_hid_change_report)
        ASSERT_EQ(buf[2], 0) TH_LOG("leftovers_from_previous_test");
 }
 
+/*
+ * Call hid_bpf_input_report against the given uhid device,
+ * check that the program is called and does the expected.
+ */
+TEST_F(hid_bpf, test_hid_user_input_report_call)
+{
+       struct hid_hw_request_syscall_args args = {
+               .retval = -1,
+               .size = 10,
+       };
+       DECLARE_LIBBPF_OPTS(bpf_test_run_opts, tattrs,
+                           .ctx_in = &args,
+                           .ctx_size_in = sizeof(args),
+       );
+       __u8 buf[10] = {0};
+       int err, prog_fd;
+
+       LOAD_BPF;
+
+       args.hid = self->hid_id;
+       args.data[0] = 1; /* report ID */
+       args.data[1] = 2; /* report ID */
+       args.data[2] = 42; /* report ID */
+
+       prog_fd = bpf_program__fd(self->skel->progs.hid_user_input_report);
+
+       /* check that there is no data to read from hidraw */
+       memset(buf, 0, sizeof(buf));
+       err = read(self->hidraw_fd, buf, sizeof(buf));
+       ASSERT_EQ(err, -1) TH_LOG("read_hidraw");
+
+       err = bpf_prog_test_run_opts(prog_fd, &tattrs);
+
+       ASSERT_OK(err) TH_LOG("error while calling bpf_prog_test_run_opts");
+
+       ASSERT_EQ(args.retval, 0);
+
+       /* 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[0], 1);
+       ASSERT_EQ(buf[1], 2);
+       ASSERT_EQ(buf[2], 42);
+}
+
 /*
  * Call hid_bpf_hw_output_report against the given uhid device,
  * check that the program is called and does the expected.
@@ -797,8 +843,7 @@ TEST_F(hid_bpf, test_hid_user_output_report_call)
 }
 
 /*
- * Attach hid_user_raw_request to the given uhid device,
- * call the bpf program from userspace
+ * Call hid_hw_raw_request against the given uhid device,
  * check that the program is called and does the expected.
  */
 TEST_F(hid_bpf, test_hid_user_raw_request_call)
index 2c2b679a83b17be217927785dfd02ec7fba3cb12..f67d35def142ff4f46d1fdd3af22c51ad7e6eb64 100644 (file)
@@ -125,6 +125,28 @@ int hid_user_output_report(struct hid_hw_request_syscall_args *args)
        return 0;
 }
 
+SEC("syscall")
+int hid_user_input_report(struct hid_hw_request_syscall_args *args)
+{
+       struct hid_bpf_ctx *ctx;
+       const size_t size = args->size;
+       int i, ret = 0;
+
+       if (size > sizeof(args->data))
+               return -7; /* -E2BIG */
+
+       ctx = hid_bpf_allocate_context(args->hid);
+       if (!ctx)
+               return -1; /* EPERM check */
+
+       ret = hid_bpf_input_report(ctx, HID_INPUT_REPORT, args->data, size);
+       args->retval = ret;
+
+       hid_bpf_release_context(ctx);
+
+       return 0;
+}
+
 static const __u8 rdesc[] = {
        0x05, 0x01,                             /* USAGE_PAGE (Generic Desktop) */
        0x09, 0x32,                             /* USAGE (Z) */
index 50c6a0d5765eeb63a1a144131403b028cf3929b4..9cd56821d0f189c03629d849e895fa92d5fc98b8 100644 (file)
@@ -96,5 +96,9 @@ extern int hid_bpf_hw_request(struct hid_bpf_ctx *ctx,
                              enum hid_class_request reqtype) __ksym;
 extern int hid_bpf_hw_output_report(struct hid_bpf_ctx *ctx,
                                    __u8 *buf, size_t buf__sz) __ksym;
+extern int hid_bpf_input_report(struct hid_bpf_ctx *ctx,
+                               enum hid_report_type type,
+                               __u8 *data,
+                               size_t buf__sz) __ksym;
 
 #endif /* __HID_BPF_HELPERS_H */