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

Thank you for your feedback. Please check the comment inline. 

On 8/26/2024 9:43 PM, Luiz Augusto von Dentz wrote:
> 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:
Yes. It can be put in device_cancel_authentication, but the condition to call
this function in adapter_remove_connection need change. device_is_authenticating
is only true when request, notify or confirm pincode/passkey.
As for bearer, the service authorize is only happened on BDADDR_BREDR. So it 
can be called when the address type is BDADDR_BREDR in dev_disconnected. 
> 
>     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.
Yes, it's great. Need use the above code to cancel all pending authorize. 
> 
> 
>>                 disconnect_notify(device, reason);
>>         }
>>
>> --
>> 2.25.1
>>
>>
> 
> 





[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