linux-bluetooth.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [BlueZ PATCH v5 0/4] Detailed error string
@ 2021-08-06 23:47 Miao-chen Chou
  2021-08-06 23:47 ` [BlueZ PATCH v5 1/4] doc: Add errors.txt to describe errors of D-Bus method returns Miao-chen Chou
                   ` (3 more replies)
  0 siblings, 4 replies; 7+ messages in thread
From: Miao-chen Chou @ 2021-08-06 23:47 UTC (permalink / raw)
  To: Bluetooth Kernel Mailing List
  Cc: Marcel Holtmann, Howard Chung, Luiz Augusto von Dentz,
	Alain Michaud, Miao-chen Chou

Chromium OS has been working closely with Linux Bluetooth community to
improve BlueZ stack, and there are increasing needs from applications
building their features around Bluetooth. One of the major feedback
from these application is the lack of the detailed failure reasons as
return for D-Bus method call, and these failure reasons can be used in
metrics, optimizing retry mechanism, hinting the reproduce scenario to
improve BlueZ stack. The current org.bluez.Error.* are serving the
generic errors well. However,g given org.bluez.Error.* errors are used
across different interface context which does not serve the detailed
failure reasons well. (See https://github.com/bluez/bluez/issues/131)

Changes in v5:
- Replace error code with error string

Changes in v4:
- Address make errors.

Changes in v3:
- Correct error-codes.txt.

Changes in v2:
- Add documentation for error codes

Miao-chen Chou (4):
  Add errors.txt to describe errors of D-Bus method returns
  BR/EDR and LE connection failure reasons
  Include detailed error string in Connect() return
  Print error code for connect methods

 client/main.c  |   3 +-
 doc/errors.txt | 233 +++++++++++++++++++++++++++++++++++++++++++++++++
 src/device.c   |  46 ++++++----
 src/error.c    | 100 +++++++++++++++++++++
 src/error.h    |  59 +++++++++++++
 5 files changed, 424 insertions(+), 17 deletions(-)
 create mode 100644 doc/errors.txt

-- 
2.32.0.605.g8dce9f2422-goog


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [BlueZ PATCH v5 1/4] doc: Add errors.txt to describe errors of D-Bus method returns
  2021-08-06 23:47 [BlueZ PATCH v5 0/4] Detailed error string Miao-chen Chou
@ 2021-08-06 23:47 ` Miao-chen Chou
  2021-08-07  1:17   ` Detailed error string bluez.test.bot
  2021-08-06 23:47 ` [BlueZ PATCH v5 2/4] error: BR/EDR and LE connection failure reasons Miao-chen Chou
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 7+ messages in thread
From: Miao-chen Chou @ 2021-08-06 23:47 UTC (permalink / raw)
  To: Bluetooth Kernel Mailing List
  Cc: Marcel Holtmann, Howard Chung, Luiz Augusto von Dentz,
	Alain Michaud, Miao-chen Chou

Changes in v5:
- Remove the use of error codes.

 doc/errors.txt | 233 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 233 insertions(+)
 create mode 100644 doc/errors.txt

diff --git a/doc/errors.txt b/doc/errors.txt
new file mode 100644
index 000000000..047610c74
--- /dev/null
+++ b/doc/errors.txt
@@ -0,0 +1,233 @@
+D-Bus Method Return Error Codes
+===============================
+
+The motivation of having detailed error is to provide context-based failure
+reasons along with D-Bus method return so that D-Bus clients can build metrics
+and optimize their application based on these failure reasons. For instance, a
+client can build retry mechanism for a connection failure or improve the
+bottleneck of use scenario based on actionable metrics.
+
+These error codes are context-based but not necessarily tied to interface or
+method calls. For instance, if a pairing request failed due to connection
+failure, connection error would be attached to the method return of Pair().
+
+BR/EDR connection already connected
+===================================
+	errno:	EALREADY, EISCONN
+
+	Either the profile is already connected or ACL connection is in place.
+
+BR/EDR connection page timeout
+==============================
+	errno:	EHOSTDOWN
+
+	Failed due to page timeout.
+
+BR/EDR connection profile unavailable
+=====================================
+	errno:	ENOPROTOOPT
+
+	Failed to find connectable services or the target service.
+
+BR/EDR connection SDP search
+============================
+	errno:	none
+
+	Failed to complete the SDP search.
+
+BR/EDR connection create socket
+===============================
+	errno:	EIO
+
+	Failed to create or connect to BT IO socket. This can also indicate
+	hardware failure in the controller.
+
+BR/EDR connection invalid arguments
+===================================
+	errno:	EHOSTUNREACH
+
+	Failed due to invalid arguments.
+
+BR/EDR connection not powered
+=============================
+	errno:	EHOSTUNREACH
+
+	Failed due to adapter not powered.
+
+BR/EDR connection not supported
+===============================
+	errno:	EOPNOTSUPP, EPROTONOSUPPORT
+
+	Failed due to unsupported state transition of L2CAP channel or other
+	features either by the local host or the remote.
+
+BR/EDR connection bad socket
+============================
+	errno:	EBADFD
+
+	Failed due to the socket is in bad state.
+
+BR/EDR connection memory allocation
+===================================
+	errno:	ENOMEM
+
+	Failed to allocate memory in either host stack or controller.
+
+BR/EDR connection busy
+======================
+	errno:	EBUSY
+
+	Failed due to other ongoing operations, such as pairing, busy L2CAP
+	channel or the operation disallowed by the controller.
+
+BR/EDR connection concurrent connection limit
+=============================================
+	errno:	EMLINK
+
+	Failed due to reaching the concurrent connection limit to a device.
+
+BR/EDR connection timeout
+=========================
+	errno:	ETIMEDOUT
+
+	Failed due to connection timeout
+
+BR/EDR connection refused
+=========================
+	errno:	ECONNREFUSED
+
+	Refused by the remote device due to limited resource, security reason
+	or unacceptable address type.
+
+BR/EDR connection aborted by remote
+===================================
+	errno:	ECONNRESET
+
+	Terminated by the remote device due to limited resource or power off.
+
+BR/EDR connection aborted by local
+==================================
+	errno:	ECONNABORTED
+
+	Aborted by the local host.
+
+BR/EDR connection LMP protocol error
+====================================
+	errno:	EPROTO
+
+	Failed due to LMP protocol error.
+
+BR/EDR connection canceled
+==========================
+	errno:	none
+
+	Failed due to cancellation caused by adapter drop, unexpected device
+	drop, orincoming disconnection request before connection request is
+	completed.
+
+BR/EDR connection unknown error
+===============================
+	errno:	ENOSYS
+
+	Failed due to unknown reason.
+
+LE connection invalid arguments
+===============================
+	errno:	EINVAL
+
+	Failed due to invalid arguments.
+
+LE connection not powered
+=========================
+	errno:	EHOSTUNREACH
+
+	Failed due to adapter not powered.
+
+LE connection not supported
+===========================
+	errno:	EOPNOTSUPP, EPROTONOSUPPORT
+
+	Failed due to unsupported state transition of L2CAP channel or other
+	features (e.g. LE features) either by the local host or the remote.
+
+LE connection already connected
+===============================
+	errno: EALREADY, EISCONN
+
+	Either the BT IO is already connected or LE link connection in place.
+
+LE connection bad socket
+========================
+	errno: EBADFD
+
+	Failed due to the socket is in bad state.
+
+LE connection memory allocation
+===============================
+	errno: ENOMEM
+
+	Failed to allocate memory in either host stack or controller.
+
+LE connection busy
+==================
+	errno:	EBUSY
+
+	Failed due to other ongoing operations, such as pairing, connecting,
+	busy L2CAP channel or the operation disallowed by the controller.
+
+LE connection refused
+=====================
+	errno:	ECONNREFUSED
+
+	Failed due to that LE is not enabled or the attempt is refused by the
+	remote device due to limited resource, security reason or unacceptable
+	address type.
+
+LE connection create socket
+===========================
+	errno:	EIO
+
+	Failed to create or connect to BT IO socket. This can also indicate
+	hardware failure in the controller.
+
+LE connection timeout
+=====================
+	errno:	ETIMEDOUT
+
+	Failed due to connection timeout
+
+LE connection concurrent connection limit
+=========================================
+	errno:	EMLINK
+
+	Failed due to reaching the synchronous connection limit to a device.
+
+LE connection abort by remote
+=============================
+	errno:	ECONNRESET
+
+	Aborted by the remote device due to limited resource or power off.
+
+LE connection abort by local
+============================
+	errno:	ECONNABORTED
+
+	Aborted by the local host.
+
+LE connection link layer protocol error
+=======================================
+	errno:	EPROTO
+
+	Failed due to link layer protocol error.
+
+LE connection GATT browsing
+===========================
+	errno:	none
+
+	Failed to complete the GATT browsing.
+
+LE connection unknown error
+===========================
+	errno:	ENOSYS
+
+	Failed due to unknown reason.
-- 
2.32.0.605.g8dce9f2422-goog


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [BlueZ PATCH v5 2/4] error: BR/EDR and LE connection failure reasons
  2021-08-06 23:47 [BlueZ PATCH v5 0/4] Detailed error string Miao-chen Chou
  2021-08-06 23:47 ` [BlueZ PATCH v5 1/4] doc: Add errors.txt to describe errors of D-Bus method returns Miao-chen Chou
@ 2021-08-06 23:47 ` Miao-chen Chou
  2021-08-09 13:32   ` Marcel Holtmann
  2021-08-06 23:47 ` [BlueZ PATCH v5 3/4] device: Include detailed error string in Connect() return Miao-chen Chou
  2021-08-06 23:47 ` [BlueZ PATCH v5 4/4] client: Print error code for connect methods Miao-chen Chou
  3 siblings, 1 reply; 7+ messages in thread
From: Miao-chen Chou @ 2021-08-06 23:47 UTC (permalink / raw)
  To: Bluetooth Kernel Mailing List
  Cc: Marcel Holtmann, Howard Chung, Luiz Augusto von Dentz,
	Alain Michaud, Miao-chen Chou

The source of Connect() failures can be divided into the following
three.
- bluetoothd's device interface state transition and profile state
  transition
- Kernel's L2CAP layer state transition
- Potential HCI error codes returned by the remote device

Reviewed-by: Alain Michaud <alainm@chromium.org>
Reviewed-by: Howard Chung <howardchung@google.com>
---

Changes in v5:
- Replace uint16_t error code with string

Changes in v4:
- Address make errors

Changes in v3:
- Separate error-code.txt into its own commit

Changes in v2:
- Add error-code.txt
- Remove BtdError from return string

 src/error.c | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/error.h |  59 +++++++++++++++++++++++++++++++
 2 files changed, 159 insertions(+)

diff --git a/src/error.c b/src/error.c
index 89517075e..411f36fcb 100644
--- a/src/error.c
+++ b/src/error.c
@@ -27,6 +27,8 @@
 #include <config.h>
 #endif
 
+#include <error.h>
+#include <stdio.h>
 #include "gdbus/gdbus.h"
 
 #include "error.h"
@@ -79,12 +81,24 @@ DBusMessage *btd_error_in_progress(DBusMessage *msg)
 					"In Progress");
 }
 
