diff options
author | Luiz Augusto von Dentz <luiz.von.dentz@intel.com> | 2022-05-24 17:49:57 -0700 |
---|---|---|
committer | Luiz Augusto von Dentz <luiz.von.dentz@intel.com> | 2022-05-25 12:47:10 -0700 |
commit | 2894f1392fbe5e570039e9a753c7065cb8fcbf01 (patch) | |
tree | de542503ee7c2bb600a7f45e4d16bc6e38c6b80c /monitor | |
parent | 79fe529d64855e1e482d3c265d89b7bbe7c99ab9 (diff) | |
download | bluez-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')
-rw-r--r-- | monitor/att.c | 47 |
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) |