Re: [PATCH v3] device: Remove device after all bearers are disconnected

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

 



Hi Luiz, 

On 9/25/2024 10:56 PM, Luiz Augusto von Dentz wrote:
> Hi Cheng,
> 
> On Wed, Sep 25, 2024 at 5:10 AM Cheng Jiang <quic_chejiang@xxxxxxxxxxx> wrote:
>>
>> For a combo mode remote, both BR/EDR and BLE may be connected.
>> RemoveDevice should be handled after all bearers are dropped,
>> otherwise, remove device is not performed in adapter_remove_connection.
>> ---
>>  src/device.c | 12 +++++++++++-
>>  1 file changed, 11 insertions(+), 1 deletion(-)
>>
>> diff --git a/src/device.c b/src/device.c
>> index f8f61e643..c25bf6b60 100644
>> --- a/src/device.c
>> +++ b/src/device.c
>> @@ -3492,8 +3492,18 @@ void device_remove_connection(struct btd_device *device, uint8_t bdaddr_type,
>>                 DBusMessage *msg = device->disconnects->data;
>>
>>                 if (dbus_message_is_method_call(msg, ADAPTER_INTERFACE,
>> -                                                               "RemoveDevice"))
>> +                                                       "RemoveDevice")) {
>> +
>> +                       /* Don't handle the RemoveDevice msg if device is
>> +                        * connected. For a dual mode remote, both BR/EDR
>> +                        * and BLE may be connected, RemoveDevice should
>> +                        * be handled after all bearers are disconnects.
>> +                        */
>> +                       if (device->bredr_state.connected ||
>> +                                       device->le_state.connected)
>> +                               break;
> 
> While this seems to make sense further down there is the same state:
> 
> line 3531: if (device->bredr_state.connected || device->le_state.connected)
> 
> So what this is doing is just to avoid removing the msg from
> device->disconnects but perhaps I'm missing something.
Yes, it is used to avoid remove the msg. If BR/EDR and BLE are connected, when user perform
remove operation, the BR/EDR connection is disconnect first. Then it set the "remove_device"
to True, and remove the msg from device->disconnects, but BLE is still connected, so this function
(device_remove_connection) will return without set the *remove to True.
Then the BLE is disconnected, but at this time, msg is already removed from device->disconnects, so
"remove_device" is not set to True. And accordingly *remove is not true. The device is not removed for
adapter in adapter_remove_connection. Need to wait for temporary device timeout to remove the device. 

> 
>>                         remove_device = true;
>> +               }
>>
>>                 g_dbus_send_reply(dbus_conn, msg, DBUS_TYPE_INVALID);
>>                 device->disconnects = g_slist_remove(device->disconnects, msg);
>> --
>> 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