Merge branch 'tizen' into tizen_5.5
[platform/core/connectivity/bluetooth-frwk.git] / bt-oal / oal-gatt.c
index 000439e..5aadebb 100644 (file)
@@ -527,6 +527,23 @@ oal_status_t gatts_multi_adv_disable(int instance_id)
        return OAL_STATUS_SUCCESS;
 }
 
+oal_status_t gatts_set_filter_policy(int filter_policy)
+{
+       int ret = OAL_STATUS_SUCCESS;
+
+       CHECK_OAL_GATT_ENABLED();
+
+       /* send the filter_policy value to the HAL Layer */
+       ret = gatt_api->server->set_filter_policy(filter_policy);
+
+       if (ret != BT_STATUS_SUCCESS) {
+               BT_ERR("set_filter_policy failed: %d",ret);
+               return convert_to_oal_status(ret);
+       }
+
+       return OAL_STATUS_SUCCESS;
+}
+
 oal_status_t gatts_multi_adv_update(int instance_id,
                int min_intv, int max_intv,
                int adv_type, int chnl_map,
@@ -1741,7 +1758,6 @@ oal_status_t gattc_start_le_discovery(int client_id)
                BT_ERR("Error:Start LE Discovery failed: %s", status2string(ret));
                return convert_to_oal_status(ret);
        }
-       send_event(OAL_EVENT_BLE_DISCOVERY_STARTED, NULL, 0);
        return OAL_STATUS_SUCCESS;
 }
 
@@ -1757,8 +1773,7 @@ oal_status_t gattc_stop_le_discovery(int client_id)
        if (ret != BT_STATUS_SUCCESS) {
                BT_ERR("Error:Stop LE Discovery failed: %s", status2string(ret));
                return convert_to_oal_status(ret);
-       } else
-               send_event(OAL_EVENT_BLE_DISCOVERY_STOPPED, NULL, 0);
+       }
        return OAL_STATUS_SUCCESS;
 }
 
@@ -2170,3 +2185,244 @@ oal_status_t gattc_unregister_scan_filter(int slot_id)
        }
        return OAL_STATUS_SUCCESS;
 }
