Skip to content

Commit

Permalink
input: Remove bonding info when receiving virtual cable unplug
Browse files Browse the repository at this point in the history
From Bluetooth HID Profile 1.1 Spec: If a Virtual Cable is
unplugged via a HID control Virtual Unplug command, then both the
Bluetooth HID device and Bluetooth HID Host shall destroy or
invalidate all Bluetooth bonding and Virtual Cable information
that was previously stored in persistent memory for the respective
Virtually Cabled devices and hosts.

This patch removes the bonding information upon receiving and/or
sending a "virtual cable unplug".
  • Loading branch information
apusaka authored and Vudentz committed Jul 28, 2020
1 parent cfe249a commit a081a33
Showing 1 changed file with 22 additions and 1 deletion.
23 changes: 22 additions & 1 deletion profiles/input/device.c
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ struct input_device {
uint8_t report_req_pending;
guint report_req_timer;
uint32_t report_rsp_id;
bool virtual_cable_unplug;
};

static int idle_timeout = 0;
Expand Down Expand Up @@ -159,6 +160,14 @@ static void input_device_free(struct input_device *idev)
g_free(idev);
}

static void virtual_cable_unplug(struct input_device *idev)
{
device_remove_bonding(idev->device,
btd_device_get_bdaddr_type(idev->device));

idev->virtual_cable_unplug = false;
}

static bool hidp_send_message(GIOChannel *chan, uint8_t hdr,
const uint8_t *data, size_t size)
{
Expand Down Expand Up @@ -199,6 +208,9 @@ static bool hidp_send_message(GIOChannel *chan, uint8_t hdr,
static bool hidp_send_ctrl_message(struct input_device *idev, uint8_t hdr,
const uint8_t *data, size_t size)
{
if (hdr == (HIDP_TRANS_HID_CONTROL | HIDP_CTRL_VIRTUAL_CABLE_UNPLUG))
idev->virtual_cable_unplug = true;

return hidp_send_message(idev->ctrl_io, hdr, data, size);
}

Expand Down Expand Up @@ -355,6 +367,9 @@ static gboolean intr_watch_cb(GIOChannel *chan, GIOCondition cond, gpointer data
/* Enter the auto-reconnect mode if needed */
input_device_enter_reconnect_mode(idev);

if (!idev->ctrl_io && idev->virtual_cable_unplug)
virtual_cable_unplug(idev);

return FALSE;
}

Expand Down Expand Up @@ -419,7 +434,7 @@ static void hidp_recv_ctrl_hid_control(struct input_device *idev, uint8_t param)
DBG("");

if (param == HIDP_CTRL_VIRTUAL_CABLE_UNPLUG)
connection_disconnect(idev, 0);
connection_disconnect(idev, (1 << HIDP_VIRTUAL_CABLE_UNPLUG));
}

static void hidp_recv_ctrl_data(struct input_device *idev, uint8_t param,
Expand Down Expand Up @@ -543,6 +558,9 @@ static gboolean ctrl_watch_cb(GIOChannel *chan, GIOCondition cond, gpointer data
if (idev->intr_io && !(cond & G_IO_NVAL))
g_io_channel_shutdown(idev->intr_io, TRUE, NULL);

if (!idev->intr_io && idev->virtual_cable_unplug)
virtual_cable_unplug(idev);

return FALSE;
}

Expand Down Expand Up @@ -1052,6 +1070,9 @@ static int connection_disconnect(struct input_device *idev, uint32_t flags)
shutdown(sock, SHUT_WR);
}

if (flags & (1 << HIDP_VIRTUAL_CABLE_UNPLUG))
idev->virtual_cable_unplug = true;

if (idev->uhid)
return 0;
else
Expand Down

0 comments on commit a081a33

Please sign in to comment.