Fix bt-service crash issue in testhub
[platform/core/connectivity/bluetooth-frwk.git] / bt-service-adaptation / services / adapter / bt-service-core-adapter-le.c
index 12e13ac..5f146f3 100644 (file)
@@ -33,6 +33,7 @@
 #include "bt-service-gatt.h"
 #include "bt-service-util.h"
 #include "bt-service-core-device.h"
+#include "bt-service-battery-monitor.h"
 
 #include <oal-hardware.h>
 #include <oal-manager.h>
@@ -90,6 +91,8 @@ static bt_le_discovery_state_t adapter_le_discovery_state = LE_DISCOVERY_STOPPED
 
 typedef struct {
        char *sender;
+       uid_t uid;
+       pid_t pid;
        GSList *filter_list;
        gboolean is_scanning;
 } bt_adapter_le_scanner_t;
@@ -271,7 +274,6 @@ static void __bt_adapter_le_handle_pending_request_info(int result,
        GSList *l;
        GArray *out_param;
        invocation_info_t *req_info = NULL;
-       BT_DBG("+");
 
        for (l = _bt_get_invocation_list(); l != NULL; ) {
                req_info = l->data;
@@ -287,7 +289,6 @@ static void __bt_adapter_le_handle_pending_request_info(int result,
                        int *saved_handle;
                        bt_pending_adv_data_set_t *data;
 
-                       BT_DBG("Service function: [%d]", service_function);
                        ret_if(param == NULL);
 
                        saved_handle = (int*)req_info->user_data;
@@ -332,10 +333,10 @@ static void __bt_adapter_le_handle_pending_request_info(int result,
                        break;
                }
                default:
+                       BT_DBG("Unknown function(%d)", service_function);
                        break;
                }
        }
-       BT_DBG("-");
 }
 
 static void __bt_le_handle_server_instance_registered(event_gatts_register_t *data)
@@ -449,6 +450,8 @@ static void __bt_le_multi_advertising_enabled(event_ble_multiadv_status *event)
                /* Free data */
                g_free(info->sender);
                g_free(info);
+
+               BT_PERMANENT_LOG("Adv started %d", event->server_inst);
        }
 }
 
@@ -485,6 +488,8 @@ static void __bt_le_multi_advertising_disabled(event_ble_multiadv_status *event)
                /* Free data */
                g_free(info->sender);
                g_free(info);
+
+               BT_PERMANENT_LOG("Adv stopped %d", event->server_inst);
        }
 }
 
@@ -499,14 +504,13 @@ static void __bt_le_multi_advertising_set_data(event_ble_multiadv_status *event)
        if (sender == NULL) {
                BT_ERR("Abnormal!!");
        } else {
-               BT_DBG("Sender [%s], adv handle [%d]",  sender, adv_handle);
+               BT_INFO("Sender [%s], adv handle [%d]",  sender, adv_handle);
                if (event->status != OAL_STATUS_SUCCESS)
                        result = BLUETOOTH_ERROR_INTERNAL;
 
                info = g_malloc0(sizeof(bt_pending_adv_data_set_t));
                info->sender = sender;
                info->adv_handle = adv_handle;
-               BT_DBG("Sender [%s], adv handle [%d]",  info->sender, info->adv_handle);
                __bt_adapter_le_handle_pending_request_info(result,
                                BT_SET_SCAN_RESPONSE_DATA,
                                (void*)info, sizeof(bt_pending_adv_data_set_t));
@@ -518,34 +522,13 @@ static void __bt_le_multi_advertising_set_data(event_ble_multiadv_status *event)
        }
 }
 
