X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=bt-oal%2Foal-gatt.c;h=90c9e62c37fd380ed51cd68ccbd8acf37ec4b6c5;hb=00cc8b49438e9807518aea60220bb5fb99485f2c;hp=6d5d203c78a8e2faa9ddb3091befa174b7f6296d;hpb=4f8a5f7d76a3aa0ffd224e215bab05ff49907752;p=platform%2Fcore%2Fconnectivity%2Fbluetooth-frwk.git diff --git a/bt-oal/oal-gatt.c b/bt-oal/oal-gatt.c index 6d5d203..90c9e62 100644 --- a/bt-oal/oal-gatt.c +++ b/bt-oal/oal-gatt.c @@ -192,7 +192,7 @@ static const btgatt_server_callbacks_t btgatt_server_callbacks = { .notif_enabled_cb = cb_notifcation_changed, #endif .request_acquire_write_cb = cb_gatts_acquire_write, - .request_acquire_notify_cb = cb_gatts_acquire_notify, + .request_acquire_notify_cb = cb_gatts_acquire_notify }; /* Forward declaration for GATT client callbacks */ @@ -213,6 +213,8 @@ static void cb_gattc_write_descriptor(int conn_id, int status, btgatt_write_para static void cb_gattc_register_for_notification(int conn_id, int registered, int status, btgatt_srvc_id_t *srvc_id, btgatt_gatt_id_t *char_id); static void cb_gattc_notify(int conn_id, btgatt_notify_params_t *p_data); +static void cb_gattc_service_changed(bt_bdaddr_t *bd_addr, int change_type, uint8_t *uuid, int conn_id, int inst_id); +static void cb_gattc_configure_mtu_cmpl(int conn_id, int status, int mtu); /*TODO GATT CLient callbacks will be implemented in subsequent patches */ static const btgatt_client_callbacks_t btgatt_client_callbacks = { @@ -227,13 +229,14 @@ static const btgatt_client_callbacks_t btgatt_client_callbacks = { .get_included_service_cb = NULL, .register_for_notification_cb = cb_gattc_register_for_notification, .notify_cb = cb_gattc_notify, + .service_changed_cb = cb_gattc_service_changed, .read_characteristic_cb = cb_gattc_read_characteristic, .write_characteristic_cb = cb_gattc_write_characteristic, .read_descriptor_cb = cb_gattc_read_descriptor, .write_descriptor_cb = cb_gattc_write_descriptor, .execute_write_cb = NULL, .read_remote_rssi_cb = NULL, - .configure_mtu_cb = NULL, + .configure_mtu_cb = cb_gattc_configure_mtu_cmpl, #ifdef PLATFORM_ANDROID_HAL .scan_filter_cfg_cb = NULL, .scan_filter_param_cb = NULL, @@ -527,6 +530,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, @@ -600,19 +620,8 @@ oal_status_t gatts_multi_adv_set_inst_data(int instance_id, adv_setup.timeout_s = adv_param_setup->timeout_s; adv_setup.server_if = gatt_servers[instance_id - 1].server_id; - if (adv_setup.manufacturer_data_len > 0 && adv_setup.manufacturer_data != NULL) { - BT_INFO("Manufacture data.....\n"); - PRINT_ADV_DATA(adv_setup.manufacturer_data_len, (unsigned char *)adv_setup.manufacturer_data, adv_setup.set_scan_rsp); - } - - if (adv_setup.service_uuid_len > 0 && adv_setup.service_uuid != NULL) { - BT_INFO("Service uuid.....\n"); - PRINT_ADV_DATA(adv_setup.service_uuid_len, (unsigned char*)adv_setup.service_uuid, FALSE); - } - ret = gatt_api->server->multi_adv_set_inst_data(adv_setup); - if (ret != BT_STATUS_SUCCESS) { BT_ERR("GATT Set Multi advertising data failed: %s", status2string(ret)); gatt_servers[instance_id - 1].state = GATT_INS_DISABLED; @@ -1230,8 +1239,7 @@ static void cb_gatts_connection(int conn_id, int server_if, int connected, bt_bd event_gatts_conn_t *event = g_new0(event_gatts_conn_t, 1); for (ins_id = 1 ; ins_id <= NUM_SERVER_INST ; ins_id++) { - if ((gatt_servers[ins_id - 1].server_id == server_if) && - (gatt_servers[ins_id - 1].state == GATT_INS_ENABLED)) { + if ((gatt_servers[ins_id - 1].server_id == server_if)) { event->server_inst = ins_id; break; } else { @@ -1390,13 +1398,10 @@ static void cb_gattc_register_app(int status, int clientIf, bt_uuid_t *app_uuid) char uuid_str[BT_UUID_STRING_MAX]; event_gattc_register_t *event; - BT_INFO("+"); - /* Check if GATT client registered for Default GATT client UUID */ uuid_to_string((service_uuid_t *)app_uuid, uuid_str); - BT_INFO("UUID:%s", uuid_str); - BT_INFO("BTGATT CLIENT REGISTER APP CB, status:%d, clientIf:%d", status, clientIf); + BT_INFO("GATT CLIENT REGISTER APP CB, status:%d, clientIf:%d, %s", status, clientIf, uuid_str); event = g_new0(event_gattc_register_t, 1); event->client_if = clientIf; event->status = (status == 0 ? OAL_STATUS_SUCCESS : OAL_STATUS_INTERNAL_ERROR); @@ -1460,7 +1465,7 @@ static void cb_gattc_search_result(int conn_id, btgatt_srvc_id_t *srvc_id) BT_INFO("BTGATT Client Service Search Result cb, conn_id:%d", conn_id); uuid_to_stringname((oal_uuid_t *)&(srvc_id->id.uuid), uuid_str); - BT_INFO("Service=> UUID: [%s], Inst_id: [%u], Type: [%s]", + BT_INFO("Service=> [%s], Inst_id [%u], Type [%s]", uuid_str, srvc_id->id.inst_id, srvc_id->is_primary ? "Primary" : "Secondary"); event_gattc_service_result_t *event = g_new0(event_gattc_service_result_t, 1); @@ -1490,9 +1495,10 @@ static void cb_gattc_get_characteristics(int conn_id, int status, btgatt_srvc_id char uuid_str1[2*BT_UUID_STRING_MAX]; char uuid_str2[2*BT_UUID_STRING_MAX]; char str[50]; + BT_INFO("BTGATT Client Get Characteristic Callback, conn_id:%d, status:%d", conn_id, status); uuid_to_stringname((oal_uuid_t *)&(srvc_id->id.uuid), uuid_str1); - BT_INFO("Service=> UUID: [%s], Inst_id: [%u], Type: [%s]", + BT_INFO("Service=> [%s], Inst_id [%u], Type [%s]", uuid_str1, srvc_id->id.inst_id, srvc_id->is_primary ? "Primary" : "Secondary"); event_gattc_characteristic_result_t *event = g_new0(event_gattc_characteristic_result_t, 1); @@ -1502,7 +1508,7 @@ static void cb_gattc_get_characteristics(int conn_id, int status, btgatt_srvc_id if (status == 0) { uuid_to_stringname((oal_uuid_t *)&(char_id->uuid), uuid_str2); - BT_INFO("Charac=> UUID: [%s], Inst_id: [%u], Prop: [%s]", + BT_INFO("Charac => [%s], Inst_id [%u], Prop [%s]", uuid_str2, char_id->inst_id, char_prop_to_string(char_prop, str)); event->char_prop = char_prop; memcpy(&(event->char_id), char_id, sizeof(oal_gatt_id_t)); @@ -1520,9 +1526,9 @@ static void cb_gattc_get_descriptor(int conn_id, int status, btgatt_srvc_id_t *s BT_INFO("BTGATT Client Get Descriptor Callback, conn_id:%d, status:%d", conn_id, status); uuid_to_stringname((oal_uuid_t *)&(srvc_id->id.uuid), uuid_str1); uuid_to_stringname((oal_uuid_t *)&(char_id->uuid), uuid_str2); - BT_INFO("Service=> UUID: [%s], Inst_id: [%u], Type: [%s]", + BT_INFO("Service=> [%s], Inst_id [%u], Type [%s]", uuid_str1, srvc_id->id.inst_id, srvc_id->is_primary ? "Primary" : "Secondary"); - BT_INFO("Charac=> UUID: [%s], Inst_id: [%u]", uuid_str2, char_id->inst_id); + BT_INFO("Charac => [%s], Inst_id [%u]", uuid_str2, char_id->inst_id); event_gattc_descriptor_result_t *event = g_new0(event_gattc_descriptor_result_t, 1); event->conn_status.conn_id = conn_id; @@ -1532,7 +1538,7 @@ static void cb_gattc_get_descriptor(int conn_id, int status, btgatt_srvc_id_t *s if (status == 0) { uuid_to_stringname((oal_uuid_t *)&(descr_id->uuid), uuid_str3); - BT_INFO("Desc=> UUID: [%s], Inst_id: [%u]", uuid_str3, descr_id->inst_id); + BT_INFO("Desc => [%s], Inst_id [%u]", uuid_str3, descr_id->inst_id); memcpy(&(event->descr_id), descr_id, sizeof(oal_gatt_id_t)); } send_event(OAL_EVENT_GATTC_DESC_SERACH_RESULT, event, sizeof(*event)); @@ -1546,8 +1552,8 @@ static void cb_gattc_register_for_notification(int client_if, int registered, in client_if, status, registered == 1 ? "REGISTERED" : "DEREGISTERED"); uuid_to_stringname((oal_uuid_t *)&(srvc_id->id.uuid), uuid_str1); uuid_to_stringname((oal_uuid_t *)&(char_id->uuid), uuid_str2); - BT_INFO("Service=> UUID: [%s], Inst_id: [%u], Type: [%s]", uuid_str1, srvc_id->id.inst_id, srvc_id->is_primary ? "Primary" : "Secondary"); - BT_INFO("Charac=> UUID: [%s], Inst_id: [%u]", uuid_str2, char_id->inst_id); + BT_INFO("Service=> [%s], Inst_id [%u], Type [%s]", uuid_str1, srvc_id->id.inst_id, srvc_id->is_primary ? "Primary" : "Secondary"); + BT_INFO("Charac => [%s], Inst_id [%u]", uuid_str2, char_id->inst_id); event_gattc_regdereg_notify_t *event = g_new0(event_gattc_regdereg_notify_t, 1); oal_event_t event_type = (registered == 1 ? OAL_EVENT_GATTC_NOTIFICATION_REGISTERED : OAL_EVENT_GATTC_NOTIFICATION_DEREGISTERED); @@ -1572,9 +1578,9 @@ static void cb_gattc_notify(int conn_id, btgatt_notify_params_t *p_data) uuid_to_stringname((oal_uuid_t *)&(p_data->srvc_id.id.uuid), uuid_str1); uuid_to_stringname((oal_uuid_t *)&(p_data->char_id.uuid), uuid_str2); - BT_INFO("Service=> UUID: [%s], Inst_id: [%u], Type: [%s]", + BT_INFO("Service=> [%s], Inst_id [%u], Type [%s]", uuid_str1, p_data->srvc_id.id.inst_id, p_data->srvc_id.is_primary ? "Primary" : "Secondary"); - BT_INFO("Charac=> UUID: [%s], Inst_id: [%u]", uuid_str2, p_data->char_id.inst_id); + BT_INFO("Charac => [%s], Inst_id [%u]", uuid_str2, p_data->char_id.inst_id); if (p_data->len > 0) { char *data = NULL; @@ -1600,6 +1606,18 @@ static void cb_gattc_notify(int conn_id, btgatt_notify_params_t *p_data) } } +static void cb_gattc_service_changed(bt_bdaddr_t *bd_addr, int change_type, uint8_t *uuid, int conn_id, int inst_id) +{ + event_gattc_service_changed_data *event = g_new0(event_gattc_service_changed_data, 1); + + memcpy(event->address.addr, bd_addr->address, 6); + event->change_type = change_type; + memcpy(event->uuid.uuid, uuid, sizeof(event->uuid.uuid)); + event->conn_id = conn_id; + event->inst_id = inst_id; + + send_event_bda_trace(OAL_EVENT_GATTC_SERVICE_CHANGED_IND, event, sizeof(*event), (bt_address_t *)bd_addr); +} static void cb_gattc_read_characteristic(int conn_id, int status, btgatt_read_params_t *p_data) { @@ -1616,10 +1634,10 @@ static void cb_gattc_read_characteristic(int conn_id, int status, btgatt_read_pa if (status == 0) { uuid_to_stringname((oal_uuid_t *)&(p_data->srvc_id.id.uuid), uuid_str1); uuid_to_stringname((oal_uuid_t *)&(p_data->char_id.uuid), uuid_str2); - BT_INFO("Service=> UUID: [%s], Inst_id: [%u], Type: [%s]", uuid_str1, + BT_INFO("Service=> [%s], Inst_id [%u], Type [%s]", uuid_str1, p_data->srvc_id.id.inst_id, p_data->srvc_id.is_primary ? "Primary" : "Secondary"); - BT_INFO("Charac=> UUID: [%s], Inst_id: [%u]", uuid_str2, p_data->char_id.inst_id); - BT_INFO("Len: %u, value_type: %u", p_data->value.len, p_data->value_type); + BT_INFO("Charac => [%s], Inst_id [%u]", uuid_str2, p_data->char_id.inst_id); + BT_DBG("Len: %u, value_type: %u", p_data->value.len, p_data->value_type); if (p_data->value.len > 0 && event->value_type == GATTC_READ_VALUE_TYPE_VALUE) { char *data = NULL; data = g_malloc(3*p_data->value.len+1); @@ -1629,7 +1647,7 @@ static void cb_gattc_read_characteristic(int conn_id, int status, btgatt_read_pa return; } convert_hex_2_str((unsigned char *)p_data->value.value, p_data->value.len, data); - BT_INFO("Read Data: [%s]", data); + BT_DBG("Read Data: [%s]", data); event->data_len = p_data->value.len; memcpy(&(event->data), &(p_data->value.value), event->data_len); g_free(data); @@ -1652,9 +1670,9 @@ static void cb_gattc_write_characteristic(int conn_id, int status, btgatt_write_ if (status == 0) { uuid_to_stringname((oal_uuid_t *)&(p_data->srvc_id.id.uuid), uuid_str1); uuid_to_stringname((oal_uuid_t *)&(p_data->char_id.uuid), uuid_str2); - BT_INFO("Service=> UUID: [%s], Inst_id: [%u], Type: [%s]", uuid_str1, + BT_INFO("Service=> [%s], Inst_id [%u], Type [%s]", uuid_str1, p_data->srvc_id.id.inst_id, p_data->srvc_id.is_primary ? "Primary" : "Secondary"); - BT_INFO("Charac=> UUID: [%s], Inst_id: [%u]", uuid_str2, p_data->char_id.inst_id); + BT_INFO("Charac => [%s], Inst_id [%u]", uuid_str2, p_data->char_id.inst_id); } send_event(OAL_EVENT_GATTC_WRITE_CHARAC, event, sizeof(*event)); } @@ -1676,10 +1694,10 @@ static void cb_gattc_write_descriptor(int conn_id, int status, btgatt_write_para uuid_to_stringname((oal_uuid_t *)&(p_data->srvc_id.id.uuid), uuid_str1); uuid_to_stringname((oal_uuid_t *)&(p_data->char_id.uuid), uuid_str2); uuid_to_stringname((oal_uuid_t *)&(p_data->descr_id.uuid), uuid_str3); - BT_INFO("Service=> UUID: [%s], Inst_id: [%u], Type: [%s]", uuid_str1, + BT_INFO("Service=> [%s], Inst_id [%u], Type [%s]", uuid_str1, p_data->srvc_id.id.inst_id, p_data->srvc_id.is_primary ? "Primary" : "Secondary"); - BT_INFO("Charac=> UUID: [%s], Inst_id: [%u]", uuid_str2, p_data->char_id.inst_id); - BT_INFO("Desc=> UUID: [%s], Inst_id: [%u]", uuid_str3, p_data->descr_id.inst_id); + BT_INFO("Charac => [%s], Inst_id [%u]", uuid_str2, p_data->char_id.inst_id); + BT_INFO("Desc => [%s], Inst_id [%u]", uuid_str3, p_data->descr_id.inst_id); } send_event(OAL_EVENT_GATTC_WRITE_DESCR, event, sizeof(*event)); } @@ -1705,11 +1723,11 @@ static void cb_gattc_read_descriptor(int conn_id, int status, btgatt_read_params uuid_to_stringname((oal_uuid_t *)&(p_data->srvc_id.id.uuid), uuid_str1); uuid_to_stringname((oal_uuid_t *)&(p_data->char_id.uuid), uuid_str2); uuid_to_stringname((oal_uuid_t *)&(p_data->descr_id.uuid), uuid_str3); - BT_INFO("Service=> UUID: [%s], Inst_id: [%u], Type: [%s]", uuid_str1, + BT_INFO("Service=> [%s], Inst_id [%u], Type [%s]", uuid_str1, p_data->srvc_id.id.inst_id, p_data->srvc_id.is_primary ? "Primary" : "Secondary"); - BT_INFO("Charac=> UUID: [%s], Inst_id: [%u]", uuid_str2, p_data->char_id.inst_id); - BT_INFO("Desc=> UUID: [%s], Inst_id: [%u]", uuid_str3, p_data->descr_id.inst_id); - BT_INFO("Len: %u, value_type: %u", p_data->value.len, p_data->value_type); + BT_INFO("Charac => [%s], Inst_id [%u]", uuid_str2, p_data->char_id.inst_id); + BT_INFO("Desc => [%s], Inst_id [%u]", uuid_str3, p_data->descr_id.inst_id); + BT_DBG("Len: %u, value_type: %u", p_data->value.len, p_data->value_type); if (p_data->value.len > 0 && event->value_type == GATTC_READ_VALUE_TYPE_VALUE) { char *data = NULL; data = g_malloc(3*p_data->value.len+1); @@ -1719,7 +1737,7 @@ static void cb_gattc_read_descriptor(int conn_id, int status, btgatt_read_params return; } convert_hex_2_str((unsigned char *)p_data->value.value, p_data->value.len, data); - BT_INFO("Read Data: [%s]", data); + BT_DBG("Read Data: [%s]", data); event->data_len = p_data->value.len; memcpy(&(event->data), &(p_data->value.value), event->data_len); g_free(data); @@ -1742,7 +1760,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; } @@ -1758,8 +1775,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; } @@ -1786,6 +1802,19 @@ oal_status_t gattc_set_le_scan_param(int scan_type, int itv, int win) return OAL_STATUS_SUCCESS; } + +static void cb_gattc_configure_mtu_cmpl(int conn_id, int status, int mtu) +{ + event_gattc_mtu_configured_t *event; + BT_INFO("BTGATT Client configure mtu complete Callback, conn_id: %d, status: %d, mtu: %d", + conn_id, status, mtu); + event = g_new0(event_gattc_mtu_configured_t, 1); + event->conn_id = conn_id; + event->mtu = mtu; + event->status = convert_to_oal_status(status); + send_event(OAL_EVENT_GATTC_MTU_EXCHANGE_COMPLETED, event, sizeof(*event)); +} + /************************************ GATT Client ***********************************/ oal_status_t gattc_register(oal_uuid_t* client_uuid) { @@ -2153,3 +2182,304 @@ oal_status_t gattc_conn_param_update(bt_address_t * address, int min, int max, i } return OAL_STATUS_SUCCESS; } + +oal_status_t gattc_unregister_scan_filter(int slot_id) +{ + int ret; + int client_if = 0; + + API_TRACE(""); + CHECK_OAL_GATT_ENABLED(); + + BT_INFO("Remove Scan filter Slot ID is: [%d]", slot_id); + + ret = gatt_api->client->scan_filter_clear(client_if, slot_id); + 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_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; +} + +oal_status_t gattc_configure_mtu(int conn_id, int mtu) +{ + int ret; + + API_TRACE("Configure MTU Size: [%d]", mtu); + CHECK_OAL_GATT_ENABLED(); + CHECK_CLIENT_CONNECTION(conn_id); + + /* To prevent crash in case other libraries not support this api */ + if (gatt_api->client->configure_mtu == NULL) { + BT_WARN("configure_mtu is NULL"); + return OAL_STATUS_NOT_SUPPORT; + } + + ret = gatt_api->client->configure_mtu(conn_id, mtu); + if (ret != BT_STATUS_SUCCESS) { + BT_ERR("Gatt client configure_mtu error: %s", status2string(ret)); + return convert_to_oal_status(ret); + } + return OAL_STATUS_SUCCESS; +} + +oal_status_t gattc_add_connection_info(bt_address_t *device_address, int conn_id, int server_inst_id) +{ + int ret = OAL_STATUS_SUCCESS; + bdstr_t bdstr; + + OAL_CHECK_PARAMETER(device_address, return); + API_TRACE("Add connection info: [%s]", bdt_bd2str(device_address, &bdstr)); + CHECK_OAL_GATT_ENABLED(); + CHECK_SERVER_INSTANCE(server_inst_id); + CHECK_SERVER_REGISTRATION(server_inst_id); + + ret = gatt_api->client->add_connection_info((bt_bdaddr_t *)device_address, conn_id, server_inst_id); + if (ret != BT_STATUS_SUCCESS) { + BT_ERR("GATT connection info add failed: %s", status2string(ret)); + return convert_to_oal_status(ret); + } + return OAL_STATUS_SUCCESS; +} +