2021-09-21 17:36:39

by Miao-chen Chou

[permalink] [raw]
Subject: [BlueZ PATCH v6 2/4] error: BR/EDR and LE connection failure reasons

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 <[email protected]>
Reviewed-by: Howard Chung <[email protected]>
---

Changes in v6:
- Rephrase error strings.

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 | 57 ++++++++++++++++++++++++++++++
2 files changed, 157 insertions(+)

diff --git a/src/error.c b/src/error.c
index dd85cd288..caeee1cc7 100644
--- a/src/error.c
+++ b/src/error.c
@@ -14,6 +14,8 @@
#include <config.h>
#endif

+#include <error.h>
+#include <stdio.h>
#include "gdbus/gdbus.h"

#include "error.h"
@@ -66,12 +68,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",
@@ -108,8 +122,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 7fcddaf4a..d0552bef1 100644
--- a/src/error.h
+++ b/src/error.h
@@ -11,9 +11,60 @@
*/

#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-connection-already-"\
+ "connected"
+#define ERR_BREDR_CONN_PAGE_TIMEOUT "br-connection-page-timeout"
+#define ERR_BREDR_CONN_PROFILE_UNAVAILABLE "br-connection-profile-"\
+ "unavailable"
+#define ERR_BREDR_CONN_SDP_SEARCH "br-connection-sdp-search"
+#define ERR_BREDR_CONN_CREATE_SOCKET "br-connection-create-socket"
+#define ERR_BREDR_CONN_INVALID_ARGUMENTS "br-connection-invalid-"\
+ "argument"
+#define ERR_BREDR_CONN_ADAPTER_NOT_POWERED "br-connection-adapter-not-"\
+ "powered"
+#define ERR_BREDR_CONN_NOT_SUPPORTED "br-connection-not-suuported"
+#define ERR_BREDR_CONN_BAD_SOCKET "br-connection-bad-socket"
+#define ERR_BREDR_CONN_MEMORY_ALLOC "br-connection-memory-"\
+ "allocation"
+#define ERR_BREDR_CONN_BUSY "br-connection-busy"
+#define ERR_BREDR_CONN_CNCR_CONNECT_LIMIT "br-connection-concurrent-"\
+ "connection-limit"
+#define ERR_BREDR_CONN_TIMEOUT "br-connection-timeout"
+#define ERR_BREDR_CONN_REFUSED "br-connection-refused"
+#define ERR_BREDR_CONN_ABORT_BY_REMOTE "br-connection-aborted-by-"\
+ "remote"
+#define ERR_BREDR_CONN_ABORT_BY_LOCAL "br-connection-aborted-by-"\
+ "local"
+#define ERR_BREDR_CONN_LMP_PROTO_ERROR "br-connection-lmp-protocol-"\
+ "error"
+#define ERR_BREDR_CONN_CANCELED "br-connection-canceled"
+#define ERR_BREDR_CONN_UNKNOWN "br-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);
@@ -22,11 +73,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.33.0.464.g1972c5931b-goog