@@ -73,7 +73,6 @@ struct input_device {
unsigned int reconnect_timer;
uint32_t reconnect_attempt;
struct bt_uhid *uhid;
- bool uhid_created;
uint8_t report_req_pending;
unsigned int report_req_timer;
uint32_t report_rsp_id;
@@ -215,32 +214,20 @@ static bool uhid_send_get_report_reply(struct input_device *idev,
const uint8_t *data, size_t size,
uint32_t id, uint16_t err)
{
- struct uhid_event ev;
int ret;
if (data == NULL)
size = 0;
- if (size > sizeof(ev.u.get_report_reply.data))
- size = sizeof(ev.u.get_report_reply.data);
-
- if (!idev->uhid_created) {
+ if (!bt_uhid_created(idev->uhid)) {
DBG("HID report (%zu bytes) dropped", size);
return false;
}
- memset(&ev, 0, sizeof(ev));
- ev.type = UHID_GET_REPORT_REPLY;
- ev.u.get_report_reply.id = id;
- ev.u.get_report_reply.err = err;
- ev.u.get_report_reply.size = size;
-
- if (size > 0)
- memcpy(ev.u.get_report_reply.data, data, size);
-
- ret = bt_uhid_send(idev->uhid, &ev);
+ ret = bt_uhid_get_report_reply(idev->uhid, id, 0, err, data, size);
if (ret < 0) {
- error("bt_uhid_send: %s (%d)", strerror(-ret), -ret);
+ error("bt_uhid_get_report_reply: %s (%d)", strerror(-ret),
+ -ret);
return false;
}
@@ -252,20 +239,15 @@ static bool uhid_send_get_report_reply(struct input_device *idev,
static bool uhid_send_set_report_reply(struct input_device *idev,
uint32_t id, uint16_t err)
{
- struct uhid_event ev;
int ret;
- if (!idev->uhid_created)
+ if (!bt_uhid_created(idev->uhid))
return false;
- memset(&ev, 0, sizeof(ev));
- ev.type = UHID_SET_REPORT_REPLY;
- ev.u.set_report_reply.id = id;
- ev.u.set_report_reply.err = err;
-
- ret = bt_uhid_send(idev->uhid, &ev);
+ ret = bt_uhid_set_report_reply(idev->uhid, id, err);
if (ret < 0) {
- error("bt_uhid_send: %s (%d)", strerror(-ret), -ret);
+ error("bt_uhid_set_report_reply: %s (%d)", strerror(-ret),
+ -ret);
return false;
}
@@ -275,30 +257,19 @@ static bool uhid_send_set_report_reply(struct input_device *idev,
static bool uhid_send_input_report(struct input_device *idev,
const uint8_t *data, size_t size)
{
- struct uhid_event ev;
int err;
if (data == NULL)
size = 0;
- if (size > sizeof(ev.u.input.data))
- size = sizeof(ev.u.input.data);
-
- if (!idev->uhid_created) {
+ if (!bt_uhid_created(idev->uhid)) {
DBG("HID report (%zu bytes) dropped", size);
return false;
}
- memset(&ev, 0, sizeof(ev));
- ev.type = UHID_INPUT;
- ev.u.input.size = size;
-
- if (size > 0)
- memcpy(ev.u.input.data, data, size);
-
- err = bt_uhid_send(idev->uhid, &ev);
+ err = bt_uhid_input(idev->uhid, 0, data, size);
if (err < 0) {
- error("bt_uhid_send: %s (%d)", strerror(-err), -err);
+ error("bt_uhid_input: %s (%d)", strerror(-err), -err);
return false;
}
@@ -385,7 +356,7 @@ static gboolean intr_watch_cb(GIOChannel *chan, GIOCondition cond, gpointer data
virtual_cable_unplug(idev);
/* If connection abruptly ended, uhid might be not yet disconnected */
- if (idev->uhid_created)
+ if (bt_uhid_created(idev->uhid))
uhid_disconnect(idev);
return FALSE;
@@ -445,6 +416,7 @@ static void hidp_recv_ctrl_handshake(struct input_device *idev, uint8_t param)
timeout_remove(idev->report_req_timer);
idev->report_req_timer = 0;
}
+ uhid_send_set_report_reply(idev, idev->report_rsp_id, 0);
idev->report_rsp_id = 0;
}
}
@@ -625,7 +597,7 @@ static bool hidp_report_req_timeout(gpointer data)
break;
}
- DBG("Device %s HIDP %s request timed out", address, req_type_str);
+ error("Device %s HIDP %s request timed out", address, req_type_str);
idev->report_req_pending = 0;
idev->report_req_timer = 0;
@@ -941,28 +913,15 @@ static int ioctl_disconnect(struct input_device *idev, uint32_t flags)
static int uhid_connadd(struct input_device *idev, struct hidp_connadd_req *req)
{
int err;
- struct uhid_event ev;
- if (idev->uhid_created)
+ if (bt_uhid_created(idev->uhid))
return 0;
- /* create uHID device */
- memset(&ev, 0, sizeof(ev));
- ev.type = UHID_CREATE;
- strncpy((char *) ev.u.create.name, req->name, sizeof(ev.u.create.name));
- ba2strlc(&idev->src, (char *) ev.u.create.phys);
- ba2strlc(&idev->dst, (char *) ev.u.create.uniq);
- ev.u.create.vendor = req->vendor;
- ev.u.create.product = req->product;
- ev.u.create.version = req->version;
- ev.u.create.country = req->country;
- ev.u.create.bus = BUS_BLUETOOTH;
- ev.u.create.rd_data = req->rd_data;
- ev.u.create.rd_size = req->rd_size;
-
- err = bt_uhid_send(idev->uhid, &ev);
+ err = bt_uhid_create(idev->uhid, req->name, &idev->src, &idev->dst,
+ req->vendor, req->product, req->version,
+ req->country, req->rd_data, req->rd_size);
if (err < 0) {
- error("bt_uhid_send: %s", strerror(-err));
+ error("bt_uhid_create: %s", strerror(-err));
return err;
}
@@ -972,17 +931,14 @@ static int uhid_connadd(struct input_device *idev, struct hidp_connadd_req *req)
bt_uhid_register(idev->uhid, UHID_SET_REPORT, hidp_send_set_report,
idev);
- idev->uhid_created = true;
-
return err;
}
static int uhid_disconnect(struct input_device *idev)
{
int err;
- struct uhid_event ev;
- if (!idev->uhid_created)
+ if (!bt_uhid_created(idev->uhid))
return 0;
/* Only destroy the node if virtual cable unplug flag has been set */
@@ -991,17 +947,12 @@ static int uhid_disconnect(struct input_device *idev)
bt_uhid_unregister_all(idev->uhid);
- memset(&ev, 0, sizeof(ev));
- ev.type = UHID_DESTROY;
-
- err = bt_uhid_send(idev->uhid, &ev);
+ err = bt_uhid_destroy(idev->uhid);
if (err < 0) {
- error("bt_uhid_send: %s", strerror(-err));
+ error("bt_uhid_destroy: %s", strerror(-err));
return err;
}
- idev->uhid_created = false;
-
return err;
}
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com> This makes use of bt_uhid function instead of directly submitting events directly using bt_uhid_send. Fixes: https://github.com/bluez/bluez/issues/771 --- profiles/input/device.c | 93 ++++++++++------------------------------- 1 file changed, 22 insertions(+), 71 deletions(-)