From: Luiz Augusto von Dentz <luiz.dentz@gmail.com>
To: linux-bluetooth@vger.kernel.org
Subject: [PATCH BlueZ 15/15] device: Store Database Hash on storage
Date: Tue, 29 Jan 2019 15:26:34 +0200 [thread overview]
Message-ID: <20190129132634.28786-15-luiz.dentz@gmail.com> (raw)
In-Reply-To: <20190129132634.28786-1-luiz.dentz@gmail.com>
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This stores the hash on the storage so it can be reloaded when the
daemon/system restarts.
---
src/device.c | 86 ++++++++++++++++++++++++++++++++++++++++++++++------
1 file changed, 77 insertions(+), 9 deletions(-)
diff --git a/src/device.c b/src/device.c
index 060251f66..8ddfa28ff 100644
--- a/src/device.c
+++ b/src/device.c
@@ -2143,6 +2143,18 @@ struct gatt_saver {
GKeyFile *key_file;
};
+static void db_hash_read_value_cb(struct gatt_db_attribute *attrib,
+ int err, const uint8_t *value,
+ size_t length, void *user_data)
+{
+ const uint8_t **hash = user_data;
+
+ if (err || (length != 16))
+ return;
+
+ *hash = value;
+}
+
static void store_desc(struct gatt_db_attribute *attr, void *user_data)
{
struct gatt_saver *saver = user_data;
@@ -2174,7 +2186,7 @@ static void store_chrc(struct gatt_db_attribute *attr, void *user_data)
char handle[6], value[100], uuid_str[MAX_LEN_UUID_STR];
uint16_t handle_num, value_handle;
uint8_t properties;
- bt_uuid_t uuid;
+ bt_uuid_t uuid, hash_uuid;
if (!gatt_db_attribute_get_char_data(attr, &handle_num, &value_handle,
&properties, &saver->ext_props,
@@ -2185,8 +2197,34 @@ static void store_chrc(struct gatt_db_attribute *attr, void *user_data)
sprintf(handle, "%04hx", handle_num);
bt_uuid_to_string(&uuid, uuid_str, sizeof(uuid_str));
- sprintf(value, GATT_CHARAC_UUID_STR ":%04hx:%02hhx:%s", value_handle,
- properties, uuid_str);
+
+ /* Store Database Hash value if available */
+ bt_uuid16_create(&hash_uuid, GATT_CHARAC_DB_HASH);
+ if (!bt_uuid_cmp(&uuid, &hash_uuid)) {
+ const uint8_t *hash = NULL;
+
+ attr = gatt_db_get_attribute(saver->device->db, value_handle);
+
+ gatt_db_attribute_read(attr, 0, BT_ATT_OP_READ_REQ, NULL,
+ db_hash_read_value_cb, &hash);
+ if (hash)
+ sprintf(value, GATT_CHARAC_UUID_STR ":%04hx:%02hhx:"
+ "%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx"
+ "%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx"
+ "%02hhx%02hhx:%s", value_handle, properties,
+ hash[0], hash[1], hash[2], hash[3],
+ hash[4], hash[5], hash[6], hash[7],
+ hash[8], hash[9], hash[10], hash[11],
+ hash[12], hash[13], hash[14], hash[15],
+ uuid_str);
+ else
+ sprintf(value, GATT_CHARAC_UUID_STR ":%04hx:%02hhx:%s",
+ value_handle, properties, uuid_str);
+
+ } else
+ sprintf(value, GATT_CHARAC_UUID_STR ":%04hx:%02hhx:%s",
+ value_handle, properties, uuid_str);
+
g_key_file_set_string(key_file, "Attributes", handle, value);
gatt_db_service_foreach_desc(attr, store_desc, saver);
@@ -3228,6 +3266,20 @@ static void load_desc_value(struct gatt_db_attribute *attrib,
warn("loading descriptor value to db failed");
}
+static ssize_t str2val(const char *str, uint8_t *val, size_t len)
+{
+ const char *pos = str;
+ size_t i;
+
+ for (i = 0; i < len; i++) {
+ if (sscanf(pos, "%2hhx", &val[i]) != 1)
+ break;
+ pos += 2;
+ }
+
+ return i;
+}
+
static int load_desc(char *handle, char *value,
struct gatt_db_attribute *service)
{
@@ -3247,7 +3299,7 @@ static int load_desc(char *handle, char *value,
val = 0;
}
- DBG("loading descriptor handle: 0x%04x, value: 0x%04x, uuid: %s",
+ DBG("loading descriptor handle: 0x%04x, value: 0x%04x, value uuid: %s",
handle_int, val, uuid_str);
bt_string_to_uuid(&uuid, uuid_str);
@@ -3282,21 +3334,31 @@ static int load_chrc(char *handle, char *value,
uint16_t properties, value_handle, handle_int;
char uuid_str[MAX_LEN_UUID_STR];
struct gatt_db_attribute *att;
+ char val_str[32];
+ uint8_t val[16];
+ size_t val_len;
bt_uuid_t uuid;
if (sscanf(handle, "%04hx", &handle_int) != 1)
return -EIO;
- if (sscanf(value, GATT_CHARAC_UUID_STR ":%04hx:%02hx:%s", &value_handle,
- &properties, uuid_str) != 3)
- return -EIO;
+ /* Check if there is any value stored */
+ if (sscanf(value, GATT_CHARAC_UUID_STR ":%04hx:%02hx:%32s:%s",
+ &value_handle, &properties, val_str, uuid_str) != 4) {
+ if (sscanf(value, GATT_CHARAC_UUID_STR ":%04hx:%02hx:%s",
+ &value_handle, &properties, uuid_str) != 3)
+ return -EIO;
+ val_len = 0;
+ } else
+ val_len = str2val(val_str, val, sizeof(val));
bt_string_to_uuid(&uuid, uuid_str);
/* Log debug message. */
DBG("loading characteristic handle: 0x%04x, value handle: 0x%04x,"
- " properties 0x%04x uuid: %s", handle_int,
- value_handle, properties, uuid_str);
+ " properties 0x%04x value: %s uuid: %s",
+ handle_int, value_handle, properties,
+ val_len ? val_str : "", uuid_str);
att = gatt_db_service_insert_characteristic(service, value_handle,
&uuid, 0, properties,
@@ -3306,6 +3368,12 @@ static int load_chrc(char *handle, char *value,
return -EIO;
}
+ if (val_len) {
+ if (!gatt_db_attribute_write(att, 0, val, val_len, 0, NULL,
+ load_desc_value, NULL))
+ return -EIO;
+ }
+
return 0;
}
--
2.17.2
next prev parent reply other threads:[~2019-01-29 13:27 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-01-29 13:26 [PATCH BlueZ 01/15] shared/crypto: Add bt_crypto_gatt_hash Luiz Augusto von Dentz
2019-01-29 13:26 ` [PATCH BlueZ 02/15] unit/test-crypto: Add test for bt_crypto_gatt_hash Luiz Augusto von Dentz
2019-01-29 13:26 ` [PATCH BlueZ 03/15] lib/uuid: Introduce definition for GATT caching attributes Luiz Augusto von Dentz
2019-01-29 13:26 ` [PATCH BlueZ 04/15] shared/util: Add decoding support " Luiz Augusto von Dentz
2019-01-29 13:26 ` [PATCH BlueZ 05/15] shared/att-types: Add errors introduced by GATT caching Luiz Augusto von Dentz
2019-01-29 13:26 ` [PATCH BlueZ 06/15] monitor: Decode GATT Caching errors Luiz Augusto von Dentz
2019-01-29 13:26 ` [PATCH BlueZ 07/15] shared/gatt-db: Introduce Database Hash Luiz Augusto von Dentz
2019-01-29 13:26 ` [PATCH BlueZ 08/15] shared/gatt-db: Generate database hash Luiz Augusto von Dentz
2019-01-29 13:26 ` [PATCH BlueZ 09/15] gatt: Add caching support for server Luiz Augusto von Dentz
2019-01-29 13:26 ` [PATCH BlueZ 10/15] shared/gatt-db: Add gatt_db_set_authorize Luiz Augusto von Dentz
2019-01-29 13:26 ` [PATCH BlueZ 11/15] shared/gatt-server: Add bt_gatt_server_set_authorize Luiz Augusto von Dentz
2019-01-29 13:26 ` [PATCH BlueZ 12/15] gatt: Implement Robust Caching handling for server Luiz Augusto von Dentz
2019-01-29 13:26 ` [PATCH BlueZ 13/15] shared/gatt-client: Read database hash if available Luiz Augusto von Dentz
2019-01-29 13:26 ` [PATCH BlueZ 14/15] shared/gatt-client: Write Client Features Luiz Augusto von Dentz
2019-01-29 13:26 ` Luiz Augusto von Dentz [this message]
2019-02-06 11:49 ` [PATCH BlueZ 01/15] shared/crypto: Add bt_crypto_gatt_hash Luiz Augusto von Dentz
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190129132634.28786-15-luiz.dentz@gmail.com \
--to=luiz.dentz@gmail.com \
--cc=linux-bluetooth@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).