error: BR/EDR and LE connection failure reasons
authorMiao-chen Chou <mcchou@chromium.org>
Thu, 30 Sep 2021 22:37:26 +0000 (15:37 -0700)
committerAyush Garg <ayush.garg@samsung.com>
Fri, 11 Mar 2022 13:38:37 +0000 (19:08 +0530)
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>
Signed-off-by: Anuj Jain <anuj01.jain@samsung.com>
Signed-off-by: Ayush Garg <ayush.garg@samsung.com>
src/error.c
src/error.h

index dd85cd2..29c0710 100755 (executable)
@@ -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;
+       }
+}
index 7fcddaf..dded9f9 100755 (executable)
  */
 
 #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);