+DBusMessage *btd_error_in_progress_str(DBusMessage *msg, const char *str)
+{
+	return g_dbus_create_error(msg, ERROR_INTERFACE ".InProgress",
+					"%s", str);
+}
+
 DBusMessage *btd_error_not_available(DBusMessage *msg)
 {
 	return g_dbus_create_error(msg, ERROR_INTERFACE ".NotAvailable",
 					"Operation currently not available");
 }
 
+DBusMessage *btd_error_not_available_str(DBusMessage *msg, const char *str)
+{
+	return g_dbus_create_error(msg, ERROR_INTERFACE ".NotAvailable",
+					"%s", str);
+}
+
 DBusMessage *btd_error_does_not_exist(DBusMessage *msg)
 {
 	return g_dbus_create_error(msg, ERROR_INTERFACE ".DoesNotExist",
@@ -121,8 +135,94 @@ DBusMessage *btd_error_not_ready(DBusMessage *msg)
 					"Resource Not Ready");
 }
 
+DBusMessage *btd_error_not_ready_str(DBusMessage *msg, const char *str)
+{
+	return g_dbus_create_error(msg, ERROR_INTERFACE ".NotReady",
+					"%s", str);
+}
+
 DBusMessage *btd_error_failed(DBusMessage *msg, const char *str)
 {
 	return g_dbus_create_error(msg, ERROR_INTERFACE
 					".Failed", "%s", str);
 }
+
+const char* btd_error_bredr_conn_from_errno(int errno_code)
+{
+	switch (-errno_code) {
+	case EALREADY:
+	case EISCONN:
+		return ERR_BREDR_CONN_ALREADY_CONNECTED;
+	case EHOSTDOWN:
+		return ERR_BREDR_CONN_PAGE_TIMEOUT;
+	case ENOPROTOOPT:
+		return ERR_BREDR_CONN_PROFILE_UNAVAILABLE;
+	case EIO:
+		return ERR_BREDR_CONN_CREATE_SOCKET;
+	case EINVAL:
+		return ERR_BREDR_CONN_INVALID_ARGUMENTS;
+	case EHOSTUNREACH:
+		return ERR_BREDR_CONN_ADAPTER_NOT_POWERED;
+	case EOPNOTSUPP:
+	case EPROTONOSUPPORT:
+		return ERR_BREDR_CONN_NOT_SUPPORTED;
+	case EBADFD:
+		return ERR_BREDR_CONN_BAD_SOCKET;
+	case ENOMEM:
+		return ERR_BREDR_CONN_MEMORY_ALLOC;
+	case EBUSY:
+		return ERR_BREDR_CONN_BUSY;
+	case EMLINK:
+		return ERR_BREDR_CONN_CNCR_CONNECT_LIMIT;
+	case ETIMEDOUT:
+		return ERR_BREDR_CONN_TIMEOUT;
+	case ECONNREFUSED:
+		return ERR_BREDR_CONN_REFUSED;
+	case ECONNRESET:
+		return ERR_BREDR_CONN_ABORT_BY_REMOTE;
+	case ECONNABORTED:
+		return ERR_BREDR_CONN_ABORT_BY_LOCAL;
+	case EPROTO:
+		return ERR_BREDR_CONN_LMP_PROTO_ERROR;
+	default:
+		return ERR_BREDR_CONN_UNKNOWN;
+	}
+}
+
+const char* btd_error_le_conn_from_errno(int errno_code)
+{
+	switch (-errno_code) {
+	case EINVAL:
+		return ERR_LE_CONN_INVALID_ARGUMENTS;
+	case EHOSTUNREACH:
+		return ERR_LE_CONN_ADAPTER_NOT_POWERED;
+	case EOPNOTSUPP:
+	case EPROTONOSUPPORT:
+		return ERR_LE_CONN_NOT_SUPPORTED;
+	case EALREADY:
+	case EISCONN:
+		return ERR_LE_CONN_ALREADY_CONNECTED;
+	case EBADFD:
+		return ERR_LE_CONN_BAD_SOCKET;
+	case ENOMEM:
+		return ERR_LE_CONN_MEMORY_ALLOC;
+	case EBUSY:
+		return ERR_LE_CONN_BUSY;
+	case ECONNREFUSED:
+		return ERR_LE_CONN_REFUSED;
+	case EIO:
+		return ERR_LE_CONN_CREATE_SOCKET;
+	case ETIMEDOUT:
+		return ERR_LE_CONN_TIMEOUT;
+	case EMLINK:
+		return ERR_LE_CONN_SYNC_CONNECT_LIMIT;
+	case ECONNRESET:
+		return ERR_LE_CONN_ABORT_BY_REMOTE;
+	case ECONNABORTED:
+		return ERR_LE_CONN_ABORT_BY_LOCAL;
+	case EPROTO:
+		return ERR_LE_CONN_LL_PROTO_ERROR;
+	default:
+		return ERR_LE_CONN_UNKNOWN;
+	}
+}
diff --git a/src/error.h b/src/error.h
index 7c8cad066..91a02654a 100644
--- a/src/error.h
+++ b/src/error.h
@@ -24,9 +24,62 @@
  */
 
 #include <dbus/dbus.h>
+#include <stdint.h>
 
 #define ERROR_INTERFACE "org.bluez.Error"
 
