X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=bt-oal%2Foal-gatt.c;h=4fd15132fdd1a044409b022ba0987cc2f0f53a2a;hb=c7066bff9deea4b9d79fd4a089dffe93c72686f8;hp=6d5d203c78a8e2faa9ddb3091befa174b7f6296d;hpb=ee95e3eee6f058c4214748b47784c2137aa9a646;p=platform%2Fcore%2Fconnectivity%2Fbluetooth-frwk.git diff --git a/bt-oal/oal-gatt.c b/bt-oal/oal-gatt.c index 6d5d203..4fd1513 100644 --- a/bt-oal/oal-gatt.c +++ b/bt-oal/oal-gatt.c @@ -32,7 +32,6 @@ #define MAX_PROP_LEN 95 /* SVACE WGID: 324403*/ #define MAX_PERM_LEN 80 //Fix for svace wgid:324402 -#define NUM_SERVER_INST 10 // Maximum slots supported by stack is set to 10 #define CHECK_OAL_GATT_ENABLED() \ do { \ if (gatt_api == NULL) { \ @@ -43,27 +42,19 @@ #define CHECK_SERVER_INSTANCE(instance_id) \ do { \ - if (instance_id < 1 || instance_id > NUM_SERVER_INST) { \ + if (instance_id < 1) { \ BT_ERR("Invalid Instance"); \ return OAL_STATUS_INVALID_PARAM; \ } \ } while (0) -#define CHECK_SERVER_REGISTRATION(instance_id) \ +#define CHECK_CORRECT_SERVER_ID(server_if, server_inst) \ do { \ - if (gatt_servers[instance_id - 1].server_id < 0) {\ - BT_INFO("GATT server registeration is not done for server Instance : %d", instance_id);\ - return OAL_STATUS_INTERNAL_ERROR;\ - } \ - } while (0) - -#define CHECK_CORRECT_SERVER_ID(instance_id, server_if, server_inst)\ - do { \ - for (instance_id = 1 ; instance_id <= NUM_SERVER_INST; instance_id++) { \ - if (gatt_servers[instance_id - 1].server_id == server_if) { \ - server_inst = instance_id; \ - goto sendevent;\ - } \ + gatt_server_t *info; \ + info = __gatts_find_server_instance(server_if); \ + if (info) { \ + server_inst = server_if; \ + goto sendevent; \ } \ } while (0) @@ -106,9 +97,10 @@ typedef enum { } gatt_data_state; typedef struct { - int server_id; + int instance_id; oal_uuid_t uuid; int state; + gboolean cur_adv_state; } gatt_server_t; const char *oal_device_type[] = { @@ -125,8 +117,7 @@ typedef enum { } oal_pending_gattc_req_e; static const btgatt_interface_t * gatt_api; -static gboolean cur_adv_state[NUM_SERVER_INST]; -static gatt_server_t gatt_servers[NUM_SERVER_INST]; +static GSList *gatt_servers = NULL; /* List of gatt_server_t */ /* Forward declarations of GATT Server callbacks */ static void cb_gatts_register_app(int status, int server_if, bt_uuid_t *uuid); @@ -192,12 +183,13 @@ 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 */ static void cb_gattc_register_app(int status, int clientIf, bt_uuid_t *app_uuid); -static void cb_gattc_scan_result(bt_bdaddr_t* bdaddress, int rssi, uint8_t *adv_data); +static void cb_gattc_scan_result(bt_bdaddr_t* bdaddress, uint8_t addr_type, int rssi, + uint8_t *adv_data, int adv_data_len, uint8_t *scan_rsp_data, int scan_rsp_data_len); static void cb_gattc_connection(int conn_id, int status, int client_if, bt_bdaddr_t* bda); static void cb_gattc_disconnect(int conn_id, int status, int client_if, bt_bdaddr_t* bda); static void cb_gattc_search_result(int conn_id, btgatt_srvc_id_t *srvc_id); @@ -213,6 +205,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 +221,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, @@ -258,14 +253,6 @@ oal_status_t gatt_enable(void) { const bt_interface_t * blued_api; int ret; - int i = 0; - - for (i = 0; i < NUM_SERVER_INST; i++) { - gatt_servers[i].server_id = -1; - gatt_servers[i].state = GATT_INS_DISABLED; - memset(&gatt_servers[i].uuid, 0, sizeof(oal_uuid_t)); - cur_adv_state[i] = FALSE; - } /* Get stack interface */ blued_api = (const bt_interface_t *) adapter_get_stack_interface(); @@ -299,37 +286,52 @@ oal_status_t gatt_enable(void) oal_status_t gatt_disable(void) { - int i; if (gatt_api) { gatt_api->cleanup(); gatt_api = NULL; } - for (i = 0; i < NUM_SERVER_INST; i++) { - gatt_servers[i].server_id = -1; - gatt_servers[i].state = GATT_INS_DISABLED; - memset(&gatt_servers[i].uuid, 0, sizeof(oal_uuid_t)); - } + g_slist_free_full(gatt_servers, g_free); + gatt_servers = NULL; return OAL_STATUS_SUCCESS; } +static gatt_server_t *__gatts_find_server_instance(int instance_id) +{ + gatt_server_t *info; + GSList *l; + + for (l = gatt_servers; l; l = g_slist_next(l)) { + info = l->data; + if (!info) + continue; + if (info->instance_id == instance_id) + return info; + } + + return NULL; +} + /************************************GATT Server Functions*************************************/ /*Public */ oal_status_t gatts_register(oal_uuid_t* server_uuid) { char str[2*BT_UUID_STRING_MAX]; int ret = OAL_STATUS_SUCCESS; - int i; + GSList *l; CHECK_OAL_GATT_ENABLED(); uuid_to_stringname((service_uuid_t*)server_uuid->uuid, str); API_TRACE("Register the server instance: UUID: [%s]", str); - for (i = 0; i < NUM_SERVER_INST; i++) { - if (memcmp(server_uuid->uuid, gatt_servers[i].uuid.uuid, sizeof(oal_uuid_t)) == 0) { - if (gatt_servers[i].server_id != -1) { - BT_ERR("This is resevered UUID for easy set up application i = %d \ - gatt_servers[i].server_id = %d", i, gatt_servers[i].server_id); + for (l = gatt_servers; l; l = g_slist_next(l)) { + gatt_server_t *info = l->data; + if (!info) + continue; + if (memcmp(server_uuid->uuid, info->uuid.uuid, sizeof(oal_uuid_t)) == 0) { + if (info->instance_id != -1) { + BT_ERR("This is resevered UUID for easy set up application \ + instance_id = %d", info->instance_id); return OAL_STATUS_ALREADY_DONE; } } @@ -347,24 +349,30 @@ oal_status_t gatts_register(oal_uuid_t* server_uuid) oal_status_t gatts_unregister(int instance_id) { int ret = OAL_STATUS_SUCCESS; + gatt_server_t *info; API_TRACE("Unregister the registered server, instance_id: %d", instance_id); CHECK_OAL_GATT_ENABLED(); CHECK_SERVER_INSTANCE(instance_id); - CHECK_SERVER_REGISTRATION(instance_id); - ret = gatt_api->server->unregister_server(gatt_servers[instance_id - 1].server_id); + info = __gatts_find_server_instance(instance_id); + if (!info) + return OAL_STATUS_INTERNAL_ERROR; + ret = gatt_api->server->unregister_server(instance_id); if (ret != BT_STATUS_SUCCESS) { BT_ERR("GATT server unregistration failed: %d", instance_id); return convert_to_oal_status(ret); } - gatt_servers[instance_id-1].server_id = -1; - gatt_servers[instance_id-1].state = GATT_INS_DISABLED; - - if (instance_id != 1 && instance_id != 2) - memset(&gatt_servers[instance_id-1].uuid, 0, sizeof(oal_uuid_t)); + info->instance_id = -1; + info->state = GATT_INS_DISABLED; + info->cur_adv_state = FALSE; + if (instance_id != 1 && instance_id != 2) { + gatt_servers = g_slist_remove(gatt_servers, info); + BT_DBG("GATT Server Removed. count of gatt_servers: %d", + g_slist_length(gatt_servers)); + } return OAL_STATUS_SUCCESS; } @@ -373,17 +381,21 @@ oal_status_t gatts_unregister(int instance_id) oal_status_t gatts_start_listen(int instance_id, gboolean enable) { int ret = OAL_STATUS_SUCCESS; - API_TRACE("server-id:%d enable: %d", gatt_servers[instance_id-1].server_id, enable); + gatt_server_t *info; + API_TRACE("instance_id: %d enable: %d", instance_id, enable); CHECK_OAL_GATT_ENABLED(); CHECK_SERVER_INSTANCE(instance_id); - CHECK_SERVER_REGISTRATION(instance_id); - - ret = gatt_api->server->listen(gatt_servers[instance_id-1].server_id, enable); + info = __gatts_find_server_instance(instance_id); + if (!info) + return OAL_STATUS_INTERNAL_ERROR; + ret = gatt_api->server->listen(instance_id, enable); if (ret != BT_STATUS_SUCCESS) { - BT_ERR("Error:Advertising start/stop on server-id:%d failed With Status: [%s]", - gatt_servers[instance_id-1].server_id, status2string(ret)); + BT_ERR("Error:Advertising %s on instance_id: %d failed \ + with status: %s, cur_adv_state: %d", + enable ? "Start" : "Stop", instance_id, + status2string(ret), info->cur_adv_state); return convert_to_oal_status(ret); } @@ -397,10 +409,10 @@ oal_status_t gatts_stop_advertising(int instance_id) CHECK_OAL_GATT_ENABLED(); CHECK_SERVER_INSTANCE(instance_id); - CHECK_SERVER_REGISTRATION(instance_id); - - ret = gatt_api->server->listen(gatt_servers[instance_id - 1].server_id, FALSE); + if (__gatts_find_server_instance(instance_id) == NULL) + return OAL_STATUS_INTERNAL_ERROR; + ret = gatt_api->server->listen(instance_id, FALSE); if (ret != BT_STATUS_SUCCESS) { BT_ERR("Stop Advertising failed for server Instance:%d With Status: %s", instance_id, status2string(ret)); @@ -456,12 +468,14 @@ oal_status_t gatts_set_scan_response(int instance_id, uint16_t manufac_len, char oal_status_t gatts_multi_adv_enable(int instance_id) { int ret = OAL_STATUS_SUCCESS; - API_TRACE("Start Multi advertising, srv_if: %d, instance_id: %d", - gatt_servers[instance_id - 1].server_id, instance_id); + gatt_server_t *info; + API_TRACE("Start Multi advertising, instance_id: %d", instance_id); CHECK_OAL_GATT_ENABLED(); CHECK_SERVER_INSTANCE(instance_id); - CHECK_SERVER_REGISTRATION(instance_id); + info = __gatts_find_server_instance(instance_id); + if (!info) + return OAL_STATUS_INTERNAL_ERROR; if (gatt_api->server->multi_adv_enable == NULL) return OAL_STATUS_NOT_SUPPORT; @@ -473,22 +487,17 @@ oal_status_t gatts_multi_adv_enable(int instance_id) return OAL_STATUS_BUSY; } */ - if (gatt_servers[instance_id - 1].state == GATT_INS_ENABLED) { - BT_ERR("Not allowed, state: %d, instance_id: %d", - gatt_servers[instance_id - 1].state, instance_id); - return OAL_STATUS_ALREADY_DONE; - } - if (gatt_servers[instance_id - 1].state == GATT_INS_ENABLING) { - BT_ERR("Not allowed, state: %d, instance_id: %d", - gatt_servers[instance_id - 1].state, instance_id); + if (info->state == GATT_INS_ENABLED) { + BT_ERR("Not allowed, state: %d, instance_id: %d", info->state, instance_id); + return OAL_STATUS_ALREADY_DONE; + } else if (info->state == GATT_INS_ENABLING) { + BT_ERR("Not allowed, state: %d, instance_id: %d", info->state, instance_id); return OAL_STATUS_BUSY; } + info->state = GATT_INS_ENABLING; - gatt_servers[instance_id - 1].state = GATT_INS_ENABLING; - - ret = gatt_api->server->multi_adv_enable(gatt_servers[instance_id - 1].server_id); - + ret = gatt_api->server->multi_adv_enable(instance_id); if (ret != BT_STATUS_SUCCESS) { BT_ERR("GATT enable multi advertising failed for server Instance: %d With Status: %s", instance_id, status2string(ret)); @@ -501,24 +510,24 @@ oal_status_t gatts_multi_adv_enable(int instance_id) oal_status_t gatts_multi_adv_disable(int instance_id) { int ret = OAL_STATUS_SUCCESS; - API_TRACE("Stop Multi advertising, srv_if: %d, instance_id: %d", - gatt_servers[instance_id - 1].server_id, instance_id); + gatt_server_t *info; + API_TRACE("Stop Multi advertising, instance_id: %d", instance_id); CHECK_OAL_GATT_ENABLED(); CHECK_SERVER_INSTANCE(instance_id); - CHECK_SERVER_REGISTRATION(instance_id); + info = __gatts_find_server_instance(instance_id); + if (!info) + return OAL_STATUS_INTERNAL_ERROR; if (gatt_api->server->multi_adv_disable == NULL) return OAL_STATUS_NOT_SUPPORT; - if ((gatt_servers[instance_id - 1].state != GATT_INS_ENABLED)) { - BT_ERR("Not Allowed, state: %d, instance_id: %d", - gatt_servers[instance_id - 1].state, instance_id); + if (info->state != GATT_INS_ENABLED) { + BT_ERR("Not Allowed, state: %d, instance_id: %d", info->state, instance_id); return OAL_STATUS_BUSY; } - ret = gatt_api->server->multi_adv_disable(gatt_servers[instance_id - 1].server_id); - + ret = gatt_api->server->multi_adv_disable(instance_id); if (ret != BT_STATUS_SUCCESS) { BT_ERR("GATT disable multi advertising failed for server Instance: %d With Status: %s", instance_id, status2string(ret)); @@ -527,6 +536,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, @@ -537,16 +563,16 @@ oal_status_t gatts_multi_adv_update(int instance_id, CHECK_OAL_GATT_ENABLED(); CHECK_SERVER_INSTANCE(instance_id); - CHECK_SERVER_REGISTRATION(instance_id); + if (__gatts_find_server_instance(instance_id) == NULL) + return OAL_STATUS_INTERNAL_ERROR; if (gatt_api->server->multi_adv_update == NULL) return OAL_STATUS_NOT_SUPPORT; - ret = gatt_api->server->multi_adv_update(gatt_servers[instance_id - 1].server_id, + ret = gatt_api->server->multi_adv_update(instance_id, min_intv, max_intv, adv_type, chnl_map, tx_power, timeout_s); - if (ret != BT_STATUS_SUCCESS) { BT_ERR("GATT update multi advertising failed for server Instance: %d With Status: %s", instance_id, status2string(ret)); @@ -560,23 +586,23 @@ oal_status_t gatts_multi_adv_set_inst_data(int instance_id, { int ret = OAL_STATUS_SUCCESS; btgatt_adv_param_setup_t adv_setup; - API_TRACE("Set Multi advertising data, srv_if: %d, instance_id: %d", - gatt_servers[instance_id - 1].server_id, instance_id); + gatt_server_t *info; + API_TRACE("Set Multi advertising data, instance_id: %d", instance_id); CHECK_OAL_GATT_ENABLED(); CHECK_SERVER_INSTANCE(instance_id); - CHECK_SERVER_REGISTRATION(instance_id); + info = __gatts_find_server_instance(instance_id); + if (!info) + return OAL_STATUS_INTERNAL_ERROR; if (gatt_api->server->multi_adv_set_inst_data == NULL) return OAL_STATUS_NOT_SUPPORT; - if ((gatt_servers[instance_id - 1].state >= GATT_INS_DATA_SETTING) && (gatt_servers[instance_id - 1].state != GATT_INS_DATA_SET)) { - BT_ERR("Not Allowed, state: %d, instance_id: %d", gatt_servers[instance_id - 1].state, instance_id); + if (info->state >= GATT_INS_DATA_SETTING && info->state != GATT_INS_DATA_SET) { + BT_ERR("Not Allowed, state: %d, instance_id: %d", info->state, instance_id); return OAL_STATUS_BUSY; } - - gatt_servers[instance_id - 1].state = GATT_INS_DATA_SETTING; - + info->state = GATT_INS_DATA_SETTING; adv_setup.set_scan_rsp = adv_param_setup->set_scan_rsp; adv_setup.include_name = adv_param_setup->include_name; @@ -599,23 +625,12 @@ oal_status_t gatts_multi_adv_set_inst_data(int instance_id, adv_setup.tx_power = adv_param_setup->tx_power; 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); - } - + adv_setup.server_if = instance_id; 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; + info->state = GATT_INS_DISABLED; return convert_to_oal_status(ret); } return OAL_STATUS_SUCCESS; @@ -630,11 +645,12 @@ oal_status_t gatts_disconnect(int instance_id, bt_address_t *device_address, int CHECK_OAL_GATT_ENABLED(); CHECK_SERVER_INSTANCE(instance_id); - CHECK_SERVER_REGISTRATION(instance_id); + if (__gatts_find_server_instance(instance_id) == NULL) + return OAL_STATUS_INTERNAL_ERROR; API_TRACE("[%s]", bdt_bd2str(device_address, &bdstr)); - ret = gatt_api->server->disconnect(gatt_servers[instance_id - 1].server_id, (bt_bdaddr_t *) device_address, conn_id); + ret = gatt_api->server->disconnect(instance_id, (bt_bdaddr_t *) device_address, conn_id); if (ret != BT_STATUS_SUCCESS) { BT_ERR("GATT Server disconnect failed: %s", status2string(ret)); return convert_to_oal_status(ret); @@ -647,54 +663,46 @@ oal_status_t gatts_disconnect(int instance_id, bt_address_t *device_address, int /*Server Callbacks*/ static void cb_gatts_register_app(int status, int server_if, bt_uuid_t *uuid) { - int i; char str[2*BT_UUID_STRING_MAX]; uuid_to_stringname((service_uuid_t*)uuid, str); event_gatts_register_t *event = g_malloc0(sizeof(event_gatts_register_t)); - BT_INFO("BTGATT SERVER REGISTER APP CB, status:%d, server_if:%d", status, server_if); - BT_INFO("UUID: [%s]", str); + BT_INFO("BTGATT SERVER REGISTER APP CB, UUID:%s, status:%d, server_if:%d", + str, status, server_if); - for (i = 0; i < NUM_SERVER_INST; i++) { - if (gatt_servers[i].server_id == -1) { - BT_INFO("Server Instance registered with stack [%d]", i+1); - gatt_servers[i].server_id = server_if; - event->server_inst = i+1; - memcpy(gatt_servers[i].uuid.uuid, uuid->uu, sizeof(bt_uuid_t)); - memcpy(event->server_uuid.uuid, uuid->uu, sizeof(bt_uuid_t)); - break; - } - } + gatt_server_t *info = g_malloc0(sizeof(gatt_server_t)); + info->instance_id = server_if; + memcpy(info->uuid.uuid, uuid->uu, sizeof(bt_uuid_t)); + gatt_servers = g_slist_append(gatt_servers, info); + BT_DBG("GATT Server Added. count of gatt_servers: %d", g_slist_length(gatt_servers)); + + event->server_inst = server_if; + memcpy(event->server_uuid.uuid, uuid->uu, sizeof(bt_uuid_t)); send_event(OAL_EVENT_BLE_SERVER_INSTANCE_INITIALISED, event, sizeof(event_gatts_register_t)); } static void cb_gatts_listen(int status, int server_if) { - gboolean prev_state[NUM_SERVER_INST]; - gboolean new_state; + gboolean prev_state; + gboolean new_state = FALSE; event_ble_adv_status *event = g_malloc0(sizeof(event_ble_adv_status)); - int instance_id; - - for (instance_id = 1 ; instance_id <= NUM_SERVER_INST ; instance_id++) { - if (gatt_servers[instance_id - 1].server_id == server_if) { - event->server_inst = instance_id; + GSList *l; + + for (l = gatt_servers; l; l = g_slist_next(l)) { + gatt_server_t *info = l->data; + if (!info) + continue; + if (info->instance_id == server_if) { + event->server_inst = server_if; + prev_state = info->cur_adv_state; + new_state = (status == BT_STATUS_SUCCESS) ? !prev_state : prev_state; + info->cur_adv_state = new_state; break; - } else { - BT_WARN("Server ID:%d recevied server Id:%d\n", gatt_servers[instance_id - 1].server_id, server_if); } } - if ((event->server_inst > 0) && (event->server_inst <= 10)) { - prev_state[event->server_inst - 1] = cur_adv_state[event->server_inst - 1]; - new_state = (status == BT_STATUS_SUCCESS) ? !(prev_state[event->server_inst - 1]) : (prev_state[event->server_inst - 1]); - cur_adv_state[event->server_inst - 1] = new_state; - } else { - BT_ERR("Invalid Callback..."); - g_free(event); - return; - } - BT_INFO("Adv State of server instance %d :%d", instance_id, new_state); + BT_INFO("Adv State of server instance %d, new_state: %d", server_if, new_state); if (TRUE == new_state) send_event(OAL_EVENT_BLE_ADVERTISING_STARTED, event, sizeof(event_ble_adv_status)); @@ -707,19 +715,21 @@ static void cb_gatts_multi_adv_enable(int server_if, int status) BT_INFO("BTGATT SERVER MULTI ADV ENABLE CB, status:%d, srv_if: %d", status, server_if); event_ble_multiadv_status *event = g_malloc0(sizeof(event_ble_multiadv_status)); - int instance_id; + GSList *l; if (status != BT_STATUS_SUCCESS) BT_ERR("MULTI ADV ENABLE failed, status:%d, srv_if: %d", status, server_if); - for (instance_id = 1 ; instance_id <= NUM_SERVER_INST ; instance_id++) { - if (gatt_servers[instance_id - 1].server_id == server_if) { - event->server_inst = instance_id; - gatt_servers[instance_id - 1].state = GATT_INS_ENABLED; + for (l = gatt_servers; l; l = g_slist_next(l)) { + gatt_server_t *info = l->data; + if (!info) + continue; + if (info->instance_id == server_if) { + event->server_inst = server_if; + info->state = GATT_INS_ENABLED; goto sendevent; } } - BT_ERR("Invalid Interface, srv_if: %d", server_if); event->server_inst = -1; sendevent: event->status = convert_to_oal_status(status); @@ -730,19 +740,21 @@ static void cb_gatts_multi_adv_disable(int server_if, int status) { BT_INFO("BTGATT SERVER MULTI ADV DISABLE CB, status:%d, srv_if: %d", status, server_if); event_ble_multiadv_status *event = g_malloc0(sizeof(event_ble_multiadv_status)); - int instance_id; + GSList *l; if (status != BT_STATUS_SUCCESS) BT_ERR("MULTI ADV DISABLE failed, status:%d, srv_if: %d", status, server_if); - for (instance_id = 1 ; instance_id <= NUM_SERVER_INST; instance_id++) { - if (gatt_servers[instance_id - 1].server_id == server_if) { - event->server_inst = instance_id; - gatt_servers[instance_id - 1].state = GATT_INS_DISABLED; + for (l = gatt_servers; l; l = g_slist_next(l)) { + gatt_server_t *info = l->data; + if (!info) + continue; + if (info->instance_id == server_if) { + event->server_inst = server_if; + info->state = GATT_INS_DISABLED; goto sendevent; } } - BT_ERR("Invalid Interface, srv_if: %d", server_if); event->server_inst = -1; sendevent: event->status = convert_to_oal_status(status); @@ -753,18 +765,20 @@ static void cb_gatts_multi_adv_update(int server_if, int status) { BT_INFO("BTGATT SERVER MULTI ADV UPDATE CB, status:%d, srv_if: %d", status, server_if); event_ble_multiadv_status *event = g_malloc0(sizeof(event_ble_multiadv_status)); - int instance_id; + GSList *l; if (status != BT_STATUS_SUCCESS) BT_ERR("MULTI ADV UPDATE failed, status:%d, srv_if: %d", status, server_if); - for (instance_id = 1 ; instance_id <= NUM_SERVER_INST ; instance_id++) { - if (gatt_servers[instance_id - 1].server_id == server_if) { - event->server_inst = instance_id; + for (l = gatt_servers; l; l = g_slist_next(l)) { + gatt_server_t *info = l->data; + if (!info) + continue; + if (info->instance_id == server_if) { + event->server_inst = server_if; goto sendevent; } } - BT_ERR("Invalid Interface, srv_if: %d", server_if); event->server_inst = -1; sendevent: event->status = convert_to_oal_status(status); @@ -775,19 +789,21 @@ static void cb_gatts_multi_adv_set_inst_data(int server_if, int status) { BT_INFO("BTGATT SERVER MULTI ADV SET INST DATA CB, status:%d, srv_if: %d", status, server_if); event_ble_multiadv_status *event = g_malloc0(sizeof(event_ble_multiadv_status)); - int instance_id; + GSList *l; if (status != BT_STATUS_SUCCESS) BT_ERR("MULTI ADV SET DATA failed, status:%d, srv_if: %d", status, server_if); - for (instance_id = 1 ; instance_id <= NUM_SERVER_INST ; instance_id++) { - if (gatt_servers[instance_id - 1].server_id == server_if) { - event->server_inst = instance_id; - gatt_servers[instance_id - 1].state = GATT_INS_DATA_SET; + for (l = gatt_servers; l; l = g_slist_next(l)) { + gatt_server_t *info = l->data; + if (!info) + continue; + if (info->instance_id == server_if) { + event->server_inst = server_if; + info->state = GATT_INS_DATA_SET; goto sendevent; } } - BT_ERR("Invalid Interface, srv_if: %d", server_if); event->server_inst = -1; sendevent: event->status = convert_to_oal_status(status); @@ -843,7 +859,8 @@ oal_status_t gatts_add_service(int instance_id, oal_gatt_srvc_id_t *gatt_serv_id CHECK_OAL_GATT_ENABLED(); CHECK_SERVER_INSTANCE(instance_id); - CHECK_SERVER_REGISTRATION(instance_id); + if (__gatts_find_server_instance(instance_id) == NULL) + return OAL_STATUS_INTERNAL_ERROR; if (gatt_serv_id != NULL) { uuid_to_stringname(&(gatt_serv_id->id.uuid), str); @@ -856,8 +873,7 @@ oal_status_t gatts_add_service(int instance_id, oal_gatt_srvc_id_t *gatt_serv_id return OAL_STATUS_INVALID_PARAM; } - ret = gatt_api->server->add_service(gatt_servers[instance_id - 1].server_id, &btgatt_srvc_id, num_handles); - + ret = gatt_api->server->add_service(instance_id, &btgatt_srvc_id, num_handles); if (ret != BT_STATUS_SUCCESS) { BT_ERR("GATT Server add service failed: %s", status2string(ret)); return convert_to_oal_status(ret); @@ -874,10 +890,10 @@ oal_status_t gatts_add_included_services(int instance_id, int serv_handle, CHECK_OAL_GATT_ENABLED(); CHECK_SERVER_INSTANCE(instance_id); + if (__gatts_find_server_instance(instance_id) == NULL) + return OAL_STATUS_INTERNAL_ERROR; - CHECK_SERVER_REGISTRATION(instance_id); - - ret = gatt_api->server->add_included_service(gatt_servers[instance_id - 1].server_id, serv_handle, incl_handle); + ret = gatt_api->server->add_included_service(instance_id, serv_handle, incl_handle); if (ret != BT_STATUS_SUCCESS) { BT_ERR("GATT Server Add included Service failed: %s", status2string(ret)); return convert_to_oal_status(ret); @@ -898,15 +914,15 @@ oal_status_t gatts_add_characteristics(int instance_id, int serv_handle, CHECK_OAL_GATT_ENABLED(); CHECK_SERVER_INSTANCE(instance_id); - - CHECK_SERVER_REGISTRATION(instance_id); + if (__gatts_find_server_instance(instance_id) == NULL) + return OAL_STATUS_INTERNAL_ERROR; if (charc_uuid != NULL) { uuid_to_stringname(charc_uuid, str); API_TRACE("uuid: [%s]", str); } - ret = gatt_api->server->add_characteristic(gatt_servers[instance_id - 1].server_id, + ret = gatt_api->server->add_characteristic(instance_id, serv_handle, (bt_uuid_t*)charc_uuid, propts, permsn); if (ret != BT_STATUS_SUCCESS) { BT_ERR("GATT Server Add Characteristic failed: %s", status2string(ret)); @@ -927,17 +943,16 @@ oal_status_t gatts_add_descriptor(int instance_id, int serv_handle, CHECK_OAL_GATT_ENABLED(); CHECK_SERVER_INSTANCE(instance_id); - - CHECK_SERVER_REGISTRATION(instance_id); + if (__gatts_find_server_instance(instance_id) == NULL) + return OAL_STATUS_INTERNAL_ERROR; if (desc_uuid != NULL) { uuid_to_stringname(desc_uuid, str); API_TRACE("uuid: [%s]", str); } - ret = gatt_api->server->add_descriptor(gatt_servers[instance_id - 1].server_id, + ret = gatt_api->server->add_descriptor(instance_id, serv_handle, (bt_uuid_t*)desc_uuid, permsn); - if (ret != BT_STATUS_SUCCESS) { BT_ERR("GATT Server Add Descriptor failed: %s", status2string(ret)); return convert_to_oal_status(ret); @@ -954,11 +969,10 @@ oal_status_t gatts_start_service(int instance_id, int svc_handle, int transport) CHECK_OAL_GATT_ENABLED(); CHECK_SERVER_INSTANCE(instance_id); + if (__gatts_find_server_instance(instance_id) == NULL) + return OAL_STATUS_INTERNAL_ERROR; - CHECK_SERVER_REGISTRATION(instance_id); - - ret = gatt_api->server->start_service(gatt_servers[instance_id - 1].server_id, svc_handle, transport); - + ret = gatt_api->server->start_service(instance_id, svc_handle, transport); if (ret != BT_STATUS_SUCCESS) { BT_ERR("GATT Server Start Service failed: %s", status2string(ret)); return convert_to_oal_status(ret); @@ -966,17 +980,18 @@ oal_status_t gatts_start_service(int instance_id, int svc_handle, int transport) return OAL_STATUS_SUCCESS; } -oal_status_t gatts_stop_service(int ins_id, int srv_hdl) +oal_status_t gatts_stop_service(int instance_id, int srv_hdl) { int ret = OAL_STATUS_SUCCESS; - API_TRACE("Server Stop Service : Ins_id = %d, srvHndl = %d, ", ins_id, srv_hdl); + API_TRACE("Server Stop Service : Ins_id = %d, srvHndl = %d, ", instance_id, srv_hdl); CHECK_OAL_GATT_ENABLED(); - CHECK_SERVER_INSTANCE(ins_id); - CHECK_SERVER_REGISTRATION(ins_id); + CHECK_SERVER_INSTANCE(instance_id); + if (__gatts_find_server_instance(instance_id) == NULL) + return OAL_STATUS_INTERNAL_ERROR; - ret = gatt_api->server->stop_service(gatt_servers[ins_id - 1].server_id, srv_hdl); + ret = gatt_api->server->stop_service(instance_id, srv_hdl); if (ret != BT_STATUS_SUCCESS) { BT_ERR("GATT Server Stop Service failed: %s", status2string(ret)); return convert_to_oal_status(ret); @@ -984,18 +999,18 @@ oal_status_t gatts_stop_service(int ins_id, int srv_hdl) return OAL_STATUS_SUCCESS; } -oal_status_t gatts_delete_service(int ins_id, int srv_hdl) +oal_status_t gatts_delete_service(int instance_id, int srv_hdl) { int ret = OAL_STATUS_SUCCESS; - API_TRACE("Server Delete Service : Ins_id = %d, srvHndl = %d, ", ins_id, srv_hdl); + API_TRACE("Server Delete Service : Ins_id = %d, srvHndl = %d, ", instance_id, srv_hdl); CHECK_OAL_GATT_ENABLED(); - CHECK_SERVER_INSTANCE(ins_id); - - CHECK_SERVER_REGISTRATION(ins_id); + CHECK_SERVER_INSTANCE(instance_id); + if (__gatts_find_server_instance(instance_id) == NULL) + return OAL_STATUS_INTERNAL_ERROR; - ret = gatt_api->server->delete_service(gatt_servers[ins_id - 1].server_id, srv_hdl); + ret = gatt_api->server->delete_service(instance_id, srv_hdl); if (ret != BT_STATUS_SUCCESS) { BT_ERR("GATT Server Delete Service failed: %s", status2string(ret)); return convert_to_oal_status(ret); @@ -1023,26 +1038,25 @@ oal_status_t gatts_send_response(int conn_id, int trans_id, int resp_status, oal return OAL_STATUS_SUCCESS; } -oal_status_t gatts_send_indication(int ins_id, int attr_hndl, int conn_id, int len, int confirm, char* value) +oal_status_t gatts_send_indication(int instance_id, int attr_hndl, int conn_id, int len, int confirm, char* value) { int ret = OAL_STATUS_SUCCESS; API_TRACE("Server Send Indication : Ins_id = %d, srvHndl = %d, [%s]", - ins_id, attr_hndl, confirm == TRUE ? "INDICATION" : "NOTIFICATION"); + instance_id, attr_hndl, confirm == TRUE ? "INDICATION" : "NOTIFICATION"); CHECK_OAL_GATT_ENABLED(); - CHECK_SERVER_INSTANCE(ins_id); - - CHECK_SERVER_REGISTRATION(ins_id); + CHECK_SERVER_INSTANCE(instance_id); + if (__gatts_find_server_instance(instance_id) == NULL) + return OAL_STATUS_INTERNAL_ERROR; if (value == NULL || len == 0) { BT_ERR("GATT Server attribute value is empty"); return OAL_STATUS_INVALID_PARAM; } - ret = gatt_api->server->send_indication(gatt_servers[ins_id - 1].server_id, + ret = gatt_api->server->send_indication(instance_id, attr_hndl, conn_id, len, confirm, value); - if (ret != BT_STATUS_SUCCESS) { BT_ERR("GATT Server Send Indication failed: %s", status2string(ret)); return convert_to_oal_status(ret); @@ -1050,15 +1064,15 @@ oal_status_t gatts_send_indication(int ins_id, int attr_hndl, int conn_id, int l return OAL_STATUS_SUCCESS; } -oal_status_t gatts_update_att_value(int ins_id, oal_gatt_value_t *value) +oal_status_t gatts_update_att_value(int instance_id, oal_gatt_value_t *value) { int ret = OAL_STATUS_SUCCESS; CHECK_OAL_GATT_ENABLED(); - CHECK_SERVER_INSTANCE(ins_id); - - CHECK_SERVER_REGISTRATION(ins_id); + CHECK_SERVER_INSTANCE(instance_id); + if (__gatts_find_server_instance(instance_id) == NULL) + return OAL_STATUS_INTERNAL_ERROR; if (value == NULL || value->len == 0) { BT_ERR("GATT Server attribute value is empty"); @@ -1066,11 +1080,10 @@ oal_status_t gatts_update_att_value(int ins_id, oal_gatt_value_t *value) } API_TRACE("Server Update Value: Ins_id = [%d], att handle = [%d] data len [%d]", - ins_id, value->handle, value->len); + instance_id, value->handle, value->len); - ret = gatt_api->server->update_att_value(gatt_servers[ins_id - 1].server_id, + ret = gatt_api->server->update_att_value(instance_id, (int)value->handle, (int)value->len, (char*)value->value); - if (ret != BT_STATUS_SUCCESS) { BT_ERR("GATT Server Update Attribute Value failed: [%s]", status2string(ret)); return convert_to_oal_status(ret); @@ -1082,12 +1095,10 @@ oal_status_t gatts_update_att_value(int ins_id, oal_gatt_value_t *value) static void cb_gatts_service_added(int status, int server_if, btgatt_srvc_id_t *psrvc_id, int srvc_handle) { - int instance_id; - BT_INFO("BTGATT SERVER SERVICE ADDED CB, status:%d, handle:%d", status, srvc_handle); event_gatts_srvc_prm_t* event = g_new0(event_gatts_srvc_prm_t, 1); - CHECK_CORRECT_SERVER_ID(instance_id, server_if, event->gatt_srvc_stat.server_inst); + CHECK_CORRECT_SERVER_ID(server_if, event->gatt_srvc_stat.server_inst); BT_ERR("Invalid Interface, srv_if: %d", server_if); event->gatt_srvc_stat.server_inst = -1; @@ -1109,13 +1120,12 @@ static void cb_gatts_included_service_added(int status, int server_if, int srvc_handle, int incl_srvc_handle) { - int ins_id ; BT_INFO("BTGATT SERVER INCLUDED SERVICE ADDED CB, status:%d, srvc handle:%d, incl handle:%d", status, srvc_handle, incl_srvc_handle); event_gatts_incld_srvc_t* event = g_new0(event_gatts_incld_srvc_t, 1); - CHECK_CORRECT_SERVER_ID(ins_id, server_if, event->gatt_srvc_stat.server_inst); + CHECK_CORRECT_SERVER_ID(server_if, event->gatt_srvc_stat.server_inst); BT_ERR("Invalid Interface, srv_if: %d", server_if); event->gatt_srvc_stat.server_inst = -1; @@ -1129,14 +1139,12 @@ sendevent: static void cb_gatts_characteristic_added(int status, int server_if, bt_uuid_t *char_id, int srvc_handle, int char_handle) { - int Ins_id ; - BT_INFO("BTGATT SERVER CHARACTERISTIC ADDED CB, status:%d, srvc handle:%d, char handle:%d", status, srvc_handle, char_handle); event_gatts_srvc_charctr_t* event = g_new0(event_gatts_srvc_charctr_t, 1); - CHECK_CORRECT_SERVER_ID(Ins_id, server_if, event->gatt_srvc_stat.server_inst); + CHECK_CORRECT_SERVER_ID(server_if, event->gatt_srvc_stat.server_inst); BT_ERR("Invalid Interface, srv_if: %d", server_if); event->gatt_srvc_stat.server_inst = -1; @@ -1152,13 +1160,12 @@ static void cb_gatts_descriptor_added(int status, int server_if, bt_uuid_t *descr_id, int srvc_handle, int descr_handle) { - int Ins_id ; BT_INFO("BTGATT SERVER DESCRIPTOR ADDED CB, status:%d, srvc handle:%d, desc handle:%d", status, srvc_handle, descr_handle); event_gatts_srvc_descr_t* event = g_new0(event_gatts_srvc_descr_t, 1); - CHECK_CORRECT_SERVER_ID(Ins_id, server_if, event->gatt_srvc_stat.server_inst); + CHECK_CORRECT_SERVER_ID(server_if, event->gatt_srvc_stat.server_inst); BT_ERR("Invalid Interface, srv_if: %d", server_if); event->gatt_srvc_stat.server_inst = -1; @@ -1172,12 +1179,11 @@ sendevent: static void cb_gatts_service_started(int status, int server_if, int srvc_handle) { - int Ins_id ; BT_INFO("BTGATT SERVER SERVICE STARTED CB, status:%d, srvc_handle:%d", status, srvc_handle); event_gatts_srvc_t* event = g_new0(event_gatts_srvc_t, 1); - CHECK_CORRECT_SERVER_ID(Ins_id, server_if, event->server_inst); + CHECK_CORRECT_SERVER_ID(server_if, event->server_inst); BT_ERR("Invalid Interface, srv_if: %d", server_if); event->server_inst = -1; @@ -1189,12 +1195,11 @@ sendevent: static void cb_gatts_service_stopped(int status, int server_if, int srvc_handle) { - int ins_id ; BT_INFO("BTGATT SERVER SERVICE STOPPED CB, status:%d, srvc_handle:%d", status, srvc_handle); event_gatts_srvc_t* event = g_new0(event_gatts_srvc_t, 1); - CHECK_CORRECT_SERVER_ID(ins_id, server_if, event->server_inst); + CHECK_CORRECT_SERVER_ID(server_if, event->server_inst); BT_ERR("Invalid Interface, srv_if: %d", server_if); event->server_inst = -1; @@ -1206,12 +1211,11 @@ sendevent: static void cb_gatts_service_deleted(int status, int server_if, int srvc_handle) { - int ins_id; BT_INFO("BTGATT SERVER SERVICE DELETED CB, status:%d, srvc_handle:%d", status, srvc_handle); event_gatts_srvc_t* event = g_new0(event_gatts_srvc_t, 1); - CHECK_CORRECT_SERVER_ID(ins_id, server_if, event->server_inst); + CHECK_CORRECT_SERVER_ID(server_if, event->server_inst); BT_ERR("Invalid Interface, srv_if: %d", server_if); event->server_inst = -1; @@ -1223,25 +1227,24 @@ sendevent: static void cb_gatts_connection(int conn_id, int server_if, int connected, bt_bdaddr_t *bda) { - int ins_id ; + GSList *l; oal_event_t event_type; BT_INFO("BTGATT SERVER CONNECTION connnected:%d, conn_id:%d server_if:%d", connected, conn_id, server_if); 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)) { - event->server_inst = ins_id; - break; - } else { - BT_INFO("Server ID:%d recevied server Id:%d\n", gatt_servers[ins_id - 1].server_id, server_if); + if (connected == TRUE) { + for (l = gatt_servers; l; l = g_slist_next(l)) { + gatt_server_t *info = l->data; + if (!info) + continue; + if (info->instance_id == server_if) { + event->server_inst = server_if; + break; + } } - } - if (ins_id == NUM_SERVER_INST+1) { - BT_WARN("Incorrect Server Interface received: %d\n", server_if); - g_free(event); - return; + } else { + /* server_inst is not required in disconnected case */ } memcpy(event->address.addr, bda->address, BT_ADDRESS_BYTES_NUM); event->conn_id = conn_id; @@ -1254,7 +1257,7 @@ static void cb_gatts_connection(int conn_id, int server_if, int connected, bt_bd static void cb_gatts_request_read(int conn_id, int trans_id, bt_bdaddr_t *bda, int attr_handle, int offset, bool is_long) { - BT_INFO("BTGATT SERVER REQUEST READ CB: conn_id:%d", conn_id); + BT_DBG("BTGATT SERVER REQUEST READ CB: conn_id:%d", conn_id); event_gatts_srvc_read_attr_t* event = g_new0(event_gatts_srvc_read_attr_t, 1); @@ -1390,13 +1393,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); @@ -1404,14 +1404,19 @@ static void cb_gattc_register_app(int status, int clientIf, bt_uuid_t *app_uuid) send_event(OAL_EVENT_GATTC_REGISTRATION, event, sizeof(event_gattc_register_t)); } -static void cb_gattc_scan_result(bt_bdaddr_t* bdaddress, int rssi, uint8_t *adv_data) +static void cb_gattc_scan_result(bt_bdaddr_t* bdaddress, uint8_t addr_type, int rssi, + uint8_t *adv_data, int adv_data_len, uint8_t *scan_rsp_data, int scan_rsp_data_len) { event_ble_scan_result_info *event; event = g_new0(event_ble_scan_result_info, 1); + event->addr_type = addr_type; event->rssi = rssi; memcpy(event->address.addr, bdaddress->address, BT_ADDRESS_BYTES_NUM); memcpy(event->adv_data, adv_data, BLE_ADV_DATA_LENGTH); + event->adv_data_len = adv_data_len; + memcpy(event->scan_rsp_data, scan_rsp_data, BLE_ADV_DATA_LENGTH); + event->scan_rsp_data_len = scan_rsp_data_len; send_event_bda_trace(OAL_EVENT_BLE_REMOTE_DEVICE_FOUND, event, sizeof(event_ble_scan_result_info), (bt_address_t *)bdaddress); } @@ -1457,10 +1462,8 @@ static void cb_gattc_search_result(int conn_id, btgatt_srvc_id_t *srvc_id) { char uuid_str[2*BT_UUID_STRING_MAX]; - 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 +1493,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); + + BT_DBG("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_DBG("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 +1506,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)); @@ -1517,12 +1521,12 @@ static void cb_gattc_get_descriptor(int conn_id, int status, btgatt_srvc_id_t *s char uuid_str1[2*BT_UUID_STRING_MAX]; char uuid_str2[2*BT_UUID_STRING_MAX]; char uuid_str3[2*BT_UUID_STRING_MAX]; - BT_INFO("BTGATT Client Get Descriptor Callback, conn_id:%d, status:%d", conn_id, status); + BT_DBG("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_DBG("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_DBG("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,26 +1536,26 @@ 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)); } -static void cb_gattc_register_for_notification(int client_if, int registered, int status, btgatt_srvc_id_t *srvc_id, btgatt_gatt_id_t *char_id) +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) { char uuid_str1[2*BT_UUID_STRING_MAX]; char uuid_str2[2*BT_UUID_STRING_MAX]; - BT_INFO("BTGATT Client Register For Notification Callback, client_if:%d, status:%d, registered: %s", - client_if, status, registered == 1 ? "REGISTERED" : "DEREGISTERED"); + BT_INFO("BTGATT Client Register For Notification Callback, conn_id:%d, status:%d, registered: %s", + conn_id, 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); - event->client_if = client_if; + event->conn_id = conn_id; event->status = convert_to_oal_status(status); memcpy(&(event->srvc_id), srvc_id, sizeof(oal_gatt_srvc_id_t)); memcpy(&(event->char_id), char_id, sizeof(oal_gatt_id_t)); @@ -1572,9 +1576,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,12 +1604,24 @@ 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) { char uuid_str1[2*BT_UUID_STRING_MAX]; char uuid_str2[2*BT_UUID_STRING_MAX]; - BT_INFO("BTGATT Client Read Charcateristic Callback, conn_id:%d, read_status:%d", conn_id, status); + BT_DBG("BTGATT Client Read Charcateristic Callback, conn_id:%d, read_status:%d", conn_id, status); event_gattc_read_data *event = g_new0(event_gattc_read_data, 1); event->uuid_status.conn_status.conn_id = conn_id; @@ -1616,23 +1632,13 @@ 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_DBG("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_DBG("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); - if (!data) { - BT_ERR("memory allocation failed"); - g_free(event); - return; - } - convert_hex_2_str((unsigned char *)p_data->value.value, p_data->value.len, data); - BT_INFO("Read Data: [%s]", data); event->data_len = p_data->value.len; memcpy(&(event->data), &(p_data->value.value), event->data_len); - g_free(data); } } send_event(OAL_EVENT_GATTC_READ_CHARAC, event, sizeof(*event)); @@ -1652,9 +1658,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)); } @@ -1664,7 +1670,7 @@ static void cb_gattc_write_descriptor(int conn_id, int status, btgatt_write_para char uuid_str1[2*BT_UUID_STRING_MAX]; char uuid_str2[2*BT_UUID_STRING_MAX]; char uuid_str3[2*BT_UUID_STRING_MAX]; - BT_INFO("BTGATT Client Write Descriptor Callback, conn_id:%d, write_status:%d", conn_id, status); + BT_DBG("BTGATT Client Write Descriptor Callback, conn_id:%d, write_status:%d", conn_id, status); event_gattc_write_data *event = g_new0(event_gattc_write_data, 1); event->conn_status.conn_id = conn_id; @@ -1676,10 +1682,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 +1711,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 +1725,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 +1748,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 +1763,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 +1790,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) { @@ -1828,7 +1845,7 @@ oal_status_t gattc_connect(int client_id, bt_address_t *device_address, int isDi bdstr_t bdstr; OAL_CHECK_PARAMETER(device_address, return); - API_TRACE("Client Connect: [%s]", bdt_bd2str(device_address, &bdstr)); + API_TRACE("Client Connect: [%s]", bdt_bd2str(device_address, &bdstr) + 12); CHECK_OAL_GATT_ENABLED(); CHECK_CLIENT_REGISTRATION(client_id); @@ -1848,7 +1865,7 @@ oal_status_t gattc_disconnect(int client_id, bt_address_t *device_address, int c bdstr_t bdstr; OAL_CHECK_PARAMETER(device_address, return); - API_TRACE("Client Disconnect: [%s]", bdt_bd2str(device_address, &bdstr)); + API_TRACE("Client Disconnect: [%s]", bdt_bd2str(device_address, &bdstr) + 12); CHECK_OAL_GATT_ENABLED(); CHECK_CLIENT_REGISTRATION(client_id); CHECK_CLIENT_CONNECTION(conn_id); @@ -1892,7 +1909,7 @@ oal_status_t gattc_get_characteristic(int conn_id, oal_gatt_srvc_id_t *srvc_id, OAL_CHECK_PARAMETER(srvc_id, return); uuid_to_stringname(&(srvc_id->id.uuid), uuid_str); - API_TRACE("Client Get Characteristic, Service_uuid: [%s]", uuid_str); + API_TRACE("Client Get Characteristic [%s]", uuid_str); CHECK_OAL_GATT_ENABLED(); CHECK_CLIENT_CONNECTION(conn_id); ret = gatt_api->client->get_characteristic(conn_id, (btgatt_srvc_id_t *)srvc_id, @@ -1927,7 +1944,7 @@ oal_status_t gattc_get_descriptor(int conn_id, oal_gatt_srvc_id_t *srvc_id, return OAL_STATUS_SUCCESS; } -oal_status_t gattc_register_for_notification(int client_id, bt_address_t * address, +oal_status_t gattc_register_for_notification(int conn_id, bt_address_t * address, oal_gatt_srvc_id_t *srvc_id, oal_gatt_id_t *char_id) { int ret = OAL_STATUS_SUCCESS; char uuid_str1[2*BT_UUID_STRING_MAX]; @@ -1941,9 +1958,9 @@ oal_status_t gattc_register_for_notification(int client_id, bt_address_t * addre uuid_to_stringname(&(char_id->uuid), uuid_str2); API_TRACE("Client Register Notification: [%s], Service_uuid: [%s], Char_uuid: [%s]", bdt_bd2str(address, &bdstr), uuid_str1, uuid_str2); CHECK_OAL_GATT_ENABLED(); - CHECK_CLIENT_REGISTRATION(client_id); + CHECK_CLIENT_CONNECTION(conn_id); - ret = gatt_api->client->register_for_notification(client_id, (bt_bdaddr_t *)address, (btgatt_srvc_id_t *)srvc_id, (btgatt_gatt_id_t *)char_id); + ret = gatt_api->client->register_for_notification(conn_id, (bt_bdaddr_t *)address, (btgatt_srvc_id_t *)srvc_id, (btgatt_gatt_id_t *)char_id); if (ret != BT_STATUS_SUCCESS) { BT_ERR("GATT client register notification failed: %s", status2string(ret)); return convert_to_oal_status(ret); @@ -1952,7 +1969,7 @@ oal_status_t gattc_register_for_notification(int client_id, bt_address_t * addre return OAL_STATUS_SUCCESS; } -oal_status_t gattc_deregister_for_notification(int client_id, bt_address_t * address, +oal_status_t gattc_deregister_for_notification(int conn_id, bt_address_t * address, oal_gatt_srvc_id_t *srvc_id, oal_gatt_id_t *char_id) { int ret = OAL_STATUS_SUCCESS; char uuid_str1[2*BT_UUID_STRING_MAX]; @@ -1966,9 +1983,9 @@ oal_status_t gattc_deregister_for_notification(int client_id, bt_address_t * add uuid_to_stringname(&(char_id->uuid), uuid_str2); API_TRACE("Client Deregister Notification: [%s], Service_uuid: [%s], Char_uuid: [%s]", bdt_bd2str(address, &bdstr), uuid_str1, uuid_str2); CHECK_OAL_GATT_ENABLED(); - CHECK_CLIENT_REGISTRATION(client_id); + CHECK_CLIENT_CONNECTION(conn_id); - ret = gatt_api->client->deregister_for_notification(client_id, (bt_bdaddr_t *)address, (btgatt_srvc_id_t *)srvc_id, (btgatt_gatt_id_t *)char_id); + ret = gatt_api->client->deregister_for_notification(conn_id, (bt_bdaddr_t *)address, (btgatt_srvc_id_t *)srvc_id, (btgatt_gatt_id_t *)char_id); if (ret != BT_STATUS_SUCCESS) { BT_ERR("GATT client deregister notification failed: %s", status2string(ret)); return convert_to_oal_status(ret); @@ -2142,10 +2159,9 @@ oal_status_t gattc_conn_param_update(bt_address_t * address, int min, int max, i bdstr_t bdstr; OAL_CHECK_PARAMETER(address, return); - API_TRACE("Conn Param Update: [%s]", bdt_bd2str(address, &bdstr)); CHECK_OAL_GATT_ENABLED(); - BT_INFO("[%s] min[%d] max[%d] latency[%d] timeout[%d]", bdt_bd2str(address, &bdstr), min, max, latency, timeout); + BT_DBG("[%s] min[%d] max[%d] latency[%d] timeout[%d]", bdt_bd2str(address, &bdstr), min, max, latency, timeout); ret = gatt_api->client->conn_parameter_update((bt_bdaddr_t *)address, min, max, latency, timeout); if (ret != BT_STATUS_SUCCESS) { BT_ERR("error: %s", status2string(ret)); @@ -2153,3 +2169,368 @@ 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_get_att_mtu(int conn_id, int *mtu) +{ + int ret = OAL_STATUS_SUCCESS; + API_TRACE("Get ATT MTU, conn_id: %d", conn_id); + CHECK_OAL_GATT_ENABLED(); + CHECK_CLIENT_CONNECTION(conn_id); + OAL_CHECK_PARAMETER(mtu, return); + + /* To prevent crash in case other libraries not support this api */ + if (gatt_api->client->get_att_mtu == NULL) { + BT_WARN("get_att_mtu is NULL"); + return OAL_STATUS_NOT_SUPPORT; + } + + ret = gatt_api->client->get_att_mtu(conn_id, mtu); + if (ret != BT_STATUS_SUCCESS) { + BT_ERR("GATT MTU Size failed, status: %s", status2string(ret)); + return convert_to_oal_status(ret); + } + + BT_INFO("Current ATT MTU Size: %d", *mtu); + 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 gatt_get_data_batching_available_packets( + unsigned int *available_packets) +{ + int ret; + + ret = gatt_api->client->get_data_batching_available_packets(available_packets); + if (ret != BT_STATUS_SUCCESS) { + BT_ERR("GATT data batching failed: %s", status2string(ret)); + return convert_to_oal_status(ret); + } + + return OAL_STATUS_SUCCESS; +} + +oal_status_t gatt_enable_data_batching(bt_address_t * address, + int packet_threshold, int timeout) +{ + int ret; + + ret = gatt_api->client->enable_data_batching((bt_bdaddr_t *)address, packet_threshold, timeout); + if (ret != BT_STATUS_SUCCESS) { + BT_ERR("GATT data batching failed: %s", status2string(ret)); + return convert_to_oal_status(ret); + } + + return OAL_STATUS_SUCCESS; +} + +oal_status_t gatt_disable_data_batching(bt_address_t * address) +{ + int ret; + + ret = gatt_api->client->disable_data_batching((bt_bdaddr_t *)address); + if (ret != BT_STATUS_SUCCESS) { + BT_ERR("GATT data batching failed: %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 instance_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) + 12); + CHECK_OAL_GATT_ENABLED(); + + ret = gatt_api->client->add_connection_info((bt_bdaddr_t *)device_address, conn_id, instance_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; +} +