Re: [PATCH BlueZ v2 1/3] src/device: Add Disconnected signal to propagate disconnection reason

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Frédéric,

On Tue, May 20, 2025 at 12:26 PM Frédéric Danis
<frederic.danis@xxxxxxxxxxxxx> wrote:
>
> Currently a client application is informed of the disconnection by the
> update of the Connected property to false.
> This sends a Disconnected signal with the disconnection reason before
> the property is updated.
>
> This helps client application to know the reason for the disconnection
> and to take appropriate action.
> ---
> v1->v2: Propagate numerical reason instead of text one
>
>  src/adapter.c | 13 ++++++++-----
>  src/device.c  | 16 ++++++++++++++--
>  src/device.h  |  3 ++-
>  3 files changed, 24 insertions(+), 8 deletions(-)
>
> diff --git a/src/adapter.c b/src/adapter.c
> index fd425e6d2..a10721489 100644
> --- a/src/adapter.c
> +++ b/src/adapter.c
> @@ -7549,7 +7549,8 @@ struct agent *adapter_get_agent(struct btd_adapter *adapter)
>
>  static void adapter_remove_connection(struct btd_adapter *adapter,
>                                                 struct btd_device *device,
> -                                               uint8_t bdaddr_type)
> +                                               uint8_t bdaddr_type,
> +                                               uint8_t reason)
>  {
>         bool remove_device = false;
>
> @@ -7560,7 +7561,7 @@ static void adapter_remove_connection(struct btd_adapter *adapter,
>                 return;
>         }
>
> -       device_remove_connection(device, bdaddr_type, &remove_device);
> +       device_remove_connection(device, bdaddr_type, &remove_device, reason);
>
>         device_cancel_authentication(device, TRUE);
>
> @@ -7601,9 +7602,11 @@ static void adapter_stop(struct btd_adapter *adapter)
>                 struct btd_device *device = adapter->connections->data;
>                 uint8_t addr_type = btd_device_get_bdaddr_type(device);
>
> -               adapter_remove_connection(adapter, device, BDADDR_BREDR);
> +               adapter_remove_connection(adapter, device, BDADDR_BREDR,
> +                                               MGMT_DEV_DISCONN_UNKNOWN);
>                 if (addr_type != BDADDR_BREDR)
> -                       adapter_remove_connection(adapter, device, addr_type);
> +                       adapter_remove_connection(adapter, device, addr_type,
> +                                               MGMT_DEV_DISCONN_UNKNOWN);
>         }
>
>         g_dbus_emit_property_changed(dbus_conn, adapter->path,
> @@ -8551,7 +8554,7 @@ static void dev_disconnected(struct btd_adapter *adapter,
>
>         device = btd_adapter_find_device(adapter, &addr->bdaddr, addr->type);
>         if (device) {
> -               adapter_remove_connection(adapter, device, addr->type);
> +               adapter_remove_connection(adapter, device, addr->type, reason);
>                 disconnect_notify(device, reason);
>         }
>
> diff --git a/src/device.c b/src/device.c
> index d230af0a8..00a0fbfc7 100644
> --- a/src/device.c
> +++ b/src/device.c
> @@ -3417,6 +3417,12 @@ static const GDBusMethodTable device_methods[] = {
>         { }
>  };
>
> +static const GDBusSignalTable device_signals[] = {
> +       { GDBUS_SIGNAL("Disconnected",
> +                       GDBUS_ARGS({ "reason", "y" })) },

Ive changed my mind regarding this, this should actually have the same
format as Device.Connect error reply, so we use the same domain of
errors org.bluez.Error.{Name} followed by its message.

> +       { }
> +};
> +
>  static gboolean
>  dev_property_get_prefer_bearer(const GDBusPropertyTable *property,
>                                 DBusMessageIter *iter, void *data)
> @@ -3638,7 +3644,8 @@ static void set_temporary_timer(struct btd_device *dev, unsigned int timeout)
>  }
>
>  void device_remove_connection(struct btd_device *device, uint8_t bdaddr_type,
> -                                                               bool *remove)
> +                                                               bool *remove,
> +                                                               uint8_t reason)
>  {
>         struct bearer_state *state = get_state(device, bdaddr_type);
>         DBusMessage *reply;
> @@ -3708,6 +3715,11 @@ void device_remove_connection(struct btd_device *device, uint8_t bdaddr_type,
>         g_slist_free_full(device->eir_uuids, g_free);
>         device->eir_uuids = NULL;
>
> +       g_dbus_emit_signal(dbus_conn, device->path, DEVICE_INTERFACE,
> +                                               "Disconnected",
> +                                               DBUS_TYPE_BYTE, &reason,
> +                                               DBUS_TYPE_INVALID);
> +
>         g_dbus_emit_property_changed(dbus_conn, device->path,
>                                                 DEVICE_INTERFACE, "Connected");
>
> @@ -4611,7 +4623,7 @@ static struct btd_device *device_new(struct btd_adapter *adapter,
>
>         if (g_dbus_register_interface(dbus_conn,
>                                         device->path, DEVICE_INTERFACE,
> -                                       device_methods, NULL,
> +                                       device_methods, device_signals,
>                                         device_properties, device,
>                                         device_free) == FALSE) {
>                 error("Unable to register device interface for %s", address);
> diff --git a/src/device.h b/src/device.h
> index a35bb1386..4eebcebe9 100644
> --- a/src/device.h
> +++ b/src/device.h
> @@ -134,7 +134,8 @@ gboolean device_is_authenticating(struct btd_device *device);
>  void device_add_connection(struct btd_device *dev, uint8_t bdaddr_type,
>                                                         uint32_t flags);
>  void device_remove_connection(struct btd_device *device, uint8_t bdaddr_type,
> -                                                               bool *remove);
> +                                                       bool *remove,
> +                                                       uint8_t reason);
>  void device_request_disconnect(struct btd_device *device, DBusMessage *msg);
>  bool device_is_disconnecting(struct btd_device *device);
>  void device_set_ltk(struct btd_device *device, const uint8_t val[16],
> --
> 2.43.0
>
>


-- 
Luiz Augusto von Dentz





[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux