2 * Open Adaptation Layer (OAL)
4 * Copyright (c) 2014-2015 Samsung Electronics Co., Ltd.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
20 #include <bluetooth.h>
22 #include "oal-event.h"
23 #include "oal-internal.h"
24 #include "oal-manager.h"
25 #include "oal-adapter-mgr.h"
26 #include "oal-utils.h"
28 #include "oal-common.h"
30 #define DEV_APPEARANCE 0x0000
31 #define DEFAULT_GATT_CLIENT_UUID "0000A00A-1111-1111-0123-456789ABCDEF"
32 #define MAX_PROP_LEN 90
33 #define MAX_PERM_LEN 70
35 #define NUM_SERVER_INST 10 // Maximum slots supported by stack is set to 10
36 #define CHECK_OAL_GATT_ENABLED() \
38 if (gatt_api == NULL) { \
39 BT_ERR("GATT Not Enabled"); \
40 return OAL_STATUS_NOT_READY; \
44 #define CHECK_SERVER_INSTANCE(instance_id) \
46 if (instance_id < 1 || instance_id > NUM_SERVER_INST) { \
47 BT_ERR("Invalid Instance"); \
48 return OAL_STATUS_INVALID_PARAM; \
52 #define CHECK_SERVER_REGISTRATION(instance_id) \
54 if (gatt_servers[instance_id - 1].server_id < 0) {\
55 BT_INFO("GATT server registeration is not done for server Instance : %d", instance_id);\
56 return OAL_STATUS_INTERNAL_ERROR;\
60 #define CHECK_CORRECT_SERVER_ID(instance_id, server_if, server_inst)\
62 for (instance_id = 1 ; instance_id <= NUM_SERVER_INST; instance_id++) { \
63 if (gatt_servers[instance_id - 1].server_id == server_if) { \
64 server_inst = instance_id; \
70 #define PRINT_ADV_DATA(length, manuf_data, data_type) \
72 char * buf_str = g_malloc0(3*length + 1);\
73 if (NULL != buf_str) { \
74 convert_hex_2_str(manuf_data, length, buf_str);\
75 if (TRUE == data_type) \
76 BT_INFO("Scan Response Data:%s\n", buf_str);\
78 BT_INFO("Advertising Data:%s\n", buf_str);\
85 GATT_INS_DATA_SETTING,
97 const char *oal_device_type[] = {
108 } oal_pending_gattc_req_e;
110 static const btgatt_interface_t * gatt_api;
111 static gboolean cur_adv_state[NUM_SERVER_INST];
112 static gatt_server_t gatt_servers[NUM_SERVER_INST];
114 static int default_client_id = -1;
115 static int pending_gattc_req = OAL_REQ_NONE;
117 /* Forward declarations of GATT Server callbacks */
118 static void cb_gatts_register_app(int status, int server_if, bt_uuid_t *uuid);
119 static void cb_gatts_multi_adv_enable(int server_if, int status);
120 static void cb_gatts_multi_adv_set_inst_data(int server_if, int status);
121 static void cb_gatts_multi_adv_disable(int server_if, int status);
122 static void cb_gatts_multi_adv_update(int server_if, int status);
124 static void cb_gatts_listen(int status, int server_if);
127 static void cb_gatts_service_added(int status, int server_if, btgatt_srvc_id_t *srvc_id, int srvc_handle);
128 static void cb_gatts_included_service_added(int status, int server_if, int srvc_handle, int incl_srvc_handle);
129 static void cb_gatts_characteristic_added(int status, int server_if, bt_uuid_t *char_id, int srvc_handle, int char_handle);
130 static void cb_gatts_descriptor_added(int status, int server_if, bt_uuid_t *descr_id, int srvc_handle, int descr_handle);
132 static void cb_gatts_service_started(int status, int server_if, int srvc_handle);
133 static void cb_gatts_service_stopped(int status, int server_if, int srvc_handle);
134 static void cb_gatts_service_deleted(int status, int server_if, int srvc_handle);
136 static void cb_gatts_request_read(int conn_id, int trans_id, bt_bdaddr_t *bda, int attr_handle, int offset, bool is_long);
137 static void cb_gatts_request_write(int conn_id, int trans_id, bt_bdaddr_t *bda, int attr_handle, int offset, int length,
138 bool need_rsp, bool is_prep, uint8_t* value);
139 static void cb_gatts_response_confirmation(int status, int handle);
141 static void cb_indication_confirmation(int conn_id, int trans_id, int attr_handle, bt_bdaddr_t *bda);
142 static void cb_gatts_connection(int conn_id, int server_if, int connected, bt_bdaddr_t *bda);
144 static void cb_gatts_mtu_changed(int conn_id, int mtu);
147 static void cb_notifcation_changed(int conn_id, int trans_id, int attr_handle, bool notify, bt_bdaddr_t *bda);
150 /************************************HAL Interface *************************************/
152 /*TODO GATT Server callbacks will be implemented in subsequent patches */
153 static const btgatt_server_callbacks_t btgatt_server_callbacks = {
154 cb_gatts_register_app,
156 cb_gatts_service_added,
157 cb_gatts_included_service_added,
158 cb_gatts_characteristic_added,
159 cb_gatts_descriptor_added,
160 cb_gatts_service_started,
161 cb_gatts_service_stopped,
162 cb_gatts_service_deleted,
163 cb_indication_confirmation,
164 cb_gatts_request_read,
165 cb_gatts_request_write,
166 NULL, /*cb_gatts_request_exec_write,*/
167 cb_gatts_response_confirmation,
169 cb_gatts_multi_adv_enable,
170 cb_gatts_multi_adv_update,
171 cb_gatts_multi_adv_set_inst_data,
172 cb_gatts_multi_adv_disable,
173 cb_gatts_mtu_changed,
175 cb_notifcation_changed,
179 /* Forward declaration for GATT client callbacks */
180 static void cb_gattc_register_app(int status, int clientIf, bt_uuid_t *app_uuid);
181 static void cb_gattc_scan_result(bt_bdaddr_t* bdaddress, int rssi, uint8_t *adv_data);
183 /*TODO GATT CLient callbacks will be implemented in subsequent patches */
184 static const btgatt_client_callbacks_t btgatt_client_callbacks = {
185 cb_gattc_register_app,
186 cb_gattc_scan_result,
187 NULL, /*cb_gattc_connection*/
188 NULL, /*cb_gattc_disconnect*/
189 NULL, /*cb_gattc_search_complete*/
190 NULL, /*cb_gattc_search_result*/
191 NULL, /*cb_gattc_get_characteristics*/
192 NULL, /*cb_gattc_get_descriptor*/
193 NULL, /*cb_gattc_get_included_service*/
194 NULL, /*cb_gattc_register_for_notification*/
195 NULL, /*cb_gattc_notify*/
196 NULL, /*cb_gattc_read_characteristic*/
197 NULL, /*cb_gattc_write_characteristic*/
198 NULL, /*cb_gattc_read_descriptor*/
199 NULL, /*cb_gattc_write_descriptor*/
200 NULL, /*cb_gattc_execute_write*/
201 NULL, /*cb_gattc_remote_rssi*/
202 NULL, /*cb_gattc_configure_mtu_cmpl*/
203 #ifdef PLATFORM_ANDROID_HAL
204 NULL, /*cb_scan_filter_cfg*/
205 NULL, /*cb_scan_filter_param*/
206 NULL, /*cb_scan_filter_status*/
207 NULL, /*cb_congestion*/
208 NULL, /*cb_batchscan_cfg_storag*/
209 NULL, /*cb_batchscan_enb_disable*/
210 NULL, /*cb_batchscan_reports*/
211 NULL, /*cb_batchscan_threshold*/
212 NULL, /*cb_track_adv_event*/
216 static btgatt_callbacks_t btgatt_callbacks = {
217 sizeof(btgatt_callbacks_t),
218 &btgatt_client_callbacks,
219 &btgatt_server_callbacks
222 /*******************************GATT Initialisation - Deinitialisation********************************/
223 oal_status_t gatt_enable(void)
225 const bt_interface_t * blued_api;
229 for (i = 0; i < NUM_SERVER_INST; i++) {
230 gatt_servers[i].server_id = -1;
231 gatt_servers[i].state = GATT_INS_DISABLED;
232 memset(&gatt_servers[i].uuid, 0, sizeof(oal_uuid_t));
233 cur_adv_state[i] = FALSE;
236 /* Get stack interface */
237 blued_api = (const bt_interface_t *) adapter_get_stack_interface();
239 if (blued_api == NULL) {
240 BT_ERR("Stack is not initialized");
241 return OAL_STATUS_NOT_READY;
245 BT_WARN("GATT Interface is already initialized...");
246 return OAL_STATUS_ALREADY_DONE;
249 gatt_api = (const btgatt_interface_t *)blued_api->get_profile_interface(BT_PROFILE_GATT_ID);
250 if (gatt_api == NULL) {
251 BT_ERR("GATT interface failed");
252 return OAL_STATUS_INTERNAL_ERROR;
255 if ((ret = gatt_api->init(&btgatt_callbacks)) != BT_STATUS_SUCCESS) {
256 BT_ERR("Error: Unable to initialise GATT :%s", status2string(ret));
259 return convert_to_oal_status(ret);
262 BT_INFO("GATT successfully initialized");
263 return OAL_STATUS_SUCCESS;
266 oal_status_t gatt_disable(void)
274 for (i = 0; i < NUM_SERVER_INST; i++) {
275 gatt_servers[i].server_id = -1;
276 gatt_servers[i].state = GATT_INS_DISABLED;
277 memset(&gatt_servers[i].uuid, 0, sizeof(oal_uuid_t));
279 return OAL_STATUS_SUCCESS;
282 /************************************GATT Server Functions*************************************/
284 oal_status_t gatts_register(oal_uuid_t* server_uuid)
286 char str[2*BT_UUID_STRING_MAX];
287 int ret = OAL_STATUS_SUCCESS;
290 CHECK_OAL_GATT_ENABLED();
291 uuid_to_stringname((service_uuid_t*)server_uuid->uuid, str);
292 API_TRACE("Register the server instance: UUID: [%s]", str);
294 for (i = 0; i < NUM_SERVER_INST; i++) {
295 if (memcmp(server_uuid->uuid, gatt_servers[i].uuid.uuid, sizeof(oal_uuid_t)) == 0) {
296 if (gatt_servers[i].server_id != -1) {
297 BT_ERR("This is resevered UUID for easy set up application i = %d \
298 gatt_servers[i].server_id = %d", i, gatt_servers[i].server_id);
299 return OAL_STATUS_ALREADY_DONE;
304 ret = gatt_api->server->register_server((bt_uuid_t*)server_uuid);
306 if (ret != BT_STATUS_SUCCESS) {
307 BT_ERR("GATT server registration with UUID:%s failed: %s", str, status2string(ret));
308 return convert_to_oal_status(ret);
310 return OAL_STATUS_SUCCESS;
313 oal_status_t gatts_unregister(int instance_id)
315 int ret = OAL_STATUS_SUCCESS;
316 API_TRACE("Unregister the registered server, instance_id: %d", instance_id);
318 CHECK_OAL_GATT_ENABLED();
319 CHECK_SERVER_INSTANCE(instance_id);
320 CHECK_SERVER_REGISTRATION(instance_id);
322 ret = gatt_api->server->unregister_server(gatt_servers[instance_id - 1].server_id);
324 if (ret != BT_STATUS_SUCCESS) {
325 BT_ERR("GATT server unregistration failed: %d", instance_id);
326 return convert_to_oal_status(ret);
329 gatt_servers[instance_id-1].server_id = -1;
330 gatt_servers[instance_id-1].state = GATT_INS_DISABLED;
332 if (instance_id != 1 && instance_id != 2)
333 memset(&gatt_servers[instance_id-1].uuid, 0, sizeof(oal_uuid_t));
335 return OAL_STATUS_SUCCESS;
338 /* Legacy Advertisement */
339 oal_status_t gatts_start_listen(int instance_id, gboolean enable)
341 int ret = OAL_STATUS_SUCCESS;
342 API_TRACE("server-id:%d enable: %d", gatt_servers[instance_id-1].server_id, enable);
344 CHECK_OAL_GATT_ENABLED();
345 CHECK_SERVER_INSTANCE(instance_id);
346 CHECK_SERVER_REGISTRATION(instance_id);
348 ret = gatt_api->server->listen(gatt_servers[instance_id-1].server_id, enable);
350 if (ret != BT_STATUS_SUCCESS) {
351 BT_ERR("Error:Advertising start/stop on server-id:%d failed With Status: [%s]",
352 gatt_servers[instance_id-1].server_id, status2string(ret));
353 return convert_to_oal_status(ret);
356 return OAL_STATUS_SUCCESS;
359 oal_status_t gatts_stop_advertising(int instance_id)
361 int ret = OAL_STATUS_SUCCESS;
362 API_TRACE("Stop advertising");
364 CHECK_OAL_GATT_ENABLED();
365 CHECK_SERVER_INSTANCE(instance_id);
366 CHECK_SERVER_REGISTRATION(instance_id);
368 ret = gatt_api->server->listen(gatt_servers[instance_id - 1].server_id, FALSE);
370 if (ret != BT_STATUS_SUCCESS) {
371 BT_ERR("Stop Advertising failed for server Instance:%d With Status: %s",
372 instance_id, status2string(ret));
373 return convert_to_oal_status(ret);
375 return OAL_STATUS_SUCCESS;
379 /* Below API's need to be removed as they are hardcoded API's.
380 If at all, product specific API's are required to set specific data, then new naming should
381 be adopted for these API's */
382 oal_status_t gatts_set_advertising_params(int instance_id, float min_intv, float max_intv)
384 int ret = OAL_STATUS_SUCCESS;
386 API_TRACE("Set advertising params min_int:%f, max_int:%f", min_intv, max_intv);
387 CHECK_OAL_GATT_ENABLED();
388 CHECK_SERVER_INSTANCE(instance_id);
389 CHECK_SERVER_REGISTRATION(instance_id);
391 /* Historically used for Legacy Advertising */
392 return OAL_STATUS_NOT_SUPPORT;
395 oal_status_t gatts_set_advertising_data(int instance_id, uint16_t manufac_len, char* manufac_data)
397 int ret = OAL_STATUS_SUCCESS;
399 API_TRACE("Set advertising data");
400 CHECK_OAL_GATT_ENABLED();
401 CHECK_SERVER_INSTANCE(instance_id);
402 CHECK_SERVER_REGISTRATION(instance_id);
404 /* Historically used for Legacy Advertising */
405 return OAL_STATUS_NOT_SUPPORT;
408 oal_status_t gatts_set_scan_response(int instance_id, uint16_t manufac_len, char* manufac_data)
410 int ret = OAL_STATUS_SUCCESS;
412 API_TRACE("Set Scan Response data");
413 CHECK_OAL_GATT_ENABLED();
414 CHECK_SERVER_INSTANCE(instance_id);
415 CHECK_SERVER_REGISTRATION(instance_id);
417 /* Historically used for Legacy Advertising */
418 return OAL_STATUS_NOT_SUPPORT;
422 oal_status_t gatts_multi_adv_enable(int instance_id)
424 int ret = OAL_STATUS_SUCCESS;
425 API_TRACE("Start Multi advertising, srv_if: %d, instance_id: %d",
426 gatt_servers[instance_id - 1].server_id, instance_id);
428 CHECK_OAL_GATT_ENABLED();
429 CHECK_SERVER_INSTANCE(instance_id);
430 CHECK_SERVER_REGISTRATION(instance_id);
432 if (gatt_api->server->multi_adv_enable == NULL)
433 return OAL_STATUS_NOT_SUPPORT;
435 /* Platform Requirement: Advertising to be enabled even when no data is set: i.e Empty Advertisement
436 if (gatt_servers[instance_id - 1].state != GATT_INS_DATA_SET){
437 BT_ERR("Not allowed, state: %d, instance_id: %d",
438 gatt_servers[instance_id - 1].state, instance_id);
439 return OAL_STATUS_BUSY;
442 if (gatt_servers[instance_id - 1].state == GATT_INS_ENABLED) {
443 BT_ERR("Not allowed, state: %d, instance_id: %d",
444 gatt_servers[instance_id - 1].state, instance_id);
445 return OAL_STATUS_ALREADY_DONE;
448 if (gatt_servers[instance_id - 1].state == GATT_INS_ENABLING) {
449 BT_ERR("Not allowed, state: %d, instance_id: %d",
450 gatt_servers[instance_id - 1].state, instance_id);
451 return OAL_STATUS_BUSY;
454 gatt_servers[instance_id - 1].state = GATT_INS_ENABLING;
456 ret = gatt_api->server->multi_adv_enable(gatt_servers[instance_id - 1].server_id);
458 if (ret != BT_STATUS_SUCCESS) {
459 BT_ERR("GATT enable multi advertising failed for server Instance: %d With Status: %s",
460 instance_id, status2string(ret));
461 // gatt_servers[instance_id - 1].state = GATT_INS_DATA_SET;
462 return convert_to_oal_status(ret);
464 return OAL_STATUS_SUCCESS;
467 oal_status_t gatts_multi_adv_disable(int instance_id)
469 int ret = OAL_STATUS_SUCCESS;
470 API_TRACE("Stop Multi advertising, srv_if: %d, instance_id: %d",
471 gatt_servers[instance_id - 1].server_id, instance_id);
473 CHECK_OAL_GATT_ENABLED();
474 CHECK_SERVER_INSTANCE(instance_id);
475 CHECK_SERVER_REGISTRATION(instance_id);
477 if (gatt_api->server->multi_adv_disable == NULL)
478 return OAL_STATUS_NOT_SUPPORT;
480 if ((gatt_servers[instance_id - 1].state != GATT_INS_ENABLED)) {
481 BT_ERR("Not Allowed, state: %d, instance_id: %d",
482 gatt_servers[instance_id - 1].state, instance_id);
483 return OAL_STATUS_BUSY;
486 ret = gatt_api->server->multi_adv_disable(gatt_servers[instance_id - 1].server_id);
488 if (ret != BT_STATUS_SUCCESS) {
489 BT_ERR("GATT disable multi advertising failed for server Instance: %d With Status: %s",
490 instance_id, status2string(ret));
491 return convert_to_oal_status(ret);
493 return OAL_STATUS_SUCCESS;
496 oal_status_t gatts_multi_adv_update(int instance_id,
497 int min_intv, int max_intv,
498 int adv_type, int chnl_map,
499 int tx_power, int timeout_s)
501 int ret = OAL_STATUS_SUCCESS;
502 API_TRACE("Multi advertising Update");
504 CHECK_OAL_GATT_ENABLED();
505 CHECK_SERVER_INSTANCE(instance_id);
506 CHECK_SERVER_REGISTRATION(instance_id);
508 if (gatt_api->server->multi_adv_update == NULL)
509 return OAL_STATUS_NOT_SUPPORT;
511 ret = gatt_api->server->multi_adv_update(gatt_servers[instance_id - 1].server_id,
514 tx_power, timeout_s);
516 if (ret != BT_STATUS_SUCCESS) {
517 BT_ERR("GATT update multi advertising failed for server Instance: %d With Status: %s",
518 instance_id, status2string(ret));
519 return convert_to_oal_status(ret);
521 return OAL_STATUS_SUCCESS;
524 oal_status_t gatts_multi_adv_set_inst_data(int instance_id,
525 oal_ble_multi_adv_param_setup_t *adv_param_setup)
527 int ret = OAL_STATUS_SUCCESS;
528 btgatt_adv_param_setup_t adv_setup;
529 API_TRACE("Set Multi advertising data, srv_if: %d, instance_id: %d",
530 gatt_servers[instance_id - 1].server_id, instance_id);
532 CHECK_OAL_GATT_ENABLED();
533 CHECK_SERVER_INSTANCE(instance_id);
534 CHECK_SERVER_REGISTRATION(instance_id);
536 if (gatt_api->server->multi_adv_set_inst_data == NULL)
537 return OAL_STATUS_NOT_SUPPORT;
539 if ((gatt_servers[instance_id - 1].state >= GATT_INS_DATA_SETTING) && (gatt_servers[instance_id - 1].state != GATT_INS_DATA_SET)) {
540 BT_ERR("Not Allowed, state: %d, instance_id: %d", gatt_servers[instance_id - 1].state, instance_id);
541 return OAL_STATUS_BUSY;
544 gatt_servers[instance_id - 1].state = GATT_INS_DATA_SETTING;
547 adv_setup.set_scan_rsp = adv_param_setup->set_scan_rsp;
548 adv_setup.include_name = adv_param_setup->include_name;
549 adv_setup.include_txpower = adv_param_setup->include_txpower;
550 adv_setup.appearance = adv_param_setup->appearance;
551 adv_setup.manufacturer_data = adv_param_setup->manufacturer_data;
552 adv_setup.manufacturer_data_len = adv_param_setup->manufacturer_data_len;
553 adv_setup.service_data = adv_param_setup->service_data;
554 adv_setup.service_data_len = adv_param_setup->service_data_len;
555 adv_setup.service_uuid = adv_param_setup->service_uuid;
556 adv_setup.service_uuid_len = adv_param_setup->service_uuid_len;
557 /* Solicit UUID handler: Start */
558 adv_setup.solicit_uuid = adv_param_setup->solicit_uuid;
559 adv_setup.solicit_uuid_len = adv_param_setup->solicit_uuid_len;
560 /* Solicit UUID handler: End */
561 adv_setup.min_interval = adv_param_setup->min_interval;
562 adv_setup.max_interval = adv_param_setup->min_interval;
563 adv_setup.adv_type = adv_param_setup->adv_type;
564 adv_setup.chnl_map = adv_param_setup->chnl_map;
565 adv_setup.tx_power = adv_param_setup->tx_power;
566 adv_setup.timeout_s = adv_param_setup->timeout_s;
568 adv_setup.server_if = gatt_servers[instance_id - 1].server_id;
569 if (adv_setup.manufacturer_data_len > 0 && adv_setup.manufacturer_data != NULL) {
570 BT_INFO("Manufacture data.....\n");
571 PRINT_ADV_DATA(adv_setup.manufacturer_data_len, adv_setup.manufacturer_data, adv_setup.set_scan_rsp);
574 if (adv_setup.service_uuid_len > 0 && adv_setup.service_uuid != NULL) {
575 BT_INFO("Service uuid.....\n");
576 PRINT_ADV_DATA(adv_setup.service_uuid_len, adv_setup.service_uuid, FALSE);
580 ret = gatt_api->server->multi_adv_set_inst_data(adv_setup);
582 if (ret != BT_STATUS_SUCCESS) {
583 BT_ERR("GATT Set Multi advertising data failed: %s", status2string(ret));
584 gatt_servers[instance_id - 1].state = GATT_INS_DISABLED;
585 return convert_to_oal_status(ret);
587 return OAL_STATUS_SUCCESS;
590 /************************************GATT Server Functions*************************************/
592 static void cb_gatts_register_app(int status, int server_if, bt_uuid_t *uuid)
595 char str[2*BT_UUID_STRING_MAX];
596 uuid_to_stringname((service_uuid_t*)uuid, str);
598 event_gatts_register_t *event = g_malloc0(sizeof(event_gatts_register_t));
600 BT_INFO("BTGATT SERVER REGISTER APP CB, status:%d, server_if:%d", status, server_if);
601 BT_INFO("UUID: [%s]", str);
603 for (i = 0; i < NUM_SERVER_INST; i++) {
604 if (gatt_servers[i].server_id == -1) {
605 BT_INFO("Server Instance registered with stack [%d]", i+1);
606 gatt_servers[i].server_id = server_if;
607 event->server_inst = i+1;
608 memcpy(gatt_servers[i].uuid.uuid, uuid->uu, sizeof(bt_uuid_t));
609 memcpy(event->server_uuid.uuid, uuid->uu, sizeof(bt_uuid_t));
613 send_event(OAL_EVENT_BLE_SERVER_INSTANCE_INITIALISED, event, sizeof(event_gatts_register_t));
616 static void cb_gatts_listen(int status, int server_if)
618 gboolean prev_state[NUM_SERVER_INST];
620 event_ble_adv_status *event = g_malloc0(sizeof(event_ble_adv_status));
623 for (instance_id = 1 ; instance_id <= NUM_SERVER_INST ; instance_id++) {
624 if (gatt_servers[instance_id - 1].server_id == server_if) {
625 event->server_inst = instance_id;
628 BT_WARN("Server ID:%d recevied server Id:%d\n", gatt_servers[instance_id - 1].server_id, server_if);
631 if ((event->server_inst > 0) && (event->server_inst <= 10)) {
632 prev_state[event->server_inst - 1] = cur_adv_state[event->server_inst - 1];
633 new_state = (status == BT_STATUS_SUCCESS) ? !(prev_state[event->server_inst - 1]) : (prev_state[event->server_inst - 1]);
634 cur_adv_state[event->server_inst - 1] = new_state;
636 BT_ERR("Invalid Callback...");
640 BT_INFO("Adv State of server instance %d :%d", instance_id, new_state);
642 if (TRUE == new_state)
643 send_event(OAL_EVENT_BLE_ADVERTISING_STARTED, event, sizeof(event_ble_adv_status));
645 send_event(OAL_EVENT_BLE_ADVERTISING_STOPPED, event, sizeof(event_ble_adv_status));
648 static void cb_gatts_multi_adv_enable(int server_if, int status)
651 BT_INFO("BTGATT SERVER MULTI ADV ENABLE CB, status:%d, srv_if: %d", status, server_if);
652 event_ble_multiadv_status *event = g_malloc0(sizeof(event_ble_multiadv_status));
655 if (status != BT_STATUS_SUCCESS)
656 BT_ERR("MULTI ADV ENABLE failed, status:%d, srv_if: %d", status, server_if);
658 for (instance_id = 1 ; instance_id <= NUM_SERVER_INST ; instance_id++) {
659 if (gatt_servers[instance_id - 1].server_id == server_if) {
660 event->server_inst = instance_id;
661 gatt_servers[instance_id - 1].state = GATT_INS_ENABLED;
665 BT_ERR("Invalid Interface, srv_if: %d", server_if);
666 event->server_inst = -1;
668 event->status = convert_to_oal_status(status);
669 send_event(OAL_EVENT_BLE_MULTI_ADVERTISING_ENABLE, event, sizeof(event_ble_multiadv_status));
672 static void cb_gatts_multi_adv_disable(int server_if, int status)
674 BT_INFO("BTGATT SERVER MULTI ADV DISABLE CB, status:%d, srv_if: %d", status, server_if);
675 event_ble_multiadv_status *event = g_malloc0(sizeof(event_ble_multiadv_status));
678 if (status != BT_STATUS_SUCCESS)
679 BT_ERR("MULTI ADV DISABLE failed, status:%d, srv_if: %d", status, server_if);
681 for (instance_id = 1 ; instance_id <= NUM_SERVER_INST; instance_id++) {
682 if (gatt_servers[instance_id - 1].server_id == server_if) {
683 event->server_inst = instance_id;
684 gatt_servers[instance_id - 1].state = GATT_INS_DISABLED;
688 BT_ERR("Invalid Interface, srv_if: %d", server_if);
689 event->server_inst = -1;
691 event->status = convert_to_oal_status(status);
692 send_event(OAL_EVENT_BLE_MULTI_ADVERTISING_DISABLE, event, sizeof(event_ble_multiadv_status));
695 static void cb_gatts_multi_adv_update(int server_if, int status)
697 BT_INFO("BTGATT SERVER MULTI ADV UPDATE CB, status:%d, srv_if: %d", status, server_if);
698 event_ble_multiadv_status *event = g_malloc0(sizeof(event_ble_multiadv_status));
701 if (status != BT_STATUS_SUCCESS)
702 BT_ERR("MULTI ADV UPDATE failed, status:%d, srv_if: %d", status, server_if);
704 for (instance_id = 1 ; instance_id <= NUM_SERVER_INST ; instance_id++) {
705 if (gatt_servers[instance_id - 1].server_id == server_if) {
706 event->server_inst = instance_id;
710 BT_ERR("Invalid Interface, srv_if: %d", server_if);
711 event->server_inst = -1;
713 event->status = convert_to_oal_status(status);
714 send_event(OAL_EVENT_BLE_MULTI_ADVERTISING_UPDATE, event, sizeof(event_ble_multiadv_status));
717 static void cb_gatts_multi_adv_set_inst_data(int server_if, int status)
719 BT_INFO("BTGATT SERVER MULTI ADV SET INST DATA CB, status:%d, srv_if: %d", status, server_if);
720 event_ble_multiadv_status *event = g_malloc0(sizeof(event_ble_multiadv_status));
723 if (status != BT_STATUS_SUCCESS)
724 BT_ERR("MULTI ADV SET DATA failed, status:%d, srv_if: %d", status, server_if);
726 for (instance_id = 1 ; instance_id <= NUM_SERVER_INST ; instance_id++) {
727 if (gatt_servers[instance_id - 1].server_id == server_if) {
728 event->server_inst = instance_id;
729 gatt_servers[instance_id - 1].state = GATT_INS_DATA_SET;
733 BT_ERR("Invalid Interface, srv_if: %d", server_if);
734 event->server_inst = -1;
736 event->status = convert_to_oal_status(status);
737 send_event(OAL_EVENT_BLE_MULTI_ADVERTISING_SET_INST_DATA, event, sizeof(event_ble_multiadv_status));
740 oal_status_t gatts_get_att_mtu(int conn_id, int *mtu)
742 int ret = OAL_STATUS_SUCCESS;
743 API_TRACE("Get ATT MTU, conn_id: %d", conn_id);
744 CHECK_OAL_GATT_ENABLED();
745 OAL_CHECK_PARAMETER(mtu, return);
747 /* To prevent crash in case other libraries not support this api */
748 if (gatt_api->server->get_att_mtu == NULL) {
749 BT_WARN("get_att_mtu is NULL");
750 return OAL_STATUS_NOT_SUPPORT;
753 ret = gatt_api->server->get_att_mtu(conn_id, mtu);
754 if (ret != BT_STATUS_SUCCESS) {
755 BT_ERR("GATT MTU Size failed, status: %d", status2string(ret));
756 return convert_to_oal_status(ret);
759 BT_INFO("Current ATT MTU Size: %d", *mtu);
760 return OAL_STATUS_SUCCESS;
763 oal_status_t gatts_add_service(int instance_id, oal_gatt_srvc_id_t *gatt_serv_id,
766 int ret = OAL_STATUS_SUCCESS;
767 btgatt_srvc_id_t btgatt_srvc_id;
768 char str[2*BT_UUID_STRING_MAX];
770 API_TRACE("Server Add Service : instance_id = %d, num_handles = %d", instance_id, num_handles);
771 CHECK_OAL_GATT_ENABLED();
773 CHECK_SERVER_INSTANCE(instance_id);
774 CHECK_SERVER_REGISTRATION(instance_id);
776 if (gatt_servers[instance_id - 1].server_id < 0) {
777 BT_INFO("GATT server registeration is not done for server Instance : %d", instance_id);
778 return gatts_register(&gatt_servers[instance_id - 1].uuid);
781 if (gatt_serv_id != NULL) {
782 uuid_to_stringname(&(gatt_serv_id->id.uuid), str);
783 API_TRACE("Service uuid: [%s]", str);
784 memcpy(btgatt_srvc_id.id.uuid.uu, gatt_serv_id->id.uuid.uuid, sizeof(gatt_serv_id->id.uuid));
785 btgatt_srvc_id.id.inst_id = gatt_serv_id->id.inst_id;
786 btgatt_srvc_id.is_primary = gatt_serv_id->is_prmry;
788 BT_INFO("GATT Server Service Id is NULL");
789 return OAL_STATUS_INVALID_PARAM;
792 ret = gatt_api->server->add_service(gatt_servers[instance_id - 1].server_id, &btgatt_srvc_id, num_handles);
794 if (ret != BT_STATUS_SUCCESS) {
795 BT_ERR("GATT Server add service failed: %s", status2string(ret));
796 return convert_to_oal_status(ret);
798 return OAL_STATUS_SUCCESS;
801 oal_status_t gatts_add_included_services(int instance_id, int serv_handle,
804 int ret = OAL_STATUS_SUCCESS;
805 API_TRACE("Server Add included Service : instance_id = %d, serv_handle = %d, incl_handle = %d",
806 instance_id, serv_handle, incl_handle);
807 CHECK_OAL_GATT_ENABLED();
809 CHECK_SERVER_INSTANCE(instance_id);
811 CHECK_SERVER_REGISTRATION(instance_id);
813 ret = gatt_api->server->add_included_service(gatt_servers[instance_id - 1].server_id, serv_handle, incl_handle);
814 if (ret != BT_STATUS_SUCCESS) {
815 BT_ERR("GATT Server Add included Service failed: %s", status2string(ret));
816 return convert_to_oal_status(ret);
818 return OAL_STATUS_SUCCESS;
821 oal_status_t gatts_add_characteristics(int instance_id, int serv_handle,
822 oal_uuid_t* charc_uuid, int propts, int permsn)
824 int ret = OAL_STATUS_SUCCESS;
825 char str[2*BT_UUID_STRING_MAX];
826 char prop[MAX_PROP_LEN], perm[MAX_PERM_LEN];
827 char_prop_to_string(propts, prop);
828 char_perm_to_string(permsn, perm);
829 API_TRACE("Server Add Characteristic : instance_id = %d, serv_handle = %d, Properties =%s, Permisison = %s",
830 instance_id, serv_handle, prop, perm);
831 CHECK_OAL_GATT_ENABLED();
833 CHECK_SERVER_INSTANCE(instance_id);
835 CHECK_SERVER_REGISTRATION(instance_id);
837 if (charc_uuid != NULL) {
838 uuid_to_stringname(charc_uuid, str);
839 API_TRACE("uuid: [%s]", str);
842 ret = gatt_api->server->add_characteristic(gatt_servers[instance_id - 1].server_id,
843 serv_handle, (bt_uuid_t*)charc_uuid, propts, permsn);
844 if (ret != BT_STATUS_SUCCESS) {
845 BT_ERR("GATT Server Add Characteristic failed: %s", status2string(ret));
846 return convert_to_oal_status(ret);
848 return OAL_STATUS_SUCCESS;
851 oal_status_t gatts_add_descriptor(int instance_id, int serv_handle,
852 oal_uuid_t* desc_uuid, int permsn)
854 int ret = OAL_STATUS_SUCCESS;
855 char str[2*BT_UUID_STRING_MAX];
856 char perm[MAX_PERM_LEN];
857 char_perm_to_string(permsn, perm);
858 API_TRACE("Server Add Descriptor : instance_id = %d, serv_handle = %d, Permisison = %s",
859 instance_id, serv_handle, perm);
860 CHECK_OAL_GATT_ENABLED();
862 CHECK_SERVER_INSTANCE(instance_id);
864 CHECK_SERVER_REGISTRATION(instance_id);
866 if (desc_uuid != NULL) {
867 uuid_to_stringname(desc_uuid, str);
868 API_TRACE("uuid: [%s]", str);
871 ret = gatt_api->server->add_descriptor(gatt_servers[instance_id - 1].server_id,
872 serv_handle, (bt_uuid_t*)desc_uuid, permsn);
874 if (ret != BT_STATUS_SUCCESS) {
875 BT_ERR("GATT Server Add Descriptor failed: %s", status2string(ret));
876 return convert_to_oal_status(ret);
878 return OAL_STATUS_SUCCESS;
881 oal_status_t gatts_start_service(int instance_id, int svc_handle, int transport)
883 int ret = OAL_STATUS_SUCCESS;
885 API_TRACE("Server Start Service : Ins_id = %d, srvHndl = %d, transport = %d",
886 instance_id, svc_handle, transport);
887 CHECK_OAL_GATT_ENABLED();
889 CHECK_SERVER_INSTANCE(instance_id);
891 CHECK_SERVER_REGISTRATION(instance_id);
893 ret = gatt_api->server->start_service(gatt_servers[instance_id - 1].server_id, svc_handle, transport);
895 if (ret != BT_STATUS_SUCCESS) {
896 BT_ERR("GATT Server Start Service failed: %s", status2string(ret));
897 return convert_to_oal_status(ret);
899 return OAL_STATUS_SUCCESS;
902 oal_status_t gatts_stop_service(int ins_id, int srv_hdl)
904 int ret = OAL_STATUS_SUCCESS;
906 API_TRACE("Server Stop Service : Ins_id = %d, srvHndl = %d, ", ins_id, srv_hdl);
907 CHECK_OAL_GATT_ENABLED();
909 CHECK_SERVER_INSTANCE(ins_id);
910 CHECK_SERVER_REGISTRATION(ins_id);
912 ret = gatt_api->server->stop_service(gatt_servers[ins_id - 1].server_id, srv_hdl);
913 if (ret != BT_STATUS_SUCCESS) {
914 BT_ERR("GATT Server Stop Service failed: %s", status2string(ret));
915 return convert_to_oal_status(ret);
917 return OAL_STATUS_SUCCESS;
920 oal_status_t gatts_delete_service(int ins_id, int srv_hdl)
922 int ret = OAL_STATUS_SUCCESS;
924 API_TRACE("Server Delete Service : Ins_id = %d, srvHndl = %d, ", ins_id, srv_hdl);
925 CHECK_OAL_GATT_ENABLED();
927 CHECK_SERVER_INSTANCE(ins_id);
929 CHECK_SERVER_REGISTRATION(ins_id);
931 ret = gatt_api->server->delete_service(gatt_servers[ins_id - 1].server_id, srv_hdl);
932 if (ret != BT_STATUS_SUCCESS) {
933 BT_ERR("GATT Server Delete Service failed: %s", status2string(ret));
934 return convert_to_oal_status(ret);
936 return OAL_STATUS_SUCCESS;
939 oal_status_t gatts_send_response(int conn_id, int trans_id, int resp_status, oal_gatt_response_t *response)
941 int ret = OAL_STATUS_SUCCESS;
943 API_TRACE("Server Send Response : ConnId = %d, TransId = %d, ", conn_id, trans_id);
944 CHECK_OAL_GATT_ENABLED();
946 if (response == NULL) {
947 BT_ERR("GATT Server attribute value is empty");
948 return OAL_STATUS_INVALID_PARAM;
951 ret = gatt_api->server->send_response(conn_id, trans_id, resp_status, (btgatt_response_t *)response);
952 if (ret != BT_STATUS_SUCCESS) {
953 BT_ERR("GATT Server Send Response failed: %s", status2string(ret));
954 return convert_to_oal_status(ret);
956 return OAL_STATUS_SUCCESS;
959 oal_status_t gatts_send_indication(int ins_id, int attr_hndl, int conn_id, int len, int confirm, char* value)
961 int ret = OAL_STATUS_SUCCESS;
963 API_TRACE("Server Send Indication : Ins_id = %d, srvHndl = %d, [%s]",
964 ins_id, attr_hndl, confirm == TRUE ? "INDICATION" : "NOTIFICATION");
965 CHECK_OAL_GATT_ENABLED();
967 CHECK_SERVER_INSTANCE(ins_id);
969 CHECK_SERVER_REGISTRATION(ins_id);
971 if (value == NULL || len == 0) {
972 BT_ERR("GATT Server attribute value is empty");
973 return OAL_STATUS_INVALID_PARAM;
976 ret = gatt_api->server->send_indication(gatt_servers[ins_id - 1].server_id,
977 attr_hndl, conn_id, len, confirm, value);
979 if (ret != BT_STATUS_SUCCESS) {
980 BT_ERR("GATT Server Send Indication failed: %s", status2string(ret));
981 return convert_to_oal_status(ret);
983 return OAL_STATUS_SUCCESS;
986 oal_status_t gatts_update_att_value(int ins_id, oal_gatt_value_t *value)
988 int ret = OAL_STATUS_SUCCESS;
990 API_TRACE("Server Update Value: Ins_id = [%d], att handle = [%d] data len [%d]",
991 ins_id, value->handle, value->len);
993 CHECK_OAL_GATT_ENABLED();
995 CHECK_SERVER_INSTANCE(ins_id);
997 CHECK_SERVER_REGISTRATION(ins_id);
999 if (value == NULL || value->len == 0) {
1000 BT_ERR("GATT Server attribute value is empty");
1001 return OAL_STATUS_INVALID_PARAM;
1004 ret = gatt_api->server->update_att_value(gatt_servers[ins_id - 1].server_id,
1005 (int)value->handle, (int)value->len, (char*)value->value);
1007 if (ret != BT_STATUS_SUCCESS) {
1008 BT_ERR("GATT Server Update Attribute Value failed: [%s]", status2string(ret));
1009 return convert_to_oal_status(ret);
1011 return OAL_STATUS_SUCCESS;
1014 /* GATT Server Callbacks:Start */
1015 static void cb_gatts_service_added(int status, int server_if,
1016 btgatt_srvc_id_t *psrvc_id, int srvc_handle)
1020 BT_INFO("BTGATT SERVER SERVICE ADDED CB, status:%d, handle:%d", status, srvc_handle);
1021 event_gatts_srvc_prm_t* event = g_new0(event_gatts_srvc_prm_t, 1);
1023 CHECK_CORRECT_SERVER_ID(instance_id, server_if, event->gatt_srvc_stat.server_inst);
1025 BT_ERR("Invalid Interface, srv_if: %d", server_if);
1026 event->gatt_srvc_stat.server_inst = -1;
1028 event->gatt_srvc_stat.servic_hndl = srvc_handle;
1029 if (psrvc_id != NULL) {
1030 event->gatt_srvc_id.id.inst_id = psrvc_id->id.inst_id;
1031 //event->gatt_srvc_id.id.uuid = psrvc_id->id.uuid;
1032 memcpy(event->gatt_srvc_id.id.uuid.uuid, psrvc_id->id.uuid.uu, sizeof(psrvc_id->id.uuid));
1033 event->gatt_srvc_id.is_prmry = psrvc_id->is_primary;
1036 event->gatt_srvc_stat.status = convert_to_oal_status(status);
1038 send_event(OAL_EVENT_GATTS_SERVICE_ADDED, event, sizeof(event_gatts_srvc_prm_t));
1041 static void cb_gatts_included_service_added(int status, int server_if,
1043 int incl_srvc_handle)
1046 BT_INFO("BTGATT SERVER INCLUDED SERVICE ADDED CB, status:%d, srvc handle:%d, incl handle:%d",
1047 status, srvc_handle, incl_srvc_handle);
1049 event_gatts_incld_srvc_t* event = g_new0(event_gatts_incld_srvc_t, 1);
1051 CHECK_CORRECT_SERVER_ID(ins_id, server_if, event->gatt_srvc_stat.server_inst);
1053 BT_ERR("Invalid Interface, srv_if: %d", server_if);
1054 event->gatt_srvc_stat.server_inst = -1;
1056 event->gatt_srvc_stat.servic_hndl = srvc_handle;
1057 event->incl_srvc_hndl = incl_srvc_handle;
1058 event->gatt_srvc_stat.status = convert_to_oal_status(status);
1059 send_event(OAL_EVENT_GATTS_INCLUDED_SERVICE_ADDED, event, sizeof(event_gatts_incld_srvc_t));
1062 static void cb_gatts_characteristic_added(int status, int server_if, bt_uuid_t *char_id,
1063 int srvc_handle, int char_handle)
1067 BT_INFO("BTGATT SERVER CHARACTERISTIC ADDED CB, status:%d, srvc handle:%d, char handle:%d",
1068 status, srvc_handle, char_handle);
1070 event_gatts_srvc_charctr_t* event = g_new0(event_gatts_srvc_charctr_t, 1);
1072 CHECK_CORRECT_SERVER_ID(Ins_id, server_if, event->gatt_srvc_stat.server_inst);
1074 BT_ERR("Invalid Interface, srv_if: %d", server_if);
1075 event->gatt_srvc_stat.server_inst = -1;
1077 event->gatt_srvc_stat.servic_hndl = srvc_handle;
1078 event->charctr_hndl = char_handle;
1079 event->gatt_srvc_stat.status = convert_to_oal_status(status);
1080 memcpy(event->charctr_uuid.uuid, char_id->uu, sizeof(bt_uuid_t));
1081 send_event(OAL_EVENT_GATTS_CHARACTERISTIC_ADDED, event, sizeof(event_gatts_srvc_charctr_t));
1084 static void cb_gatts_descriptor_added(int status, int server_if,
1085 bt_uuid_t *descr_id, int srvc_handle,
1089 BT_INFO("BTGATT SERVER DESCRIPTOR ADDED CB, status:%d, srvc handle:%d, desc handle:%d",
1090 status, srvc_handle, descr_handle);
1092 event_gatts_srvc_descr_t* event = g_new0(event_gatts_srvc_descr_t, 1);
1094 CHECK_CORRECT_SERVER_ID(Ins_id, server_if, event->gatt_srvc_stat.server_inst);
1096 BT_ERR("Invalid Interface, srv_if: %d", server_if);
1097 event->gatt_srvc_stat.server_inst = -1;
1099 event->gatt_srvc_stat.servic_hndl = srvc_handle;
1100 event->descrptr_hndl = descr_handle;
1101 event->gatt_srvc_stat.status = convert_to_oal_status(status);
1102 memcpy(event->descrptr_uuid.uuid, descr_id->uu, sizeof(bt_uuid_t));
1103 send_event(OAL_EVENT_GATTS_DESCRIPTOR_ADDED, event, sizeof(event_gatts_srvc_descr_t));
1106 static void cb_gatts_service_started(int status, int server_if, int srvc_handle)
1109 BT_INFO("BTGATT SERVER SERVICE STARTED CB, status:%d, srvc_handle:%d", status, srvc_handle);
1111 event_gatts_srvc_t* event = g_new0(event_gatts_srvc_t, 1);
1113 CHECK_CORRECT_SERVER_ID(Ins_id, server_if, event->server_inst);
1115 BT_ERR("Invalid Interface, srv_if: %d", server_if);
1116 event->server_inst = -1;
1118 event->servic_hndl = srvc_handle;
1119 event->status = convert_to_oal_status(status);
1120 send_event(OAL_EVENT_GATTS_SERVICE_STARTED, event, sizeof(event_gatts_srvc_t));
1123 static void cb_gatts_service_stopped(int status, int server_if, int srvc_handle)
1126 BT_INFO("BTGATT SERVER SERVICE STOPPED CB, status:%d, srvc_handle:%d", status, srvc_handle);
1128 event_gatts_srvc_t* event = g_new0(event_gatts_srvc_t, 1);
1130 CHECK_CORRECT_SERVER_ID(ins_id, server_if, event->server_inst);
1132 BT_ERR("Invalid Interface, srv_if: %d", server_if);
1133 event->server_inst = -1;
1135 event->servic_hndl = srvc_handle;
1136 event->status = convert_to_oal_status(status);
1137 send_event(OAL_EVENT_GATTS_SERVICE_STOPED, event, sizeof(event_gatts_srvc_t));
1140 static void cb_gatts_service_deleted(int status, int server_if, int srvc_handle)
1143 BT_INFO("BTGATT SERVER SERVICE DELETED CB, status:%d, srvc_handle:%d", status, srvc_handle);
1145 event_gatts_srvc_t* event = g_new0(event_gatts_srvc_t, 1);
1147 CHECK_CORRECT_SERVER_ID(ins_id, server_if, event->server_inst);
1149 BT_ERR("Invalid Interface, srv_if: %d", server_if);
1150 event->server_inst = -1;
1152 event->servic_hndl = srvc_handle;
1153 event->status = convert_to_oal_status(status);
1154 send_event(OAL_EVENT_GATTS_SERVICE_DELETED, event, sizeof(event_gatts_srvc_t));
1157 static void cb_gatts_connection(int conn_id, int server_if, int connected, bt_bdaddr_t *bda)
1160 oal_event_t event_type;
1162 BT_INFO("BTGATT SERVER CONNECTION connnected:%d, conn_id:%d server_if:%d", connected, conn_id, server_if);
1163 event_gatts_conn_t *event = g_new0(event_gatts_conn_t, 1);
1165 for (ins_id = 1 ; ins_id <= NUM_SERVER_INST ; ins_id++) {
1166 if ((gatt_servers[ins_id - 1].server_id == server_if) &&
1167 (gatt_servers[ins_id - 1].state == GATT_INS_ENABLED)) {
1168 event->server_inst = ins_id;
1171 BT_INFO("Server ID:%d recevied server Id:%d\n", gatt_servers[ins_id - 1].server_id, server_if);
1174 if (ins_id == NUM_SERVER_INST+1) {
1175 BT_WARN("Incorrect Server Interface received: %d\n", server_if);
1179 memcpy(event->address.addr, bda->address, BT_ADDRESS_BYTES_NUM);
1180 event->conn_id = conn_id;
1181 event_type = ((connected == TRUE) ? OAL_EVENT_GATTS_CONNECTION_COMPLETED : OAL_EVENT_GATTS_DISCONNECTION_COMPLETED);
1183 send_event(event_type, event, sizeof(event_gatts_conn_t));
1186 static void cb_gatts_request_read(int conn_id, int trans_id, bt_bdaddr_t *bda,
1187 int attr_handle, int offset, bool is_long)
1189 BT_INFO("BTGATT SERVER REQUEST READ CB: conn_id:%d", conn_id);
1191 event_gatts_srvc_read_attr_t* event = g_new0(event_gatts_srvc_read_attr_t, 1);
1193 memcpy(event->address.addr, bda->address, BT_ADDRESS_BYTES_NUM);
1195 event->attr_trans.attr_handle = attr_handle;
1196 event->attr_trans.conn_id = conn_id;
1197 event->attr_trans.trans_id = trans_id;
1198 event->attr_trans.offset = offset;
1199 event->is_long = is_long;
1201 send_event(OAL_EVENT_GATTS_REQUEST_READ, event, sizeof(event_gatts_srvc_read_attr_t));
1204 static void cb_gatts_request_write(int conn_id, int trans_id,
1205 bt_bdaddr_t *bda, int attr_handle,
1206 int offset, int length,
1207 bool need_rsp, bool is_prep, uint8_t* value)
1209 BT_INFO("BTGATT SERVER REQUEST WRITE conn_id:%d", conn_id);
1211 event_gatts_srvc_write_attr_t* event = g_new0(event_gatts_srvc_write_attr_t, 1);
1213 memcpy(event->address.addr, bda->address, BT_ADDRESS_BYTES_NUM);
1215 event->attr_trans.attr_handle = attr_handle;
1216 event->attr_trans.conn_id = conn_id;
1217 event->attr_trans.trans_id = trans_id;
1218 event->attr_trans.offset = offset;
1219 event->need_rsp = need_rsp;
1220 event->is_prep = is_prep;
1222 if (length > 0 && value != NULL) {
1223 if (length > OAL_GATT_MAX_ATTR_LEN)
1224 length = OAL_GATT_MAX_ATTR_LEN;
1225 memcpy(event->value, value, length);
1226 event->length = length;
1228 send_event(OAL_EVENT_GATTS_REQUEST_WRITE, event, sizeof(event_gatts_srvc_write_attr_t));
1231 static void cb_gatts_response_confirmation(int status, int handle)
1233 BT_INFO("BTGATT SERVER RESPONSE CONFIRMATION CB, status:%d, handle:%d", status, handle);
1235 event_gatts_respons_t* event = g_new0(event_gatts_respons_t, 1);
1237 event->hndl = handle;
1238 event->status = convert_to_oal_status(status);
1240 send_event(OAL_EVENT_GATTS_RESPONSE_CONFIRMED, event, sizeof(event_gatts_respons_t));
1243 static void cb_indication_confirmation(int conn_id, int trans_id, int attr_handle, bt_bdaddr_t *bda)
1245 BT_INFO("BTGATT SERVER Indication Confirmation CB, conn_id:%d, trans_id:%d attr_handle:%d",
1246 conn_id, trans_id, attr_handle);
1248 event_gatts_ind_cnfrm_t* event = g_new0(event_gatts_ind_cnfrm_t, 1);
1250 memcpy(event->address.addr, bda->address, BT_ADDRESS_BYTES_NUM);
1252 event->attr_handle = attr_handle;
1253 event->conn_id = conn_id;
1254 event->trans_id = trans_id;
1255 send_event(OAL_EVENT_GATTS_IND_CONFIRM, event, sizeof(event_gatts_ind_cnfrm_t));
1258 static void cb_gatts_mtu_changed(int conn_id, int mtu)
1260 BT_INFO("BTGATT SERVER MTU CHANGED CB, conn_id: %d, mtu_size: %d", conn_id, mtu);
1261 event_gatts_mtu_changed_t *event = g_new0(event_gatts_mtu_changed_t, 1);
1262 event->conn_id = conn_id;
1263 event->mtu_size = mtu;
1264 send_event(OAL_EVENT_GATTS_MTU_CHANGED, event, sizeof(event_gatts_mtu_changed_t));
1268 static void cb_notifcation_changed(int conn_id, int trans_id, int attr_handle, bool notify, bt_bdaddr_t *bda)
1270 BT_INFO("BTGATT SERVER Notication CB, conn_id:%d, trans_id:%d attr_handle:%d Notify:%d",
1271 conn_id, trans_id, attr_handle, notify);
1273 event_gatts_notif_t* event = g_new0(event_gatts_notif_t, 1);
1275 memcpy(event->address.addr, bda->address, BT_ADDRESS_BYTES_NUM);
1277 event->attr_handle = attr_handle;
1278 event->conn_id = conn_id;
1279 event->trans_id = trans_id;
1280 event->notify = notify;
1281 send_event(OAL_EVENT_GATTS_NOTIFICATION, event, sizeof(event_gatts_notif_t));
1286 /* GATT Server Callbacks: End */
1287 /************************************ GATT Client ***********************************/
1288 /* Client Callbacks */
1289 static void cb_gattc_register_app(int status, int clientIf, bt_uuid_t *app_uuid)
1291 char uuid_str[BT_UUID_STRING_MAX];
1292 event_gattc_register_t *event;
1294 /* Check if GATT client registered for Default GATT client UUID */
1295 uuid_to_string((service_uuid_t *)app_uuid, uuid_str);
1296 if (!strncasecmp(DEFAULT_GATT_CLIENT_UUID,
1297 uuid_str, strlen(DEFAULT_GATT_CLIENT_UUID))) {
1298 default_client_id = clientIf;
1299 switch (pending_gattc_req) {
1300 case OAL_REQ_LE_SCAN:
1302 default_client_id = -1;
1303 pending_gattc_req = OAL_REQ_NONE;
1304 BT_ERR("Default client app creation failed");
1305 send_event(OAL_EVENT_BLE_DISCOVERY_STOPPED, NULL, 0);
1309 if (OAL_STATUS_SUCCESS != gattc_start_le_discovery()) {
1310 BT_ERR("Error:Start LE Discovery failed");
1311 send_event(OAL_EVENT_BLE_DISCOVERY_STOPPED, NULL, 0);
1315 BT_ERR("Unknown pending request: %d", pending_gattc_req);
1318 /* Return from here, no need to send GATTC_REGISTRATION event */
1322 BT_INFO("BTGATT CLIENT REGISTER APP CB, status:%d, clientIf:%d", status, clientIf);
1323 event = g_new0(event_gattc_register_t, 1);
1324 event->client_if = clientIf;
1325 event->status = (status == 0 ? OAL_STATUS_SUCCESS : OAL_STATUS_INTERNAL_ERROR);
1326 memcpy(event->client_uuid.uuid, app_uuid->uu, sizeof(oal_uuid_t));
1327 send_event_no_trace(OAL_EVENT_GATTC_REGISTRATION, event, sizeof(event_gattc_register_t));
1330 static void cb_gattc_scan_result(bt_bdaddr_t* bdaddress, int rssi, uint8_t *adv_data)
1332 event_ble_scan_result_info *event;
1334 event = g_new0(event_ble_scan_result_info, 1);
1336 memcpy(event->address.addr, bdaddress->address, BT_ADDRESS_BYTES_NUM);
1337 memcpy(event->adv_data, adv_data, BLE_ADV_DATA_LENGTH);
1338 send_event_bda_trace(OAL_EVENT_BLE_REMOTE_DEVICE_FOUND, event,
1339 sizeof(event_ble_scan_result_info), (bt_address_t *)bdaddress);
1342 /* Register default gatt client to be used in LE scan etc. */
1343 static oal_status_t __register_default_gatt_client(void)
1348 API_TRACE("GATT client register");
1349 CHECK_OAL_GATT_ENABLED();
1351 if (default_client_id >= 0) {
1352 BT_ERR("Client Already registered");
1353 return OAL_STATUS_ALREADY_DONE;
1356 string_to_uuid(DEFAULT_GATT_CLIENT_UUID, (service_uuid_t *)&uuid);
1357 ret = gatt_api->client->register_client(&uuid);
1358 if (ret != BT_STATUS_SUCCESS) {
1359 BT_ERR("GATT client register failed: %s", status2string(ret));
1360 return convert_to_oal_status(ret);
1363 return OAL_STATUS_SUCCESS;
1366 oal_status_t gattc_start_le_discovery(void)
1370 API_TRACE("BTGATT CLIENT SCAN START");
1371 CHECK_OAL_GATT_ENABLED();
1373 if (default_client_id < 0) {
1374 if (pending_gattc_req != OAL_REQ_NONE) {
1375 BT_ERR("Another request: %d already in progress", pending_gattc_req);
1376 return OAL_STATUS_INTERNAL_ERROR;
1379 pending_gattc_req = OAL_REQ_LE_SCAN;
1380 ret = __register_default_gatt_client();
1381 if (OAL_STATUS_SUCCESS != ret) {
1382 BT_ERR("__register_default_gatt_client failed");
1383 pending_gattc_req = OAL_REQ_NONE;
1384 return OAL_STATUS_INTERNAL_ERROR;
1387 return OAL_STATUS_SUCCESS;
1390 ret = gatt_api->client->scan(default_client_id, true);
1391 if (ret != BT_STATUS_SUCCESS) {
1392 BT_ERR("Error:Start LE Discovery failed: %s", status2string(ret));
1393 return convert_to_oal_status(ret);
1396 send_event(OAL_EVENT_BLE_DISCOVERY_STARTED, NULL, 0);
1397 return OAL_STATUS_SUCCESS;
1400 oal_status_t gattc_stop_le_discovery(void)
1404 API_TRACE("Scan is stopped");
1405 CHECK_OAL_GATT_ENABLED();
1407 ret = gatt_api->client->scan(default_client_id, false);
1408 if (ret != BT_STATUS_SUCCESS) {
1409 BT_ERR("Error:Stop LE Discovery failed: %s", status2string(ret));
1410 return convert_to_oal_status(ret);
1413 send_event(OAL_EVENT_BLE_DISCOVERY_STOPPED, NULL, 0);
1414 return OAL_STATUS_SUCCESS;
1417 oal_status_t gattc_set_le_scan_param(int scan_type, int itv, int win)
1421 API_TRACE("Scan is stopped");
1422 CHECK_OAL_GATT_ENABLED();
1425 ret = gatt_api->client->set_scan_parameters(scan_type, itv, win);
1426 if (ret != BT_STATUS_SUCCESS) {
1427 BT_ERR("Error:Set scan parameters failed: %s", status2string(ret));
1428 return convert_to_oal_status(ret);
1431 ret = gatt_api->client->set_scan_parameters(itv, win);
1432 if (ret != BT_STATUS_SUCCESS) {
1433 BT_ERR("Error:Set scan parameters failed: %s", status2string(ret));
1434 return convert_to_oal_status(ret);
1438 return OAL_STATUS_SUCCESS;
1440 /************************************ GATT Client ***********************************/