Linux-Bluetooth Archive on lore.kernel.org
 help / color / Atom feed
* [Bluez PATCH v3 1/2] device: add device_remove_bonding function
@ 2020-07-16 18:04 Archie Pusaka
  2020-07-16 18:04 ` [Bluez PATCH v3 2/2] input: Remove bonding info when receiving virtual cable unplug Archie Pusaka
  2020-07-28 13:18 ` [Bluez PATCH v3 1/2] device: add device_remove_bonding function Alain Michaud
  0 siblings, 2 replies; 4+ messages in thread
From: Archie Pusaka @ 2020-07-16 18:04 UTC (permalink / raw)
  To: linux-bluetooth, Luiz Augusto von Dentz; +Cc: Archie Pusaka, Alain Michaud

From: Archie Pusaka <apusaka@chromium.org>

This patch splits the "bonding removal" function in device.c,
because we need to remove bonding information when receiving
"virtual cable unplug" in HID profile.

Reviewed-by: Alain Michaud <alainm@chromium.org>
---

Changes in v3:
- Call device_set_temporary on device_remove_bonding

Changes in v2: None

 src/device.c | 28 ++++++++++++++++++----------
 src/device.h |  1 +
 2 files changed, 19 insertions(+), 10 deletions(-)

diff --git a/src/device.c b/src/device.c
index 226216235..b23ecb7fd 100644
--- a/src/device.c
+++ b/src/device.c
@@ -4356,6 +4356,20 @@ static void delete_folder_tree(const char *dirname)
 	rmdir(dirname);
 }
 
+void device_remove_bonding(struct btd_device *device, uint8_t bdaddr_type)
+{
+	if (bdaddr_type == BDADDR_BREDR)
+		device->bredr_state.bonded = false;
+	else
+		device->le_state.bonded = false;
+
+	if (!device->bredr_state.bonded && !device->le_state.bonded)
+		btd_device_set_temporary(device, true);
+
+	btd_adapter_remove_bonding(device->adapter, &device->bdaddr,
+							bdaddr_type);
+}
+
 static void device_remove_stored(struct btd_device *device)
 {
 	char device_addr[18];
@@ -4364,17 +4378,11 @@ static void device_remove_stored(struct btd_device *device)
 	char *data;
 	gsize length = 0;
 
-	if (device->bredr_state.bonded) {
-		device->bredr_state.bonded = false;
-		btd_adapter_remove_bonding(device->adapter, &device->bdaddr,
-								BDADDR_BREDR);
-	}
+	if (device->bredr_state.bonded)
+		device_remove_bonding(device, BDADDR_BREDR);
 
-	if (device->le_state.bonded) {
-		device->le_state.bonded = false;
-		btd_adapter_remove_bonding(device->adapter, &device->bdaddr,
-							device->bdaddr_type);
-	}
+	if (device->le_state.bonded)
+		device_remove_bonding(device, device->bdaddr_type);
 
 	device->bredr_state.paired = false;
 	device->le_state.paired = false;
diff --git a/src/device.h b/src/device.h
index cb8d884e8..956fec1ae 100644
--- a/src/device.h
+++ b/src/device.h
@@ -50,6 +50,7 @@ uint16_t btd_device_get_vendor(struct btd_device *device);
 uint16_t btd_device_get_vendor_src(struct btd_device *device);
 uint16_t btd_device_get_product(struct btd_device *device);
 uint16_t btd_device_get_version(struct btd_device *device);
+void device_remove_bonding(struct btd_device *device, uint8_t bdaddr_type);
 void device_remove(struct btd_device *device, gboolean remove_stored);
 int device_address_cmp(gconstpointer a, gconstpointer b);
 int device_bdaddr_cmp(gconstpointer a, gconstpointer b);
-- 
2.27.0.389.gc38d7665816-goog


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [Bluez PATCH v3 2/2] input: Remove bonding info when receiving virtual cable unplug
  2020-07-16 18:04 [Bluez PATCH v3 1/2] device: add device_remove_bonding function Archie Pusaka
@ 2020-07-16 18:04 ` Archie Pusaka
  2020-07-28 13:18 ` [Bluez PATCH v3 1/2] device: add device_remove_bonding function Alain Michaud
  1 sibling, 0 replies; 4+ messages in thread
From: Archie Pusaka @ 2020-07-16 18:04 UTC (permalink / raw)
  To: linux-bluetooth, Luiz Augusto von Dentz; +Cc: Archie Pusaka, Alain Michaud

From: Archie Pusaka <apusaka@chromium.org>

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".

Reviewed-by: Alain Michaud <alainm@chromium.org>
---

Changes in v3: None
Changes in v2:
- Properly pass the correct argument to device_remove_bonding
- rename unbond_on_disconnect to virtual_cable_unplug

 profiles/input/device.c | 23 ++++++++++++++++++++++-
 1 file changed, 22 insertions(+), 1 deletion(-)

diff --git a/profiles/input/device.c b/profiles/input/device.c
index 2dc2ecab2..8e29de391 100644
--- a/profiles/input/device.c
+++ b/profiles/input/device.c
@@ -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;
@@ -148,6 +149,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)
 {
@@ -188,6 +197,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);
 }
 