+/* BR/EDR connection failure reasons */
+#define ERR_BREDR_CONN_ALREADY_CONNECTED	"BR/EDR connection already "\
+						"connected"
+#define ERR_BREDR_CONN_PAGE_TIMEOUT		"BR/EDR connection page timeout"
+#define ERR_BREDR_CONN_PROFILE_UNAVAILABLE	"BR/EDR connection profile "\
+						"unavailable"
+#define ERR_BREDR_CONN_SDP_SEARCH		"BR/EDR connection SDP search"
+#define ERR_BREDR_CONN_CREATE_SOCKET		"BR/EDR connection create "\
+						"socket"
+#define ERR_BREDR_CONN_INVALID_ARGUMENTS	"BR/EDR connection invalid "\
+						"argument"
+#define ERR_BREDR_CONN_ADAPTER_NOT_POWERED	"BR/EDR connection adapter "\
+						"not powered"
+#define ERR_BREDR_CONN_NOT_SUPPORTED		"BR/EDR connection not "\
+						"suuported"
+#define ERR_BREDR_CONN_BAD_SOCKET		"BR/EDR connection bad socket"
+#define ERR_BREDR_CONN_MEMORY_ALLOC		"BR/EDR connection memory "\
+						"allocation"
+#define ERR_BREDR_CONN_BUSY			"BR/EDR connection busy"
+#define ERR_BREDR_CONN_CNCR_CONNECT_LIMIT	"BR/EDR connection concurrent "\
+						"connection limit"
+#define ERR_BREDR_CONN_TIMEOUT			"BR/EDR connection timeout"
+#define ERR_BREDR_CONN_REFUSED			"BR/EDR connection refused"
+#define ERR_BREDR_CONN_ABORT_BY_REMOTE		"BR/EDR connection aborted by "\
+						"remote"
+#define ERR_BREDR_CONN_ABORT_BY_LOCAL		"BR/EDR connection aborted by "\
+						"local"
+#define ERR_BREDR_CONN_LMP_PROTO_ERROR		"BR/EDR connection LMP "\
+						"protocol error"
+#define ERR_BREDR_CONN_CANCELED			"BR/EDR connection canceled"
+#define ERR_BREDR_CONN_UNKNOWN			"BR/EDR connection unknown"
+
+/* LE connection failure reasons */
+#define ERR_LE_CONN_INVALID_ARGUMENTS	"LE connection invalid arguments"
+#define ERR_LE_CONN_ADAPTER_NOT_POWERED	"LE connection adapter not powered"
+#define ERR_LE_CONN_NOT_SUPPORTED	"LE connection not supported"
+#define ERR_LE_CONN_ALREADY_CONNECTED	"LE connection already connected"
+#define ERR_LE_CONN_BAD_SOCKET		"LE connection bad socket"
+#define ERR_LE_CONN_MEMORY_ALLOC	"LE connection memory allocation"
+#define ERR_LE_CONN_BUSY		"LE connection busy"
+#define ERR_LE_CONN_REFUSED		"LE connection refused"
+#define ERR_LE_CONN_CREATE_SOCKET	"LE connection create socket"
+#define ERR_LE_CONN_TIMEOUT		"LE connection timeout"
+#define ERR_LE_CONN_SYNC_CONNECT_LIMIT	"LE connection concurrent connection "\
+					"limit"
+#define ERR_LE_CONN_ABORT_BY_REMOTE	"LE connection abort by remote"
+#define ERR_LE_CONN_ABORT_BY_LOCAL	"LE connection abort by local"
+#define ERR_LE_CONN_LL_PROTO_ERROR	"LE connection link layer protocol "\
+					"error"
+#define ERR_LE_CONN_GATT_BROWSE		"LE connection GATT browsing"
+#define ERR_LE_CONN_UNKNOWN		"LE connection unknown"
+
 DBusMessage *btd_error_invalid_args(DBusMessage *msg);
 DBusMessage *btd_error_invalid_args_str(DBusMessage *msg, const char *str);
 DBusMessage *btd_error_busy(DBusMessage *msg);
@@ -35,11 +88,17 @@ DBusMessage *btd_error_not_supported(DBusMessage *msg);
 DBusMessage *btd_error_not_connected(DBusMessage *msg);
 DBusMessage *btd_error_already_connected(DBusMessage *msg);
 DBusMessage *btd_error_not_available(DBusMessage *msg);
+DBusMessage *btd_error_not_available_str(DBusMessage *msg, const char *str);
 DBusMessage *btd_error_in_progress(DBusMessage *msg);
+DBusMessage *btd_error_in_progress_str(DBusMessage *msg, const char *str);
 DBusMessage *btd_error_does_not_exist(DBusMessage *msg);
 DBusMessage *btd_error_not_authorized(DBusMessage *msg);
 DBusMessage *btd_error_not_permitted(DBusMessage *msg, const char *str);
 DBusMessage *btd_error_no_such_adapter(DBusMessage *msg);
 DBusMessage *btd_error_agent_not_available(DBusMessage *msg);
 DBusMessage *btd_error_not_ready(DBusMessage *msg);
+DBusMessage *btd_error_not_ready_str(DBusMessage *msg, const char *str);
 DBusMessage *btd_error_failed(DBusMessage *msg, const char *str);
+
+const char* btd_error_bredr_conn_from_errno(int errno_code);
+const char* btd_error_le_conn_from_errno(int errno_code);
-- 
2.32.0.605.g8dce9f2422-goog


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [BlueZ PATCH v5 3/4] device: Include detailed error string in Connect() return
  2021-08-06 23:47 [BlueZ PATCH v5 0/4] Detailed error string Miao-chen Chou
  2021-08-06 23:47 ` [BlueZ PATCH v5 1/4] doc: Add errors.txt to describe errors of D-Bus method returns Miao-chen Chou
  2021-08-06 23:47 ` [BlueZ PATCH v5 2/4] error: BR/EDR and LE connection failure reasons Miao-chen Chou
@ 2021-08-06 23:47 ` Miao-chen Chou
  2021-08-06 23:47 ` [BlueZ PATCH v5 4/4] client: Print error code for connect methods Miao-chen Chou
  3 siblings, 0 replies; 7+ messages in thread
From: Miao-chen Chou @ 2021-08-06 23:47 UTC (permalink / raw)
  To: Bluetooth Kernel Mailing List
  Cc: Marcel Holtmann, Howard Chung, Luiz Augusto von Dentz,
	Alain Michaud, Miao-chen Chou

This replaces generic strerror message with context detailed error
string to better indicate the detailed failure reason so that the D-Bus
clients can optimize their application to work better with BlueZ, e.g.
introducing retry mechanism or building metrics.

Reviewed-by: Alain Michaud <alainm@chromium.org>
Reviewed-by: Howard Chung <howardchung@google.com>
---

Changes in v5:
- Address the changes from error code to string

 src/device.c | 46 ++++++++++++++++++++++++++++++----------------
 1 file changed, 30 insertions(+), 16 deletions(-)

diff --git a/src/device.c b/src/device.c
index df440ce09..d4795dd6a 100644
--- a/src/device.c
+++ b/src/device.c
@@ -1608,7 +1608,7 @@ void device_request_disconnect(struct btd_device *device, DBusMessage *msg)
 
 	if (device->connect) {
 		DBusMessage *reply = btd_error_failed(device->connect,
-								"Cancelled");
+						ERR_BREDR_CONN_CANCELED);
 		g_dbus_send_message(dbus_conn, reply);
 		dbus_message_unref(device->connect);
 		device->connect = NULL;
@@ -1802,7 +1802,8 @@ done:
 		}
 
 		g_dbus_send_message(dbus_conn,
-				btd_error_failed(dev->connect, strerror(-err)));
+			btd_error_failed(dev->connect,
+					btd_error_bredr_conn_from_errno(err)));
 	} else {
 		/* Start passive SDP discovery to update known services */
 		if (dev->bredr && !dev->svc_refreshed && dev->refresh_discovery)
@@ -2003,10 +2004,12 @@ static DBusMessage *connect_profiles(struct btd_device *dev, uint8_t bdaddr_type
 						dbus_message_get_sender(msg));
 
 	if (dev->pending || dev->connect || dev->browse)
-		return btd_error_in_progress(msg);
+		return btd_error_in_progress_str(msg, ERR_BREDR_CONN_BUSY);
 
-	if (!btd_adapter_get_powered(dev->adapter))
-		return btd_error_not_ready(msg);
+	if (!btd_adapter_get_powered(dev->adapter)) {
+		return btd_error_not_ready_str(msg,
+					ERR_BREDR_CONN_ADAPTER_NOT_POWERED);
+	}
 
 	btd_device_set_temporary(dev, false);
 
@@ -2019,10 +2022,12 @@ static DBusMessage *connect_profiles(struct btd_device *dev, uint8_t bdaddr_type
 			if (dbus_message_is_method_call(msg, DEVICE_INTERFACE,
 							"Connect") &&
 				find_service_with_state(dev->services,
-						BTD_SERVICE_STATE_CONNECTED))
+						BTD_SERVICE_STATE_CONNECTED)) {
 				return dbus_message_new_method_return(msg);
-			else
-				return btd_error_not_available(msg);
+			} else {
+				return btd_error_not_available_str(msg,
+					ERR_BREDR_CONN_PROFILE_UNAVAILABLE);
+			}
 		}
 
 		goto resolve_services;
@@ -2032,7 +2037,8 @@ static DBusMessage *connect_profiles(struct btd_device *dev, uint8_t bdaddr_type
 	if (err < 0) {
 		if (err == -EALREADY)
 			return dbus_message_new_method_return(msg);
-		return btd_error_failed(msg, strerror(-err));
+		return btd_error_failed(msg,
+					btd_error_bredr_conn_from_errno(err));
 	}
 
 	dev->connect = dbus_message_ref(msg);
@@ -2046,8 +2052,10 @@ resolve_services:
 		err = device_browse_sdp(dev, msg);
 	else
 		err = device_browse_gatt(dev, msg);
-	if (err < 0)
-		return btd_error_failed(msg, strerror(-err));
+	if (err < 0) {
+		return btd_error_failed(msg, bdaddr_type == BDADDR_BREDR ?
+			ERR_BREDR_CONN_SDP_SEARCH : ERR_LE_CONN_GATT_BROWSE);
+	}
 
 	return NULL;
 }
