Add and remove device from whitelist
[platform/core/connectivity/bluetooth-frwk.git] / bt-service-adaptation / services / adapter / bt-service-core-adapter-le.c
1 /*
2  * Copyright (c) 2016 2017 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  * Contact: Anupam Roy <anupam.r@samsung.com>
5  *
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
9  *
10  *              http://www.apache.org/licenses/LICENSE-2.0
11  *
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.
17  *
18  */
19
20 #include <stdio.h>
21 #include <gio/gio.h>
22 #include <glib.h>
23 #include <dlog.h>
24 #include <string.h>
25 #include <vconf.h>
26
27 #include "bt-internal-types.h"
28 #include "bt-service-common.h"
29 #include "bt-service-event.h"
30 #include "bt-service-core-adapter.h"
31 #include "bt-service-core-adapter-le.h"
32 #include "bt-service-event-receiver.h"
33 #include "bt-service-gatt.h"
34 #include "bt-service-util.h"
35 #include "bt-service-core-device.h"
36
37 #include <oal-hardware.h>
38 #include <oal-manager.h>
39 #include <oal-event.h>
40 #include <oal-adapter-mgr.h>
41 #include <oal-device-mgr.h>
42 #include <oal-gatt.h>
43
44 #define BT_UUID_128 16
45 #define BT_ADV_DEFAULT_TIMEOUT 0
46 #define BT_ADV_DEFAULT_TX_POWER 4
47 #define BT_ADV_DEFAULT_CHANNEL_MAP 0
48 #define BT_SCAN_INTERVAL_SPLIT 0.625
49
50 static const char BASE_UUID_CONVERTED[BT_UUID_128] = {
51         0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80,
52         0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
53 };
54
55 typedef struct {
56         int adv_inst_max;
57         int rpa_offloading;
58         int max_filter;
59         int le_2m_phy;
60         int le_coded_phy;
61 } bt_adapter_le_feature_info_t;
62
63 /* Set Default values */
64 static bt_adapter_le_feature_info_t le_feature_info = {1, 0, 0, 0, 0};
65
66 typedef struct {
67         int adv_handle;
68         char *sender;
69         int data_len;
70         unsigned char data[31];
71         gboolean is_adv;/* Adv or Scan Response: Only applicable if is_data_set_pending is TRUE */
72         gboolean is_data_set_pending; /* Data Set pending or Adv enable request at one time */
73         gboolean is_custom_adv; /* If Adv enable is custom adv enable request */
74         bluetooth_advertising_params_t params; /* Adv Parameters */
75 } bt_pending_adv_data_set_t;
76
77 static guint timer_id = 0;
78
79 static GSList *adv_data_pending_list = NULL;
80 static bt_le_status_t adapter_le_state = BT_LE_DEACTIVATED;
81 static bt_le_discovery_state_t adapter_le_discovery_state = LE_DISCOVERY_STOPPED;
82
83 /******************************************* LE Scan *********************************************/
84 #define BT_LE_SCAN_INTERVAL_MIN 2.5
85 #define BT_LE_SCAN_INTERVAL_MAX 10240
86 #define BT_LE_SCAN_WINDOW_MIN 2.5
87 #define BT_LE_SCAN_WINDOW_MAX 10240
88
89 #define BT_ADV_INTERVAL_SPLIT 0.625
90
91 typedef struct {
92         char *sender;
93         GSList *filter_list;
94         gboolean is_scanning;
95         gboolean stop_pending;
96 } bt_adapter_le_scanner_t;
97
98 GSList *scanner_list = NULL;
99 static gboolean is_le_set_scan_parameter = FALSE;
100 static gboolean is_le_scanning = FALSE;
101
102 static bluetooth_le_scan_params_t le_scan_params = { BT_LE_ACTIVE_SCAN, 0, 0 };
103
104 static int g_gatt_client_id = 0;
105
106 /******************************************* LE Scan *********************************************/
107
108 void _bt_adapter_set_le_status(bt_le_status_t status)
109 {
110         BT_INFO("adapter_le_state changed [%d] -> [%d]", adapter_le_state, status);
111         adapter_le_state = status;
112 }
113
114 bt_le_status_t _bt_adapter_get_le_status(void)
115 {
116         return adapter_le_state;
117 }
118
119
120 /* Internal functions of core adapter service */
121 static void __bt_le_handle_pending_requests(int service_function, void *user_data, unsigned int size)
122 {
123         GSList *l;
124         GArray *out_param;
125         invocation_info_t *req_info;
126         BT_INFO("+");
127
128         /* Get method invocation context */
129         for (l = _bt_get_invocation_list(); l != NULL; ) {
130                 req_info = l->data;
131                 l = g_slist_next(l);
132                 if (req_info == NULL || req_info->service_function != service_function)
133                         continue;
134
135                 /* Create out param */
136                 out_param = g_array_new(FALSE, FALSE, sizeof(gchar));
137
138                 switch (service_function) {
139                 case BT_ENABLE_ADAPTER_LE:
140                 case BT_DISABLE_ADAPTER_LE: {
141                         gboolean done = TRUE;
142                         g_array_append_vals(out_param, &done, sizeof(gboolean));
143                         break;
144                 }
145                 default:
146                         BT_ERR("Unknown service function[%d]", service_function);
147                 }
148
149                 _bt_service_method_return(req_info->context, out_param, req_info->result);
150                 g_array_free(out_param, TRUE);
151                 /* Now free invocation info for this request*/
152                 _bt_free_info_from_invocation_list(req_info);
153         }
154 }
155
156
157 /* Request return handlings */
158 static gboolean __bt_le_post_set_enabled(gpointer user_data)
159 {
160         BT_INFO("__bt_adapter_post_set_enabled>>");
161
162         /* Add LE enabled post processing codes */
163
164         return FALSE;
165 }
166
167
168 static gboolean __bt_le_post_set_disabled(gpointer user_data)
169 {
170         BT_INFO("_bt_adapter_post_set_disabled>>");
171
172         /* Add LE disabled post processing codes */
173
174         return FALSE;
175 }
176
177 static void __bt_le_update_bt_enabled(void)
178 {
179         int result = BLUETOOTH_ERROR_NONE;
180         BT_ERR("_bt_adapter_update_bt_enabled>>");
181         /* Update Bluetooth Status to notify other modules */
182         if (vconf_set_int(VCONFKEY_BT_LE_STATUS, VCONFKEY_BT_LE_STATUS_ON) != 0)
183                 BT_ERR("Set vconf failed\n");
184
185         /* TODO:Add timer function to handle any further post processing */
186         g_idle_add((GSourceFunc)__bt_le_post_set_enabled, NULL);
187
188         /*Return BT_ADAPTER_ENABLE Method invocation context */
189         __bt_le_handle_pending_requests(BT_ENABLE_ADAPTER_LE, NULL, 0);
190         /*Send BT Enabled event to application */
191         _bt_send_event(BT_LE_ADAPTER_EVENT, BLUETOOTH_EVENT_LE_ENABLED,
192                         g_variant_new("(i)", result));
193 }
194
195 static void __bt_le_update_bt_disabled(void)
196 {
197         int result = BLUETOOTH_ERROR_NONE;
198         BT_INFO("_bt_adapter_update_bt_disabled>>");
199
200         int power_off_status = 0;
201         int ret;
202
203         /* Update the vconf LE status in normal Deactivation case only */
204         ret = vconf_get_int(VCONFKEY_SYSMAN_POWER_OFF_STATUS, &power_off_status);
205         BT_DBG("ret : %d, power_off_status : %d", ret, power_off_status);
206
207         /* Update LE Status to notify other modules */
208         if (vconf_set_int(VCONFKEY_BT_LE_STATUS, VCONFKEY_BT_LE_STATUS_OFF) != 0)
209                 BT_ERR("Set vconf failed");
210
211         /* TODO:Add timer function to handle any further post processing */
212         g_idle_add((GSourceFunc)__bt_le_post_set_disabled, NULL);
213
214         /* Return BT_ADAPTER_DISABLE Method invocation context */
215         __bt_le_handle_pending_requests(BT_DISABLE_ADAPTER_LE, NULL, 0);
216
217         /* Send BT Disabled event to application */
218         _bt_send_event(BT_LE_ADAPTER_EVENT, BLUETOOTH_EVENT_LE_DISABLED,
219                         g_variant_new("(i)", result));
220 }
221
222
223 static void __bt_set_le_scan_status(gboolean mode)
224 {
225         is_le_scanning = mode;
226 }
227
228 gboolean _bt_is_le_scanning(void)
229 {
230         return is_le_scanning;
231 }
232
233 bt_adapter_le_scanner_t* __bt_find_scanner_from_list(const char *sender)
234 {
235         GSList *l;
236         bt_adapter_le_scanner_t *scanner;
237
238         for (l = scanner_list; l != NULL; l = g_slist_next(l)) {
239                 scanner = l->data;
240                 if (g_strcmp0(scanner->sender, sender) == 0)
241                         return scanner;
242         }
243
244         return NULL;
245 }
246
247 /* Event handlers */
248 static void __bt_adapter_le_handle_pending_request_info(int result,
249                 int service_function, void *param, unsigned int size)
250 {
251         GSList *l;
252         GArray *out_param;
253         invocation_info_t *req_info = NULL;
254         BT_DBG("+");
255
256         for (l = _bt_get_invocation_list(); l != NULL; ) {
257                 req_info = l->data;
258                 l = g_slist_next(l);
259                 if (req_info == NULL || req_info->service_function != service_function)
260                         continue;
261
262                 switch (service_function) {
263                 case BT_SET_ADVERTISING:
264                 case BT_SET_CUSTOM_ADVERTISING:
265                 case BT_SET_ADVERTISING_DATA:
266                 case BT_SET_SCAN_RESPONSE_DATA: {
267                         int *saved_handle;
268                         bt_pending_adv_data_set_t *data;
269
270                         BT_DBG("Service function: [%d]", service_function);
271                         ret_if(param == NULL);
272
273                         saved_handle = (int*)req_info->user_data;
274                         data = (bt_pending_adv_data_set_t*)param;
275                         BT_DBG("Current Sender [%s] Current Handle [%d]", data->sender, data->adv_handle);
276
277                         if (!g_strcmp0(req_info->sender, data->sender) && (*saved_handle == data->adv_handle)) {
278                                 BT_DBG("Requester found [%s] ADV Handle [%d]", req_info->sender, *saved_handle);
279                                 out_param = g_array_new(FALSE, FALSE, sizeof(gchar));
280                                 g_array_append_vals(out_param, &data->adv_handle, sizeof(int));
281                                 _bt_service_method_return(req_info->context, out_param, result);
282
283                                 /* Free data */
284                                 g_free(req_info->user_data);
285                                 _bt_free_info_from_invocation_list(req_info);
286                                 g_array_free(out_param, TRUE);
287                         }
288                         break;
289                 }
290                 case BT_START_LE_DISCOVERY: {
291                         bt_adapter_le_scanner_t *scanner;
292
293                         BT_DBG("Request Sender: [%s]", req_info->sender);
294                         if (BLUETOOTH_ERROR_NONE != result) {
295                                 scanner = __bt_find_scanner_from_list(req_info->sender);
296                                 if (scanner && scanner->is_scanning)
297                                         scanner->is_scanning = FALSE;
298                         }
299
300                         out_param = g_array_new(FALSE, FALSE, sizeof(gchar));
301                         _bt_service_method_return(req_info->context, out_param, result);
302                         _bt_free_info_from_invocation_list(req_info);
303                         g_array_free(out_param, TRUE);
304                         break;
305                 }
306                 case BT_STOP_LE_DISCOVERY: {
307                         BT_DBG("Request Sender: [%s]", req_info->sender);
308                         out_param = g_array_new(FALSE, FALSE, sizeof(gchar));
309                         _bt_service_method_return(req_info->context, out_param, result);
310                         _bt_free_info_from_invocation_list(req_info);
311                         g_array_free(out_param, TRUE);
312                         break;
313                 }
314                 default:
315                         break;
316                 }
317         }
318         BT_DBG("-");
319 }
320
321 static void __bt_le_handle_server_instance_registered(event_gatts_register_t *data)
322 {
323         int adv_handle;
324         GSList *l;
325         char uuid_string[BLUETOOTH_UUID_STRING_MAX];
326         bluetooth_advertising_data_t adv;
327         bluetooth_scan_resp_data_t scan_rsp;
328         int result = BLUETOOTH_ERROR_NONE;
329         bt_pending_adv_data_set_t *info = NULL;
330
331         memset(adv.data, 0, sizeof(adv.data));
332         memset(scan_rsp.data, 0, sizeof(scan_rsp.data));
333
334         _bt_uuid_to_string(&(data->server_uuid), uuid_string);
335         BT_INFO("Instance ID is Intialized [%d] UUID initialized [%s]", data->server_inst, uuid_string);
336
337         /* Get sender and adv handle for the server instance */
338         _bt_get_adv_handle_from_instance(data->server_inst, &adv_handle);
339
340                 /* Check if pending Adv Data set or Scan response data set request is pending*/
341                 for (l = adv_data_pending_list; l != NULL; l = l->next) {
342                         info = l->data;
343
344                         if (info && (adv_handle == info->adv_handle)) {
345                                 if (info->is_data_set_pending) {
346                                         BT_INFO("LE Data set request is pending");
347                                         if (info->is_adv) {
348                                                 memcpy(&adv.data, info->data, info->data_len);
349                                                 result = _bt_set_advertising_data(info->sender,
350                                                         info->adv_handle, &adv, info->data_len, FALSE);
351                                                 if (result != BLUETOOTH_ERROR_NONE) {
352                                                         __bt_adapter_le_handle_pending_request_info(result,
353                                                                 BT_SET_ADVERTISING_DATA,
354                                                                 (void*)info, sizeof(bt_pending_adv_data_set_t));
355                                                 }
356                                                 goto data_free;
357                                         } else {
358                                                 memcpy(&scan_rsp.data, info->data, info->data_len);
359                                                 result = _bt_set_scan_response_data(info->sender,
360                                                                 info->adv_handle, &scan_rsp, info->data_len, FALSE);
361                                                 if (result != BLUETOOTH_ERROR_NONE) {
362                                                         __bt_adapter_le_handle_pending_request_info(result,
363                                                                 BT_SET_SCAN_RESPONSE_DATA, (void*)info,
364                                                                 sizeof(bt_pending_adv_data_set_t));
365                                                 }
366                                                 goto data_free;
367                                         }
368                                 } else {
369                                         BT_INFO("LE Enable Adv request is pending");
370                                         if (info->is_custom_adv) {
371                                                 result = _bt_set_custom_advertising(info->sender, info->adv_handle,
372                                                                         TRUE, &info->params, FALSE/*Reserved Slot*/);
373                                                 if (result != BLUETOOTH_ERROR_NONE) {
374                                                         __bt_adapter_le_handle_pending_request_info(result,
375                                                                 BT_SET_CUSTOM_ADVERTISING,
376                                                                 (void*)info, sizeof(bt_pending_adv_data_set_t));
377                                                 }
378                                                 goto data_free;
379                                         } else {
380                                                 result = _bt_set_advertising(info->sender, info->adv_handle,
381                                                                 TRUE, FALSE/*Reserved Slot*/);
382                                                 if (result != BLUETOOTH_ERROR_NONE) {
383                                                         __bt_adapter_le_handle_pending_request_info(result,
384                                                                 BT_SET_ADVERTISING,
385                                                                 (void*)info, sizeof(bt_pending_adv_data_set_t));
386                                                 }
387                                                 goto data_free;
388                                 }
389                         }
390                 }
391         }
392         BT_DBG("-");
393         return;
394
395 data_free:
396         adv_data_pending_list = g_slist_remove(adv_data_pending_list, info);
397         g_free(info->sender);
398         g_free(info);
399 }
400
401 static void __bt_le_multi_advertising_enabled(event_ble_multiadv_status *event)
402 {
403         char *sender;
404         int adv_handle;
405         bt_pending_adv_data_set_t *info = NULL;
406         GVariant *param = NULL;
407         int result = BLUETOOTH_ERROR_NONE;
408
409         sender = _bt_get_sender_and_handle(event->server_inst, &adv_handle);
410         if (sender == NULL) {
411                 BT_ERR("Abnormal!!");
412         } else {
413                 if (event->status != OAL_STATUS_SUCCESS)
414                         result = BLUETOOTH_ERROR_INTERNAL;
415                 info = g_malloc0(sizeof(bt_pending_adv_data_set_t));
416                 info->sender = sender;
417                 info->adv_handle = adv_handle;
418                 __bt_adapter_le_handle_pending_request_info(result,
419                                 BT_SET_CUSTOM_ADVERTISING,
420                                 (void*)info, sizeof(bt_pending_adv_data_set_t));
421                 __bt_adapter_le_handle_pending_request_info(result,
422                                 BT_SET_ADVERTISING,
423                                 (void*)info, sizeof(bt_pending_adv_data_set_t));
424
425                 /* Send event */
426                 param = g_variant_new("(ii)", result, info->adv_handle);
427                 _bt_send_event_to_dest(info->sender, BT_ADAPTER_EVENT, BLUETOOTH_EVENT_ADVERTISING_STARTED, param);
428
429                 /* Free data */
430                 g_free(info->sender);
431                 g_free(info);
432         }
433 }
434
435 static void __bt_le_multi_advertising_disabled(event_ble_multiadv_status *event)
436 {
437         char *sender;
438         int adv_handle;
439         bt_pending_adv_data_set_t *info = NULL;
440         GVariant *param = NULL;
441         int result = BLUETOOTH_ERROR_NONE;
442         sender = _bt_get_sender_and_handle(event->server_inst, &adv_handle);
443
444         if (sender == NULL) {
445                 BT_INFO("Means application containing the adv info is already freed!!");
446         } else {
447                 if (event->status != OAL_STATUS_SUCCESS)
448                         result = BLUETOOTH_ERROR_INTERNAL;
449                 info = g_malloc0(sizeof(bt_pending_adv_data_set_t));
450                 info->sender = sender;
451                 info->adv_handle = adv_handle;
452                 __bt_adapter_le_handle_pending_request_info(result,
453                                 BT_SET_CUSTOM_ADVERTISING,
454                                 (void*)info, sizeof(bt_pending_adv_data_set_t));
455                 __bt_adapter_le_handle_pending_request_info(result,
456                                 BT_SET_ADVERTISING,
457                                 (void*)info, sizeof(bt_pending_adv_data_set_t));
458                 /* Send event */
459                 param = g_variant_new("(ii)", result, info->adv_handle);
460                 _bt_send_event_to_dest(info->sender, BT_ADAPTER_EVENT, BLUETOOTH_EVENT_ADVERTISING_STOPPED, param);
461
462                 /* Free allocated slot or server instance from stack to be used for other advertisng */
463                 result = _bt_unregister_server_instance(sender, adv_handle);
464
465                 /* Free data */
466                 g_free(info->sender);
467                 g_free(info);
468         }
469 }
470
471 static void __bt_le_multi_advertising_set_data(event_ble_multiadv_status *event)
472 {
473         char *sender = NULL;
474         int adv_handle;
475         bt_pending_adv_data_set_t *info = NULL;
476         int result = BLUETOOTH_ERROR_NONE;
477         sender = _bt_get_sender_and_handle(event->server_inst, &adv_handle);
478
479         if (sender == NULL) {
480                 BT_ERR("Abnormal!!");
481         } else {
482                 BT_DBG("Sender [%s], adv handle [%d]",  sender, adv_handle);
483                 if (event->status != OAL_STATUS_SUCCESS)
484                         result = BLUETOOTH_ERROR_INTERNAL;
485
486                 info = g_malloc0(sizeof(bt_pending_adv_data_set_t));
487                 info->sender = sender;
488                 info->adv_handle = adv_handle;
489                 BT_DBG("Sender [%s], adv handle [%d]",  info->sender, info->adv_handle);
490                 __bt_adapter_le_handle_pending_request_info(result,
491                                 BT_SET_SCAN_RESPONSE_DATA,
492                                 (void*)info, sizeof(bt_pending_adv_data_set_t));
493                 __bt_adapter_le_handle_pending_request_info(result,
494                                 BT_SET_ADVERTISING_DATA,
495                                 (void*)info, sizeof(bt_pending_adv_data_set_t));
496                 g_free(info->sender);
497                 g_free(info);
498         }
499 }
500
501 static int __get_advertisement_data(unsigned char *dest, unsigned char *src)
502 {
503         int length = 0;
504         int i = 0;
505
506         while (i <= 31) {
507                 int len = src[i];
508
509                 if ((len == 0) || (31 < (i + len))) {
510                         BT_INFO("length: %d", length);
511                         memcpy(dest, src, length);
512                         break;
513                 }
514
515                 length += (len + 1);
516                 i += (len + 1);
517         }
518
519         return length;
520 }
521
522 static void __bt_le_handle_device_found(event_ble_scan_result_info *scan_result)
523 {
524         int result = BLUETOOTH_ERROR_NONE;
525         bt_adapter_le_scanner_t *scanner = NULL;
526         char address[BT_ADDRESS_STRING_SIZE];
527         int addr_type = 0x01; /* TODO: Need to get correct address type */
528         unsigned char adv_ind_data[31];
529         unsigned char scan_resp_data[31];
530         int adv_ind_len = 0;
531         int scan_resp_len = 0;
532         char *tmp_str = NULL;
533         GVariant *scan_data_param;
534         GVariant *adv_data_param;
535         GVariant *param;
536         GSList *l;
537
538         BT_DBG("+");
539         ret_if(NULL == scan_result);
540
541         _bt_convert_addr_type_to_string(address, scan_result->address.addr);
542
543         memset(adv_ind_data, 0x00, sizeof(adv_ind_data));
544         adv_ind_len = __get_advertisement_data(
545                         adv_ind_data, &(scan_result->adv_data[0]));
546
547         memset(scan_resp_data, 0x00, sizeof(scan_resp_data));
548         scan_resp_len = __get_advertisement_data(
549                         scan_resp_data, &(scan_result->adv_data[adv_ind_len]));
550
551         BT_INFO("Address: %s, RSSI: %d, adv_ind_len: %d, scan_resp_len: %d",
552                         address, scan_result->rssi, adv_ind_len, scan_resp_len);
553
554         tmp_str = _bt_service_convert_hex_to_string(scan_result->adv_data, 62);
555         BT_INFO("Complete Data: [%s]", tmp_str);
556         g_free(tmp_str);
557         tmp_str = NULL;
558
559         tmp_str = _bt_service_convert_hex_to_string(adv_ind_data, adv_ind_len);
560         BT_INFO("Adv Ind Data: [%s]", tmp_str);
561         g_free(tmp_str);
562         tmp_str = NULL;
563
564         tmp_str = _bt_service_convert_hex_to_string(scan_resp_data, scan_resp_len);
565         BT_INFO("Scan resp Data: [%s]", tmp_str);
566         g_free(tmp_str);
567         tmp_str = NULL;
568
569         for (l = scanner_list; l != NULL; l = g_slist_next(l)) {
570                 scanner = l->data;
571                 if (scanner->is_scanning == FALSE)
572                         continue;
573
574                 adv_data_param = g_variant_new_from_data((const GVariantType *)"ay",
575                                 adv_ind_data, adv_ind_len, TRUE, NULL, NULL);
576                 scan_data_param = g_variant_new_from_data((const GVariantType *)"ay",
577                                 scan_resp_data, scan_resp_len, TRUE, NULL, NULL);
578
579                 param = g_variant_new("(isnnn@ayn@ay)",
580                                 result, address,
581                                 addr_type, scan_result->rssi,
582                                 adv_ind_len, adv_data_param,
583                                 scan_resp_len, scan_data_param);
584
585                 _bt_send_event_to_dest(scanner->sender, BT_LE_ADAPTER_EVENT,
586                                 BLUETOOTH_EVENT_REMOTE_LE_DEVICE_FOUND, param);
587         }
588
589         BT_DBG("-");
590 }
591
592 static void __bt_le_state_change_callback(int bt_status)
593 {
594         BT_INFO("__bt_le_state_change_callback: status [%d]", bt_status);
595
596         switch (bt_status) {
597         case BT_LE_DEACTIVATED:
598                 _bt_adapter_set_le_status(bt_status);
599
600                 /* Add Adapter disabled post processing codes */
601                 __bt_le_update_bt_disabled();
602                 break;
603         case BT_LE_ACTIVATED:
604                 _bt_adapter_set_le_status(bt_status);
605
606                 /* Add Adapter enabled post processing codes */
607                 if (timer_id > 0) {
608                         BT_DBG("g_source is removed");
609                         g_source_remove(timer_id);
610                         timer_id = 0;
611                 }
612                 __bt_le_update_bt_enabled();
613                 break;
614         default:
615                 BT_ERR("Incorrect Bluetooth adapter state changed status");
616                 break;
617
618         }
619 }
620
621 static void __bt_le_event_handler(int event_type, gpointer event_data)
622 {
623         BT_INFO("OAL event = 0x%x, \n", event_type);
624
625         switch (event_type) {
626         case OAL_EVENT_BLE_ENABLED: {
627                 __bt_le_state_change_callback(BT_LE_ACTIVATED);
628                 break;
629         }
630         case OAL_EVENT_BLE_DISABLED: {
631                 __bt_le_state_change_callback(BT_LE_DEACTIVATED);
632                 break;
633         }
634         case OAL_EVENT_BLE_SERVER_INSTANCE_INITIALISED: {
635                 BT_INFO("OAL Event: Server Instance Registered");
636                 __bt_le_handle_server_instance_registered((event_gatts_register_t *)event_data);
637                 break;
638         }
639         case OAL_EVENT_BLE_ADVERTISING_STARTED: {
640                 BT_INFO("OAL Event: Legacy Advertising Enabled: Not Supported!!");
641                 break;
642         }
643         case OAL_EVENT_BLE_ADVERTISING_STOPPED: {
644                 BT_INFO("OAL Event: Legacy Advertising Disabled: Not Supported!!");
645                 break;
646         }
647         case OAL_EVENT_BLE_MULTI_ADVERTISING_ENABLE: {
648                 BT_INFO("OAL Event: Advertising Enabled");
649                 __bt_le_multi_advertising_enabled((event_ble_multiadv_status *)event_data);
650                 break;
651         }
652         case OAL_EVENT_BLE_MULTI_ADVERTISING_DISABLE: {
653                 BT_INFO("OAL Event: Advertising Disabled");
654                 __bt_le_multi_advertising_disabled((event_ble_multiadv_status *)event_data);
655                 break;
656         }
657         case OAL_EVENT_BLE_MULTI_ADVERTISING_SET_INST_DATA: {
658                 BT_INFO("OAL Event: Advertising Data set successfully");
659                 __bt_le_multi_advertising_set_data((event_ble_multiadv_status *)event_data);
660                 break;
661         }
662         case OAL_EVENT_BLE_MULTI_ADVERTISING_UPDATE: {
663                         BT_INFO("OAL Event: Advertising Params updated");
664                 break;
665         }
666         case OAL_EVENT_BLE_DISCOVERY_STARTED: {
667                 __bt_set_le_scan_status(TRUE);
668
669                 __bt_adapter_le_handle_pending_request_info(
670                                 BLUETOOTH_ERROR_NONE,
671                                 BT_START_LE_DISCOVERY, NULL, 0);
672                 break;
673         }
674         case OAL_EVENT_BLE_DISCOVERY_STOPPED: {
675                 if (!_bt_is_le_scanning()) {
676                         BT_ERR("LE discovery start failed");
677                         __bt_adapter_le_handle_pending_request_info(
678                                         BLUETOOTH_ERROR_INTERNAL,
679                                         BT_START_LE_DISCOVERY, NULL, 0);
680                         break;
681                 }
682
683                 __bt_set_le_scan_status(FALSE);
684                 __bt_adapter_le_handle_pending_request_info(
685                                 BLUETOOTH_ERROR_NONE,
686                                 BT_STOP_LE_DISCOVERY, NULL, 0);
687                 break;
688         }
689         case OAL_EVENT_BLE_REMOTE_DEVICE_FOUND: {
690                 event_ble_scan_result_info *scan_result = event_data;
691                 BT_INFO("OAL Event: OAL_EVENT_BLE_REMOTE_DEVICE_FOUND");
692                 __bt_le_handle_device_found(scan_result);
693                 break;
694         }
695         case OAL_EVENT_GATTC_REGISTRATION: {
696                 event_gattc_register_t *gattc_event = event_data;
697                 char uuid_str[BLUETOOTH_UUID_STRING_MAX];
698                 char *default_uuid_string;
699
700                 default_uuid_string = _bt_gatt_get_default_gatt_client_uuid();
701                 _bt_uuid_to_string((service_uuid_t*)&(gattc_event->client_uuid), uuid_str);
702                 BT_INFO("default UUID [%s] current registered uuid [%s]",
703                                 default_uuid_string, uuid_str);
704                 if (g_strcmp0(uuid_str, default_uuid_string)) {
705                         BT_INFO("This is not the default GATT client that is registered");
706
707                         g_free(default_uuid_string);
708                         break;
709                 }
710                 BT_INFO("GATT CLient instance registered is default client: ID [%d]",
711                                 gattc_event->client_if);
712                 g_free(default_uuid_string);
713
714                 g_gatt_client_id = gattc_event->client_if;
715                 break;
716         }
717         case OAL_EVENT_BLE_LOCAL_FEATURES: {
718                 event_adapter_le_features_t *le_features = event_data;
719
720                 le_feature_info.le_2m_phy = le_features->le_2m_phy_support;
721                 le_feature_info.le_coded_phy = le_features->le_coded_phy_support;
722
723                 BT_INFO("Adapter LE 2M PHY Support [%s]", le_feature_info.le_2m_phy ? "TRUE" : "FALSE");
724                 BT_INFO("Adapter LE CODED PHY Support [%s]", le_feature_info.le_coded_phy ? "TRUE" : "FALSE");
725
726                 break;
727         }
728         default:
729                 break;
730         }
731 }
732
733 int _bt_le_init(void)
734 {
735         BT_DBG("+");
736         /* Register LE event handler */
737         _bt_service_register_event_handler_callback(BT_ADAPTER_LE_MODULE, __bt_le_event_handler);
738         BT_DBG("-");
739         return BLUETOOTH_ERROR_NONE;
740 }
741
742 void _bt_le_deinit(void)
743 {
744         BT_DBG("+");
745         /* Un-register LE event handler */
746         _bt_service_unregister_event_handler_callback(BT_ADAPTER_LE_MODULE);
747         BT_DBG("-");
748 }
749
750 static void __bt_le_update_discovery_status(bt_adapter_discovery_state_t status)
751 {
752         BT_INFO("adapter_discovery_status changed [%d] -> [%d]", adapter_le_discovery_state, status);
753         adapter_le_discovery_state = status;
754 }
755
756 static int __bt_le_state_handle_request(gboolean enable)
757 {
758         int result = BLUETOOTH_ERROR_NONE;
759         BT_DBG("");
760
761         switch (_bt_adapter_get_le_status()) {
762         case BT_LE_ACTIVATING: {
763                 BT_INFO("LE is currently in activating state, state [%d]",
764                                 _bt_adapter_get_le_status());
765                 if (enable) {
766                         return BLUETOOTH_ERROR_IN_PROGRESS;
767                 } else {
768                         if (adapter_le_discovery_state == LE_DISCOVERY_STARTED ||
769                                         adapter_le_discovery_state == LE_DISCOVERY_STARTING) {
770                                 /*TODO Stop Discovery*/
771                                 __bt_le_update_discovery_status(FALSE);
772                         }
773                         result = le_disable();  //change
774                         if (result != OAL_STATUS_SUCCESS) {
775                                 BT_ERR("LE_enable failed: [%d]", result);
776                                 result = BLUETOOTH_ERROR_INTERNAL;
777                                 /*TODO: perform if anything more needs to be done to handle failure */
778                         } else {
779                                 /* TODO: To be handled */
780                                 _bt_adapter_set_le_status(BT_LE_DEACTIVATING);
781                                 result = BLUETOOTH_ERROR_NONE;
782                         }
783                 }
784                 break;
785         }
786         case BT_LE_ACTIVATED: {
787                 BT_INFO("LE is currently in activated state, state [%d]",
788                                 _bt_adapter_get_le_status());
789                 if (enable) {
790                         return BLUETOOTH_ERROR_DEVICE_ALREADY_ENABLED;
791                 } else {
792                         if (adapter_le_discovery_state == LE_DISCOVERY_STARTED ||
793                                         adapter_le_discovery_state == LE_DISCOVERY_STARTING) {
794                                 /*TODO Stop Discovery*/
795                                 __bt_le_update_discovery_status(FALSE);
796                         }
797                         result = le_disable();
798                         if (result != OAL_STATUS_SUCCESS) {
799                                 BT_ERR("LE_enable failed: [%d]", result);
800                                 result = BLUETOOTH_ERROR_INTERNAL;
801                                 /*TODO: perform if anything more needs to be done to handle failure */
802                         } else {
803                                 /* TODO: To be handled */
804                                 _bt_adapter_set_le_status(BT_LE_DEACTIVATING);
805                                 result = BLUETOOTH_ERROR_NONE;
806                         }
807                 }
808                 break;
809         }
810         case BT_LE_DEACTIVATING: {
811                 BT_INFO("LE is currently in deactivating state, state [%d]",
812                                 _bt_adapter_get_le_status());
813                 if (!enable) {
814                         return BLUETOOTH_ERROR_IN_PROGRESS;
815
816                 } else {
817                         result = le_enable();
818                         if (result != OAL_STATUS_SUCCESS && result != OAL_STATUS_PENDING) {
819                                 BT_ERR("LE_enable failed: [%d]", result);
820                                 le_disable();
821                                 result = BLUETOOTH_ERROR_INTERNAL;
822                                 /*TODO: perform if anything more needs to be done to handle failure */
823                         } else {
824                                 /* TODO: To be handled */
825                                 _bt_adapter_set_le_status(BT_LE_ACTIVATING);
826                                 result = BLUETOOTH_ERROR_NONE;
827                         }
828                 }
829                 break;
830         }
831         case BT_LE_DEACTIVATED: {
832                 BT_INFO("LE is currently in deactivated state, state [%d]",
833                                 _bt_adapter_get_le_status());
834                 if (!enable) {
835                         return BLUETOOTH_ERROR_DEVICE_NOT_ENABLED;
836                 } else {
837                         result = le_enable();
838                         if (result != OAL_STATUS_SUCCESS && result != OAL_STATUS_PENDING) {
839                                 BT_ERR("LE_enable failed: [%d]", result);
840                                 le_disable();
841                                 result = BLUETOOTH_ERROR_INTERNAL;
842                                 /*TODO: perform if anything more needs to be done to handle failure */
843                         } else {
844                                 /* TODO: To be handled */
845                                 _bt_adapter_set_le_status(BT_LE_ACTIVATING);
846                                 result = BLUETOOTH_ERROR_NONE;
847                         }
848                 }
849                 break;
850         }
851         default:
852                 BT_ERR("Unknown state: %d", _bt_adapter_get_le_status());
853                 break;
854         }
855
856         if (enable && result == BLUETOOTH_ERROR_NONE) {
857                 /* Adapter enable request is successful, setup event handlers */
858                 _bt_service_register_event_handler_callback(
859                                 BT_ADAPTER_LE_MODULE, __bt_le_event_handler);
860                 _bt_device_state_handle_callback_set_request();
861         }
862         return result;
863 }
864
865 int _bt_enable_adapter_le(void)
866 {
867         return __bt_le_state_handle_request(TRUE);
868 }
869
870 int _bt_disable_adapter_le(void)
871 {
872         return __bt_le_state_handle_request(FALSE);
873 }
874
875
876 static gboolean __bt_is_factory_test_mode(void)
877 {
878         int mode = 0;
879
880         if (vconf_get_bool(VCONFKEY_BT_DUT_MODE, &mode)) {
881                 BT_ERR("Get the DUT Mode fail");
882                 return TRUE;
883         }
884
885         if (mode != FALSE) {
886                 BT_INFO("DUT Test Mode !!");
887                 return TRUE;
888         }
889
890         return FALSE;
891 }
892
893 int _bt_set_advertising(const char *sender, int adv_handle, gboolean enable, gboolean use_reserved_slot)
894 {
895         BT_CHECK_PARAMETER(sender, return);
896         int server_instance;
897         bt_pending_adv_data_set_t *info = NULL;
898         int result = OAL_STATUS_SUCCESS;
899         BT_DBG("+");
900
901         if (__bt_is_factory_test_mode()) {
902                 BT_ERR("Unable to start advertising in factory binary !!");
903                 return BLUETOOTH_ERROR_NOT_SUPPORT;
904         }
905
906         server_instance = _bt_get_allocated_server_instance(sender, adv_handle, use_reserved_slot);
907
908         if (server_instance == -1) {
909                 BT_DBG("No available slot for the current sender and handle combination");
910
911                 if (enable == FALSE) {
912                         BT_ERR("Advertising not even enabled on adv handle [%d] sender [%s]", adv_handle, sender);
913                         return BLUETOOTH_ERROR_NOT_IN_OPERATION;
914                 }
915
916                 server_instance = _bt_is_sender_gatt_server_with_no_adv(sender, adv_handle);
917
918                 if (server_instance == -1) {
919                         /* Internal Logic to register server instance if not initialized, store adv handle for future use */
920                         if (_bt_register_server_instance(sender, adv_handle) != BLUETOOTH_ERROR_NONE)
921                                 return BLUETOOTH_ERROR_INTERNAL;
922                         else {
923                                 /* Allocate a pending structure and mark Adv data set pending */
924                                 info = g_malloc0(sizeof(bt_pending_adv_data_set_t));
925                                 info->adv_handle = adv_handle;
926                                 info->sender = g_strdup(sender);
927                                 info->is_data_set_pending = FALSE;
928                                 adv_data_pending_list = g_slist_append(adv_data_pending_list, info);
929                                 return BLUETOOTH_ERROR_NONE;
930                         }
931                 }
932         }
933
934         if (enable)
935                 result = adapter_ble_multi_adv_enable(server_instance);
936         else
937                 result = adapter_ble_multi_adv_disable(server_instance);
938         if (result != OAL_STATUS_SUCCESS) {
939                 BT_ERR("OAL API adapter_ble_multi_adv_enable Fail %d", result);
940                 return BLUETOOTH_ERROR_INTERNAL;
941         }
942
943         /* Update adv handle in table */
944         _bt_update_adv_handle(sender, adv_handle);
945
946         return BLUETOOTH_ERROR_NONE;
947 }
948
949 int _bt_set_custom_advertising(const char *sender, int adv_handle,
950                 gboolean enable, bluetooth_advertising_params_t *params, gboolean use_reserved_slot)
951 {
952         BT_CHECK_PARAMETER(sender, return);
953         int server_instance;
954         bt_pending_adv_data_set_t *info = NULL;
955         int result = OAL_STATUS_SUCCESS;
956         BT_DBG("+");
957
958         if (__bt_is_factory_test_mode()) {
959                 BT_ERR("Unable to start advertising in factory binary !!");
960                 return BLUETOOTH_ERROR_NOT_SUPPORT;
961         }
962
963         server_instance = _bt_get_allocated_server_instance(sender, adv_handle, use_reserved_slot);
964
965         if (server_instance == -1) {
966                 BT_DBG("No available slot for the current sender and handle combination");
967
968                 if (enable == FALSE) {
969                         BT_ERR("Advertising not even enabled on adv handle [%d] sender [%s]", adv_handle, sender);
970                         return BLUETOOTH_ERROR_NOT_IN_OPERATION;
971                 }
972                 /* Below logic is only valid only when enabling advertising */
973                 server_instance = _bt_is_sender_gatt_server_with_no_adv(sender, adv_handle);
974
975                 if (server_instance == -1) {
976                         /* Internal Logic to register server instance if not initialized, store adv handle for future use */
977                         if (_bt_register_server_instance(sender, adv_handle) != BLUETOOTH_ERROR_NONE)
978                                 return BLUETOOTH_ERROR_INTERNAL;
979                         else {
980                                 /* Allocate a pending structure and mark Adv data set pending */
981                                 info = g_malloc0(sizeof(bt_pending_adv_data_set_t));
982                                 info->adv_handle = adv_handle;
983                                 info->sender = g_strdup(sender);
984                                 info->is_custom_adv = TRUE;
985                                 info->is_data_set_pending = FALSE;
986                                 memcpy(&info->params, params, sizeof(bluetooth_advertising_params_t));
987                                 adv_data_pending_list = g_slist_append(adv_data_pending_list, info);
988                                 return BLUETOOTH_ERROR_NONE;
989                         }
990                 }
991         }
992
993         if (enable) {
994                 /* Set Advertising parameters to Stack */
995                 result = adapter_ble_multi_adv_update(server_instance, params->interval_min, params->interval_max,
996                                 params->type, BT_ADV_DEFAULT_CHANNEL_MAP, params->tx_power_level, BT_ADV_DEFAULT_TIMEOUT);
997                 if (result != OAL_STATUS_SUCCESS) {
998                         BT_ERR("OAL API adapter_ble_multi_adv_update Fail %d", result);
999                         return BLUETOOTH_ERROR_INTERNAL;
1000                 }
1001                 /* Start Advertising when Adv update event is received */
1002                 result = adapter_ble_multi_adv_enable(server_instance);
1003                 if (result != OAL_STATUS_SUCCESS) {
1004                         BT_ERR("OAL API adapter_ble_multi_adv_enable Fail %d", result);
1005                         return BLUETOOTH_ERROR_INTERNAL;
1006                 }
1007                 /* Update adv handle in table */
1008                 _bt_update_adv_handle(sender, adv_handle);
1009
1010                 return BLUETOOTH_ERROR_NONE;
1011         } else
1012                 result = adapter_ble_multi_adv_disable(server_instance);
1013
1014         if (result != OAL_STATUS_SUCCESS) {
1015                 BT_ERR("OAL API adapter_ble_multi_adv_disable Fail %d", result);
1016                 return BLUETOOTH_ERROR_INTERNAL;
1017         }
1018         return BLUETOOTH_ERROR_NONE;
1019 }
1020
1021 int _bt_get_advertising_data(char *sender, int adv_handle, bluetooth_advertising_data_t *adv, int *length)
1022 {
1023         BT_CHECK_PARAMETER(adv, return);
1024         BT_CHECK_PARAMETER(length, return);
1025         BT_CHECK_PARAMETER(sender, return);
1026
1027         int server_instance;
1028
1029         server_instance = _bt_get_allocated_server_instance(sender, adv_handle, FALSE);
1030
1031         if (server_instance == -1) {
1032                 BT_DBG("No available slot for the current sender and handle combination");
1033                 return BLUETOOTH_ERROR_INTERNAL;
1034         }
1035
1036         _bt_get_previous_adv_data(adv, length, server_instance);
1037         BT_DBG("ADV Data length [%d] Server Instance [%d] Adv handle [%d]", *length, server_instance, adv_handle);
1038
1039         return BLUETOOTH_ERROR_NONE;
1040 }
1041
1042 int _bt_get_scan_response_data(char *sender, int adv_handle, bluetooth_scan_resp_data_t *response, int *length)
1043 {
1044         BT_CHECK_PARAMETER(response, return);
1045         BT_CHECK_PARAMETER(length, return);
1046         BT_CHECK_PARAMETER(sender, return);
1047
1048         int server_instance;
1049
1050         server_instance = _bt_get_allocated_server_instance(sender, adv_handle, FALSE);
1051
1052         if (server_instance == -1) {
1053                 BT_DBG("No available slot for the current sender and handle combination");
1054                 return BLUETOOTH_ERROR_INTERNAL;
1055         }
1056
1057         _bt_get_previous_scan_rsp_data(response, length, server_instance);
1058         BT_DBG("SCAN RSP Data length [%d] Server Instance [%d] Adv handle [%d]", *length, server_instance, adv_handle);
1059
1060         return BLUETOOTH_ERROR_NONE;
1061 }
1062
1063 static int __bt_set_multi_adv_param(oal_ble_multi_adv_param_setup_t *adv_setup,
1064                 bluetooth_advertising_data_t *adv_data, int length)
1065 {
1066         unsigned char *ptr;
1067         int num_uuids;
1068
1069         BT_INFO("+");
1070         retv_if(NULL == adv_data, BLUETOOTH_ERROR_INVALID_PARAM);
1071         retv_if(NULL == adv_setup, BLUETOOTH_ERROR_INVALID_PARAM);
1072
1073         for (ptr = adv_data->data; NULL != ptr && length > 0;) {
1074                 int len = ptr[0];
1075                 int type = ptr[1];
1076
1077                 BT_INFO("len: %d, type: %x", len, type);
1078
1079                 switch (type) {
1080                 case 0xFF: /* Manufacturer Data */
1081                         adv_setup->manufacturer_data = g_malloc0(sizeof(char) * (len - 1));
1082                         memcpy(adv_setup->manufacturer_data, (ptr + 2), (len - 1));
1083                         adv_setup->manufacturer_data_len = len - 1;
1084                         break;
1085                 case 0x15: /* 128 bit Solicit UUID */
1086                         adv_setup->solicit_uuid = g_malloc0(sizeof(char) * (len - 1));
1087                         memcpy((adv_setup->solicit_uuid), (ptr + 2), (len - 1));
1088                         adv_setup->solicit_uuid_len = len;
1089                         break;
1090                 case 0x06: /* 128 bit Service UUID */
1091                         adv_setup->service_uuid = g_malloc0(sizeof(char) * (len - 1));
1092                         memcpy((adv_setup->service_uuid), (ptr + 2), (len - 1));
1093                         adv_setup->service_uuid_len = len;
1094                         break;
1095                         case 0x14: {  /* 16 bit Solicit UUID */
1096                         int c;
1097                         int k;
1098                         num_uuids = (len -1)/2;
1099                         adv_setup->solicit_uuid = g_malloc0(sizeof(char) * 16 * num_uuids);
1100                         char *tmp = adv_setup->solicit_uuid;
1101                         adv_setup->solicit_uuid_len = 0;
1102
1103                         for (c = 1; c <= num_uuids; c++) {
1104                                 adv_setup->solicit_uuid_len += 16;;
1105                                 memcpy(tmp, BASE_UUID_CONVERTED, BT_UUID_128);
1106                                 memcpy(tmp+12, &ptr[c*2/* Byte Length*/], 2/* Byte Length */);
1107
1108                                 if (c < num_uuids)
1109                                         tmp += 16;
1110                         }
1111                         /* DEBUG: Test*/
1112                         for (k = 0; k < 16 * num_uuids; k++)
1113                                 BT_DBG("%x", adv_setup->solicit_uuid[k]);
1114                         break;
1115                 }
1116                 case 0x02: { /* 16 bit Service UUID */
1117                         int c;
1118                         int k;
1119                         num_uuids = (len -1)/2;
1120                         adv_setup->service_uuid = g_malloc0(sizeof(char) * 16 * num_uuids);
1121                         char *tmp = adv_setup->service_uuid;
1122                         adv_setup->service_uuid_len = 0;
1123
1124                         for (c = 1; c <= num_uuids; c++) {
1125                                 adv_setup->service_uuid_len += 16;;
1126                                 memcpy(tmp, BASE_UUID_CONVERTED, BT_UUID_128);
1127                                 memcpy(tmp+12, &ptr[c*2/* Byte Length */], 2/* Byte Length */);
1128
1129                                 if (c < num_uuids)
1130                                         tmp += 16;
1131                         }
1132                         /* DEBUG: Test*/
1133                         for (k = 0; k < 16 * num_uuids; k++)
1134                                 BT_DBG("%x", adv_setup->service_uuid[k]);
1135                         break;
1136                 }
1137                 case 0x16: { /* Service Data */
1138                         adv_setup->service_data = g_malloc0(sizeof(char) * (len - 1));
1139                         memcpy(adv_setup->service_data, (ptr + 2), (len - 1));
1140                         adv_setup->service_data_len = len - 1;
1141                         break;
1142                 }
1143                 case 0x21: {
1144                         BT_INFO("128 Bit Service Data Not Supported!!");
1145                         break;
1146                 }
1147                 case 0x0A: {
1148                         adv_setup->include_txpower = 1;
1149                         break;
1150                 }
1151                 case 0x09:
1152                 case 0x08: {
1153                         adv_setup->include_name = 1;
1154                         break;
1155                 }
1156                 case 0x19: {
1157                         memcpy(&adv_setup->appearance, (ptr + 2), (len - 1));
1158                         break;
1159                 }
1160                 default:
1161                         BT_ERR("Unknown type: %x", type);
1162                         break;
1163         }
1164
1165                 length -= len + 1;
1166                 ptr += len + 1;
1167         }
1168
1169         BT_INFO("-");
1170         return BLUETOOTH_ERROR_NONE;
1171 }
1172
1173 int _bt_set_advertising_data(const char *sender, int adv_handle,
1174                 bluetooth_advertising_data_t *adv, int length, gboolean use_reserved_slot)
1175 {
1176         BT_CHECK_PARAMETER(adv, return);
1177         BT_CHECK_PARAMETER(sender, return);
1178         bt_pending_adv_data_set_t *info = NULL;
1179         int server_instance;
1180         bluetooth_advertising_data_t adv_old;
1181         int adv_data_len;
1182         char *old_mdata = NULL;
1183         int old_len = 0;
1184         GVariant *ad_data, *param = NULL;
1185         oal_ble_multi_adv_param_setup_t adv_setup;
1186         int result = OAL_STATUS_SUCCESS;
1187         BT_DBG("+");
1188
1189         if (length > BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX)
1190                 return BLUETOOTH_ERROR_INVALID_PARAM;
1191
1192         if (__bt_is_factory_test_mode()) {
1193                 BT_ERR("Unable to set advertising data in factory binary !!");
1194                 return BLUETOOTH_ERROR_NOT_SUPPORT;
1195         }
1196
1197         server_instance = _bt_get_allocated_server_instance(sender, adv_handle, use_reserved_slot);
1198
1199         if (server_instance == -1) {
1200                 BT_DBG("No available slot for the current sender and handle combination");
1201
1202                 server_instance = _bt_is_sender_gatt_server_with_no_adv(sender, adv_handle);
1203
1204                 if (server_instance == -1) {
1205                         /* Internal Logic to register server instance if not initialized, store adv handle for future use */
1206                         if (_bt_register_server_instance(sender, adv_handle) != BLUETOOTH_ERROR_NONE)
1207                                 return BLUETOOTH_ERROR_INTERNAL;
1208                         else {
1209                                 /* Allocate a pending structure and mark Adv data set pending */
1210                                 info = g_malloc0(sizeof(bt_pending_adv_data_set_t));
1211                                 info->adv_handle = adv_handle;
1212                                 info->sender = g_strdup(sender);
1213                                 info->data_len = length;
1214                                 info->is_adv = TRUE;
1215                                 info->is_data_set_pending = TRUE;
1216                                 memcpy(&info->data, &(adv->data[0]), length);
1217                                 adv_data_pending_list = g_slist_append(adv_data_pending_list, info);
1218                                 return BLUETOOTH_ERROR_NONE;
1219                         }
1220                 }
1221         }
1222
1223         /* Server Instance is already allocated, set Adv data to stack */
1224         /* First check if adv data is already present for slot server_instance*/
1225         memset(&adv_old.data, 0, sizeof(adv_old.data));
1226         _bt_get_previous_adv_data(&adv_old, &adv_data_len, server_instance);
1227
1228         /* Send Data to stack */
1229         memset(&adv_setup, 0, sizeof(oal_ble_multi_adv_param_setup_t));
1230
1231         if (BLUETOOTH_ERROR_NONE !=
1232                         __bt_set_multi_adv_param(&adv_setup, adv, length)) {
1233                 if (adv_setup.manufacturer_data)
1234                         g_free(adv_setup.manufacturer_data);
1235                 if (adv_setup.service_uuid)
1236                         g_free(adv_setup.service_uuid);
1237                 if (adv_setup.service_data)
1238                         g_free(adv_setup.service_data);
1239                 return BLUETOOTH_ERROR_INTERNAL;
1240         }
1241         /* Set Scan response false */
1242         adv_setup.set_scan_rsp = FALSE;
1243
1244         /* Set Server instance */
1245         adv_setup.server_if = server_instance;
1246
1247         /* Set Server instance[Product Requirement] */
1248         adv_setup.tx_power = 4;
1249
1250         BT_DBG("####Service UUID len [%d], service data len [%d] Solicit UUID len [%d]",
1251                                 adv_setup.solicit_uuid_len, adv_setup.service_uuid_len, adv_setup.service_data_len);
1252         result = adapter_ble_multi_adv_set_inst_data(server_instance, &adv_setup);
1253         if (result != OAL_STATUS_SUCCESS) {
1254                 BT_ERR("OAL API adapter_ble_multi_adv_set_inst_data Fail %d", result);
1255                 /* Free the data */
1256                 if (adv_setup.manufacturer_data)
1257                         g_free(adv_setup.manufacturer_data);
1258                 if (adv_setup.service_data)
1259                         g_free(adv_setup.service_data);
1260                 if (adv_setup.service_uuid)
1261                         g_free(adv_setup.service_uuid);
1262                 return BLUETOOTH_ERROR_INTERNAL;
1263         }
1264
1265         /* Data sent to Stack successfully, send manuf data changed event if applicable */
1266         if (adv_setup.manufacturer_data_len != 0) {
1267                 if (adv_data_len > 0) {
1268                         _bt_get_ad_data_by_type((char *)adv_old.data, adv_data_len, 0xff,
1269                                         &old_mdata, &old_len);
1270                 }
1271
1272                 if (old_len != adv_setup.manufacturer_data_len ||
1273                                 (old_mdata && adv_setup.manufacturer_data &&
1274                                  memcmp(old_mdata, adv_setup.manufacturer_data, adv_setup.manufacturer_data_len))) {
1275
1276                         ad_data = g_variant_new_from_data((const GVariantType *)"ay",
1277                                         adv_setup.manufacturer_data, adv_setup.manufacturer_data_len, TRUE, NULL, NULL);
1278                         param = g_variant_new("(@ay)", ad_data);
1279                         _bt_send_event(BT_ADAPTER_EVENT,
1280                                         BLUETOOTH_EVENT_ADVERTISING_MANUFACTURER_DATA_CHANGED,
1281                                         param);
1282                 }
1283
1284                 g_free(old_mdata);
1285         }
1286
1287         /* Time to update new ADV data completely in Table */
1288         _bt_set_new_adv_data(adv, length, server_instance);
1289
1290         /* Free the data */
1291         if (adv_setup.manufacturer_data)
1292                 g_free(adv_setup.manufacturer_data);
1293         if (adv_setup.service_data)
1294                 g_free(adv_setup.service_data);
1295         if (adv_setup.service_uuid)
1296                 g_free(adv_setup.service_uuid);
1297
1298         /* Update adv handle in table */
1299         _bt_update_adv_handle(sender, adv_handle);
1300
1301         return BLUETOOTH_ERROR_NONE;
1302 }
1303
1304 int _bt_set_scan_response_data(const char *sender, int adv_handle,
1305                                 bluetooth_scan_resp_data_t *response, int length, gboolean use_reserved_slot)
1306 {
1307         BT_CHECK_PARAMETER(response, return);
1308         BT_CHECK_PARAMETER(sender, return);
1309         bt_pending_adv_data_set_t *info = NULL;
1310         bluetooth_scan_resp_data_t scan_rsp_old;
1311         int scan_rsp_data_len;
1312         GVariant *ad_data, *param = NULL;
1313         oal_ble_multi_adv_param_setup_t adv_setup;
1314         char *old_mdata = NULL;
1315         int old_len = 0;
1316         int server_instance;
1317         int result = OAL_STATUS_SUCCESS;
1318         BT_DBG("+");
1319
1320         if (length > BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX)
1321                 return BLUETOOTH_ERROR_INVALID_PARAM;
1322
1323         if (__bt_is_factory_test_mode()) {
1324                 BT_ERR("Unable to set Scan Response data in factory binary !!");
1325                 return BLUETOOTH_ERROR_NOT_SUPPORT;
1326         }
1327
1328         server_instance = _bt_get_allocated_server_instance(sender, adv_handle, use_reserved_slot);
1329         if (server_instance == -1) {
1330                 BT_DBG("No available slot for the current sender and handle combination");
1331
1332                 server_instance = _bt_is_sender_gatt_server_with_no_adv(sender, adv_handle);
1333
1334                 if (server_instance == -1) {
1335                         /* Internal Logic to register server instance if not initialized */
1336                         if (_bt_register_server_instance(sender, adv_handle) != BLUETOOTH_ERROR_NONE)
1337                                 return BLUETOOTH_ERROR_INTERNAL;
1338                         else {
1339                                 /* Allocate a pending structure and mark Adv data set pending */
1340                                 info = g_malloc0(sizeof(bt_pending_adv_data_set_t));
1341                                 info->adv_handle = adv_handle;
1342                                 info->sender = g_strdup(sender);
1343                                 info->data_len = length;
1344                                 info->is_adv = FALSE;
1345                                 info->is_data_set_pending = TRUE;
1346                                 memcpy(&info->data, &(response->data[0]), length);
1347                                 adv_data_pending_list = g_slist_append(adv_data_pending_list, info);
1348                                 return BLUETOOTH_ERROR_NONE;
1349                         }
1350                 }
1351         }
1352
1353         /* Server Instance is already allocated, set Adv data to stack */
1354         /* First check if adv data is already present for slot server_instance*/
1355         memset(&scan_rsp_old.data, 0, sizeof(scan_rsp_old.data));
1356         _bt_get_previous_scan_rsp_data(&scan_rsp_old, &scan_rsp_data_len, server_instance);
1357
1358         /* Send Data to stack */
1359         memset(&adv_setup, 0, sizeof(oal_ble_multi_adv_param_setup_t));
1360
1361         if (BLUETOOTH_ERROR_NONE !=
1362                         __bt_set_multi_adv_param(&adv_setup, (bluetooth_advertising_data_t*)response, length)) {
1363                 if (adv_setup.manufacturer_data)
1364                         g_free(adv_setup.manufacturer_data);
1365                 if (adv_setup.service_uuid)
1366                         g_free(adv_setup.service_uuid);
1367                 if (adv_setup.service_data)
1368                         g_free(adv_setup.service_data);
1369                 return BLUETOOTH_ERROR_INTERNAL;
1370         }
1371
1372         /* Set Scan response to TRUE */
1373         adv_setup.set_scan_rsp = TRUE;
1374
1375         /* Set Server instance */
1376         adv_setup.server_if = server_instance;
1377
1378         /* Set Server instance[Product Requirement] */
1379         adv_setup.tx_power = 4;
1380
1381         result = adapter_ble_multi_adv_set_inst_data(server_instance, &adv_setup);
1382         if (result != OAL_STATUS_SUCCESS) {
1383                 BT_ERR("OAL API adapter_ble_multi_adv_set_inst_data Fail %d", result);
1384                 /* Free the data */
1385                 if (adv_setup.manufacturer_data)
1386                         g_free(adv_setup.manufacturer_data);
1387                 if (adv_setup.service_data)
1388                         g_free(adv_setup.service_data);
1389                 if (adv_setup.service_uuid)
1390                         g_free(adv_setup.service_uuid);
1391                 return BLUETOOTH_ERROR_INTERNAL;
1392         }
1393
1394         /* Data sent to Stack successfully, send manuf data changed event if applicable */
1395         if (adv_setup.manufacturer_data_len != 0) {
1396                 if (scan_rsp_data_len > 0) {
1397                         _bt_get_ad_data_by_type((char *)scan_rsp_old.data, scan_rsp_data_len, 0xff,
1398                                         &old_mdata, &old_len);
1399                 }
1400
1401                 if (old_len != adv_setup.manufacturer_data_len ||
1402                                 (old_mdata && adv_setup.manufacturer_data &&
1403                                  memcmp(old_mdata, adv_setup.manufacturer_data, adv_setup.manufacturer_data_len))) {
1404
1405                         ad_data = g_variant_new_from_data((const GVariantType *)"ay",
1406                                         adv_setup.manufacturer_data, adv_setup.manufacturer_data_len, TRUE, NULL, NULL);
1407                         param = g_variant_new("(@ay)", ad_data);
1408                         _bt_send_event(BT_ADAPTER_EVENT,
1409                                         BLUETOOTH_EVENT_ADVERTISING_MANUFACTURER_DATA_CHANGED,
1410                                         param);
1411                 }
1412
1413                 g_free(old_mdata);
1414         }
1415
1416         /* Time to update new Scan Response data completely in Table */
1417         _bt_set_new_scan_rsp_data(response, length, server_instance);
1418
1419         /* Free the data */
1420         if (adv_setup.manufacturer_data)
1421                 g_free(adv_setup.manufacturer_data);
1422         if (adv_setup.service_data)
1423                 g_free(adv_setup.service_data);
1424         if (adv_setup.service_uuid)
1425                 g_free(adv_setup.service_uuid);
1426
1427         /* Update adv handle in table */
1428         _bt_update_adv_handle(sender, adv_handle);
1429         return BLUETOOTH_ERROR_NONE;
1430 }
1431
1432 /*************************************** LE Scan APIs *********************************************/
1433 int _bt_set_scan_parameters(bluetooth_le_scan_params_t *params)
1434 {
1435         int itv = 0;
1436         int win = 0;
1437         int ret;
1438
1439         BT_CHECK_PARAMETER(params, return);
1440
1441         if (_bt_adapter_get_status() != BT_ACTIVATED &&
1442                         _bt_adapter_get_le_status() != BT_LE_ACTIVATED) {
1443                 return BLUETOOTH_ERROR_DEVICE_NOT_ENABLED;
1444         }
1445
1446         BT_DBG("inteval %f, win %f, type %d", params->interval, params->window, params->type);
1447
1448         if (params->interval < BT_LE_SCAN_INTERVAL_MIN ||
1449                         params->interval > BT_LE_SCAN_INTERVAL_MAX)
1450                 return BLUETOOTH_ERROR_INVALID_PARAM;
1451
1452         if (params->window < BT_LE_SCAN_WINDOW_MIN ||
1453                         params->window > BT_LE_SCAN_WINDOW_MAX)
1454                 return BLUETOOTH_ERROR_INVALID_PARAM;
1455
1456         if (params->window > params->interval)
1457                 return BLUETOOTH_ERROR_INVALID_PARAM;
1458
1459         itv = params->interval / BT_SCAN_INTERVAL_SPLIT;
1460         win = params->window / BT_SCAN_INTERVAL_SPLIT;
1461
1462         ret = gattc_set_le_scan_param(params->type, itv, win);
1463         if (OAL_STATUS_SUCCESS != ret) {
1464                 BT_ERR("gattc_set_le_scan_param failed");
1465                 return BLUETOOTH_ERROR_INTERNAL;
1466         }
1467
1468         is_le_set_scan_parameter = TRUE;
1469
1470         BT_INFO("Set scan parameters inteval %f, win %f, type %d",
1471                         itv * BT_SCAN_INTERVAL_SPLIT, win * BT_SCAN_INTERVAL_SPLIT, params->type);
1472
1473         return BLUETOOTH_ERROR_NONE;
1474 }
1475
1476 int _bt_prepare_scan_parameters(bluetooth_le_scan_params_t *params, int scan_type)
1477 {
1478         if (_bt_adapter_get_status() != BT_ACTIVATED &&
1479                 _bt_adapter_get_le_status() != BT_LE_ACTIVATED) {
1480                 return BLUETOOTH_ERROR_DEVICE_NOT_ENABLED;
1481         }
1482
1483         if (params)
1484                 BT_DBG("inteval %f, win %f", params->interval, params->window);
1485         else
1486                 BT_DBG("type %d", scan_type);
1487
1488         if (params) {
1489                 if (params->interval < BT_LE_SCAN_INTERVAL_MIN || params->interval > BT_LE_SCAN_INTERVAL_MAX)
1490                         return BLUETOOTH_ERROR_INVALID_PARAM;
1491
1492                 if (params->window < BT_LE_SCAN_WINDOW_MIN || params->window > BT_LE_SCAN_WINDOW_MAX)
1493                         return BLUETOOTH_ERROR_INVALID_PARAM;
1494
1495                 if (params->window > params->interval)
1496                         return BLUETOOTH_ERROR_INVALID_PARAM;
1497
1498                 le_scan_params.interval = params->interval;
1499                 le_scan_params.window = params->window;
1500         } else {
1501                 le_scan_params.type = scan_type;
1502                 if (le_scan_params.interval == 0) {
1503                         /* Set default scan interval same with BT_ADAPTER_LE_SCAN_MODE_LOW_ENERGY */
1504                         le_scan_params.interval = 5120;
1505                         le_scan_params.window = 512;
1506                 }
1507         }
1508
1509         is_le_set_scan_parameter = TRUE;
1510
1511         return BLUETOOTH_ERROR_NONE;
1512 }
1513
1514 gboolean __send_le_scan_reply(gpointer data)
1515 {
1516         int value = (intptr_t)data;
1517
1518         if (0 == value) {
1519                 BT_DBG("Send reply to BT_STOP_LE_DISCOVERY");
1520                 __bt_adapter_le_handle_pending_request_info(
1521                                 BLUETOOTH_ERROR_NONE,
1522                                 BT_STOP_LE_DISCOVERY, NULL, 0);
1523         } else {
1524                 BT_DBG("Send reply to BT_START_LE_DISCOVERY");
1525                 __bt_adapter_le_handle_pending_request_info(
1526                                 BLUETOOTH_ERROR_NONE,
1527                                 BT_START_LE_DISCOVERY, NULL, 0);
1528         }
1529
1530         return FALSE;
1531 }
1532
1533 static gboolean __start_le_scan_timeout(gpointer user_data)
1534 {
1535         char *sender = (char *)user_data;
1536         _bt_start_le_scan(sender);
1537
1538         return FALSE;
1539 }
1540
1541 int _bt_start_le_scan(const char *sender)
1542 {
1543         bt_adapter_le_scanner_t *scanner;
1544         int ret;
1545
1546         scanner = __bt_find_scanner_from_list(sender);
1547         if (!scanner) {
1548                 scanner = g_malloc0(sizeof(bt_adapter_le_scanner_t));
1549                 retv_if(scanner == NULL, BLUETOOTH_ERROR_INTERNAL);
1550
1551                 scanner->sender = g_strdup(sender);
1552                 scanner_list = g_slist_append(scanner_list, scanner);
1553         }
1554
1555         if (scanner->stop_pending == TRUE) {
1556                 BT_DBG("Waiting LEDiscoveryFinished");
1557                 g_timeout_add(500, (GSourceFunc)__start_le_scan_timeout, scanner->sender);
1558                 return BLUETOOTH_ERROR_NONE;
1559         }
1560
1561         if (scanner->is_scanning) {
1562                 BT_ERR("BT is already in LE scanning");
1563                 return BLUETOOTH_ERROR_IN_PROGRESS;
1564         }
1565
1566         if (_bt_is_le_scanning()) {
1567                 int value = 1;
1568
1569                 BT_INFO("LE Full Scan is already on progress");
1570                 g_idle_add(__send_le_scan_reply, (void *)(intptr_t)value);
1571                 goto done;
1572         }
1573
1574         if (is_le_set_scan_parameter == FALSE) {
1575                 bluetooth_le_scan_params_t scan_params;
1576
1577                 /* Set default scan parameter same with BT_ADAPTER_LE_SCAN_MODE_LOW_ENERGY */
1578                 scan_params.type = 0x01;
1579                 scan_params.interval = 5120;
1580                 scan_params.window = 512;
1581                 _bt_set_scan_parameters(&scan_params);
1582         } else {
1583                 _bt_set_scan_parameters(&le_scan_params);
1584         }
1585
1586         BT_INFO("Start LE Full Scan");
1587         ret = gattc_start_le_discovery(g_gatt_client_id);
1588
1589         if (OAL_STATUS_SUCCESS != ret) {
1590                 BT_ERR("gattc_start_le_discovery failed");
1591                 return BLUETOOTH_ERROR_INTERNAL;
1592         }
1593
1594 done:
1595         scanner->is_scanning = TRUE;
1596         return BLUETOOTH_ERROR_NONE;
1597 }
1598
1599 int _bt_stop_le_scan(const char *sender)
1600 {
1601         bt_adapter_le_scanner_t *scan_sender;
1602         bt_adapter_le_scanner_t *scanner;
1603         gboolean next_scanning = FALSE;
1604         GSList *l;
1605         int ret;
1606
1607         scan_sender = __bt_find_scanner_from_list(sender);
1608         if (scan_sender == NULL || scan_sender->is_scanning == FALSE)
1609                 return BLUETOOTH_ERROR_NOT_IN_OPERATION;
1610
1611         scan_sender->is_scanning = FALSE;
1612         scan_sender->stop_pending = TRUE;
1613
1614         for (l = scanner_list; l != NULL; l = g_slist_next(l)) {
1615                 scanner = l->data;
1616                 if (scanner->is_scanning == TRUE)
1617                         next_scanning = TRUE;
1618         }
1619
1620         if (next_scanning == TRUE) {
1621                 int value = 0;
1622
1623                 g_idle_add(__send_le_scan_reply, (void *)(intptr_t)value);
1624                 return BLUETOOTH_ERROR_NONE;
1625         } else {
1626                 BT_INFO("Just stop LE scan");
1627         }
1628
1629         ret = gattc_stop_le_discovery(g_gatt_client_id);
1630
1631         if (OAL_STATUS_SUCCESS != ret) {
1632                 BT_ERR("gattc_start_le_discovery failed");
1633                 scan_sender->stop_pending = FALSE;
1634                 return BLUETOOTH_ERROR_INTERNAL;
1635         }
1636
1637         is_le_set_scan_parameter = FALSE;
1638
1639         le_scan_params.type = BT_LE_ACTIVE_SCAN;
1640         le_scan_params.interval = 0;
1641         le_scan_params.window = 0;
1642
1643         return BLUETOOTH_ERROR_NONE;
1644 }
1645
1646 void _bt_disable_all_scanner_status(void)
1647 {
1648         GSList *l;
1649         bt_adapter_le_scanner_t *scanner;
1650
1651         for (l = scanner_list; l != NULL; l = g_slist_next(l)) {
1652                 scanner = l->data;
1653                 scanner->is_scanning = FALSE;
1654                 scanner->stop_pending = FALSE;
1655         }
1656 }
1657
1658 static void __bt_free_le_scanner(void)
1659 {
1660         GSList *l;
1661         bt_adapter_le_scanner_t *scanner;
1662
1663         for (l = scanner_list; l != NULL; l = g_slist_next(l)) {
1664                 scanner = l->data;
1665                 g_free(scanner->sender);
1666                 g_slist_free_full(scanner->filter_list, g_free);
1667                 g_free(scanner);
1668         }
1669
1670         g_slist_free(scanner_list);
1671         scanner_list = NULL;
1672
1673         is_le_scanning = FALSE;
1674         is_le_set_scan_parameter = FALSE;
1675         le_scan_params.type = BT_LE_ACTIVE_SCAN;
1676         le_scan_params.interval = 0;
1677         le_scan_params.window = 0;
1678 }
1679
1680 void _bt_check_le_scanner_app_termination(const char *sender)
1681 {
1682         bt_adapter_le_scanner_t *scanner;
1683
1684         scanner = __bt_find_scanner_from_list(sender);
1685         if (!scanner)
1686                 return;
1687
1688         if (scanner->is_scanning)
1689                 _bt_stop_le_scan(sender);
1690
1691         scanner_list = g_slist_remove(scanner_list, scanner);
1692         g_free(scanner->sender);
1693         g_free(scanner);
1694 }
1695
1696 int _bt_service_le_init(void)
1697 {
1698         le_init();
1699
1700         return BLUETOOTH_ERROR_NONE;
1701 }
1702
1703 void _bt_service_le_deinit(void)
1704 {
1705         le_deinit();
1706         __bt_free_le_scanner();
1707 }
1708
1709 int _bt_is_advertising(void)
1710 {
1711         int ret = is_advertising();
1712
1713         if (ret == BLUETOOTH_ERROR_NONE)
1714                 return TRUE;
1715         else
1716                 return FALSE;
1717 }
1718
1719 gboolean _bt_is_le_2m_phy_supported(void)
1720 {
1721         if (le_feature_info.le_2m_phy)
1722                 return TRUE;
1723         else
1724                 return FALSE;
1725 }
1726
1727 gboolean _bt_is_le_coded_phy_supported(void)
1728 {
1729         if (le_feature_info.le_coded_phy)
1730                 return TRUE;
1731         else
1732                 return FALSE;
1733 }
1734
1735 int _bt_set_white_list(bluetooth_device_address_t *device_address, int address_type, bool is_add)
1736 {
1737         int result = BLUETOOTH_ERROR_NONE;
1738         if (__bt_is_factory_test_mode()) {
1739                 if(is_add)
1740                         BT_ERR("Unable to add to white list in factory binary !!");
1741                 else
1742                         BT_ERR("Unable to remove white list in factory binary !!");
1743                 return BLUETOOTH_ERROR_NOT_SUPPORT;
1744         }
1745
1746         BT_CHECK_PARAMETER(device_address, return);
1747
1748         if(_bt_adapter_get_status() != BT_ACTIVATED ){
1749                 BT_ERR("Bluetooth adapter is disabled");
1750                 return BLUETOOTH_ERROR_DEVICE_NOT_ENABLED;
1751         }
1752
1753         result = adapter_set_white_list((bt_address_t*)device_address, address_type, is_add);
1754         if (result != OAL_STATUS_SUCCESS) {
1755                 if(is_add)
1756                         BT_ERR("Add to White List Failed %d", result);
1757                 else
1758                         BT_ERR("Remove from white list Failed %d", result);
1759                 return BLUETOOTH_ERROR_INTERNAL;
1760         }
1761
1762         return result;
1763 }
1764
1765 /*************************************** LE Scan APIs *********************************************/
1766
1767 int _bt_set_le_static_random_address(gboolean is_enable)
1768 {
1769         int result = BLUETOOTH_ERROR_NONE;
1770
1771         if (__bt_is_factory_test_mode()) {
1772                 BT_ERR("Unable to set le random address in factory binary !!");
1773                 return BLUETOOTH_ERROR_NOT_SUPPORT;
1774         }
1775
1776         if (_bt_adapter_get_status() != BT_ACTIVATED &&
1777                 _bt_adapter_get_le_status() != BT_LE_ACTIVATED) {
1778                 return BLUETOOTH_ERROR_DEVICE_NOT_ENABLED;
1779         }
1780
1781         result =  adapter_set_le_static_random_address(is_enable);
1782         if (result != OAL_STATUS_SUCCESS) {
1783                 BT_ERR("adapter_set_connectable failed: %d", result);
1784                 result = BLUETOOTH_ERROR_INTERNAL;
1785         } else {
1786                 BT_INFO("SetLeStaticRandomAddress as %d", is_enable);
1787                 result = BLUETOOTH_ERROR_NONE;
1788         }
1789
1790         return result;
1791 }