@@ -344,6 +356,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;
 }
 
@@ -408,7 +423,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,
@@ -532,6 +547,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;
 }
 
@@ -1042,6 +1060,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
-- 
2.27.0.389.gc38d7665816-goog


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Bluez PATCH v3 1/2] device: add device_remove_bonding function
  2020-07-16 18:04 [Bluez PATCH v3 1/2] device: add device_remove_bonding function Archie Pusaka
  2020-07-16 18:04 ` [Bluez PATCH v3 2/2] input: Remove bonding info when receiving virtual cable unplug Archie Pusaka
@ 2020-07-28 13:18 ` Alain Michaud
  2020-07-28 18:03   ` Luiz Augusto von Dentz
  1 sibling, 1 reply; 4+ messages in thread
From: Alain Michaud @ 2020-07-28 13:18 UTC (permalink / raw)
  To: Archie Pusaka, Luiz Augusto von Dentz
  Cc: linux-bluetooth, Archie Pusaka, Alain Michaud

Friendly ping to maintainers on this one.

Thanks,
Alain

On Thu, Jul 16, 2020 at 2:04 PM Archie Pusaka <apusaka@google.com> wrote:
>
> From: Archie Pusaka <apusaka@chromium.org>
>
> This patch splits the "bonding removal" function in device.c,
> because we need to remove bonding information when receiving
> "virtual cable unplug" in HID profile.
>
> Reviewed-by: Alain Michaud <alainm@chromium.org>
> ---
>
> Changes in v3:
> - Call device_set_temporary on device_remove_bonding
>
> Changes in v2: None
>
>  src/device.c | 28 ++++++++++++++++++----------
>  src/device.h |  1 +
>  2 files changed, 19 insertions(+), 10 deletions(-)
>
> diff --git a/src/device.c b/src/device.c
> index 226216235..b23ecb7fd 100644
> --- a/src/device.c
> +++ b/src/device.c
> @@ -4356,6 +4356,20 @@ static void delete_folder_tree(const char *dirname)
>         rmdir(dirname);
>  }
>
> +void device_remove_bonding(struct btd_device *device, uint8_t bdaddr_type)
> +{
> +       if (bdaddr_type == BDADDR_BREDR)
> +               device->bredr_state.bonded = false;
> +       else
> +               device->le_state.bonded = false;
> +
> +       if (!device->bredr_state.bonded && !device->le_state.bonded)
> +               btd_device_set_temporary(device, true);
> +
> +       btd_adapter_remove_bonding(device->adapter, &device->bdaddr,
> +                                                       bdaddr_type);
> +}
> +
>  static void device_remove_stored(struct btd_device *device)
>  {
>         char device_addr[18];
> @@ -4364,17 +4378,11 @@ static void device_remove_stored(struct btd_device *device)
>         char *data;
>         gsize length = 0;
>
> -       if (device->bredr_state.bonded) {
> -               device->bredr_state.bonded = false;
> -               btd_adapter_remove_bonding(device->adapter, &device->bdaddr,
> -                                                               BDADDR_BREDR);
> -       }
> +       if (device->bredr_state.bonded)
> +               device_remove_bonding(device, BDADDR_BREDR);
>
> -       if (device->le_state.bonded) {
> -               device->le_state.bonded = false;
> -               btd_adapter_remove_bonding(device->adapter, &device->bdaddr,
> -                                                       device->bdaddr_type);
> -       }
> +       if (device->le_state.bonded)
> +               device_remove_bonding(device, device->bdaddr_type);
>
>         device->bredr_state.paired = false;
>         device->le_state.paired = false;
> diff --git a/src/device.h b/src/device.h
> index cb8d884e8..956fec1ae 100644
> --- a/src/device.h
> +++ b/src/device.h
> @@ -50,6 +50,7 @@ uint16_t btd_device_get_vendor(struct btd_device *device);
>  uint16_t btd_device_get_vendor_src(struct btd_device *device);
>  uint16_t btd_device_get_product(struct btd_device *device);
>  uint16_t btd_device_get_version(struct btd_device *device);
> +void device_remove_bonding(struct btd_device *device, uint8_t bdaddr_type);
>  void device_remove(struct btd_device *device, gboolean remove_stored);
>  int device_address_cmp(gconstpointer a, gconstpointer b);
>  int device_bdaddr_cmp(gconstpointer a, gconstpointer b);
> --
> 2.27.0.389.gc38d7665816-goog
>

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Bluez PATCH v3 1/2] device: add device_remove_bonding function
  2020-07-28 13:18 ` [Bluez PATCH v3 1/2] device: add device_remove_bonding function Alain Michaud
