monitor/att: Attempt to reload if database is empty
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Wed, 25 May 2022 00:49:57 +0000 (17:49 -0700)
committerAyush Garg <ayush.garg@samsung.com>
Mon, 15 May 2023 09:25:54 +0000 (14:55 +0530)
If database is empty attempt to reload since the daemon may have
updated its cache in the meantime.

Signed-off-by: Manika Shrivastava <manika.sh@samsung.com>
Signed-off-by: Ayush Garg <ayush.garg@samsung.com>
monitor/att.c

index c7e1d79..ed50734 100644 (file)
@@ -426,32 +426,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,
@@ -465,14 +472,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)