Resolve the LE advertising fail after slot exhaustion
[platform/core/connectivity/bluetooth-frwk.git] / bt-oal / bluez_hal / src / bt-hal-gatt-server.c
index 4b9e2cc..d1eabe8 100644 (file)
@@ -1819,6 +1819,28 @@ static struct hal_gatts_server_register_info_t * bt_hal_gatts_find_server_regist
        return NULL;
 }
 
+static struct hal_gatts_server_register_info_t * bt_hal_gatts_find_server_register_info_by_slot_id(int adv_slot_id)
+{
+       DBG("+");
+
+       GSList *l;
+       struct hal_gatts_server_register_info_t *info = NULL;
+
+       for (l = hal_gatts_server_register_list; l != NULL; l = g_slist_next(l)) {
+               info = (struct hal_gatts_server_register_info_t *)l->data;
+               if (info == NULL) {
+                       continue;
+               }
+
+               if (info->adv_slot_id == adv_slot_id) {
+                       DBG("gatt server register found");
+                       return info;
+               }
+       }
+
+       return NULL;
+}
+
 static struct hal_gatts_server_register_info_t * bt_hal_gatts_add_server_app(bt_uuid_t *app_uuid)
 {
        DBG("+");
@@ -3428,6 +3450,37 @@ static int bt_hal_gatts_allocate_adv_slot(struct hal_gatts_server_register_info_
        return 0;
 }
 
+int bt_hal_gatts_allocate_adv_slot_by_server_if(int server_if)
+{
+       CHECK_BTGATT_INIT();
+
+       int ret = -1;
+
+       struct hal_gatts_server_register_info_t *server_register_info = NULL;
+
+       DBG("server_if: [%d]", server_if);
+
+       server_register_info =  bt_hal_gatts_find_server_register_info(server_if);
+       if (server_register_info == NULL) {
+               DBG("gatt server is not registered");
+               return -1;
+       }
+
+       DBG("gatt server:[%d], adv_slot:[%d]", server_register_info->server_if, server_register_info->adv_slot_id);
+
+       if (server_register_info->adv_slot_id < 0 ) {
+               DBG("adv_slot is not assigned to server:[%d] \n", server_if);
+
+               ret = bt_hal_gatts_allocate_adv_slot(server_register_info);
+               if (ret < 0) {
+                       DBG("failed to get adv_slot");
+                       return -1;
+               }
+       }
+
+       return server_register_info->adv_slot_id;
+}
+
 void bt_hal_gatts_release_adv_slot(int server_if)
 {
        struct hal_gatts_server_register_info_t *server_register_info = NULL;
@@ -3465,6 +3518,19 @@ int bt_hal_gatts_get_adv_slot_id(int server_if)
        return server_register_info->adv_slot_id;
 }
 
+int bt_hal_gatts_get_server_if(int slot_id)
+{
+       struct hal_gatts_server_register_info_t *server_register_info = NULL;
+
+       server_register_info = bt_hal_gatts_find_server_register_info_by_slot_id(slot_id);
+       if (server_register_info == NULL) {
+               DBG("failed to get server_register_info");
+               return -1;
+       }
+
+       return server_register_info->server_if;
+}
+
 static bt_status_t gatt_server_multi_adv_enable(int server_if)
 {
        CHECK_BTGATT_INIT();