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