@@ -2157,8 +2165,10 @@ static DBusMessage *connect_profile(DBusConnection *conn, DBusMessage *msg,
 	DBusMessage *reply;
 
 	if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &pattern,
-							DBUS_TYPE_INVALID))
-		return btd_error_invalid_args(msg);
+							DBUS_TYPE_INVALID)) {
+		return btd_error_invalid_args_str(msg,
+					ERR_BREDR_CONN_INVALID_ARGUMENTS);
+	}
 
 	uuid = bt_name2string(pattern);
 	reply = connect_profiles(dev, BDADDR_BREDR, msg, uuid);
@@ -2541,7 +2551,10 @@ static void browse_request_complete(struct browse_req *req, uint8_t type,
 			if (err == 0)
 				goto done;
 		}
-		reply = btd_error_failed(req->msg, strerror(-err));
+		reply = btd_error_failed(req->msg,
+				bdaddr_type == BDADDR_BREDR ?
+				btd_error_bredr_conn_from_errno(err) :
+				btd_error_le_conn_from_errno(err));
 		goto done;
 	}
 
@@ -3027,7 +3040,8 @@ 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, "Disconnected early");
+		reply = btd_error_failed(device->connect,
+						ERR_BREDR_CONN_CANCELED);
 		g_dbus_send_message(dbus_conn, reply);
 		dbus_message_unref(device->connect);
 		device->connect = NULL;
@@ -5414,7 +5428,7 @@ done:
 	if (device->connect) {
 		if (err < 0)
 			reply = btd_error_failed(device->connect,
-							strerror(-err));
+					btd_error_le_conn_from_errno(err));
 		else
 			reply = dbus_message_new_method_return(device->connect);
 
-- 
2.32.0.605.g8dce9f2422-goog


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [BlueZ PATCH v5 4/4] client: Print error code for connect methods
  2021-08-06 23:47 [BlueZ PATCH v5 0/4] Detailed error string Miao-chen Chou
                   ` (2 preceding siblings ...)
  2021-08-06 23:47 ` [BlueZ PATCH v5 3/4] device: Include detailed error string in Connect() return Miao-chen Chou
@ 2021-08-06 23:47 ` Miao-chen Chou
  3 siblings, 0 replies; 7+ messages in thread
From: Miao-chen Chou @ 2021-08-06 23:47 UTC (permalink / raw)
  To: Bluetooth Kernel Mailing List
  Cc: Marcel Holtmann, Howard Chung, Luiz Augusto von Dentz,
	Alain Michaud, Miao-chen Chou

The following steps were performed.
- Issuing repeated commands to connect the same BLE device.
- Verifying the print in bluetoothctl console

Reviewed-by: Alain Michaud <alainm@chromium.org>
Reviewed-by: Howard Chung <howardchung@google.com>
---

Changes in v5:
- Replace error code with error string

Changes in v4:
- Address make errors.

Changes in v3:
- Correct error-codes.txt.

Changes in v2:
- Add documentation for error codes

 client/main.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/client/main.c b/client/main.c
index da877b546..488a24bf6 100644
--- a/client/main.c
+++ b/client/main.c
@@ -1949,7 +1949,8 @@ static void connect_reply(DBusMessage *message, void *user_data)
 	dbus_error_init(&error);
 
 	if (dbus_set_error_from_message(&error, message) == TRUE) {
-		bt_shell_printf("Failed to connect: %s\n", error.name);
+		bt_shell_printf("Failed to connect: %s %s\n", error.name,
+				error.message);
 		dbus_error_free(&error);
 		return bt_shell_noninteractive_quit(EXIT_FAILURE);
 	}
-- 
2.32.0.605.g8dce9f2422-goog


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* RE: Detailed error string
  2021-08-06 23:47 ` [BlueZ PATCH v5 1/4] doc: Add errors.txt to describe errors of D-Bus method returns Miao-chen Chou
