summaryrefslogtreecommitdiff
path: root/monitor/att.c
diff options
context:
space:
mode:
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2022-05-24 17:49:57 -0700
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2022-05-25 12:47:10 -0700
commit2894f1392fbe5e570039e9a753c7065cb8fcbf01 (patch)
treede542503ee7c2bb600a7f45e4d16bc6e38c6b80c /monitor/att.c
parent79fe529d64855e1e482d3c265d89b7bbe7c99ab9 (diff)
downloadbluez-2894f1392fbe5e570039e9a753c7065cb8fcbf01.tar.gz
monitor/att: Attempt to reload if database is empty
If database is empty attempt to reload since the daemon may have updated its cache in the meantime.
Diffstat (limited to 'monitor/att.c')
-rw-r--r--monitor/att.c47
1 files changed, 26 insertions, 21 deletions
diff --git a/monitor/att.c b/monitor/att.c
index 9ae88504a..3644436e4 100644
--- a/monitor/att.c
+++ b/monitor/att.c
@@ -427,32 +427,39 @@ static void att_conn_data_free(void *data)
static void load_gatt_db(struct packet_conn_data *conn)
{
- struct att_conn_data *data;
+ struct att_conn_data *data = conn->data;
char filename[PATH_MAX];
bdaddr_t src;
char local[18];
char peer[18];
- if (hci_devba(conn->index, &src) < 0)
+ if (!data) {
+ data = new0(struct att_conn_data, 1);
+ data->rdb = gatt_db_new();
+ data->ldb = gatt_db_new();
+ conn->data = data;
+ conn->destroy = att_conn_data_free;
+ }
+
+ if (!gatt_db_isempty(data->ldb) && !gatt_db_isempty(data->rdb))
return;
- data = new0(struct att_conn_data, 1);
- data->rdb = gatt_db_new();
- data->ldb = gatt_db_new();
- conn->data = data;
- conn->destroy = att_conn_data_free;
+ if (hci_devba(conn->index, &src) < 0)
+ return;
ba2str(&src, local);
-
- create_filename(filename, PATH_MAX, "/%s/attributes", local);
-
- btd_settings_gatt_db_load(data->ldb, filename);
-
ba2str((bdaddr_t *)conn->dst, peer);
- create_filename(filename, PATH_MAX, "/%s/cache/%s", local, peer);
+ if (gatt_db_isempty(data->ldb)) {
+ create_filename(filename, PATH_MAX, "/%s/attributes", local);
+ btd_settings_gatt_db_load(data->ldb, filename);
+ }
- btd_settings_gatt_db_load(data->rdb, filename);
+ if (gatt_db_isempty(data->rdb)) {
+ create_filename(filename, PATH_MAX, "/%s/cache/%s", local,
+ peer);
+ btd_settings_gatt_db_load(data->rdb, filename);
+ }
}
static struct gatt_db_attribute *get_attribute(const struct l2cap_frame *frame,
@@ -466,14 +473,12 @@ static struct gatt_db_attribute *get_attribute(const struct l2cap_frame *frame,
if (!conn)
return NULL;
- data = conn->data;
/* Try loading local and remote gatt_db if not loaded yet */
- if (!data) {
- load_gatt_db(conn);
- data = conn->data;
- if (!data)
- return NULL;
- }
+ load_gatt_db(conn);
+
+ data = conn->data;
+ if (!data)
+ return NULL;
if (frame->in) {
if (rsp)