-static int __get_advertisement_data(unsigned char *dest, unsigned char *src)
-{
-       int length = 0;
-       int i = 0;
-
-       while (i <= 31) {
-               int len = src[i];
-
-               if ((len == 0) || (31 < (i + len))) {
-                       BT_INFO("length: %d", length);
-                       memcpy(dest, src, length);
-                       break;
-               }
-
-               length += (len + 1);
-               i += (len + 1);
-       }
-
-       return length;
-}
-
 static int __bt_get_ad_data_by_type(const char *in_data, int in_len,
                char in_type, char **data, int *data_len)
 {
        if (in_data == NULL || data == NULL || data_len == NULL)
                return BLUETOOTH_ERROR_INTERNAL;
 
-       if (in_len < 0)
+       if (in_len <= 0)
                return BLUETOOTH_ERROR_INTERNAL;
 
        int i;
@@ -572,7 +555,7 @@ static int __bt_get_ad_data_by_type(const char *in_data, int in_len,
 
        if (i > BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX - 1
                        || i + len > in_len
-                       || i + len > BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX - 1) {
+                       || i + len > BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX) {
                BT_ERR("Invalid advertising data");
                return BLUETOOTH_ERROR_INTERNAL;
        } else if (len == 0) {
@@ -630,7 +613,7 @@ static gboolean __bt_check_scan_result_with_filter(const char *device_address,
        int idx;
 
        if (scanner->filter_list == NULL) {
-               BT_INFO("This scanner is on Full Scan.");
+               BT_DBG("This scanner is on Full Scan.");
                return TRUE;
        }
 
@@ -745,8 +728,7 @@ static gboolean __bt_check_scan_result_with_filter(const char *device_address,
                                name[data_len] = '\0';
                                g_free(data);
                                data = NULL;
-                               if (strncmp(filter_data->device_name,
-                                               name, data_len) == 0) {
+                               if (g_strrstr(name, filter_data->device_name) != NULL) {
                                        BT_INFO("Device Name is matched in adv data.");
                                        is_matched = TRUE;
                                }
@@ -763,8 +745,7 @@ static gboolean __bt_check_scan_result_with_filter(const char *device_address,
                                name[data_len] = '\0';
                                g_free(data);
                                data = NULL;
-                               if (strncmp(filter_data->device_name,
-                                               name, data_len) == 0) {
+                               if (g_strrstr(name, filter_data->device_name) != NULL) {
                                        BT_INFO("Device Name is matched in scan data.");
                                        is_matched = TRUE;
                                }
@@ -904,56 +885,30 @@ static void __bt_le_handle_device_found(event_ble_scan_result_info *scan_result)
        int result = BLUETOOTH_ERROR_NONE;
        bt_adapter_le_scanner_t *scanner = NULL;
        char address[BT_ADDRESS_STRING_SIZE];
-       int addr_type = 0x01; /* TODO: Need to get correct address type */
        unsigned char adv_ind_data[BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX];
        unsigned char scan_resp_data[BLUETOOTH_SCAN_RESP_DATA_LENGTH_MAX];
        int adv_ind_len = 0;
        int scan_resp_len = 0;
-       char *tmp_str = NULL;
        GVariant *scan_data_param;
        GVariant *adv_data_param;
        GVariant *param;
        GSList *l;
 
-       BT_DBG("+");
        ret_if(NULL == scan_result);
 
        _bt_convert_addr_type_to_string(address, scan_result->address.addr);
 
        memset(adv_ind_data, 0x00, sizeof(adv_ind_data));
-       adv_ind_len = __get_advertisement_data(
-                       adv_ind_data, &(scan_result->adv_data[0]));
-       if (adv_ind_len > BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX) {
-               BT_ERR("Invalid advertising data");
-               return;
-       }
+       adv_ind_len = scan_result->adv_data_len;
+       memcpy(adv_ind_data, scan_result->adv_data, BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX);
 
        memset(scan_resp_data, 0x00, sizeof(scan_resp_data));
-       scan_resp_len = __get_advertisement_data(
-                       scan_resp_data, &(scan_result->adv_data[adv_ind_len]));
-       if (scan_resp_len > BLUETOOTH_SCAN_RESP_DATA_LENGTH_MAX) {
-               BT_ERR("Invalid scan response data");
-               return;
-       }
+       scan_resp_len = scan_result->scan_rsp_data_len;
+       memcpy(scan_resp_data, scan_result->scan_rsp_data, BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX);
 
-       BT_INFO("Address: %s, RSSI: %d, adv_ind_len: %d, scan_resp_len: %d",
+       BT_DBG("Address: %s, RSSI: %d, adv_ind_len: %d, scan_resp_len: %d",
                        address, scan_result->rssi, adv_ind_len, scan_resp_len);
 
-       tmp_str = _bt_service_convert_hex_to_string(scan_result->adv_data, 62);
-       BT_INFO("Complete Data: [%s]", tmp_str);
-       g_free(tmp_str);
-       tmp_str = NULL;
-
-       tmp_str = _bt_service_convert_hex_to_string(adv_ind_data, adv_ind_len);
-       BT_INFO("Adv Ind Data: [%s]", tmp_str);
-       g_free(tmp_str);
-       tmp_str = NULL;
-
-       tmp_str = _bt_service_convert_hex_to_string(scan_resp_data, scan_resp_len);
-       BT_INFO("Scan resp Data: [%s]", tmp_str);
-       g_free(tmp_str);
-       tmp_str = NULL;
-
        for (l = scanner_list; l != NULL; l = g_slist_next(l)) {
                scanner = l->data;
                if (scanner->is_scanning == FALSE)
@@ -970,15 +925,13 @@ static void __bt_le_handle_device_found(event_ble_scan_result_info *scan_result)
 
                param = g_variant_new("(isnnn@ayn@ay)",
                                result, address,
-                               addr_type, scan_result->rssi,
+                               scan_result->addr_type, scan_result->rssi,
                                adv_ind_len, adv_data_param,
                                scan_resp_len, scan_data_param);
 
                _bt_send_event_to_dest(scanner->sender, BT_LE_ADAPTER_EVENT,
                                BLUETOOTH_EVENT_REMOTE_LE_DEVICE_FOUND, param);
        }
-
-       BT_DBG("-");
 }
 
 static void __bt_le_state_change_callback(int bt_status)
@@ -1012,7 +965,7 @@ static void __bt_le_state_change_callback(int bt_status)
 
 static void __bt_le_event_handler(int event_type, gpointer event_data)
 {
-       BT_INFO("OAL event = 0x%x, \n", event_type);
+       BT_INFO("OAL event = %d", event_type);
 
        switch (event_type) {
        case OAL_EVENT_BLE_ENABLED: {
@@ -1080,7 +1033,6 @@ static void __bt_le_event_handler(int event_type, gpointer event_data)
        }
        case OAL_EVENT_BLE_REMOTE_DEVICE_FOUND: {
                event_ble_scan_result_info *scan_result = event_data;
-               BT_INFO("OAL Event: OAL_EVENT_BLE_REMOTE_DEVICE_FOUND");
                __bt_le_handle_device_found(scan_result);
                break;
        }
@@ -1125,19 +1077,15 @@ static void __bt_le_event_handler(int event_type, gpointer event_data)
 
 int _bt_le_init(void)
 {
-       BT_DBG("+");
        /* Register LE event handler */
        _bt_service_register_event_handler_callback(BT_ADAPTER_LE_MODULE, __bt_le_event_handler);
-       BT_DBG("-");
        return BLUETOOTH_ERROR_NONE;
 }
 
 void _bt_le_deinit(void)
 {
-       BT_DBG("+");
        /* Un-register LE event handler */
        _bt_service_unregister_event_handler_callback(BT_ADAPTER_LE_MODULE);
-       BT_DBG("-");
 }
 
 static void __bt_le_update_discovery_status(bt_adapter_discovery_state_t status)
@@ -1149,7 +1097,6 @@ static void __bt_le_update_discovery_status(bt_adapter_discovery_state_t status)
 static int __bt_le_state_handle_request(gboolean enable)
 {
        int result = BLUETOOTH_ERROR_NONE;
-       BT_DBG("");
 
        switch (_bt_adapter_get_le_status()) {
        case BT_LE_ACTIVATING: {
@@ -1346,7 +1293,6 @@ int _bt_set_custom_advertising(const char *sender, int adv_handle,
        int server_instance;
        bt_pending_adv_data_set_t *info = NULL;
        int result = OAL_STATUS_SUCCESS;
-       BT_DBG("+");
 
        if (__bt_is_factory_test_mode()) {
                BT_ERR("Unable to start advertising in factory binary !!");
@@ -1384,6 +1330,13 @@ int _bt_set_custom_advertising(const char *sender, int adv_handle,
        }
 
        if (enable) {
+               /* Set the Advertising filter policy Parameter in HAL */
+               result = adapter_ble_set_filter_policy(params->filter_policy);
+
+               if (result != OAL_STATUS_SUCCESS){
+                       BT_ERR("OAL API adapter_ble_set_filter_policy Fail %d", result);
+                       return BLUETOOTH_ERROR_INTERNAL;
+               }
                /* Set Advertising parameters to Stack */
                result = adapter_ble_multi_adv_update(server_instance, params->interval_min, params->interval_max,
                                params->type, BT_ADV_DEFAULT_CHANNEL_MAP, params->tx_power_level, BT_ADV_DEFAULT_TIMEOUT);
@@ -1459,7 +1412,6 @@ static int __bt_set_multi_adv_param(oal_ble_multi_adv_param_setup_t *adv_setup,
        unsigned char *ptr;
        int num_uuids;
 
-       BT_INFO("+");
        retv_if(NULL == adv_data, BLUETOOTH_ERROR_INVALID_PARAM);
        retv_if(NULL == adv_setup, BLUETOOTH_ERROR_INVALID_PARAM);
 
@@ -1467,7 +1419,7 @@ static int __bt_set_multi_adv_param(oal_ble_multi_adv_param_setup_t *adv_setup,
                int len = ptr[0];
                int type = ptr[1];
 
-               BT_INFO("len: %d, type: %x", len, type);
+               BT_DBG("len: %d, type: 0x%x", len, type);
 
                switch (type) {
                case 0xFF: /* Manufacturer Data */
@@ -1487,7 +1439,6 @@ static int __bt_set_multi_adv_param(oal_ble_multi_adv_param_setup_t *adv_setup,
                        break;
                        case 0x14: {  /* 16 bit Solicit UUID */
                        int c;
-                       int k;
                        num_uuids = (len -1)/2;
                        adv_setup->solicit_uuid = g_malloc0(sizeof(char) * 16 * num_uuids);
                        char *tmp = adv_setup->solicit_uuid;
@@ -1501,14 +1452,10 @@ static int __bt_set_multi_adv_param(oal_ble_multi_adv_param_setup_t *adv_setup,
                                if (c < num_uuids)
                                        tmp += 16;
                        }
-                       /* DEBUG: Test*/
-                       for (k = 0; k < 16 * num_uuids; k++)
-                               BT_DBG("%x", adv_setup->solicit_uuid[k]);
                        break;
                }
                case 0x02: { /* 16 bit Service UUID */
                        int c;
-                       int k;
                        num_uuids = (len -1)/2;
                        adv_setup->service_uuid = g_malloc0(sizeof(char) * 16 * num_uuids);
                        char *tmp = adv_setup->service_uuid;
@@ -1522,9 +1469,6 @@ static int __bt_set_multi_adv_param(oal_ble_multi_adv_param_setup_t *adv_setup,
                                if (c < num_uuids)
                                        tmp += 16;
                        }
-                       /* DEBUG: Test*/
-                       for (k = 0; k < 16 * num_uuids; k++)
-                               BT_DBG("%x", adv_setup->service_uuid[k]);
                        break;
                }
                case 0x16: { /* Service Data */
@@ -1559,7 +1503,6 @@ static int __bt_set_multi_adv_param(oal_ble_multi_adv_param_setup_t *adv_setup,
                ptr += len + 1;
        }
 
-       BT_INFO("-");
        return BLUETOOTH_ERROR_NONE;
 }
 
@@ -1640,7 +1583,7 @@ int _bt_set_advertising_data(const char *sender, int adv_handle,
        /* Set Server instance[Product Requirement] */
        adv_setup.tx_power = 4;
 
-       BT_DBG("####Service UUID len [%d], service data len [%d] Solicit UUID len [%d]",
+       BT_DBG("Service UUID len [%d], service data len [%d] Solicit UUID len [%d]",
                                adv_setup.solicit_uuid_len, adv_setup.service_uuid_len, adv_setup.service_data_len);
        result = adapter_ble_multi_adv_set_inst_data(server_instance, &adv_setup);
        if (result != OAL_STATUS_SUCCESS) {
@@ -2040,7 +1983,7 @@ int _bt_unregister_all_scan_filters(const char* sender)
        return BLUETOOTH_ERROR_NONE;
 }
 
-int _bt_start_le_scan(const char *sender)
+int _bt_start_le_scan(const char *sender, uid_t uid, pid_t pid)
 {
        bt_adapter_le_scanner_t *scanner;
        int ret;
@@ -2051,6 +1994,8 @@ int _bt_start_le_scan(const char *sender)
                retv_if(scanner == NULL, BLUETOOTH_ERROR_INTERNAL);
 
                scanner->sender = g_strdup(sender);
+               scanner->uid = uid;
+               scanner->pid = pid;
                scanner_list = g_slist_append(scanner_list, scanner);
        }
 
@@ -2060,6 +2005,8 @@ int _bt_start_le_scan(const char *sender)
                return BLUETOOTH_ERROR_IN_PROGRESS;
        }
 
+       scanner->is_scanning = TRUE;
+
        /* Check scanning is in progress or not by other users */
        if (_bt_is_le_scanning()) {
                int value = 1;
@@ -2080,7 +2027,7 @@ int _bt_start_le_scan(const char *sender)
                } else {
                        BT_INFO("LE Full Scan is already on progress");
                }
-               goto done;
+               return BLUETOOTH_ERROR_NONE;
        } else {
                if (is_le_set_scan_parameter == FALSE) {
                        /* Set default scan parameter same with BT_ADAPTER_LE_SCAN_MODE_LOW_ENERGY */
@@ -2112,8 +2059,6 @@ int _bt_start_le_scan(const char *sender)
                return BLUETOOTH_ERROR_INTERNAL;
        }
 
-done:
-       scanner->is_scanning = TRUE;
        return BLUETOOTH_ERROR_NONE;
 }
 
@@ -2127,14 +2072,18 @@ int _bt_stop_le_scan(const char *sender)
 
        /* Check scanning is in progress or not */
        scanner = __bt_find_scanner_from_list(sender);
-       if (scanner == NULL || scanner->is_scanning == FALSE)
+       if (scanner == NULL)
+               return BLUETOOTH_ERROR_NOT_IN_OPERATION;
+
+       if (scanner->is_scanning == FALSE)
                return BLUETOOTH_ERROR_NOT_IN_OPERATION;
 
        scanner->is_scanning = FALSE;
 
        for (l = scanner_list; l != NULL; l = g_slist_next(l)) {
-               scanner = l->data;
-               if (scanner->is_scanning == TRUE)
+               bt_adapter_le_scanner_t *scanner_iter = l->data;
+
+               if (scanner_iter->is_scanning == TRUE)
                        next_scanning = TRUE;
        }
 
@@ -2187,12 +2136,16 @@ void _bt_check_le_scanner_app_termination(const char *sender)
        if (!scanner)
                return;
 
-       if (scanner->is_scanning)
-               _bt_stop_le_scan(sender);
+       _bt_bm_remove_scan_app(SCAN_LE, scanner->uid, scanner->pid);
+
+       if (scanner->is_scanning) {
+               /* Free 'scanner' into the function */
+               if (_bt_stop_le_scan(sender) != BLUETOOTH_ERROR_NOT_IN_OPERATION)
+                       return;
+       }
 
        scanner_list = g_slist_remove(scanner_list, scanner);
-       g_free(scanner->sender);
-       g_free(scanner);
+       __bt_free_le_scanner(scanner);
 }
 
 int _bt_service_le_init(void)
@@ -2341,7 +2294,7 @@ int _bt_set_le_static_random_address(gboolean is_enable)
 
        result =  adapter_set_le_static_random_address(is_enable);
        if (result != OAL_STATUS_SUCCESS) {
-               BT_ERR("adapter_set_connectable failed: %d", result);
+               BT_ERR("adapter_set_le_static_random_address failed: %d", result);
                result = BLUETOOTH_ERROR_INTERNAL;
        } else {
                BT_INFO("SetLeStaticRandomAddress as %d", is_enable);