+
+oal_status_t gattc_enable_scan_filter(int client_if)
+{
+       int ret;
+
+       API_TRACE("");
+       CHECK_OAL_GATT_ENABLED();
+
+       BT_INFO("Enable Scan filter. Client If: %d", client_if);
+
+       ret = gatt_api->client->scan_filter_enable(client_if, TRUE);
+       if (ret != BT_STATUS_SUCCESS) {
+               BT_ERR("error: %s", status2string(ret));
+               return convert_to_oal_status(ret);
+       }
+       return OAL_STATUS_SUCCESS;
+}
+
+oal_status_t gattc_disable_scan_filter(int client_if)
+{
+       int ret;
+
+       API_TRACE("");
+       CHECK_OAL_GATT_ENABLED();
+
+       BT_INFO("Disable Scan filter. Client If: %d", client_if);
+
+       ret = gatt_api->client->scan_filter_enable(client_if, FALSE);
+       if (ret != BT_STATUS_SUCCESS) {
+               BT_ERR("error: %s", status2string(ret));
+               return convert_to_oal_status(ret);
+       }
+       return OAL_STATUS_SUCCESS;
+}
+
+oal_status_t gattc_register_scan_filter(oal_ble_scan_filter_t* filter_data)
+{
+       int ret;
+       int client_info = 0;
+       int action = 0;
+       int company_id = 0;
+       int company_id_mask = 0;
+       int address_type = 0;
+       int feature_selection = 0;
+
+       oal_ble_scan_filter_param_setup_t scan_filter_setup = {.list_logic_type = 0,
+                                                               .filt_logic_type = 1,
+                                                               .rssi_high_thres = -127,
+                                                               .rssi_low_thres = -127,
+                                                               .dely_mode = 0,
+                                                               .found_timeout = 0,
+                                                               .lost_timeout = 0,
+                                                               .found_timeout_cnt = 0
+                                                               };
+
+       OAL_CHECK_PARAMETER(filter_data, return);
+       API_TRACE();
+       CHECK_OAL_GATT_ENABLED();
+
+       if (filter_data->added_features & OAL_BLE_SCAN_FILTER_FEATURE_DEVICE_ADDRESS){
+               bdstr_t bdstr;
+               BT_INFO("OAL_BLE_SCAN_FILTER_FEATURE_DEVICE_ADDRESS is being added");
+               BT_INFO("BT remote Device address is %s", bdt_bd2str(filter_data->device_address, &bdstr));
+               ret = gatt_api->client->scan_filter_add_remove(client_info,
+                                                               action,
+                                                               OAL_BLE_SCAN_FILTER_FEATURE_DEVICE_ADDRESS,
+                                                               filter_data->slot_id,
+                                                               company_id,
+                                                               company_id_mask,
+                                                               NULL,
+                                                               NULL,
+                                                               (bt_bdaddr_t*)filter_data->device_address,
+                                                               address_type,
+                                                               0,
+                                                               NULL,
+                                                               0,
+                                                               NULL
+                                                               );
+               if (ret != BT_STATUS_SUCCESS){
+                       BT_ERR("error: %s", status2string(ret));
+                       BT_INFO("unregistering already set filter features.");
+                       gatt_api->client->scan_filter_clear(client_info, filter_data->slot_id);
+                       return convert_to_oal_status(ret);
+               }
+
+               feature_selection |= OAL_BLE_SCAN_FILTER_FEATURE_DEVICE_ADDRESS;
+       }
+       if (filter_data->added_features & OAL_BLE_SCAN_FILTER_FEATURE_DEVICE_NAME){
+               ret = gatt_api->client->scan_filter_add_remove(client_info,
+                                                               action,
+                                                               OAL_BLE_SCAN_FILTER_FEATURE_DEVICE_NAME,
+                                                               filter_data->slot_id,
+                                                               company_id,
+                                                               company_id_mask,
+                                                               NULL,
+                                                               NULL,
+                                                               NULL,
+                                                               address_type,
+                                                               0,
+                                                               filter_data->device_name,     // device_name as p_data in HAL
+                                                               0,
+                                                               NULL
+                                                               );
+               if (ret != BT_STATUS_SUCCESS){
+                       BT_ERR("error: %s", status2string(ret));
+                       BT_INFO("unregistering already set filter features.");
+                       gatt_api->client->scan_filter_clear(client_info, filter_data->slot_id);
+                       return convert_to_oal_status(ret);
+               }
+
+               feature_selection |= OAL_BLE_SCAN_FILTER_FEATURE_DEVICE_NAME;
+       }
+       if (filter_data->added_features & OAL_BLE_SCAN_FILTER_FEATURE_SERVICE_UUID){
+               BT_INFO("OAL_BLE_SCAN_FILTER_FEATURE_SERVICE_UUID is being added");
+               char uuid_str1[2*BT_UUID_STRING_MAX];
+               char uuid_str2[2*BT_UUID_STRING_MAX];
+
+               uuid_to_stringname((service_uuid_t*)filter_data->service_uuid, uuid_str1);
+               uuid_to_stringname((service_uuid_t*)filter_data->service_uuid_mask, uuid_str2);
+
+               BT_INFO("Service UUID  is [%s] and Service UUID mask is [%s]", uuid_str1, uuid_str2);
+               ret = gatt_api->client->scan_filter_add_remove(client_info,
+                                                               action,
+                                                               OAL_BLE_SCAN_FILTER_FEATURE_SERVICE_UUID,
+                                                               filter_data->slot_id,
+                                                               company_id,
+                                                               company_id_mask,
+                                                               (bt_uuid_t*)filter_data->service_uuid,
+                                                               (bt_uuid_t*)filter_data->service_uuid_mask,
+                                                               NULL,
+                                                               address_type,
+                                                               filter_data->service_uuid_len,   // service_uuid_len as data_len in HAL
+                                                               NULL,
+                                                               filter_data->service_uuid_mask_len,
+                                                               NULL
+                                                               );
+               if (ret != BT_STATUS_SUCCESS){
+                       BT_ERR("error: %s", status2string(ret));
+                       BT_INFO("unregistering already set filter features.");
+                       gatt_api->client->scan_filter_clear(client_info, filter_data->slot_id);
+                       return convert_to_oal_status(ret);
+               }
+
+               feature_selection |= OAL_BLE_SCAN_FILTER_FEATURE_SERVICE_UUID;
+       }
+       if (filter_data->added_features & OAL_BLE_SCAN_FILTER_FEATURE_SERVICE_SOLICITATION_UUID){
+               BT_INFO("OAL_BLE_SCAN_FILTER_FEATURE_SERVICE_SOLICITATION_UUID is being added");
+               char uuid_str1[2*BT_UUID_STRING_MAX];
+               char uuid_str2[2*BT_UUID_STRING_MAX];
+               uuid_to_stringname((service_uuid_t*)filter_data->service_solicitation_uuid, uuid_str1);
+               uuid_to_stringname((service_uuid_t*)filter_data->service_solicitation_uuid_mask, uuid_str2);
+               BT_INFO("Service Solicitation UUID  is [%s] and Service Solicitation UUID mask is [%s]", uuid_str1, uuid_str2);
+               ret = gatt_api->client->scan_filter_add_remove(client_info,
+                                                               action,
+                                                               OAL_BLE_SCAN_FILTER_FEATURE_SERVICE_SOLICITATION_UUID,
+                                                               filter_data->slot_id,
+                                                               company_id,
+                                                               company_id_mask,
+                                                               (bt_uuid_t*)filter_data->service_solicitation_uuid,
+                                                               (bt_uuid_t*)filter_data->service_solicitation_uuid_mask,
+                                                               NULL,
+                                                               address_type,
+                                                               filter_data->service_solicitation_uuid_len,   // service_solicitation_uuid_len as data_len in HAL
+                                                               NULL,
+                                                               filter_data->service_solicitation_uuid_mask_len,
+                                                               NULL
+                                                               );
+               if (ret != BT_STATUS_SUCCESS){
+                       BT_ERR("error: %s", status2string(ret));
+                       BT_INFO("unregistering already set filter features.");
+                       gatt_api->client->scan_filter_clear(client_info, filter_data->slot_id);
+                       return convert_to_oal_status(ret);
+               }
+
+               feature_selection |= OAL_BLE_SCAN_FILTER_FEATURE_SERVICE_SOLICITATION_UUID;
+       }
+       if (filter_data->added_features & OAL_BLE_SCAN_FILTER_FEATURE_SERVICE_DATA){
+               ret = gatt_api->client->scan_filter_add_remove(client_info,
+                                                               action,
+                                                               OAL_BLE_SCAN_FILTER_FEATURE_SERVICE_DATA,
+                                                               filter_data->slot_id,
+                                                               company_id,
+                                                               company_id_mask,
+                                                               NULL,
+                                                               NULL,
+                                                               NULL,
+                                                               address_type,
+                                                               filter_data->service_data_len,    //service_data_len as data_len in HAL
+                                                               (char*)filter_data->service_data,
+                                                               filter_data->service_data_mask_len,
+                                                               (char*)filter_data->service_data_mask
+                                                               );
+               if (ret != BT_STATUS_SUCCESS){
+                       BT_ERR("error: %s", status2string(ret));
+                       BT_INFO("unregistering already set filter features.");
+                       gatt_api->client->scan_filter_clear(client_info, filter_data->slot_id);
+                       return convert_to_oal_status(ret);
+               }
+
+               feature_selection |= OAL_BLE_SCAN_FILTER_FEATURE_SERVICE_DATA;
+       }
+       if (filter_data->added_features & OAL_BLE_SCAN_FILTER_FEATURE_MANUFACTURER_DATA){
+               ret = gatt_api->client->scan_filter_add_remove(client_info,
+                                                               action,
+                                                               OAL_BLE_SCAN_FILTER_FEATURE_MANUFACTURER_DATA,
+                                                               filter_data->slot_id,
+                                                               filter_data->manufacturer_id,
+                                                               company_id_mask,
+                                                               NULL,
+                                                               NULL,
+                                                               NULL,
+                                                               address_type,
+                                                               filter_data->manufacturer_data_len,    //manufacturer_data_len as data_len in HAL
+                                                               (char*)filter_data->manufacturer_data,
+                                                               filter_data->manufacturer_data_mask_len,
+                                                               (char*)filter_data->manufacturer_data_mask
+                                                               );
+               feature_selection |= OAL_BLE_SCAN_FILTER_FEATURE_MANUFACTURER_DATA;
+               if (ret != BT_STATUS_SUCCESS){
+                       BT_ERR("error: %s", status2string(ret));
+                       BT_INFO("unregistering already set filter features.");
+                       gatt_api->client->scan_filter_clear(client_info, filter_data->slot_id);
+                       return convert_to_oal_status(ret);
+               }
+
+               feature_selection |= OAL_BLE_SCAN_FILTER_FEATURE_MANUFACTURER_DATA;
+       }
+
+       BT_DBG("Filter selection 0x%.2x", feature_selection);
+
+       ret = gatt_api->client->scan_filter_param_setup(client_info, action, filter_data->slot_id, feature_selection,
+                                                       scan_filter_setup.list_logic_type, scan_filter_setup.filt_logic_type,
+                                                       scan_filter_setup.rssi_high_thres, scan_filter_setup.rssi_low_thres,
+                                                       scan_filter_setup.dely_mode, scan_filter_setup.found_timeout,
+                                                       scan_filter_setup.lost_timeout, scan_filter_setup.found_timeout_cnt);
+       if (ret != BT_STATUS_SUCCESS){
+               BT_ERR("error: %s", status2string(ret));
+               return convert_to_oal_status(ret);
+       }
+       return OAL_STATUS_SUCCESS;
+}