summaryrefslogtreecommitdiff
path: root/src/gatt-database.c
diff options
context:
space:
mode:
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2020-03-31 14:05:48 -0700
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2020-04-01 10:42:00 -0700
commitb58ec70bf6af4c2f2090f4e09b5483c36ff59571 (patch)
treee2e3c577d78d4b20c25238c891b3f9d0cc92f96f /src/gatt-database.c
parent18b780eac37e56990d4128f0405e48b2e2ad7232 (diff)
downloadbluez-b58ec70bf6af4c2f2090f4e09b5483c36ff59571.tar.gz
gatt: Check error before retrying if Acquire* failed
If the method has timed out it probably means the application is not responding so a follow up method call might have the same result, also in case the application returns org.bluez.Error.Failed it indicates the operation has been attempted but failed which again most likely will have the same result if reattempted.
Diffstat (limited to 'src/gatt-database.c')
-rw-r--r--src/gatt-database.c48
1 files changed, 35 insertions, 13 deletions
diff --git a/src/gatt-database.c b/src/gatt-database.c
index 55fd28a54..11d886c56 100644
--- a/src/gatt-database.c
+++ b/src/gatt-database.c
@@ -53,6 +53,7 @@
#define GATT_SERVICE_IFACE "org.bluez.GattService1"
#define GATT_CHRC_IFACE "org.bluez.GattCharacteristic1"
#define GATT_DESC_IFACE "org.bluez.GattDescriptor1"
+#define ERROR_FAILED ERROR_INTERFACE ".Failed"
#define UUID_GAP 0x1800
#define UUID_GATT 0x1801
@@ -2027,28 +2028,30 @@ static bool parse_handle(GDBusProxy *proxy, uint16_t *handle)
return true;
}
-static uint8_t dbus_error_to_att_ecode(const char *error_name)
+static uint8_t dbus_error_to_att_ecode(const char *error_name, uint8_t perm_err)
{
-
- if (strcmp(error_name, "org.bluez.Error.Failed") == 0)
+ if (strcmp(error_name, ERROR_INTERFACE ".Failed") == 0)
return 0x80; /* For now return this "application error" */
- if (strcmp(error_name, "org.bluez.Error.NotSupported") == 0)
+ if (strcmp(error_name, ERROR_INTERFACE ".NotSupported") == 0)
return BT_ATT_ERROR_REQUEST_NOT_SUPPORTED;
- if (strcmp(error_name, "org.bluez.Error.NotAuthorized") == 0)
+ if (strcmp(error_name, ERROR_INTERFACE ".NotAuthorized") == 0)
return BT_ATT_ERROR_AUTHORIZATION;
- if (strcmp(error_name, "org.bluez.Error.InvalidValueLength") == 0)
+ if (strcmp(error_name, ERROR_INTERFACE ".InvalidValueLength") == 0)
return BT_ATT_ERROR_INVALID_ATTRIBUTE_VALUE_LEN;
- if (strcmp(error_name, "org.bluez.Error.InvalidOffset") == 0)
+ if (strcmp(error_name, ERROR_INTERFACE ".InvalidOffset") == 0)
return BT_ATT_ERROR_INVALID_OFFSET;
- if (strcmp(error_name, "org.bluez.Error.InProgress") == 0)
+ if (strcmp(error_name, ERROR_INTERFACE ".InProgress") == 0)
return BT_ERROR_ALREADY_IN_PROGRESS;
- return 0;
+ if (strcmp(error_name, ERROR_INTERFACE ".NotPermitted") == 0)
+ return perm_err;
+
+ return BT_ATT_ERROR_UNLIKELY;
}
static void read_reply_cb(DBusMessage *message, void *user_data)
@@ -2069,8 +2072,8 @@ static void read_reply_cb(DBusMessage *message, void *user_data)
if (dbus_set_error_from_message(&err, message) == TRUE) {
DBG("Failed to read value: %s: %s", err.name, err.message);
- ecode = dbus_error_to_att_ecode(err.name);
- ecode = ecode ? ecode : BT_ATT_ERROR_READ_NOT_PERMITTED;
+ ecode = dbus_error_to_att_ecode(err.name,
+ BT_ATT_ERROR_READ_NOT_PERMITTED);
dbus_error_free(&err);
goto done;
}
@@ -2246,8 +2249,8 @@ static void write_reply_cb(DBusMessage *message, void *user_data)
if (dbus_set_error_from_message(&err, message) == TRUE) {
DBG("Failed to write value: %s: %s", err.name, err.message);
- ecode = dbus_error_to_att_ecode(err.name);
- ecode = ecode ? ecode : BT_ATT_ERROR_WRITE_NOT_PERMITTED;
+ ecode = dbus_error_to_att_ecode(err.name,
+ BT_ATT_ERROR_WRITE_NOT_PERMITTED);
dbus_error_free(&err);
goto done;
}
@@ -2414,8 +2417,20 @@ static void acquire_write_reply(DBusMessage *message, void *user_data)
dbus_error_init(&err);
if (dbus_set_error_from_message(&err, message) == TRUE) {
+ uint8_t ecode;
+
error("Failed to acquire write: %s\n", err.name);
+
+ ecode = dbus_error_to_att_ecode(err.name,
+ BT_ATT_ERROR_WRITE_NOT_PERMITTED);
dbus_error_free(&err);
+
+ if (ecode != BT_ATT_ERROR_UNLIKELY) {
+ gatt_db_attribute_write_result(op->attrib, op->id,
+ ecode);
+ return;
+ }
+
goto retry;
}
@@ -2501,6 +2516,13 @@ static void acquire_notify_reply(DBusMessage *message, void *user_data)
if (dbus_set_error_from_message(&err, message) == TRUE) {
error("Failed to acquire notify: %s\n", err.name);
+
+ if (dbus_error_has_name(&err, DBUS_ERROR_NO_REPLY) ||
+ dbus_error_has_name(&err, ERROR_FAILED)) {
+ dbus_error_free(&err);
+ return;
+ }
+
dbus_error_free(&err);
goto retry;
}