summaryrefslogtreecommitdiff
path: root/src/error.c
diff options
context:
space:
mode:
authorMiao-chen Chou <mcchou@chromium.org>2021-09-30 15:37:26 -0700
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2021-10-04 15:44:55 -0700
commit8f73362e8cb3e9846528a13d9db1f95efb3f3087 (patch)
tree7d1a87e7eea1d52dabf4336992feaa83c169f4ae /src/error.c
parentde48279160940710f5d23538a1061ebb35fbe2ef (diff)
downloadbluez-8f73362e8cb3e9846528a13d9db1f95efb3f3087.tar.gz
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 <alainm@chromium.org> Reviewed-by: Howard Chung <howardchung@google.com>
Diffstat (limited to 'src/error.c')
-rw-r--r--src/error.c100
1 files changed, 100 insertions, 0 deletions
diff --git a/src/error.c b/src/error.c
index dd85cd288..29c071067 100644
--- a/src/error.c
+++ b/src/error.c
@@ -14,6 +14,8 @@
#include <config.h>
#endif
+#include <errno.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;
+ }
+}