Diff between 79fe529d64855e1e482d3c265d89b7bbe7c99ab9 and 2894f1392fbe5e570039e9a753c7065cb8fcbf01

Changed Files

File Additions Deletions Status
monitor/att.c +26 -21 modified

Full Patch

diff --git a/monitor/att.c b/monitor/att.c
index 9ae8850..3644436 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)