Re: [PATCH v2] adapter: Cancel the service authorization when remote is disconnected

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

 



Hi Cheng,

On Mon, Aug 26, 2024 at 5:01 AM Cheng Jiang <quic_chejiang@xxxxxxxxxxx> wrote:
>
> If the remote device drops the connection before DUT confirm the
> service authorization, the DUT still must wait for service
> authorization timeout before processing future request.
>
> Cancel the service authorization request when connection is dropped.
> ---
>  src/adapter.c | 20 ++++++++++++++++++++
>  1 file changed, 20 insertions(+)
>
> diff --git a/src/adapter.c b/src/adapter.c
> index 245de4456..3ad000425 100644
> --- a/src/adapter.c
> +++ b/src/adapter.c
> @@ -8502,6 +8502,25 @@ static void disconnect_notify(struct btd_device *dev, uint8_t reason)
>         }
>  }
>
> +static void adapter_cancel_service_auth(struct btd_adapter *adapter,
> +                                       struct btd_device *device)
> +{
> +       struct service_auth *auth;
> +       GList *l;
> +
> +       auth = NULL;
> +       for (l = adapter->auths->head; l != NULL; l = l->next) {
> +               auth = l->data;
> +               if (auth->device == device)
> +                       break;
> +       }
> +       if (auth != NULL) {
> +               DBG("Cancel pending auth: %s", auth->uuid);
> +               g_queue_remove(auth->adapter->auths, auth);
> +               service_auth_cancel(auth);
> +       }
> +}
> +
>  static void dev_disconnected(struct btd_adapter *adapter,
>                                         const struct mgmt_addr_info *addr,
>                                         uint8_t reason)
> @@ -8516,6 +8535,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_cancel_service_auth(adapter, device);

This shall probably be placed together with
device_cancel_authentication in adapter_remove_connection but we need
to track in what bearer the authorization is for and remove all
authorization requests like in btd_adapter_remove_device:

    l = adapter->auths->head;
    while (l != NULL) {
        struct service_auth *auth = l->data;
        GList *next = g_list_next(l);

        if (auth->device != dev) {
            l = next;
            continue;
        }

        g_queue_delete_link(adapter->auths, l);
        l = next;

        service_auth_cancel(auth);
   }

I'd probably move the above code to a helper function so it can be
called from different places, as for doing this on a per bearer basis
would probably need to add bearer information to btd_service but I
guess that can be treated separately.


>                 disconnect_notify(device, reason);
>         }
>
> --
> 2.25.1
>
>


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