@ 2020-07-28 18:03   ` Luiz Augusto von Dentz
  0 siblings, 0 replies; 4+ messages in thread
From: Luiz Augusto von Dentz @ 2020-07-28 18:03 UTC (permalink / raw)
  To: Alain Michaud
  Cc: Archie Pusaka, linux-bluetooth, Archie Pusaka, Alain Michaud

Hi,

On Tue, Jul 28, 2020 at 6:19 AM Alain Michaud <alainmichaud@google.com> wrote:
>
> Friendly ping to maintainers on this one.
>
> Thanks,
> Alain
>
> On Thu, Jul 16, 2020 at 2:04 PM Archie Pusaka <apusaka@google.com> wrote:
> >
> > From: Archie Pusaka <apusaka@chromium.org>
> >
> > This patch splits the "bonding removal" function in device.c,
> > because we need to remove bonding information when receiving
> > "virtual cable unplug" in HID profile.
> >
> > Reviewed-by: Alain Michaud <alainm@chromium.org>
> > ---
> >
> > Changes in v3:
> > - Call device_set_temporary on device_remove_bonding
> >
> > Changes in v2: None
> >
> >  src/device.c | 28 ++++++++++++++++++----------
> >  src/device.h |  1 +
> >  2 files changed, 19 insertions(+), 10 deletions(-)
> >
> > diff --git a/src/device.c b/src/device.c
> > index 226216235..b23ecb7fd 100644
> > --- a/src/device.c
> > +++ b/src/device.c
> > @@ -4356,6 +4356,20 @@ static void delete_folder_tree(const char *dirname)
> >         rmdir(dirname);
> >  }
> >
> > +void device_remove_bonding(struct btd_device *device, uint8_t bdaddr_type)
> > +{
> > +       if (bdaddr_type == BDADDR_BREDR)
> > +               device->bredr_state.bonded = false;
> > +       else
> > +               device->le_state.bonded = false;
> > +
> > +       if (!device->bredr_state.bonded && !device->le_state.bonded)
> > +               btd_device_set_temporary(device, true);
> > +
> > +       btd_adapter_remove_bonding(device->adapter, &device->bdaddr,
> > +                                                       bdaddr_type);
> > +}
> > +
> >  static void device_remove_stored(struct btd_device *device)
> >  {
> >         char device_addr[18];
> > @@ -4364,17 +4378,11 @@ static void device_remove_stored(struct btd_device *device)
> >         char *data;
> >         gsize length = 0;
> >
> > -       if (device->bredr_state.bonded) {
> > -               device->bredr_state.bonded = false;
> > -               btd_adapter_remove_bonding(device->adapter, &device->bdaddr,
> > -                                                               BDADDR_BREDR);
> > -       }
> > +       if (device->bredr_state.bonded)
> > +               device_remove_bonding(device, BDADDR_BREDR);
> >
> > -       if (device->le_state.bonded) {
> > -               device->le_state.bonded = false;
> > -               btd_adapter_remove_bonding(device->adapter, &device->bdaddr,
> > -                                                       device->bdaddr_type);
> > -       }
> > +       if (device->le_state.bonded)
> > +               device_remove_bonding(device, device->bdaddr_type);
> >
> >         device->bredr_state.paired = false;
> >         device->le_state.paired = false;
> > diff --git a/src/device.h b/src/device.h
> > index cb8d884e8..956fec1ae 100644
> > --- a/src/device.h
> > +++ b/src/device.h
> > @@ -50,6 +50,7 @@ uint16_t btd_device_get_vendor(struct btd_device *device);
> >  uint16_t btd_device_get_vendor_src(struct btd_device *device);
> >  uint16_t btd_device_get_product(struct btd_device *device);
> >  uint16_t btd_device_get_version(struct btd_device *device);
> > +void device_remove_bonding(struct btd_device *device, uint8_t bdaddr_type);
> >  void device_remove(struct btd_device *device, gboolean remove_stored);
> >  int device_address_cmp(gconstpointer a, gconstpointer b);
> >  int device_bdaddr_cmp(gconstpointer a, gconstpointer b);
> > --
> > 2.27.0.389.gc38d7665816-goog
> >

Applied, thanks.

-- 
Luiz Augusto von Dentz

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, back to index

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-07-16 18:04 [Bluez PATCH v3 1/2] device: add device_remove_bonding function Archie Pusaka
2020-07-16 18:04 ` [Bluez PATCH v3 2/2] input: Remove bonding info when receiving virtual cable unplug Archie Pusaka
2020-07-28 13:18 ` [Bluez PATCH v3 1/2] device: add device_remove_bonding function Alain Michaud
2020-07-28 18:03   ` Luiz Augusto von Dentz

Linux-Bluetooth Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/linux-bluetooth/0 linux-bluetooth/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 linux-bluetooth linux-bluetooth/ https://lore.kernel.org/linux-bluetooth \
		linux-bluetooth@vger.kernel.org
	public-inbox-index linux-bluetooth

Example config snippet for mirrors

Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.kernel.vger.linux-bluetooth


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git