Hi Frederic, On Wed, May 14, 2025 at 7:21 AM Frédéric Danis <frederic.danis@xxxxxxxxxxxxx> wrote: > > Currently when connection is removed while the client is waiting for > Connect() the failed message is br-connection-canceled, even if this > is due to bonding error. > > This commit reply br-connection-key-missing when connection request > fails due to bonding error, allowing the client to differentiate > connection failure reasons. > --- > src/device.c | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/src/device.c b/src/device.c > index c364d72c3..816282eab 100644 > --- a/src/device.c > +++ b/src/device.c > @@ -246,6 +246,7 @@ struct btd_device { > struct browse_req *browse; /* service discover request */ > struct bonding_req *bonding; > struct authentication_req *authr; /* authentication request */ > + uint8_t bonding_status; > GSList *disconnects; /* disconnects message */ > DBusMessage *connect; /* connect message */ > DBusMessage *disconnect; /* disconnect message */ > @@ -3636,6 +3637,7 @@ void device_remove_connection(struct btd_device *device, uint8_t bdaddr_type, > DBusMessage *reply; > bool remove_device = false; > bool paired_status_updated = false; > + uint8_t bonding_status = device->bonding_status; > > if (!state->connected) > return; > @@ -3643,6 +3645,7 @@ void device_remove_connection(struct btd_device *device, uint8_t bdaddr_type, > state->connected = false; > state->initiator = false; > device->general_connect = FALSE; > + device->bonding_status = 0; > > device_set_svc_refreshed(device, false); > > @@ -3658,6 +3661,7 @@ void device_remove_connection(struct btd_device *device, uint8_t bdaddr_type, > if (device->connect) { > DBG("connection removed while Connect() is waiting reply"); > reply = btd_error_failed(device->connect, > + bonding_status ? ERR_BREDR_CONN_KEY_MISSING : > ERR_BREDR_CONN_CANCELED); Hmm, we shouldn't really be assuming that if status != 0 then it must be a key missing error. > g_dbus_send_message(dbus_conn, reply); > dbus_message_unref(device->connect); > @@ -6763,6 +6767,8 @@ void device_bonding_complete(struct btd_device *device, uint8_t bdaddr_type, > > DBG("bonding %p status 0x%02x", bonding, status); > > + device->bonding_status = status; I also wonder if we should reply directly here in case the bonding fails, but perhaps that depends on the error. > if (auth && auth->agent) > agent_cancel(auth->agent); > > -- > 2.43.0 > > -- Luiz Augusto von Dentz