@ 2021-08-07  1:17   ` bluez.test.bot
  0 siblings, 0 replies; 7+ messages in thread
From: bluez.test.bot @ 2021-08-07  1:17 UTC (permalink / raw)
  To: linux-bluetooth, mcchou

[-- Attachment #1: Type: text/plain, Size: 22831 bytes --]

This is automated email and please do not reply to this email!

Dear submitter,

Thank you for submitting the patches to the linux bluetooth mailing list.
This is a CI test results with your patch series:
PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=527809

---Test result---

Test Summary:
CheckPatch                    FAIL      1.26 seconds
GitLint                       PASS      0.53 seconds
Prep - Setup ELL              PASS      47.63 seconds
Build - Prep                  PASS      0.14 seconds
Build - Configure             PASS      8.37 seconds
Build - Make                  FAIL      178.99 seconds
Make Check                    FAIL      0.60 seconds
Make Distcheck                FAIL      165.43 seconds
Build w/ext ELL - Configure   PASS      8.42 seconds
Build w/ext ELL - Make        FAIL      166.09 seconds

Details
##############################
Test: CheckPatch - FAIL
Desc: Run checkpatch.pl script with rule in .checkpatch.conf
Output:
error: BR/EDR and LE connection failure reasons
ERROR:POINTER_LOCATION: "foo* bar" should be "foo *bar"
#70: FILE: src/error.c:137:
+const char* btd_error_bredr_conn_from_errno(int errno_code)

ERROR:POINTER_LOCATION: "foo* bar" should be "foo *bar"
#112: FILE: src/error.c:179:
+const char* btd_error_le_conn_from_errno(int errno_code)

ERROR:POINTER_LOCATION: "foo* bar" should be "foo *bar"
#232: FILE: src/error.h:90:
+const char* btd_error_bredr_conn_from_errno(int errno_code);

ERROR:POINTER_LOCATION: "foo* bar" should be "foo *bar"
#233: FILE: src/error.h:91:
+const char* btd_error_le_conn_from_errno(int errno_code);

- total: 4 errors, 0 warnings, 205 lines checked

NOTE: For some of the reported defects, checkpatch may be able to
      mechanically convert to the typical style using --fix or --fix-inplace.

"[PATCH] error: BR/EDR and LE connection failure reasons" has style problems, please review.

NOTE: Ignored message types: COMMIT_MESSAGE COMPLEX_MACRO CONST_STRUCT FILE_PATH_CHANGES MISSING_SIGN_OFF PREFER_PACKED SPDX_LICENSE_TAG SPLIT_STRING SSCANF_TO_KSTRTO

NOTE: If any of the errors are false positives, please report
      them to the maintainer, see CHECKPATCH in MAINTAINERS.


##############################
Test: GitLint - PASS
Desc: Run gitlint with rule in .gitlint

##############################
Test: Prep - Setup ELL - PASS
Desc: Clone, build, and install ELL

##############################
Test: Build - Prep - PASS
Desc: Prepare environment for build

##############################
Test: Build - Configure - PASS
Desc: Configure the BlueZ source tree

##############################
Test: Build - Make - FAIL
Desc: Build the BlueZ source tree
Output:
src/error.c: In function ‘btd_error_bredr_conn_from_errno’:
src/error.c:140:7: error: ‘EALREADY’ undeclared (first use in this function)
  140 |  case EALREADY:
      |       ^~~~~~~~
src/error.c:140:7: note: each undeclared identifier is reported only once for each function it appears in
src/error.c:141:7: error: ‘EISCONN’ undeclared (first use in this function)
  141 |  case EISCONN:
      |       ^~~~~~~
src/error.c:143:7: error: ‘EHOSTDOWN’ undeclared (first use in this function)
  143 |  case EHOSTDOWN:
      |       ^~~~~~~~~
src/error.c:145:7: error: ‘ENOPROTOOPT’ undeclared (first use in this function)
  145 |  case ENOPROTOOPT:
      |       ^~~~~~~~~~~
src/error.c:147:7: error: ‘EIO’ undeclared (first use in this function)
  147 |  case EIO:
      |       ^~~
src/error.c:149:7: error: ‘EINVAL’ undeclared (first use in this function)
  149 |  case EINVAL:
      |       ^~~~~~
src/error.c:151:7: error: ‘EHOSTUNREACH’ undeclared (first use in this function)
  151 |  case EHOSTUNREACH:
      |       ^~~~~~~~~~~~
src/error.c:153:7: error: ‘EOPNOTSUPP’ undeclared (first use in this function)
  153 |  case EOPNOTSUPP:
      |       ^~~~~~~~~~
src/error.c:154:7: error: ‘EPROTONOSUPPORT’ undeclared (first use in this function)
  154 |  case EPROTONOSUPPORT:
      |       ^~~~~~~~~~~~~~~
src/error.c:156:7: error: ‘EBADFD’ undeclared (first use in this function)
  156 |  case EBADFD:
      |       ^~~~~~
src/error.c:158:7: error: ‘ENOMEM’ undeclared (first use in this function)
  158 |  case ENOMEM:
      |       ^~~~~~
src/error.c:160:7: error: ‘EBUSY’ undeclared (first use in this function)
  160 |  case EBUSY:
      |       ^~~~~
src/error.c:162:7: error: ‘EMLINK’ undeclared (first use in this function)
  162 |  case EMLINK:
      |       ^~~~~~
src/error.c:164:7: error: ‘ETIMEDOUT’ undeclared (first use in this function)
  164 |  case ETIMEDOUT:
      |       ^~~~~~~~~
src/error.c:166:7: error: ‘ECONNREFUSED’ undeclared (first use in this function); did you mean ‘ERR_LE_CONN_REFUSED’?
  166 |  case ECONNREFUSED:
      |       ^~~~~~~~~~~~
      |       ERR_LE_CONN_REFUSED
src/error.c:168:7: error: ‘ECONNRESET’ undeclared (first use in this function)
  168 |  case ECONNRESET:
      |       ^~~~~~~~~~
src/error.c:170:7: error: ‘ECONNABORTED’ undeclared (first use in this function)
  170 |  case ECONNABORTED:
      |       ^~~~~~~~~~~~
src/error.c:172:7: error: ‘EPROTO’ undeclared (first use in this function)
  172 |  case EPROTO:
      |       ^~~~~~
src/error.c: In function ‘btd_error_le_conn_from_errno’:
src/error.c:182:7: error: ‘EINVAL’ undeclared (first use in this function)
  182 |  case EINVAL:
      |       ^~~~~~
src/error.c:184:7: error: ‘EHOSTUNREACH’ undeclared (first use in this function)
  184 |  case EHOSTUNREACH:
      |       ^~~~~~~~~~~~
src/error.c:186:7: error: ‘EOPNOTSUPP’ undeclared (first use in this function)
  186 |  case EOPNOTSUPP:
      |       ^~~~~~~~~~
src/error.c:187:7: error: ‘EPROTONOSUPPORT’ undeclared (first use in this function)
  187 |  case EPROTONOSUPPORT:
      |       ^~~~~~~~~~~~~~~
src/error.c:189:7: error: ‘EALREADY’ undeclared (first use in this function)
  189 |  case EALREADY:
      |       ^~~~~~~~
src/error.c:190:7: error: ‘EISCONN’ undeclared (first use in this function)
  190 |  case EISCONN:
      |       ^~~~~~~
src/error.c:192:7: error: ‘EBADFD’ undeclared (first use in this function)
  192 |  case EBADFD:
      |       ^~~~~~
src/error.c:194:7: error: ‘ENOMEM’ undeclared (first use in this function)
  194 |  case ENOMEM:
      |       ^~~~~~
src/error.c:196:7: error: ‘EBUSY’ undeclared (first use in this function)
  196 |  case EBUSY:
      |       ^~~~~
src/error.c:198:7: error: ‘ECONNREFUSED’ undeclared (first use in this function); did you mean ‘ERR_LE_CONN_REFUSED’?
  198 |  case ECONNREFUSED:
      |       ^~~~~~~~~~~~
      |       ERR_LE_CONN_REFUSED
src/error.c:200:7: error: ‘EIO’ undeclared (first use in this function)
  200 |  case EIO:
      |       ^~~
src/error.c:202:7: error: ‘ETIMEDOUT’ undeclared (first use in this function)
  202 |  case ETIMEDOUT:
      |       ^~~~~~~~~
src/error.c:204:7: error: ‘EMLINK’ undeclared (first use in this function)
  204 |  case EMLINK:
      |       ^~~~~~
src/error.c:206:7: error: ‘ECONNRESET’ undeclared (first use in this function)
  206 |  case ECONNRESET:
      |       ^~~~~~~~~~
src/error.c:208:7: error: ‘ECONNABORTED’ undeclared (first use in this function)
  208 |  case ECONNABORTED:
      |       ^~~~~~~~~~~~
src/error.c:210:7: error: ‘EPROTO’ undeclared (first use in this function)
  210 |  case EPROTO:
      |       ^~~~~~
make[1]: *** [Makefile:9331: src/bluetoothd-error.o] Error 1
make: *** [Makefile:4147: all] Error 2


##############################
Test: Make Check - FAIL
Desc: Run 'make check'
Output:
src/error.c: In function ‘btd_error_bredr_conn_from_errno’:
src/error.c:140:7: error: ‘EALREADY’ undeclared (first use in this function)
  140 |  case EALREADY:
      |       ^~~~~~~~
src/error.c:140:7: note: each undeclared identifier is reported only once for each function it appears in
src/error.c:141:7: error: ‘EISCONN’ undeclared (first use in this function)
  141 |  case EISCONN:
      |       ^~~~~~~
src/error.c:143:7: error: ‘EHOSTDOWN’ undeclared (first use in this function)
  143 |  case EHOSTDOWN:
      |       ^~~~~~~~~
src/error.c:145:7: error: ‘ENOPROTOOPT’ undeclared (first use in this function)
  145 |  case ENOPROTOOPT:
      |       ^~~~~~~~~~~
src/error.c:147:7: error: ‘EIO’ undeclared (first use in this function)
  147 |  case EIO:
      |       ^~~
src/error.c:149:7: error: ‘EINVAL’ undeclared (first use in this function)
  149 |  case EINVAL:
      |       ^~~~~~
src/error.c:151:7: error: ‘EHOSTUNREACH’ undeclared (first use in this function)
  151 |  case EHOSTUNREACH:
      |       ^~~~~~~~~~~~
src/error.c:153:7: error: ‘EOPNOTSUPP’ undeclared (first use in this function)
  153 |  case EOPNOTSUPP:
      |       ^~~~~~~~~~
src/error.c:154:7: error: ‘EPROTONOSUPPORT’ undeclared (first use in this function)
  154 |  case EPROTONOSUPPORT:
      |       ^~~~~~~~~~~~~~~
src/error.c:156:7: error: ‘EBADFD’ undeclared (first use in this function)
  156 |  case EBADFD:
      |       ^~~~~~
src/error.c:158:7: error: ‘ENOMEM’ undeclared (first use in this function)
  158 |  case ENOMEM:
      |       ^~~~~~
src/error.c:160:7: error: ‘EBUSY’ undeclared (first use in this function)
  160 |  case EBUSY:
      |       ^~~~~
src/error.c:162:7: error: ‘EMLINK’ undeclared (first use in this function)
  162 |  case EMLINK:
      |       ^~~~~~
src/error.c:164:7: error: ‘ETIMEDOUT’ undeclared (first use in this function)
  164 |  case ETIMEDOUT:
      |       ^~~~~~~~~
src/error.c:166:7: error: ‘ECONNREFUSED’ undeclared (first use in this function); did you mean ‘ERR_LE_CONN_REFUSED’?
  166 |  case ECONNREFUSED:
      |       ^~~~~~~~~~~~
      |       ERR_LE_CONN_REFUSED
src/error.c:168:7: error: ‘ECONNRESET’ undeclared (first use in this function)
  168 |  case ECONNRESET:
      |       ^~~~~~~~~~
src/error.c:170:7: error: ‘ECONNABORTED’ undeclared (first use in this function)
  170 |  case ECONNABORTED:
      |       ^~~~~~~~~~~~
src/error.c:172:7: error: ‘EPROTO’ undeclared (first use in this function)
  172 |  case EPROTO:
      |       ^~~~~~
src/error.c: In function ‘btd_error_le_conn_from_errno’:
src/error.c:182:7: error: ‘EINVAL’ undeclared (first use in this function)
  182 |  case EINVAL:
      |       ^~~~~~
src/error.c:184:7: error: ‘EHOSTUNREACH’ undeclared (first use in this function)
  184 |  case EHOSTUNREACH:
      |       ^~~~~~~~~~~~
src/error.c:186:7: error: ‘EOPNOTSUPP’ undeclared (first use in this function)
  186 |  case EOPNOTSUPP:
      |       ^~~~~~~~~~
src/error.c:187:7: error: ‘EPROTONOSUPPORT’ undeclared (first use in this function)
  187 |  case EPROTONOSUPPORT:
      |       ^~~~~~~~~~~~~~~
src/error.c:189:7: error: ‘EALREADY’ undeclared (first use in this function)
  189 |  case EALREADY:
      |       ^~~~~~~~
src/error.c:190:7: error: ‘EISCONN’ undeclared (first use in this function)
  190 |  case EISCONN:
      |       ^~~~~~~
src/error.c:192:7: error: ‘EBADFD’ undeclared (first use in this function)
  192 |  case EBADFD:
      |       ^~~~~~
src/error.c:194:7: error: ‘ENOMEM’ undeclared (first use in this function)
  194 |  case ENOMEM:
      |       ^~~~~~
src/error.c:196:7: error: ‘EBUSY’ undeclared (first use in this function)
  196 |  case EBUSY:
      |       ^~~~~
src/error.c:198:7: error: ‘ECONNREFUSED’ undeclared (first use in this function); did you mean ‘ERR_LE_CONN_REFUSED’?
  198 |  case ECONNREFUSED:
      |       ^~~~~~~~~~~~
      |       ERR_LE_CONN_REFUSED
src/error.c:200:7: error: ‘EIO’ undeclared (first use in this function)
  200 |  case EIO:
      |       ^~~
src/error.c:202:7: error: ‘ETIMEDOUT’ undeclared (first use in this function)
  202 |  case ETIMEDOUT:
      |       ^~~~~~~~~
src/error.c:204:7: error: ‘EMLINK’ undeclared (first use in this function)
  204 |  case EMLINK:
      |       ^~~~~~
src/error.c:206:7: error: ‘ECONNRESET’ undeclared (first use in this function)
  206 |  case ECONNRESET:
      |       ^~~~~~~~~~
src/error.c:208:7: error: ‘ECONNABORTED’ undeclared (first use in this function)
  208 |  case ECONNABORTED:
      |       ^~~~~~~~~~~~
src/error.c:210:7: error: ‘EPROTO’ undeclared (first use in this function)
  210 |  case EPROTO:
      |       ^~~~~~
make[1]: *** [Makefile:9331: src/bluetoothd-error.o] Error 1
make: *** [Makefile:10436: check] Error 2


##############################
Test: Make Distcheck - FAIL
Desc: Run distcheck to check the distribution
Output:
../../src/error.c: In function ‘btd_error_bredr_conn_from_errno’:
../../src/error.c:140:7: error: ‘EALREADY’ undeclared (first use in this function)
  140 |  case EALREADY:
      |       ^~~~~~~~
../../src/error.c:140:7: note: each undeclared identifier is reported only once for each function it appears in
../../src/error.c:141:7: error: ‘EISCONN’ undeclared (first use in this function)
  141 |  case EISCONN:
      |       ^~~~~~~
../../src/error.c:143:7: error: ‘EHOSTDOWN’ undeclared (first use in this function)
  143 |  case EHOSTDOWN:
      |       ^~~~~~~~~
../../src/error.c:145:7: error: ‘ENOPROTOOPT’ undeclared (first use in this function)
  145 |  case ENOPROTOOPT:
      |       ^~~~~~~~~~~
../../src/error.c:147:7: error: ‘EIO’ undeclared (first use in this function)
  147 |  case EIO:
      |       ^~~
../../src/error.c:149:7: error: ‘EINVAL’ undeclared (first use in this function)
  149 |  case EINVAL:
      |       ^~~~~~
../../src/error.c:151:7: error: ‘EHOSTUNREACH’ undeclared (first use in this function)
  151 |  case EHOSTUNREACH:
      |       ^~~~~~~~~~~~
../../src/error.c:153:7: error: ‘EOPNOTSUPP’ undeclared (first use in this function)
  153 |  case EOPNOTSUPP:
      |       ^~~~~~~~~~
../../src/error.c:154:7: error: ‘EPROTONOSUPPORT’ undeclared (first use in this function)
  154 |  case EPROTONOSUPPORT:
      |       ^~~~~~~~~~~~~~~
../../src/error.c:156:7: error: ‘EBADFD’ undeclared (first use in this function)
  156 |  case EBADFD:
      |       ^~~~~~
../../src/error.c:158:7: error: ‘ENOMEM’ undeclared (first use in this function)
  158 |  case ENOMEM:
      |       ^~~~~~
../../src/error.c:160:7: error: ‘EBUSY’ undeclared (first use in this function)
  160 |  case EBUSY:
      |       ^~~~~
../../src/error.c:162:7: error: ‘EMLINK’ undeclared (first use in this function)
  162 |  case EMLINK:
      |       ^~~~~~
../../src/error.c:164:7: error: ‘ETIMEDOUT’ undeclared (first use in this function)
  164 |  case ETIMEDOUT:
      |       ^~~~~~~~~
../../src/error.c:166:7: error: ‘ECONNREFUSED’ undeclared (first use in this function)
  166 |  case ECONNREFUSED:
      |       ^~~~~~~~~~~~
../../src/error.c:168:7: error: ‘ECONNRESET’ undeclared (first use in this function)
  168 |  case ECONNRESET:
      |       ^~~~~~~~~~
../../src/error.c:170:7: error: ‘ECONNABORTED’ undeclared (first use in this function)
  170 |  case ECONNABORTED:
      |       ^~~~~~~~~~~~
../../src/error.c:172:7: error: ‘EPROTO’ undeclared (first use in this function)
  172 |  case EPROTO:
      |       ^~~~~~
../../src/error.c: In function ‘btd_error_le_conn_from_errno’:
../../src/error.c:182:7: error: ‘EINVAL’ undeclared (first use in this function)
  182 |  case EINVAL:
      |       ^~~~~~
../../src/error.c:184:7: error: ‘EHOSTUNREACH’ undeclared (first use in this function)
  184 |  case EHOSTUNREACH:
      |       ^~~~~~~~~~~~
../../src/error.c:186:7: error: ‘EOPNOTSUPP’ undeclared (first use in this function)
  186 |  case EOPNOTSUPP:
      |       ^~~~~~~~~~
../../src/error.c:187:7: error: ‘EPROTONOSUPPORT’ undeclared (first use in this function)
  187 |  case EPROTONOSUPPORT:
      |       ^~~~~~~~~~~~~~~
../../src/error.c:189:7: error: ‘EALREADY’ undeclared (first use in this function)
  189 |  case EALREADY:
      |       ^~~~~~~~
../../src/error.c:190:7: error: ‘EISCONN’ undeclared (first use in this function)
  190 |  case EISCONN:
      |       ^~~~~~~
../../src/error.c:192:7: error: ‘EBADFD’ undeclared (first use in this function)
  192 |  case EBADFD:
      |       ^~~~~~
../../src/error.c:194:7: error: ‘ENOMEM’ undeclared (first use in this function)
  194 |  case ENOMEM:
      |       ^~~~~~
../../src/error.c:196:7: error: ‘EBUSY’ undeclared (first use in this function)
  196 |  case EBUSY:
      |       ^~~~~
../../src/error.c:198:7: error: ‘ECONNREFUSED’ undeclared (first use in this function)
  198 |  case ECONNREFUSED:
      |       ^~~~~~~~~~~~
../../src/error.c:200:7: error: ‘EIO’ undeclared (first use in this function)
  200 |  case EIO:
      |       ^~~
../../src/error.c:202:7: error: ‘ETIMEDOUT’ undeclared (first use in this function)
  202 |  case ETIMEDOUT:
      |       ^~~~~~~~~
../../src/error.c:204:7: error: ‘EMLINK’ undeclared (first use in this function)
  204 |  case EMLINK:
      |       ^~~~~~
../../src/error.c:206:7: error: ‘ECONNRESET’ undeclared (first use in this function)
  206 |  case ECONNRESET:
      |       ^~~~~~~~~~
../../src/error.c:208:7: error: ‘ECONNABORTED’ undeclared (first use in this function)
  208 |  case ECONNABORTED:
      |       ^~~~~~~~~~~~
../../src/error.c:210:7: error: ‘EPROTO’ undeclared (first use in this function)
  210 |  case EPROTO:
      |       ^~~~~~
make[2]: *** [Makefile:9331: src/bluetoothd-error.o] Error 1
make[1]: *** [Makefile:4147: all] Error 2
make: *** [Makefile:10357: distcheck] Error 1


##############################
Test: Build w/ext ELL - Configure - PASS
Desc: Configure BlueZ source with '--enable-external-ell' configuration

##############################
Test: Build w/ext ELL - Make - FAIL
Desc: Build BlueZ source with '--enable-external-ell' configuration
Output:
src/error.c: In function ‘btd_error_bredr_conn_from_errno’:
src/error.c:140:7: error: ‘EALREADY’ undeclared (first use in this function)
  140 |  case EALREADY:
      |       ^~~~~~~~
src/error.c:140:7: note: each undeclared identifier is reported only once for each function it appears in
src/error.c:141:7: error: ‘EISCONN’ undeclared (first use in this function)
  141 |  case EISCONN:
      |       ^~~~~~~
src/error.c:143:7: error: ‘EHOSTDOWN’ undeclared (first use in this function)
  143 |  case EHOSTDOWN:
      |       ^~~~~~~~~
src/error.c:145:7: error: ‘ENOPROTOOPT’ undeclared (first use in this function)
  145 |  case ENOPROTOOPT:
      |       ^~~~~~~~~~~
src/error.c:147:7: error: ‘EIO’ undeclared (first use in this function)
  147 |  case EIO:
      |       ^~~
src/error.c:149:7: error: ‘EINVAL’ undeclared (first use in this function)
  149 |  case EINVAL:
      |       ^~~~~~
src/error.c:151:7: error: ‘EHOSTUNREACH’ undeclared (first use in this function)
  151 |  case EHOSTUNREACH:
      |       ^~~~~~~~~~~~
src/error.c:153:7: error: ‘EOPNOTSUPP’ undeclared (first use in this function)
  153 |  case EOPNOTSUPP:
      |       ^~~~~~~~~~
src/error.c:154:7: error: ‘EPROTONOSUPPORT’ undeclared (first use in this function)
  154 |  case EPROTONOSUPPORT:
      |       ^~~~~~~~~~~~~~~
src/error.c:156:7: error: ‘EBADFD’ undeclared (first use in this function)
  156 |  case EBADFD:
      |       ^~~~~~
src/error.c:158:7: error: ‘ENOMEM’ undeclared (first use in this function)
  158 |  case ENOMEM:
      |       ^~~~~~
src/error.c:160:7: error: ‘EBUSY’ undeclared (first use in this function)
  160 |  case EBUSY:
      |       ^~~~~
src/error.c:162:7: error: ‘EMLINK’ undeclared (first use in this function)
  162 |  case EMLINK:
      |       ^~~~~~
src/error.c:164:7: error: ‘ETIMEDOUT’ undeclared (first use in this function)
  164 |  case ETIMEDOUT:
      |       ^~~~~~~~~
src/error.c:166:7: error: ‘ECONNREFUSED’ undeclared (first use in this function); did you mean ‘ERR_LE_CONN_REFUSED’?
  166 |  case ECONNREFUSED:
      |       ^~~~~~~~~~~~
      |       ERR_LE_CONN_REFUSED
src/error.c:168:7: error: ‘ECONNRESET’ undeclared (first use in this function)
  168 |  case ECONNRESET:
      |       ^~~~~~~~~~
src/error.c:170:7: error: ‘ECONNABORTED’ undeclared (first use in this function)
  170 |  case ECONNABORTED:
      |       ^~~~~~~~~~~~
src/error.c:172:7: error: ‘EPROTO’ undeclared (first use in this function)
  172 |  case EPROTO:
      |       ^~~~~~
src/error.c: In function ‘btd_error_le_conn_from_errno’:
src/error.c:182:7: error: ‘EINVAL’ undeclared (first use in this function)
  182 |  case EINVAL:
      |       ^~~~~~
src/error.c:184:7: error: ‘EHOSTUNREACH’ undeclared (first use in this function)
  184 |  case EHOSTUNREACH:
      |       ^~~~~~~~~~~~
src/error.c:186:7: error: ‘EOPNOTSUPP’ undeclared (first use in this function)
  186 |  case EOPNOTSUPP:
      |       ^~~~~~~~~~
src/error.c:187:7: error: ‘EPROTONOSUPPORT’ undeclared (first use in this function)
  187 |  case EPROTONOSUPPORT:
      |       ^~~~~~~~~~~~~~~
src/error.c:189:7: error: ‘EALREADY’ undeclared (first use in this function)
  189 |  case EALREADY:
      |       ^~~~~~~~
src/error.c:190:7: error: ‘EISCONN’ undeclared (first use in this function)
  190 |  case EISCONN:
      |       ^~~~~~~
src/error.c:192:7: error: ‘EBADFD’ undeclared (first use in this function)
  192 |  case EBADFD:
      |       ^~~~~~
src/error.c:194:7: error: ‘ENOMEM’ undeclared (first use in this function)
  194 |  case ENOMEM:
      |       ^~~~~~
src/error.c:196:7: error: ‘EBUSY’ undeclared (first use in this function)
  196 |  case EBUSY:
      |       ^~~~~
src/error.c:198:7: error: ‘ECONNREFUSED’ undeclared (first use in this function); did you mean ‘ERR_LE_CONN_REFUSED’?
  198 |  case ECONNREFUSED:
      |       ^~~~~~~~~~~~
      |       ERR_LE_CONN_REFUSED
src/error.c:200:7: error: ‘EIO’ undeclared (first use in this function)
  200 |  case EIO:
      |       ^~~
src/error.c:202:7: error: ‘ETIMEDOUT’ undeclared (first use in this function)
  202 |  case ETIMEDOUT:
      |       ^~~~~~~~~
src/error.c:204:7: error: ‘EMLINK’ undeclared (first use in this function)
  204 |  case EMLINK:
      |       ^~~~~~
src/error.c:206:7: error: ‘ECONNRESET’ undeclared (first use in this function)
  206 |  case ECONNRESET:
      |       ^~~~~~~~~~
src/error.c:208:7: error: ‘ECONNABORTED’ undeclared (first use in this function)
  208 |  case ECONNABORTED:
      |       ^~~~~~~~~~~~
src/error.c:210:7: error: ‘EPROTO’ undeclared (first use in this function)
  210 |  case EPROTO:
      |       ^~~~~~
make[1]: *** [Makefile:9331: src/bluetoothd-error.o] Error 1
make: *** [Makefile:4147: all] Error 2




---
Regards,
Linux Bluetooth


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [BlueZ PATCH v5 2/4] error: BR/EDR and LE connection failure reasons
  2021-08-06 23:47 ` [BlueZ PATCH v5 2/4] error: BR/EDR and LE connection failure reasons Miao-chen Chou
