Hi Bastien, On Tue, Oct 29, 2024 at 11:17 AM Bastien Nocera <hadess@xxxxxxxxxx> wrote: > > Output clearer debug information so that it's possible to follow the > decisions made by the bluetoothd daemon when a client such as > bluetoothctl or the GNOME Bluetooth settings ask it to connect to a > device. > --- > src/device.c | 39 ++++++++++++++++++++++++++++++++------- > 1 file changed, 32 insertions(+), 7 deletions(-) > > diff --git a/src/device.c b/src/device.c > index 7585184de50c..8756aef41aab 100644 > --- a/src/device.c > +++ b/src/device.c > @@ -2462,10 +2462,13 @@ static DBusMessage *connect_profiles(struct btd_device *dev, uint8_t bdaddr_type > DBG("%s %s, client %s", dev->path, uuid ? uuid : "(all)", > dbus_message_get_sender(msg)); > > - if (dev->pending || dev->connect || dev->browse) > + if (dev->pending || dev->connect || dev->browse) { > + DBG("Cannot connect, connection busy"); > return btd_error_in_progress_str(msg, ERR_BREDR_CONN_BUSY); I think for this type of debug we are better off introducing directly into our gdbus lib so we get the information of both method calls and replies when debug is enabled, thoughts? > + } > > if (!btd_adapter_get_powered(dev->adapter)) { > + DBG("Cannot connect, adapter is not powered"); > return btd_error_not_ready_str(msg, > ERR_BREDR_CONN_ADAPTER_NOT_POWERED); > } > @@ -2482,8 +2485,10 @@ static DBusMessage *connect_profiles(struct btd_device *dev, uint8_t bdaddr_type > "Connect") && > find_service_with_state(dev->services, > BTD_SERVICE_STATE_CONNECTED)) { > + DBG("Already connected to services"); > return dbus_message_new_method_return(msg); > } else { > + DBG("Exhausted the list of BR/EDR profiles to connect to"); > return btd_error_not_available_str(msg, > ERR_BREDR_CONN_PROFILE_UNAVAILABLE); > } > @@ -2494,8 +2499,10 @@ static DBusMessage *connect_profiles(struct btd_device *dev, uint8_t bdaddr_type > > err = connect_next(dev); > if (err < 0) { > - if (err == -EALREADY) > + if (err == -EALREADY) { > + DBG("Already connected"); > return dbus_message_new_method_return(msg); > + } > return btd_error_failed(msg, > btd_error_bredr_conn_from_errno(err)); > } > @@ -2568,12 +2575,20 @@ static uint8_t select_conn_bearer(struct btd_device *dev) > return dev->bdaddr_type; > } > > +static const char *bdaddr_type_strs[] = { > + "BR/EDR", > + "LE public", > + "LE random" > +}; > + > static DBusMessage *dev_connect(DBusConnection *conn, DBusMessage *msg, > void *user_data) > { > struct btd_device *dev = user_data; > uint8_t bdaddr_type; > > + DBG("Calling \"Connect\" for device %s", dev->path); > + > if (dev->bredr_state.connected) { > /* > * Check if services have been resolved and there is at least > @@ -2581,20 +2596,30 @@ static DBusMessage *dev_connect(DBusConnection *conn, DBusMessage *msg, > */ > if (dev->bredr_state.svc_resolved && > find_service_with_state(dev->services, > - BTD_SERVICE_STATE_CONNECTED)) > + BTD_SERVICE_STATE_CONNECTED)) { > bdaddr_type = dev->bdaddr_type; > - else > + DBG("Selecting address type %s, as BR/EDR services are resolved " > + " and connected", bdaddr_type_strs[dev->bdaddr_type]); > + } else { > bdaddr_type = BDADDR_BREDR; > - } else if (dev->le_state.connected && dev->bredr) > + DBG("Selecting address type BR/EDR, as services not resolved " > + "or not connected"); > + } > + } else if (dev->le_state.connected && dev->bredr) { > bdaddr_type = BDADDR_BREDR; > - else > + DBG("Selecting address type BR/EDR, as LE already connected"); > + } else { > bdaddr_type = select_conn_bearer(dev); > + DBG("Selecting address type %s", bdaddr_type_strs[dev->bdaddr_type]); > + } > > if (bdaddr_type != BDADDR_BREDR) { > int err; > > - if (dev->le_state.connected) > + if (dev->le_state.connected) { > + DBG("Device already connected through LE"); > return dbus_message_new_method_return(msg); > + } > > btd_device_set_temporary(dev, false); > > -- > 2.47.0 > > -- Luiz Augusto von Dentz