@ 2021-08-09 13:32   ` Marcel Holtmann
  0 siblings, 0 replies; 7+ messages in thread
From: Marcel Holtmann @ 2021-08-09 13:32 UTC (permalink / raw)
  To: Miao-chen Chou
  Cc: Bluetooth Kernel Mailing List, Howard Chung,
	Luiz Augusto von Dentz, Alain Michaud

Hi Miao-chen,

> The source of Connect() failures can be divided into the following
> three.
> - bluetoothd's device interface state transition and profile state
>  transition
> - Kernel's L2CAP layer state transition
> - Potential HCI error codes returned by the remote device
> 
> Reviewed-by: Alain Michaud <alainm@chromium.org>
> Reviewed-by: Howard Chung <howardchung@google.com>
> ---
> 
> Changes in v5:
> - Replace uint16_t error code with string
> 
> Changes in v4:
> - Address make errors
> 
> Changes in v3:
> - Separate error-code.txt into its own commit
> 
> Changes in v2:
> - Add error-code.txt
> - Remove BtdError from return string
> 
> src/error.c | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++
> src/error.h |  59 +++++++++++++++++++++++++++++++
> 2 files changed, 159 insertions(+)
> 
> diff --git a/src/error.c b/src/error.c
> index 89517075e..411f36fcb 100644
> --- a/src/error.c
> +++ b/src/error.c
> @@ -27,6 +27,8 @@
> #include <config.h>
> #endif
> 
> +#include <error.h>
> +#include <stdio.h>
> #include "gdbus/gdbus.h"
> 
> #include "error.h"
> @@ -79,12 +81,24 @@ DBusMessage *btd_error_in_progress(DBusMessage *msg)
> 					"In Progress");
> }
> 
> +DBusMessage *btd_error_in_progress_str(DBusMessage *msg, const char *str)
> +{
> +	return g_dbus_create_error(msg, ERROR_INTERFACE ".InProgress",
> +					"%s", str);
> +}
> +
> DBusMessage *btd_error_not_available(DBusMessage *msg)
> {
> 	return g_dbus_create_error(msg, ERROR_INTERFACE ".NotAvailable",
> 					"Operation currently not available");
> }
> 
> +DBusMessage *btd_error_not_available_str(DBusMessage *msg, const char *str)
> +{
> +	return g_dbus_create_error(msg, ERROR_INTERFACE ".NotAvailable",
> +					"%s", str);
> +}
> +
> DBusMessage *btd_error_does_not_exist(DBusMessage *msg)
> {
> 	return g_dbus_create_error(msg, ERROR_INTERFACE ".DoesNotExist",
> @@ -121,8 +135,94 @@ DBusMessage *btd_error_not_ready(DBusMessage *msg)
> 					"Resource Not Ready");
> }
> 
> +DBusMessage *btd_error_not_ready_str(DBusMessage *msg, const char *str)
> +{
> +	return g_dbus_create_error(msg, ERROR_INTERFACE ".NotReady",
> +					"%s", str);
> +}
> +
> DBusMessage *btd_error_failed(DBusMessage *msg, const char *str)
> {
> 	return g_dbus_create_error(msg, ERROR_INTERFACE
> 					".Failed", "%s", str);
> }
> +
> +const char* btd_error_bredr_conn_from_errno(int errno_code)
> +{
> +	switch (-errno_code) {
> +	case EALREADY:
> +	case EISCONN:
> +		return ERR_BREDR_CONN_ALREADY_CONNECTED;
> +	case EHOSTDOWN:
> +		return ERR_BREDR_CONN_PAGE_TIMEOUT;
> +	case ENOPROTOOPT:
> +		return ERR_BREDR_CONN_PROFILE_UNAVAILABLE;
> +	case EIO:
> +		return ERR_BREDR_CONN_CREATE_SOCKET;
> +	case EINVAL:
> +		return ERR_BREDR_CONN_INVALID_ARGUMENTS;
> +	case EHOSTUNREACH:
> +		return ERR_BREDR_CONN_ADAPTER_NOT_POWERED;
> +	case EOPNOTSUPP:
> +	case EPROTONOSUPPORT:
> +		return ERR_BREDR_CONN_NOT_SUPPORTED;
> +	case EBADFD:
> +		return ERR_BREDR_CONN_BAD_SOCKET;
> +	case ENOMEM:
> +		return ERR_BREDR_CONN_MEMORY_ALLOC;
> +	case EBUSY:
> +		return ERR_BREDR_CONN_BUSY;
> +	case EMLINK:
> +		return ERR_BREDR_CONN_CNCR_CONNECT_LIMIT;
> +	case ETIMEDOUT:
> +		return ERR_BREDR_CONN_TIMEOUT;
> +	case ECONNREFUSED:
> +		return ERR_BREDR_CONN_REFUSED;
> +	case ECONNRESET:
> +		return ERR_BREDR_CONN_ABORT_BY_REMOTE;
> +	case ECONNABORTED:
> +		return ERR_BREDR_CONN_ABORT_BY_LOCAL;
> +	case EPROTO:
> +		return ERR_BREDR_CONN_LMP_PROTO_ERROR;
> +	default:
> +		return ERR_BREDR_CONN_UNKNOWN;
> +	}
> +}
> +
> +const char* btd_error_le_conn_from_errno(int errno_code)
> +{
> +	switch (-errno_code) {
> +	case EINVAL:
> +		return ERR_LE_CONN_INVALID_ARGUMENTS;
> +	case EHOSTUNREACH:
> +		return ERR_LE_CONN_ADAPTER_NOT_POWERED;
> +	case EOPNOTSUPP:
> +	case EPROTONOSUPPORT:
> +		return ERR_LE_CONN_NOT_SUPPORTED;
> +	case EALREADY:
> +	case EISCONN:
> +		return ERR_LE_CONN_ALREADY_CONNECTED;
> +	case EBADFD:
> +		return ERR_LE_CONN_BAD_SOCKET;
> +	case ENOMEM:
> +		return ERR_LE_CONN_MEMORY_ALLOC;
> +	case EBUSY:
> +		return ERR_LE_CONN_BUSY;
> +	case ECONNREFUSED:
> +		return ERR_LE_CONN_REFUSED;
> +	case EIO:
> +		return ERR_LE_CONN_CREATE_SOCKET;
> +	case ETIMEDOUT:
> +		return ERR_LE_CONN_TIMEOUT;
> +	case EMLINK:
> +		return ERR_LE_CONN_SYNC_CONNECT_LIMIT;
> +	case ECONNRESET:
> +		return ERR_LE_CONN_ABORT_BY_REMOTE;
> +	case ECONNABORTED:
> +		return ERR_LE_CONN_ABORT_BY_LOCAL;
> +	case EPROTO:
> +		return ERR_LE_CONN_LL_PROTO_ERROR;
> +	default:
> +		return ERR_LE_CONN_UNKNOWN;
> +	}
> +}
> diff --git a/src/error.h b/src/error.h
> index 7c8cad066..91a02654a 100644
> --- a/src/error.h
> +++ b/src/error.h
> @@ -24,9 +24,62 @@
>  */
> 
> #include <dbus/dbus.h>
> +#include <stdint.h>
> 
> #define ERROR_INTERFACE "org.bluez.Error"
> 
> +/* BR/EDR connection failure reasons */
> +#define ERR_BREDR_CONN_ALREADY_CONNECTED	"BR/EDR connection already "\
> +						"connected"
> +#define ERR_BREDR_CONN_PAGE_TIMEOUT		"BR/EDR connection page timeout"
> +#define ERR_BREDR_CONN_PROFILE_UNAVAILABLE	"BR/EDR connection profile "\
> +						"unavailable"
> +#define ERR_BREDR_CONN_SDP_SEARCH		"BR/EDR connection SDP search"
> +#define ERR_BREDR_CONN_CREATE_SOCKET		"BR/EDR connection create "\
> +						"socket"
> +#define ERR_BREDR_CONN_INVALID_ARGUMENTS	"BR/EDR connection invalid "\
> +						"argument"
> +#define ERR_BREDR_CONN_ADAPTER_NOT_POWERED	"BR/EDR connection adapter "\
> +						"not powered"
> +#define ERR_BREDR_CONN_NOT_SUPPORTED		"BR/EDR connection not "\
> +						"suuported"
> +#define ERR_BREDR_CONN_BAD_SOCKET		"BR/EDR connection bad socket"
> +#define ERR_BREDR_CONN_MEMORY_ALLOC		"BR/EDR connection memory "\
> +						"allocation"
> +#define ERR_BREDR_CONN_BUSY			"BR/EDR connection busy"
> +#define ERR_BREDR_CONN_CNCR_CONNECT_LIMIT	"BR/EDR connection concurrent "\
> +						"connection limit"
> +#define ERR_BREDR_CONN_TIMEOUT			"BR/EDR connection timeout"
> +#define ERR_BREDR_CONN_REFUSED			"BR/EDR connection refused"
> +#define ERR_BREDR_CONN_ABORT_BY_REMOTE		"BR/EDR connection aborted by "\
> +						"remote"
> +#define ERR_BREDR_CONN_ABORT_BY_LOCAL		"BR/EDR connection aborted by "\
> +						"local"
> +#define ERR_BREDR_CONN_LMP_PROTO_ERROR		"BR/EDR connection LMP "\
> +						"protocol error"
> +#define ERR_BREDR_CONN_CANCELED			"BR/EDR connection canceled"
> +#define ERR_BREDR_CONN_UNKNOWN			"BR/EDR connection unknown"
> +
> +/* LE connection failure reasons */
> +#define ERR_LE_CONN_INVALID_ARGUMENTS	"LE connection invalid arguments"
> +#define ERR_LE_CONN_ADAPTER_NOT_POWERED	"LE connection adapter not powered"
> +#define ERR_LE_CONN_NOT_SUPPORTED	"LE connection not supported"
> +#define ERR_LE_CONN_ALREADY_CONNECTED	"LE connection already connected"
> +#define ERR_LE_CONN_BAD_SOCKET		"LE connection bad socket"
> +#define ERR_LE_CONN_MEMORY_ALLOC	"LE connection memory allocation"
> +#define ERR_LE_CONN_BUSY		"LE connection busy"
> +#define ERR_LE_CONN_REFUSED		"LE connection refused"
> +#define ERR_LE_CONN_CREATE_SOCKET	"LE connection create socket"
> +#define ERR_LE_CONN_TIMEOUT		"LE connection timeout"
> +#define ERR_LE_CONN_SYNC_CONNECT_LIMIT	"LE connection concurrent connection "\
> +					"limit"
> +#define ERR_LE_CONN_ABORT_BY_REMOTE	"LE connection abort by remote"
> +#define ERR_LE_CONN_ABORT_BY_LOCAL	"LE connection abort by local"
> +#define ERR_LE_CONN_LL_PROTO_ERROR	"LE connection link layer protocol "\
> +					"error"
> +#define ERR_LE_CONN_GATT_BROWSE		"LE connection GATT browsing"
> +#define ERR_LE_CONN_UNKNOWN		"LE connection unknown"

I rather have you use strings like “le-connection-not-supported” to make this similar to what we are using for other strings in the API.

And I am always torn between using “bredr-“ and just using “br-“.

Regards

Marcel


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2021-08-09 13:32 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-08-06 23:47 [BlueZ PATCH v5 0/4] Detailed error string Miao-chen Chou
2021-08-06 23:47 ` [BlueZ PATCH v5 1/4] doc: Add errors.txt to describe errors of D-Bus method returns Miao-chen Chou
2021-08-07  1:17   ` Detailed error string bluez.test.bot
2021-08-06 23:47 ` [BlueZ PATCH v5 2/4] error: BR/EDR and LE connection failure reasons Miao-chen Chou
2021-08-09 13:32   ` Marcel Holtmann
2021-08-06 23:47 ` [BlueZ PATCH v5 3/4] device: Include detailed error string in Connect() return Miao-chen Chou
2021-08-06 23:47 ` [BlueZ PATCH v5 4/4] client: Print error code for connect methods Miao-chen Chou

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).