2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include <dbus/dbus.h>
25 #include <syspopup_caller.h>
28 #include "bt-internal-types.h"
29 #include "bt-service-common.h"
30 #include "bt-service-event.h"
31 #include "bt-service-adapter.h"
32 #include "bt-service-adapter-le.h"
33 #include "bt-service-util.h"
36 #define BT_ADV_INTERVAL_MIN 20 /* msec */
37 #define BT_ADV_INTERVAL_MAX 10240
38 #define BT_ADV_INTERVAL_SPLIT 0.625
39 #define BT_DEFAULT_ADV_MIN_INTERVAL 500
40 #define BT_DEFAULT_ADV_MAX_INTERVAL 500
41 #define BT_ADV_FILTER_POLICY_DEFAULT 0x00
42 #define BT_ADV_TYPE_DEFAULT 0x00
43 #define BT_ADV_FILTER_POLICY_ALLOW_SCAN_CONN_WL_ONLY 0x03
49 } bt_adapter_le_feature_info_t;
54 gboolean is_advertising;
56 } bt_adapter_le_adv_slot_t;
62 gboolean stop_pending;
63 } bt_adapter_le_scanner_t;
65 static bluetooth_advertising_params_t adv_params = {
66 BT_DEFAULT_ADV_MIN_INTERVAL,
67 BT_DEFAULT_ADV_MAX_INTERVAL,
68 BT_ADV_FILTER_POLICY_DEFAULT,
70 static bluetooth_advertising_data_t adv_data = { {0} };
71 static int adv_data_len;
72 static bluetooth_scan_resp_data_t resp_data = { {0} };
73 static int resp_data_len;
75 static bt_adapter_le_feature_info_t le_feature_info = { 1, 0, 0 };
76 static bt_adapter_le_adv_slot_t *le_adv_slot = NULL;
78 GSList *scanner_list = NULL;
79 static gboolean is_le_set_scan_parameter = FALSE;
80 static gboolean is_le_scanning = FALSE;
81 static gboolean scan_filter_enabled = FALSE;
82 static bt_le_scan_type_t le_scan_type = BT_LE_PASSIVE_SCAN;
84 static GSList *gatt_client_senders = NULL;
87 gboolean _bt_is_set_scan_parameter(void)
89 return is_le_set_scan_parameter;
92 void _bt_init_gatt_client_senders(void)
94 _bt_clear_request_list();
97 int _bt_insert_gatt_client_sender(char *sender)
101 retv_if(sender == NULL, BLUETOOTH_ERROR_INVALID_PARAM);
103 info = g_strdup(sender);
104 retv_if(info == NULL, BLUETOOTH_ERROR_MEMORY_ALLOCATION);
106 gatt_client_senders = g_slist_append(gatt_client_senders, info);
108 BT_DBG("insert sender: %s", sender);
110 return BLUETOOTH_ERROR_NONE;
113 int _bt_delete_gatt_client_sender(char *sender)
118 BT_DBG("remove sender: %s", sender);
120 for (l = gatt_client_senders; l != NULL; l = g_slist_next(l)) {
125 if (g_strcmp0(info, sender) == 0) {
126 BT_DBG("remove info");
127 gatt_client_senders = g_slist_remove(gatt_client_senders, info);
129 return BLUETOOTH_ERROR_NONE;
133 return BLUETOOTH_ERROR_NOT_FOUND;
136 void _bt_clear_gatt_client_senders(void)
138 if (gatt_client_senders) {
139 g_slist_foreach(gatt_client_senders, (GFunc)g_free, NULL);
140 g_slist_free(gatt_client_senders);
141 gatt_client_senders = NULL;
145 static void __bt_send_foreach_event(gpointer data, gpointer user_data)
148 GVariant *param = user_data;
150 _bt_send_event_to_dest(sender, BT_DEVICE_EVENT, BLUETOOTH_EVENT_GATT_CHAR_VAL_CHANGED,
154 void _bt_send_char_value_changed_event(void *param)
157 g_slist_foreach(gatt_client_senders, __bt_send_foreach_event,
160 _bt_send_event(BT_DEVICE_EVENT, BLUETOOTH_EVENT_GATT_CHAR_VAL_CHANGED, param);
164 void __bt_free_le_adv_slot(void)
168 if (le_adv_slot == NULL)
171 for (i = 0; i < le_feature_info.adv_inst_max; i++) {
172 if (le_adv_slot[i].sender)
173 g_free(le_adv_slot[i].sender);
174 if (le_adv_slot[i].hold_timer_id > 0)
175 g_source_remove(le_adv_slot[i].hold_timer_id);
181 int _bt_le_set_max_packet_len(void)
183 int result = BLUETOOTH_ERROR_NONE;
184 int tx_octets, tx_time;
185 bluetooth_le_read_maximum_data_length_t max_len = {0};
187 if (BLUETOOTH_ERROR_NONE != _bt_le_read_maximum_data_length(&max_len))
188 return BLUETOOTH_ERROR_INTERNAL;
190 if (max_len.max_tx_octets > BT_LE_TX_LEN_DEFAULT) {
191 tx_octets = max_len.max_tx_octets > BT_LE_TX_LEN_MAX ?
192 BT_LE_TX_LEN_MAX : max_len.max_tx_octets;
193 tx_time = BT_LE_TX_TIME_MAX;
195 result = _bt_le_write_host_suggested_default_data_length(tx_octets, tx_time);
197 BT_DBG("Wrote max packet size : result[%d], MAX[%d], set[%d]",
198 result, max_len.max_tx_octets, tx_octets);
204 gboolean _bt_update_le_feature_support(const char *item, const char *value)
206 if (item == NULL || value == NULL)
210 _bt_service_adapter_le_init();
212 if (g_strcmp0(item, "adv_inst_max") == 0) {
215 slot_num = atoi(value);
216 retv_if(slot_num < 0, FALSE);
218 if (slot_num != le_feature_info.adv_inst_max) {
219 __bt_free_le_adv_slot();
220 le_feature_info.adv_inst_max = slot_num;
221 BT_INFO("Advertising instance max : %d", le_feature_info.adv_inst_max);
222 le_adv_slot = g_malloc0(sizeof(bt_adapter_le_adv_slot_t) * le_feature_info.adv_inst_max);
224 } else if (g_strcmp0(item, "rpa_offloading") == 0) {
225 le_feature_info.rpa_offloading = atoi(value);
226 BT_INFO("RPA offloading : %d", le_feature_info.rpa_offloading);
227 } else if (g_strcmp0(item, "max_filter") == 0) {
228 le_feature_info.max_filter = atoi(value);
229 BT_INFO("BLE Scan max filter : %d", le_feature_info.max_filter);
231 BT_DBG("No registered item");
238 static gboolean __bt_is_factory_test_mode(void)
242 if (vconf_get_bool(VCONFKEY_BT_DUT_MODE, &mode)) {
243 BT_ERR("Get the DUT Mode fail");
248 BT_INFO("DUT Test Mode !!");
255 int __bt_get_available_adv_slot_id(const char *sender, int adv_handle, gboolean use_reserved_slot)
259 if (le_adv_slot == NULL) {
260 BT_ERR("le_adv_slot is NULL");
264 BT_DBG("adv_inst_max : %d", le_feature_info.adv_inst_max);
266 for (i = 0; i < le_feature_info.adv_inst_max; i++) {
267 if (le_adv_slot[i].sender == NULL)
269 if ((g_strcmp0(le_adv_slot[i].sender, sender) == 0) && (le_adv_slot[i].adv_handle == adv_handle))
273 if (le_feature_info.adv_inst_max <= 1)
275 else if (use_reserved_slot == TRUE)
280 for (; i < le_feature_info.adv_inst_max; i++) {
281 if (le_adv_slot[i].sender == NULL)
288 static void __bt_register_adv_slot_owner(const char *sender, int adv_handle, int slot_id)
290 if (le_adv_slot[slot_id].sender == NULL) {
291 le_adv_slot[slot_id].sender = strdup(sender);
292 le_adv_slot[slot_id].adv_handle = adv_handle;
296 void _bt_unregister_adv_slot_owner(int slot_id)
298 if (le_adv_slot[slot_id].hold_timer_id > 0) {
299 BT_INFO("Hold state adv is not unregistered");
303 g_free(le_adv_slot[slot_id].sender);
304 le_adv_slot[slot_id].sender = NULL;
305 le_adv_slot[slot_id].adv_handle = 0;
308 const char* _bt_get_adv_slot_owner(int slot_id)
310 if (le_adv_slot == NULL)
313 return le_adv_slot[slot_id].sender;
316 int _bt_get_adv_slot_adv_handle(int slot_id)
318 if (le_adv_slot == NULL)
321 return le_adv_slot[slot_id].adv_handle;
324 void _bt_set_advertising_status(int slot_id, gboolean mode)
326 le_adv_slot[slot_id].is_advertising = mode;
329 gboolean _bt_is_advertising(void)
331 gboolean status = FALSE;
334 if (le_adv_slot == NULL)
337 for (i = 0; i < le_feature_info.adv_inst_max; i++) {
338 if (le_adv_slot[i].is_advertising == TRUE)
345 void _bt_stop_advertising_by_terminated_process(const char* terminated_name)
349 if (le_adv_slot == NULL)
352 for (i = 0; i < le_feature_info.adv_inst_max; i++) {
353 if (le_adv_slot[i].sender != NULL) {
354 if (strcasecmp(terminated_name, le_adv_slot[i].sender) == 0) {
355 BT_ERR("Stop advertising by terminated process(%s).", terminated_name);
356 _bt_set_advertising(terminated_name, le_adv_slot[i].adv_handle, FALSE, FALSE);
362 gboolean _bt_get_advertising_params(bluetooth_advertising_params_t *params)
367 memcpy(params, &adv_params, sizeof(bluetooth_advertising_params_t));
372 int _bt_set_advertising(const char *sender, int adv_handle, gboolean enable, gboolean use_reserved_slot)
375 GError *error = NULL;
379 if (__bt_is_factory_test_mode()) {
380 BT_ERR("Unable to start advertising in factory binary !!");
381 return BLUETOOTH_ERROR_NOT_SUPPORT;
384 if (_bt_adapter_get_status() != BT_ACTIVATED &&
385 _bt_adapter_get_le_status() != BT_LE_ACTIVATED) {
386 return BLUETOOTH_ERROR_DEVICE_NOT_ENABLED;
389 slot_id = __bt_get_available_adv_slot_id(sender, adv_handle, use_reserved_slot);
391 BT_ERR("There is NO available slot!!");
392 return BLUETOOTH_ERROR_NO_RESOURCES;
395 if (le_adv_slot[slot_id].is_advertising == TRUE && enable == TRUE)
396 return BLUETOOTH_ERROR_IN_PROGRESS;
398 if (le_adv_slot[slot_id].hold_timer_id > 0) {
399 g_source_remove(le_adv_slot[slot_id].hold_timer_id);
400 le_adv_slot[slot_id].hold_timer_id = 0;
401 _bt_unregister_adv_slot_owner(slot_id);
404 if (le_adv_slot[slot_id].is_advertising == FALSE && enable == FALSE)
405 return BLUETOOTH_ERROR_NOT_IN_OPERATION;
407 proxy = _bt_get_adapter_proxy();
408 retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
410 ret = g_dbus_proxy_call_sync(proxy, "SetAdvertising",
411 g_variant_new("(bi)", enable, slot_id),
412 G_DBUS_CALL_FLAGS_NONE,
418 BT_INFO("SetAdvertising %d, slot_id %d", enable, slot_id);
419 BT_ERR("SetAdvertising Fail: %s", error->message);
420 g_clear_error(&error);
421 return BLUETOOTH_ERROR_INTERNAL;
425 __bt_register_adv_slot_owner(sender, adv_handle, slot_id);
427 le_adv_slot[slot_id].is_advertising = enable;
428 BT_INFO_C("### Set advertising [%d], Slot id [%d]", enable, slot_id);
431 g_variant_unref(ret);
433 return BLUETOOTH_ERROR_NONE;
436 int _bt_set_custom_advertising(const char *sender, int adv_handle,
437 gboolean enable, bluetooth_advertising_params_t *params, gboolean use_reserved_slot)
441 GError *error = NULL;
446 BT_CHECK_PARAMETER(params, return);
448 if (__bt_is_factory_test_mode()) {
449 BT_ERR("Unable to start advertising in factory binary !!");
450 return BLUETOOTH_ERROR_NOT_SUPPORT;
453 if (_bt_adapter_get_status() != BT_ACTIVATED &&
454 _bt_adapter_get_le_status() != BT_LE_ACTIVATED) {
455 return BLUETOOTH_ERROR_DEVICE_NOT_ENABLED;
458 slot_id = __bt_get_available_adv_slot_id(sender, adv_handle, use_reserved_slot);
460 BT_ERR("There is NO available slot!!");
461 return BLUETOOTH_ERROR_NO_RESOURCES;
464 if (le_adv_slot[slot_id].is_advertising == TRUE && enable == TRUE)
465 return BLUETOOTH_ERROR_IN_PROGRESS;
467 if (le_adv_slot[slot_id].hold_timer_id > 0) {
468 g_source_remove(le_adv_slot[slot_id].hold_timer_id);
469 le_adv_slot[slot_id].hold_timer_id = 0;
470 _bt_unregister_adv_slot_owner(slot_id);
473 if (le_adv_slot[slot_id].is_advertising == FALSE && enable == FALSE)
474 return BLUETOOTH_ERROR_NOT_IN_OPERATION;
476 proxy = _bt_get_adapter_proxy();
477 retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
479 if (params->interval_min > params->interval_max ||
480 params->interval_min < BT_ADV_INTERVAL_MIN ||
481 params->interval_max > BT_ADV_INTERVAL_MAX)
482 return BLUETOOTH_ERROR_INVALID_PARAM;
484 if (params->filter_policy > BLUETOOTH_ALLOW_SCAN_CONN_WHITE_LIST)
485 return BLUETOOTH_ERROR_INVALID_PARAM;
487 if (params->type == BLUETOOTH_ADV_CONNECTABLE_DIRECT_HIGH ||
488 params->type == BLUETOOTH_ADV_CONNECTABLE_DIRECT_LOW ||
489 params->type == BLUETOOTH_ADV_NON_CONNECTABLE)
490 return BLUETOOTH_ERROR_NOT_SUPPORT;
492 if (params->tx_power_level > 1 ||
493 params->tx_power_level < -127)
494 return BLUETOOTH_ERROR_INVALID_PARAM;
496 min = params->interval_min / BT_ADV_INTERVAL_SPLIT;
497 max = params->interval_max / BT_ADV_INTERVAL_SPLIT;
499 ret = g_dbus_proxy_call_sync(proxy, "SetAdvertisingParameters",
500 g_variant_new("(uuuuii)", min, max,
501 params->filter_policy, params->type,
502 params->tx_power_level, slot_id),
503 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
506 BT_ERR("SetAdvertisingParameters Fail: %s", error->message);
507 g_clear_error(&error);
508 return BLUETOOTH_ERROR_INTERNAL;
511 adv_params.interval_min = params->interval_min;
512 adv_params.interval_max = params->interval_max;
513 adv_params.filter_policy = params->filter_policy;
514 adv_params.type = params->type;
515 adv_params.tx_power_level = params->tx_power_level;
518 g_variant_unref(ret);
520 ret = g_dbus_proxy_call_sync(proxy, "SetAdvertising",
521 g_variant_new("(bi)", enable, slot_id),
522 G_DBUS_CALL_FLAGS_NONE,
528 BT_ERR("SetAdvertising Fail: %s", error->message);
529 g_clear_error(&error);
530 return BLUETOOTH_ERROR_INTERNAL;
534 __bt_register_adv_slot_owner(sender, adv_handle, slot_id);
536 le_adv_slot[slot_id].is_advertising = enable;
537 BT_INFO_C("### Set advertising [%d], Slot id [%d]", enable, slot_id);
539 g_variant_unref(ret);
541 return BLUETOOTH_ERROR_NONE;
544 static gboolean __bt_hold_current_advertising_timeout_cb(gpointer user_data)
547 GError *error = NULL;
550 BT_INFO("Restart advertising stopped by bt-service");
552 le_adv_slot[0].hold_timer_id = 0;
554 proxy = _bt_get_adapter_proxy();
555 retv_if(proxy == NULL, FALSE);
557 ret = g_dbus_proxy_call_sync(proxy, "SetAdvertising",
558 g_variant_new("(bi)", TRUE, 0),
559 G_DBUS_CALL_FLAGS_NONE,
565 BT_ERR("SetAdvertising Fail: %s", error->message);
566 g_clear_error(&error);
571 g_variant_unref(ret);
576 int _bt_hold_current_advertising(void)
579 GError *error = NULL;
582 if (le_adv_slot[0].sender && le_adv_slot[0].is_advertising == TRUE) {
583 BT_INFO("Stop current advertising by bt-service");
585 proxy = _bt_get_adapter_proxy();
586 retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
588 ret = g_dbus_proxy_call_sync(proxy, "SetAdvertising",
589 g_variant_new("(bi)", FALSE, 0),
590 G_DBUS_CALL_FLAGS_NONE,
596 BT_ERR("SetAdvertising Fail: %s", error->message);
597 g_clear_error(&error);
598 return BLUETOOTH_ERROR_INTERNAL;
602 g_variant_unref(ret);
604 le_adv_slot[0].hold_timer_id = g_timeout_add(2000,
605 __bt_hold_current_advertising_timeout_cb, NULL);
607 BT_INFO("It's NOT advertising");
608 return BLUETOOTH_ERROR_NOT_IN_OPERATION;
611 return BLUETOOTH_ERROR_NONE;
614 static int __bt_get_ad_data_by_type(char *in_data, int in_len,
615 char in_type, char **data, int *data_len)
617 if (in_data == NULL || data == NULL || data_len == NULL)
618 return BLUETOOTH_ERROR_INTERNAL;
621 return BLUETOOTH_ERROR_INTERNAL;
627 for (i = 0; i < in_len; i++) {
629 if (len <= 0 || i + 1 >= in_len) {
630 BT_ERR("Invalid advertising data");
631 return BLUETOOTH_ERROR_INTERNAL;
634 type = in_data[i + 1];
635 if (type == in_type) {
645 if (i + len > in_len) {
646 BT_ERR("Invalid advertising data");
647 return BLUETOOTH_ERROR_INTERNAL;
648 } else if (len == 0) {
649 BT_DBG("AD Type 0x%02x data is not set", in_type);
652 return BLUETOOTH_ERROR_NONE;
655 *data = g_memdup(&in_data[i], len);
657 return BLUETOOTH_ERROR_OUT_OF_MEMORY;
660 return BLUETOOTH_ERROR_NONE;
663 int _bt_get_advertising_data(bluetooth_advertising_data_t *adv, int *length)
665 BT_CHECK_PARAMETER(adv, return);
666 BT_CHECK_PARAMETER(length, return);
668 memcpy(adv, &adv_data, sizeof(adv_data));
669 *length = adv_data_len;
671 return BLUETOOTH_ERROR_NONE;
674 int _bt_set_advertising_data(const char *sender, int adv_handle,
675 bluetooth_advertising_data_t *adv, int length, gboolean use_reserved_slot)
678 GError *error = NULL;
679 GVariant *ret, *ad_data, *param = NULL;
680 GVariant *temp = NULL;
681 GVariantBuilder *builder;
683 char *old_mdata = NULL;
684 char *new_mdata = NULL;
689 if (__bt_is_factory_test_mode()) {
690 BT_ERR("Unable to set advertising data in factory binary !!");
691 return BLUETOOTH_ERROR_NOT_SUPPORT;
694 BT_CHECK_PARAMETER(adv, return);
696 if (_bt_adapter_get_status() != BT_ACTIVATED &&
697 _bt_adapter_get_le_status() != BT_LE_ACTIVATED) {
698 return BLUETOOTH_ERROR_DEVICE_NOT_ENABLED;
701 proxy = _bt_get_adapter_proxy();
702 retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
704 slot_id = __bt_get_available_adv_slot_id(sender, adv_handle, use_reserved_slot);
706 BT_ERR("There is NO available slot!!");
707 return BLUETOOTH_ERROR_NO_RESOURCES;
710 builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
711 for (i = 0; i < length; i++)
712 g_variant_builder_add(builder, "y", adv->data[i]);
714 temp = g_variant_new("ay", builder);
715 g_variant_builder_unref(builder);
716 ret = g_dbus_proxy_call_sync(proxy, "SetAdvertisingData",
717 g_variant_new("(@ayi)", temp, slot_id),
718 G_DBUS_CALL_FLAGS_NONE,
722 BT_ERR("SetAdvertisingData Fail: %s", error->message);
723 g_clear_error(&error);
724 return BLUETOOTH_ERROR_INTERNAL;
727 __bt_register_adv_slot_owner(sender, adv_handle, slot_id);
729 __bt_get_ad_data_by_type((char *)adv_data.data, adv_data_len, 0xff,
730 &old_mdata, &old_len);
731 __bt_get_ad_data_by_type((char *)adv->data, length, 0xff,
732 &new_mdata, &new_len);
733 if (old_len != new_len ||
734 (old_mdata && new_mdata &&
735 memcmp(old_mdata, new_mdata, new_len))) {
736 ad_data = g_variant_new_from_data((const GVariantType *)"ay",
737 new_mdata, new_len, TRUE, NULL, NULL);
738 param = g_variant_new("(@ay)", ad_data);
739 _bt_send_event(BT_ADAPTER_EVENT,
740 BLUETOOTH_EVENT_ADVERTISING_MANUFACTURER_DATA_CHANGED,
746 memset(&adv_data, 0x00, sizeof(bluetooth_advertising_data_t));
747 memcpy(&adv_data, adv, length);
748 adv_data_len = length;
750 BT_INFO("Set advertising data");
752 g_variant_unref(ret);
754 return BLUETOOTH_ERROR_NONE;
757 int _bt_get_scan_response_data(bluetooth_scan_resp_data_t *response, int *length)
759 BT_CHECK_PARAMETER(response, return);
760 BT_CHECK_PARAMETER(length, return);
762 memcpy(response, &resp_data, sizeof(resp_data));
763 *length = resp_data_len;
765 return BLUETOOTH_ERROR_NONE;
768 int _bt_set_scan_response_data(const char *sender, int adv_handle,
769 bluetooth_scan_resp_data_t *response, int length, gboolean use_reserved_slot)
772 GError *error = NULL;
773 GVariant *ret, *scan_data, *param = NULL;
774 GVariant *temp = NULL;
775 GVariantBuilder *builder;
777 char *old_mdata = NULL;
778 char *new_mdata = NULL;
783 if (__bt_is_factory_test_mode()) {
784 BT_ERR("Unable to set scan response list in factory binary !!");
785 return BLUETOOTH_ERROR_NOT_SUPPORT;
788 BT_CHECK_PARAMETER(response, return);
790 if (_bt_adapter_get_status() != BT_ACTIVATED &&
791 _bt_adapter_get_le_status() != BT_LE_ACTIVATED) {
792 return BLUETOOTH_ERROR_DEVICE_NOT_ENABLED;
795 proxy = _bt_get_adapter_proxy();
796 retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
798 slot_id = __bt_get_available_adv_slot_id(sender, adv_handle, use_reserved_slot);
800 BT_ERR("There is NO available slot!!");
801 return BLUETOOTH_ERROR_NO_RESOURCES;
803 builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
804 for (i = 0; i < length; i++)
805 g_variant_builder_add(builder, "y", response->data[i]);
807 temp = g_variant_new("ay", builder);
808 g_variant_builder_unref(builder);
809 ret = g_dbus_proxy_call_sync(proxy, "SetScanRespData",
810 g_variant_new("(@ayi)", temp, slot_id),
811 G_DBUS_CALL_FLAGS_NONE,
815 BT_ERR("SetScanRespData Fail: %s", error->message);
816 g_clear_error(&error);
817 return BLUETOOTH_ERROR_INTERNAL;
820 __bt_register_adv_slot_owner(sender, adv_handle, slot_id);
822 /* Compare with previous scan resp data */
823 __bt_get_ad_data_by_type((char *)resp_data.data, resp_data_len, 0xff,
824 &old_mdata, &old_len);
825 __bt_get_ad_data_by_type((char *)response->data, length, 0xff,
826 &new_mdata, &new_len);
827 if (old_len != new_len ||
828 (old_mdata && new_mdata &&
829 memcmp(old_mdata, new_mdata, new_len))) {
830 scan_data = g_variant_new_from_data((const GVariantType *)"ay",
831 new_mdata, new_len, TRUE, NULL, NULL);
832 param = g_variant_new("(@ay)", scan_data);
833 _bt_send_event(BT_ADAPTER_EVENT,
834 BLUETOOTH_EVENT_SCAN_RESPONSE_MANUFACTURER_DATA_CHANGED,
840 memset(&resp_data, 0x00, sizeof(bluetooth_scan_resp_data_t));
841 memcpy(&resp_data, response, length);
842 resp_data_len = length;
845 g_variant_unref(ret);
846 BT_INFO("Set scan response data");
847 return BLUETOOTH_ERROR_NONE;
850 int _bt_set_scan_parameters(bluetooth_le_scan_params_t *params)
853 GError *error = NULL;
858 BT_CHECK_PARAMETER(params, return);
860 if (_bt_adapter_get_status() != BT_ACTIVATED &&
861 _bt_adapter_get_le_status() != BT_LE_ACTIVATED) {
862 return BLUETOOTH_ERROR_DEVICE_NOT_ENABLED;
865 proxy = _bt_get_adapter_proxy();
866 retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
868 if (params->interval < BT_LE_SCAN_INTERVAL_MIN || params->interval > BT_LE_SCAN_INTERVAL_MAX)
869 return BLUETOOTH_ERROR_INVALID_PARAM;
871 if (params->window < BT_LE_SCAN_WINDOW_MIN || params->window > BT_LE_SCAN_WINDOW_MAX)
872 return BLUETOOTH_ERROR_INVALID_PARAM;
874 if (params->window > params->interval)
875 return BLUETOOTH_ERROR_INVALID_PARAM;
877 itv = params->interval / BT_ADV_INTERVAL_SPLIT;
878 win = params->window / BT_ADV_INTERVAL_SPLIT;
880 ret = g_dbus_proxy_call_sync(proxy, "SetScanParameters",
881 g_variant_new("(uuu)", params->type, itv, win),
882 G_DBUS_CALL_FLAGS_NONE, -1,
886 BT_ERR("SetScanParameters Fail: %s", error->message);
887 g_clear_error(&error);
888 return BLUETOOTH_ERROR_INTERNAL;
891 _bt_set_le_scan_type(params->type);
893 is_le_set_scan_parameter = TRUE;
896 g_variant_unref(ret);
897 BT_INFO("Set scan parameters");
898 return BLUETOOTH_ERROR_NONE;
901 bt_adapter_le_scanner_t* __bt_find_scanner_from_list(const char *sender)
904 bt_adapter_le_scanner_t *scanner;
906 for (l = scanner_list; l != NULL; l = g_slist_next(l)) {
908 if (g_strcmp0(scanner->sender, sender) == 0)
915 int __bt_get_available_scan_filter_slot_id(void)
918 bt_adapter_le_scanner_t *scanner;
920 bluetooth_le_scan_filter_t *filter_data;
921 gboolean *slot_check_list = NULL;
924 if (le_feature_info.max_filter == 0) {
925 BT_ERR("Scan filter is NOT Supported");
928 slot_check_list = g_malloc0(sizeof(gboolean) * le_feature_info.max_filter);
930 for (l = scanner_list; l != NULL; l = g_slist_next(l)) {
932 for (fl = scanner->filter_list; fl != NULL; fl = g_slist_next(fl)) {
933 filter_data = fl->data;
934 if (filter_data->slot_id < le_feature_info.max_filter)
935 slot_check_list[filter_data->slot_id] = TRUE;
939 for (i = 0; i < le_feature_info.max_filter; i++) {
940 if (slot_check_list[i] == FALSE) {
941 g_free(slot_check_list);
946 BT_ERR("There is NO available slot for scan filter.");
947 g_free(slot_check_list);
951 gboolean _bt_is_scan_filter_supported(void)
953 if (le_feature_info.max_filter > 0)
959 int _bt_register_scan_filter(const char *sender, bluetooth_le_scan_filter_t *filter, int *slot_id)
962 GError *error = NULL;
963 GVariant *ret, *param;
964 GVariant *arr_uuid_param = NULL, *arr_uuid_mask_param = NULL;
965 GVariant *arr_data_param = NULL, *arr_data_mask_param = NULL;
966 GArray *arr_uuid = NULL;
967 GArray *arr_uuid_mask = NULL;
968 GArray *arr_data = NULL;
969 GArray *arr_data_mask = NULL;
970 bt_adapter_le_scanner_t *scanner = NULL;
971 bluetooth_le_scan_filter_t *filter_data = NULL;
972 int feature_selection = 0;
974 *slot_id = __bt_get_available_scan_filter_slot_id();
976 return BLUETOOTH_ERROR_NO_RESOURCES;
978 proxy = _bt_get_adapter_proxy();
979 retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
981 if (filter->added_features & BLUETOOTH_LE_SCAN_FILTER_FEATURE_DEVICE_ADDRESS) {
982 char address[BT_ADDRESS_STRING_SIZE] = { 0 };
983 feature_selection |= BLUETOOTH_LE_SCAN_FILTER_FEATURE_DEVICE_ADDRESS;
985 _bt_convert_addr_type_to_string(address, filter->device_address.addr);
987 arr_uuid_param = g_variant_new_from_data((const GVariantType *)"ay",
988 NULL, 0, TRUE, NULL, NULL);
989 arr_uuid_mask_param = g_variant_new_from_data((const GVariantType *)"ay",
990 NULL, 0, TRUE, NULL, NULL);
991 arr_data_param = g_variant_new_from_data((const GVariantType *)"ay",
992 NULL, 0, TRUE, NULL, NULL);
993 arr_data_mask_param = g_variant_new_from_data((const GVariantType *)"ay",
994 NULL, 0, TRUE, NULL, NULL);
996 param = g_variant_new("(iiiiii@ay@aysu@ay@ay)",
998 0, // action (Add - 0x00, Delete - 0x01, Clear - 0x02)
999 BLUETOOTH_LE_SCAN_FILTER_FEATURE_DEVICE_ADDRESS, // filter_type
1000 *slot_id, // filter_index
1002 0, // company_id_mask
1003 arr_uuid_param, // p_uuid
1004 arr_uuid_mask_param, // p_uuid_mask
1007 arr_data_param, // p_data
1008 arr_data_mask_param); // p_mask
1010 ret = g_dbus_proxy_call_sync(proxy, "scan_filter_add_remove",
1011 param, G_DBUS_CALL_FLAGS_NONE,
1015 BT_ERR("scan_filter_add_remove Fail: %s", error->message);
1016 g_clear_error(&error);
1019 g_variant_unref(ret);
1022 if (filter->added_features & BLUETOOTH_LE_SCAN_FILTER_FEATURE_DEVICE_NAME) {
1023 feature_selection |= BLUETOOTH_LE_SCAN_FILTER_FEATURE_DEVICE_NAME;
1025 arr_uuid_param = g_variant_new_from_data((const GVariantType *)"ay",
1026 NULL, 0, TRUE, NULL, NULL);
1027 arr_uuid_mask_param = g_variant_new_from_data((const GVariantType *)"ay",
1028 NULL, 0, TRUE, NULL, NULL);
1029 arr_data_param = g_variant_new_from_data((const GVariantType *)"ay",
1030 NULL, 0, TRUE, NULL, NULL);
1031 arr_data_mask_param = g_variant_new_from_data((const GVariantType *)"ay",
1032 NULL, 0, TRUE, NULL, NULL);
1034 param = g_variant_new("(iiiiii@ay@aysu@ay@ay)",
1036 0, // action (Add - 0x00, Delete - 0x01, Clear - 0x02)
1037 BLUETOOTH_LE_SCAN_FILTER_FEATURE_DEVICE_NAME, // filter_type
1038 *slot_id, // filter_index
1040 0, // company_id_mask
1041 arr_uuid_param, // p_uuid
1042 arr_uuid_mask_param, // p_uuid_mask
1043 filter->device_name, // string
1045 arr_data_param, // p_data
1046 arr_data_mask_param);
1048 ret = g_dbus_proxy_call_sync(proxy, "scan_filter_add_remove",
1049 param, G_DBUS_CALL_FLAGS_NONE,
1053 BT_ERR("scan_filter_add_remove Fail: %s", error->message);
1054 g_clear_error(&error);
1057 g_variant_unref(ret);
1060 if (filter->added_features & BLUETOOTH_LE_SCAN_FILTER_FEATURE_SERVICE_UUID) {
1061 feature_selection |= BLUETOOTH_LE_SCAN_FILTER_FEATURE_SERVICE_UUID;
1063 arr_uuid = g_array_new(TRUE, TRUE, sizeof(guint8));
1064 arr_uuid_mask = g_array_new(TRUE, TRUE, sizeof(guint8));
1066 g_array_append_vals(arr_uuid, filter->service_uuid.data.data, filter->service_uuid.data_len * sizeof(guint8));
1067 g_array_append_vals(arr_uuid_mask, filter->service_uuid_mask.data.data, filter->service_uuid_mask.data_len * sizeof(guint8));
1069 arr_uuid_param = g_variant_new_from_data((const GVariantType *)"ay",
1070 arr_uuid->data, arr_uuid->len, TRUE, NULL, NULL);
1071 arr_uuid_mask_param = g_variant_new_from_data((const GVariantType *)"ay",
1072 arr_uuid_mask->data, arr_uuid_mask->len, TRUE, NULL, NULL);
1073 arr_data_param = g_variant_new_from_data((const GVariantType *)"ay",
1074 NULL, 0, TRUE, NULL, NULL);
1075 arr_data_mask_param = g_variant_new_from_data((const GVariantType *)"ay",
1076 NULL, 0, TRUE, NULL, NULL);
1078 param = g_variant_new("(iiiiii@ay@aysu@ay@ay)",
1080 0, // action (Add - 0x00, Delete - 0x01, Clear - 0x02)
1081 BLUETOOTH_LE_SCAN_FILTER_FEATURE_SERVICE_UUID, // filter_type
1082 *slot_id, // filter_index
1084 0, // company_id_mask
1085 arr_uuid_param, // p_uuid
1086 arr_uuid_mask_param, // p_uuid_mask
1089 arr_data_param, // p_data
1090 arr_data_mask_param);
1092 ret = g_dbus_proxy_call_sync(proxy, "scan_filter_add_remove",
1093 param, G_DBUS_CALL_FLAGS_NONE,
1097 BT_ERR("scan_filter_add_remove Fail: %s", error->message);
1098 g_clear_error(&error);
1101 g_variant_unref(ret);
1103 g_array_free(arr_uuid, TRUE);
1104 g_array_free(arr_uuid_mask, TRUE);
1107 if (filter->added_features & BLUETOOTH_LE_SCAN_FILTER_FEATURE_SERVICE_SOLICITATION_UUID) {
1108 feature_selection |= BLUETOOTH_LE_SCAN_FILTER_FEATURE_SERVICE_SOLICITATION_UUID;
1110 arr_uuid = g_array_new(TRUE, TRUE, sizeof(guint8));
1111 arr_uuid_mask = g_array_new(TRUE, TRUE, sizeof(guint8));
1113 g_array_append_vals(arr_uuid, filter->service_solicitation_uuid.data.data, filter->service_solicitation_uuid.data_len * sizeof(guint8));
1114 g_array_append_vals(arr_uuid_mask, filter->service_solicitation_uuid_mask.data.data, filter->service_solicitation_uuid_mask.data_len * sizeof(guint8));
1116 arr_uuid_param = g_variant_new_from_data((const GVariantType *)"ay",
1117 arr_uuid->data, arr_uuid->len, TRUE, NULL, NULL);
1118 arr_uuid_mask_param = g_variant_new_from_data((const GVariantType *)"ay",
1119 arr_uuid_mask->data, arr_uuid_mask->len, TRUE, NULL, NULL);
1120 arr_data_param = g_variant_new_from_data((const GVariantType *)"ay",
1121 NULL, 0, TRUE, NULL, NULL);
1122 arr_data_mask_param = g_variant_new_from_data((const GVariantType *)"ay",
1123 NULL, 0, TRUE, NULL, NULL);
1125 param = g_variant_new("(iiiiii@ay@aysu@ay@ay)",
1127 0, // action (Add - 0x00, Delete - 0x01, Clear - 0x02)
1128 BLUETOOTH_LE_SCAN_FILTER_FEATURE_SERVICE_SOLICITATION_UUID, // filter_type
1129 *slot_id, // filter_index
1131 0, // company_id_mask
1132 arr_uuid_param, // p_uuid
1133 arr_uuid_mask_param, // p_uuid_mask
1136 arr_data_param, // p_data
1137 arr_data_mask_param);
1139 ret = g_dbus_proxy_call_sync(proxy, "scan_filter_add_remove", param,
1140 G_DBUS_CALL_FLAGS_NONE,
1144 BT_ERR("scan_filter_add_remove Fail: %s", error->message);
1145 g_clear_error(&error);
1148 g_variant_unref(ret);
1150 g_array_free(arr_uuid, TRUE);
1151 g_array_free(arr_uuid_mask, TRUE);
1154 if (filter->added_features & BLUETOOTH_LE_SCAN_FILTER_FEATURE_SERVICE_DATA) {
1155 feature_selection |= BLUETOOTH_LE_SCAN_FILTER_FEATURE_SERVICE_DATA;
1157 arr_data = g_array_new(TRUE, TRUE, sizeof(guint8));
1158 arr_data_mask = g_array_new(TRUE, TRUE, sizeof(guint8));
1160 g_array_append_vals(arr_data, filter->service_data.data.data, filter->service_data.data_len * sizeof(guint8));
1161 g_array_append_vals(arr_data_mask, filter->service_data_mask.data.data, filter->service_data_mask.data_len * sizeof(guint8));
1163 arr_uuid_param = g_variant_new_from_data((const GVariantType *)"ay",
1164 NULL, 0, TRUE, NULL, NULL);
1165 arr_uuid_mask_param = g_variant_new_from_data((const GVariantType *)"ay",
1166 NULL, 0, TRUE, NULL, NULL);
1167 arr_data_param = g_variant_new_from_data((const GVariantType *)"ay",
1168 arr_data->data, arr_data->len, TRUE, NULL, NULL);
1169 arr_data_mask_param = g_variant_new_from_data((const GVariantType *)"ay",
1170 arr_data_mask->data, arr_data_mask->len, TRUE, NULL, NULL);
1172 param = g_variant_new("(iiiiii@ay@aysu@ay@ay)",
1174 0, // action (Add - 0x00, Delete - 0x01, Clear - 0x02)
1175 BLUETOOTH_LE_SCAN_FILTER_FEATURE_SERVICE_DATA, // filter_type
1176 *slot_id, // filter_index
1178 0, // company_id_mask
1179 arr_uuid_param, // p_uuid
1180 arr_uuid_mask_param, // p_uuid_mask
1183 arr_data_param, // p_data
1184 arr_data_mask_param);
1186 ret = g_dbus_proxy_call_sync(proxy, "scan_filter_add_remove", param,
1187 G_DBUS_CALL_FLAGS_NONE,
1191 BT_ERR("scan_filter_add_remove Fail: %s", error->message);
1192 g_clear_error(&error);
1195 g_variant_unref(ret);
1197 g_array_free(arr_data, TRUE);
1198 g_array_free(arr_data_mask, TRUE);
1201 if (filter->added_features & BLUETOOTH_LE_SCAN_FILTER_FEATURE_MANUFACTURER_DATA) {
1202 feature_selection |= BLUETOOTH_LE_SCAN_FILTER_FEATURE_MANUFACTURER_DATA;
1204 arr_data = g_array_new(TRUE, TRUE, sizeof(guint8));
1205 arr_data_mask = g_array_new(TRUE, TRUE, sizeof(guint8));
1207 g_array_append_vals(arr_data, filter->manufacturer_data.data.data, filter->manufacturer_data.data_len * sizeof(guint8));
1208 g_array_append_vals(arr_data_mask, filter->manufacturer_data_mask.data.data, filter->manufacturer_data_mask.data_len * sizeof(guint8));
1210 arr_uuid_param = g_variant_new_from_data((const GVariantType *)"ay",
1211 NULL, 0, TRUE, NULL, NULL);
1212 arr_uuid_mask_param = g_variant_new_from_data((const GVariantType *)"ay",
1213 NULL, 0, TRUE, NULL, NULL);
1214 arr_data_param = g_variant_new_from_data((const GVariantType *)"ay",
1215 arr_data->data, arr_data->len, TRUE, NULL, NULL);
1216 arr_data_mask_param = g_variant_new_from_data((const GVariantType *)"ay",
1217 arr_data_mask->data, arr_data_mask->len, TRUE, NULL, NULL);
1219 param = g_variant_new("(iiiiii@ay@aysu@ay@ay)",
1221 0, // action (Add - 0x00, Delete - 0x01, Clear - 0x02)
1222 BLUETOOTH_LE_SCAN_FILTER_FEATURE_MANUFACTURER_DATA, // filter_type
1223 *slot_id, // filter_index
1224 filter->manufacturer_id, // company_id
1225 0xFFFF, // company_id_mask
1226 arr_uuid_param, // p_uuid
1227 arr_uuid_mask_param, // p_uuid_mask
1230 arr_data_param, // p_data
1231 arr_data_mask_param);
1233 ret = g_dbus_proxy_call_sync(proxy, "scan_filter_add_remove", param,
1234 G_DBUS_CALL_FLAGS_NONE,
1238 BT_ERR("scan_filter_add_remove Fail: %s", error->message);
1239 g_clear_error(&error);
1242 g_variant_unref(ret);
1244 g_array_free(arr_data, TRUE);
1245 g_array_free(arr_data_mask, TRUE);
1248 BT_DBG("Filter selection %.2x", feature_selection);
1250 param = g_variant_new("(iiiiiiiiiiii)",
1252 0, // action (Add - 0x00, Delete - 0x01, Clear - 0x02)
1253 *slot_id, // filter_index
1254 feature_selection, // feat_seln
1255 0, // list_logic_type (OR - 0x00, AND - 0x01)
1256 1, // filt_logic_type (OR - 0x00, AND - 0x01)
1257 -127, // rssi_high_thres
1258 -127, // rssi_low_thres
1259 0, // dely_mode (Immediate - 0x00, on found - 0x01, batched - 0x02)
1262 0); // found_timeout_cnt
1263 ret = g_dbus_proxy_call_sync(proxy, "scan_filter_param_setup",
1264 param, G_DBUS_CALL_FLAGS_NONE,
1268 BT_ERR("scan_filter_add_remove Fail: %s", error->message);
1269 g_clear_error(&error);
1272 scanner = __bt_find_scanner_from_list(sender);
1273 if (scanner == NULL) {
1274 scanner = g_malloc0(sizeof(bt_adapter_le_scanner_t));
1275 scanner->sender = g_strdup(sender);
1276 scanner_list = g_slist_append(scanner_list, scanner);
1281 filter_data = g_malloc0(sizeof(bluetooth_le_scan_filter_t));
1282 memcpy(filter_data, filter, sizeof(bluetooth_le_scan_filter_t));
1283 filter_data->slot_id = *slot_id;
1285 scanner->filter_list = g_slist_append(scanner->filter_list, filter_data);
1289 g_variant_unref(ret);
1290 return BLUETOOTH_ERROR_NONE;
1293 int _bt_unregister_scan_filter(const char *sender, int slot_id)
1296 GError *error = NULL;
1298 bt_adapter_le_scanner_t *scanner = NULL;
1299 bluetooth_le_scan_filter_t *filter_data = NULL;
1301 gboolean is_slot_id_found = FALSE;
1303 scanner = __bt_find_scanner_from_list(sender);
1304 if (scanner == NULL) {
1305 BT_ERR("There is NO available scanner.");
1306 return BLUETOOTH_ERROR_NOT_FOUND;
1309 for (l = scanner->filter_list; l != NULL; l = g_slist_next(l)) {
1310 filter_data = l->data;
1311 if (filter_data->slot_id == slot_id) {
1312 is_slot_id_found = TRUE;
1316 if (is_slot_id_found == FALSE) {
1317 BT_ERR("There is NO registered slot.");
1318 return BLUETOOTH_ERROR_NOT_FOUND;
1321 proxy = _bt_get_adapter_proxy();
1322 retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
1324 ret = g_dbus_proxy_call_sync(proxy, "scan_filter_clear",
1325 g_variant_new("(ii)", 0, slot_id),
1326 G_DBUS_CALL_FLAGS_NONE,
1330 BT_ERR("scan_filter_clear Fail: %s", error->message);
1331 g_clear_error(&error);
1334 scanner->filter_list = g_slist_remove(scanner->filter_list, filter_data);
1335 g_free(filter_data);
1338 g_variant_unref(ret);
1339 return BLUETOOTH_ERROR_NONE;
1342 int _bt_unregister_all_scan_filters(const char *sender)
1345 GError *error = NULL;
1347 bt_adapter_le_scanner_t *scanner = NULL;
1348 bluetooth_le_scan_filter_t *filter_data = NULL;
1351 scanner = __bt_find_scanner_from_list(sender);
1352 if (scanner == NULL) {
1353 BT_ERR("There is NO available scanner.");
1354 return BLUETOOTH_ERROR_NOT_FOUND;
1357 proxy = _bt_get_adapter_proxy();
1358 retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
1360 for (l = scanner->filter_list; l != NULL; l = g_slist_next(l)) {
1361 filter_data = l->data;
1363 ret = g_dbus_proxy_call_sync(proxy, "scan_filter_clear",
1364 g_variant_new("(ii)", 0, filter_data->slot_id),
1365 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
1368 BT_ERR("scan_filter_clear Fail: %s", error->message);
1369 g_clear_error(&error);
1372 g_variant_unref(ret);
1375 g_slist_free_full(scanner->filter_list, g_free);
1376 scanner->filter_list = NULL;
1378 return BLUETOOTH_ERROR_NONE;
1381 static gboolean __start_le_scan_timeout(gpointer user_data)
1383 char *sender = (char *)user_data;
1384 _bt_start_le_scan(sender);
1390 int _bt_start_le_scan(const char *sender)
1393 GError *error = NULL;
1395 bt_adapter_le_scanner_t *scanner = __bt_find_scanner_from_list(sender);
1397 if (scanner == NULL) {
1398 scanner = g_malloc0(sizeof(bt_adapter_le_scanner_t));
1399 scanner->sender = g_strdup(sender);
1400 scanner_list = g_slist_append(scanner_list, scanner);
1403 if (scanner->stop_pending == TRUE) {
1404 BT_DBG("Waiting LEDiscoveryFinished");
1405 g_timeout_add(500, (GSourceFunc)__start_le_scan_timeout, scanner->sender);
1406 return BLUETOOTH_ERROR_NONE;
1409 if (scanner->is_scanning == TRUE) {
1410 BT_ERR("BT is already in LE scanning");
1411 return BLUETOOTH_ERROR_IN_PROGRESS;
1413 scanner->is_scanning = TRUE;
1415 proxy = _bt_get_adapter_proxy();
1416 retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
1418 if (_bt_is_le_scanning()) {
1419 if (scan_filter_enabled == TRUE) {
1420 if (scanner->filter_list == NULL) {
1421 ret = g_dbus_proxy_call_sync(proxy, "scan_filter_enable",
1422 g_variant_new("(ib)", 0, FALSE),
1423 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
1426 BT_ERR("scan_filter_enable Fail: %s", error->message);
1427 g_clear_error(&error);
1431 g_variant_unref(ret);
1432 BT_INFO("Disable LE Scan Filter");
1433 scan_filter_enabled = FALSE;
1435 BT_INFO("LE Filter Scan is continue");
1438 BT_INFO("LE Full Scan is already on progress");
1440 return BLUETOOTH_ERROR_NONE;
1442 if (is_le_set_scan_parameter == FALSE) {
1443 /* Set default scan parameter same with BT_ADAPTER_LE_SCAN_MODE_LOW_ENERGY */
1444 bluetooth_le_scan_params_t scan_params;
1445 scan_params.type = BT_LE_ACTIVE_SCAN;
1446 scan_params.interval = 5000;
1447 scan_params.window = 500;
1448 _bt_set_scan_parameters(&scan_params);
1451 if (scanner->filter_list == NULL) {
1452 BT_INFO("Start LE Full Scan");
1453 scan_filter_enabled = FALSE;
1455 ret = g_dbus_proxy_call_sync(proxy, "scan_filter_enable",
1456 g_variant_new("(ib)", 0, TRUE),
1457 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
1460 BT_ERR("scan_filter_enable Fail: %s", error->message);
1461 g_clear_error(&error);
1465 g_variant_unref(ret);
1466 BT_INFO("Enable LE Scan Filter");
1467 scan_filter_enabled = TRUE;
1471 ret = g_dbus_proxy_call_sync(proxy, "StartLEDiscovery",
1472 NULL, G_DBUS_CALL_FLAGS_NONE,
1476 BT_ERR("StartLEDiscovery Fail: %s", error->message);
1477 g_clear_error(&error);
1478 return BLUETOOTH_ERROR_INTERNAL;
1482 g_variant_unref(ret);
1483 return BLUETOOTH_ERROR_NONE;
1486 int _bt_stop_le_scan(const char *sender)
1489 GError *error = NULL;
1491 bt_adapter_le_scanner_t *scan_sender = __bt_find_scanner_from_list(sender);
1492 bt_adapter_le_scanner_t *scanner;
1494 gboolean next_scanning = FALSE;
1495 gboolean need_scan_filter = TRUE;
1497 if (scan_sender == NULL || scan_sender->is_scanning == FALSE)
1498 return BLUETOOTH_ERROR_NOT_IN_OPERATION;
1500 scan_sender->is_scanning = FALSE;
1501 scan_sender->stop_pending = TRUE;
1503 for (l = scanner_list; l != NULL; l = g_slist_next(l)) {
1505 if (scanner->is_scanning == TRUE) {
1506 next_scanning = TRUE;
1507 if (scanner->filter_list == NULL)
1508 need_scan_filter = FALSE;
1512 proxy = _bt_get_adapter_proxy();
1513 retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
1515 if (next_scanning == TRUE) {
1516 if (scan_filter_enabled == FALSE && need_scan_filter == TRUE) {
1517 ret = g_dbus_proxy_call_sync(proxy, "scan_filter_enable",
1518 g_variant_new("(ib)", 0, TRUE),
1519 G_DBUS_CALL_FLAGS_NONE,
1523 BT_ERR("scan_filter_enable Fail: %s", error->message);
1524 g_clear_error(&error);
1528 g_variant_unref(ret);
1529 BT_INFO("Enable LE Scan Filter");
1530 scan_filter_enabled = TRUE;
1532 BT_INFO("next_scanning exists. Keep the LE scanning");
1533 scan_sender->stop_pending = FALSE;
1534 return BLUETOOTH_ERROR_NONE;
1536 if (scan_filter_enabled == TRUE) {
1537 ret = g_dbus_proxy_call_sync(proxy, "scan_filter_enable",
1538 g_variant_new("(ib)", 0, FALSE),
1539 G_DBUS_CALL_FLAGS_NONE,
1543 BT_ERR("scan_filter_enable Fail: %s", error->message);
1544 g_clear_error(&error);
1548 g_variant_unref(ret);
1549 BT_INFO("Disable LE Scan Filter");
1551 BT_INFO("Just stop LE scan");
1555 ret = g_dbus_proxy_call_sync(proxy, "StopLEDiscovery",
1556 NULL, G_DBUS_CALL_FLAGS_NONE,
1559 BT_ERR("StopLEDiscovery Fail: %s", error->message);
1560 g_clear_error(&error);
1564 BT_ERR("LE Scan stop failed");
1565 return BLUETOOTH_ERROR_INTERNAL;
1568 scan_filter_enabled = FALSE;
1569 is_le_set_scan_parameter = FALSE;
1571 g_variant_unref(ret);
1572 return BLUETOOTH_ERROR_NONE;
1575 void _bt_disable_all_scanner_status(void)
1578 bt_adapter_le_scanner_t *scanner;
1580 for (l = scanner_list; l != NULL; l = g_slist_next(l)) {
1582 scanner->is_scanning = FALSE;
1583 scanner->stop_pending = FALSE;
1587 static void __bt_free_le_scanner(void)
1590 bt_adapter_le_scanner_t *scanner;
1592 for (l = scanner_list; l != NULL; l = g_slist_next(l)) {
1594 g_free(scanner->sender);
1595 g_slist_free_full(scanner->filter_list, g_free);
1599 g_slist_free(scanner_list);
1600 scanner_list = NULL;
1602 scan_filter_enabled = FALSE;
1603 is_le_scanning = FALSE;
1604 is_le_set_scan_parameter = FALSE;
1607 void _bt_set_le_scan_status(gboolean mode)
1609 BT_DBG("set is_le_scanning : %d -> %d", is_le_scanning, mode);
1610 is_le_scanning = mode;
1613 gboolean _bt_is_le_scanning(void)
1615 return is_le_scanning;
1618 void _bt_set_le_scan_type(bt_le_scan_type_t type)
1620 le_scan_type = type;
1623 bt_le_scan_type_t _bt_get_le_scan_type(void)
1625 return le_scan_type;
1628 static gboolean __bt_check_scan_result_uuid(const char *adv_data,
1629 int adv_data_len, const char *svc_uuid, int uuid_len,
1630 const char *uuid_mask, char ad_type)
1636 __bt_get_ad_data_by_type((char*)adv_data, adv_data_len,
1637 ad_type, &data, &data_len);
1639 for (i = 0; i < data_len; i += uuid_len) {
1640 if (uuid_len > (data_len - i))
1643 if (_bt_byte_arr_cmp_with_mask(data + i,
1644 svc_uuid, uuid_mask, uuid_len) == 0) {
1655 static gboolean __bt_check_scan_result_with_filter(const char *device_address,
1656 const char *adv_data, int adv_data_len,
1657 const char *scan_data, int scan_data_len,
1658 const bt_adapter_le_scanner_t *scanner)
1661 bluetooth_le_scan_filter_t *filter_data = NULL;
1664 gboolean is_matched = FALSE;
1666 if (scanner->filter_list == NULL) {
1667 BT_INFO("This scanner is on Full Scan.");
1671 for (l = scanner->filter_list; l != NULL; l = g_slist_next(l)) {
1672 filter_data = l->data;
1674 if (filter_data->added_features &
1675 BLUETOOTH_LE_SCAN_FILTER_FEATURE_DEVICE_ADDRESS) {
1676 char address[BT_ADDRESS_STRING_SIZE] = { 0 };
1678 _bt_convert_addr_type_to_string(address,
1679 filter_data->device_address.addr);
1680 if (strncmp(address, device_address,
1681 BT_ADDRESS_STRING_SIZE) != 0)
1685 if (filter_data->added_features &
1686 BLUETOOTH_LE_SCAN_FILTER_FEATURE_SERVICE_UUID) {
1689 if (__bt_check_scan_result_uuid(adv_data,
1691 (char*)filter_data->service_uuid.data.data,
1692 filter_data->service_uuid.data_len,
1693 (char*)filter_data->service_uuid_mask.data.data,
1694 BT_LE_AD_TYPE_INCOMP_LIST_16_BIT_SERVICE_CLASS_UUIDS)
1697 if (__bt_check_scan_result_uuid(adv_data,
1699 (char*)filter_data->service_uuid.data.data,
1700 filter_data->service_uuid.data_len,
1701 (char*)filter_data->service_uuid_mask.data.data,
1702 BT_LE_AD_TYPE_COMP_LIST_16_BIT_SERVICE_CLASS_UUIDS)
1705 if (__bt_check_scan_result_uuid(adv_data,
1707 (char*)filter_data->service_uuid.data.data,
1708 filter_data->service_uuid.data_len,
1709 (char*)filter_data->service_uuid_mask.data.data,
1710 BT_LE_AD_TYPE_INCOMP_LIST_128_BIT_SERVICE_CLASS_UUIDS)
1713 if (__bt_check_scan_result_uuid(adv_data,
1715 (char*)filter_data->service_uuid.data.data,
1716 filter_data->service_uuid.data_len,
1717 (char*)filter_data->service_uuid_mask.data.data,
1718 BT_LE_AD_TYPE_COMP_LIST_128_BIT_SERVICE_CLASS_UUIDS)
1721 if (__bt_check_scan_result_uuid(scan_data,
1723 (char*)filter_data->service_uuid.data.data,
1724 filter_data->service_uuid.data_len,
1725 (char*)filter_data->service_uuid_mask.data.data,
1726 BT_LE_AD_TYPE_INCOMP_LIST_16_BIT_SERVICE_CLASS_UUIDS)
1729 if (__bt_check_scan_result_uuid(scan_data,
1731 (char*)filter_data->service_uuid.data.data,
1732 filter_data->service_uuid.data_len,
1733 (char*)filter_data->service_uuid_mask.data.data,
1734 BT_LE_AD_TYPE_COMP_LIST_16_BIT_SERVICE_CLASS_UUIDS)
1737 if (__bt_check_scan_result_uuid(scan_data,
1739 (char*)filter_data->service_uuid.data.data,
1740 filter_data->service_uuid.data_len,
1741 (char*)filter_data->service_uuid_mask.data.data,
1742 BT_LE_AD_TYPE_INCOMP_LIST_128_BIT_SERVICE_CLASS_UUIDS)
1745 if (__bt_check_scan_result_uuid(scan_data,
1747 (char*)filter_data->service_uuid.data.data,
1748 filter_data->service_uuid.data_len,
1749 (char*)filter_data->service_uuid_mask.data.data,
1750 BT_LE_AD_TYPE_COMP_LIST_128_BIT_SERVICE_CLASS_UUIDS)
1754 if (is_matched == FALSE)
1757 if (filter_data->added_features &
1758 BLUETOOTH_LE_SCAN_FILTER_FEATURE_SERVICE_SOLICITATION_UUID) {
1761 if (__bt_check_scan_result_uuid(adv_data,
1763 (char*)filter_data->service_solicitation_uuid.data.data,
1764 filter_data->service_solicitation_uuid.data_len,
1765 (char*)filter_data->service_solicitation_uuid_mask.data.data,
1766 BT_LE_AD_TYPE_LIST_16_BIT_SERVICE_SOLICITATION_UUIDS)
1769 if (__bt_check_scan_result_uuid(adv_data,
1771 (char*)filter_data->service_solicitation_uuid.data.data,
1772 filter_data->service_solicitation_uuid.data_len,
1773 (char*)filter_data->service_solicitation_uuid_mask.data.data,
1774 BT_LE_AD_TYPE_LIST_128_BIT_SERVICE_SOLICITATION_UUIDS)
1777 if (__bt_check_scan_result_uuid(scan_data,
1779 (char*)filter_data->service_solicitation_uuid.data.data,
1780 filter_data->service_solicitation_uuid.data_len,
1781 (char*)filter_data->service_solicitation_uuid_mask.data.data,
1782 BT_LE_AD_TYPE_LIST_16_BIT_SERVICE_SOLICITATION_UUIDS)
1785 if (__bt_check_scan_result_uuid(scan_data,
1787 (char*)filter_data->service_solicitation_uuid.data.data,
1788 filter_data->service_solicitation_uuid.data_len,
1789 (char*)filter_data->service_solicitation_uuid_mask.data.data,
1790 BT_LE_AD_TYPE_LIST_128_BIT_SERVICE_SOLICITATION_UUIDS)
1794 if (is_matched == FALSE)
1797 if (filter_data->added_features &
1798 BLUETOOTH_LE_SCAN_FILTER_FEATURE_DEVICE_NAME) {
1799 char name[BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX] = {0, };
1804 __bt_get_ad_data_by_type((char*)adv_data, adv_data_len,
1805 BT_LE_AD_TYPE_COMPLETE_LOCAL_NAME,
1808 if (data_len >= BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX)
1809 data_len = BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX - 1;
1810 memcpy(name, data, data_len);
1811 name[data_len] = '\0';
1814 if (strncmp(filter_data->device_name,
1815 name, data_len) == 0)
1818 __bt_get_ad_data_by_type((char*)scan_data,
1820 BT_LE_AD_TYPE_COMPLETE_LOCAL_NAME,
1823 if (data_len >= BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX)
1824 data_len = BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX - 1;
1825 memcpy(name, data, data_len);
1826 name[data_len] = '\0';
1829 if (strncmp(filter_data->device_name,
1830 name, data_len) == 0)
1834 if (is_matched == FALSE)
1837 if (filter_data->added_features &
1838 BLUETOOTH_LE_SCAN_FILTER_FEATURE_MANUFACTURER_DATA) {
1843 __bt_get_ad_data_by_type((char*)adv_data,
1845 BT_LE_AD_TYPE_MANUFACTURER_SPECIFIC_DATA,
1849 int manufacturer_id;
1850 manufacturer_id = (data[1] << 8) + data[0];
1852 if (filter_data->manufacturer_id == manufacturer_id) {
1853 if (filter_data->manufacturer_data.data_len == 0) {
1856 if (data_len >= BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX)
1857 data_len = BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX - 1;
1858 if (_bt_byte_arr_cmp_with_mask(data + 2,
1859 (char*)filter_data->manufacturer_data.data.data,
1860 (char*)filter_data->manufacturer_data_mask.data.data,
1861 data_len - 2) == 0) {
1869 __bt_get_ad_data_by_type((char*)scan_data,
1871 BT_LE_AD_TYPE_MANUFACTURER_SPECIFIC_DATA,
1875 int manufacturer_id;
1876 manufacturer_id = (data[1] << 8) + data[0];
1878 if (filter_data->manufacturer_id == manufacturer_id) {
1879 if (filter_data->manufacturer_data.data_len == 0) {
1882 if (data_len >= BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX)
1883 data_len = BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX - 1;
1884 if (_bt_byte_arr_cmp_with_mask(data + 2,
1885 (char*)filter_data->manufacturer_data.data.data,
1886 (char*)filter_data->manufacturer_data_mask.data.data,
1887 data_len - 2) == 0) {
1896 if (is_matched == FALSE)
1899 if (filter_data->added_features &
1900 BLUETOOTH_LE_SCAN_FILTER_FEATURE_SERVICE_DATA) {
1905 __bt_get_ad_data_by_type((char*)adv_data,
1907 BT_LE_AD_TYPE_SERVICE_DATA,
1910 if (data_len >= BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX)
1911 data_len = BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX - 1;
1912 if (_bt_byte_arr_cmp_with_mask(data,
1913 (char*)filter_data->service_data.data.data,
1914 (char*)filter_data->service_data_mask.data.data,
1921 __bt_get_ad_data_by_type((char*)scan_data,
1923 BT_LE_AD_TYPE_SERVICE_DATA,
1926 if (data_len >= BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX)
1927 data_len = BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX - 1;
1928 if (_bt_byte_arr_cmp_with_mask(data,
1929 (char*)filter_data->service_data.data.data,
1930 (char*)filter_data->service_data_mask.data.data,
1938 if (is_matched == FALSE)
1942 BT_INFO("The scan result is conformable.");
1946 BT_INFO("The scan result is NOT conformable.");
1950 void _bt_send_scan_result_event(const bt_remote_le_dev_info_t *le_dev_info,
1951 const bt_le_adv_info_t *adv_info)
1953 int result = BLUETOOTH_ERROR_NONE;
1955 GVariant *scan_data_param, *adv_data_param;
1957 bt_adapter_le_scanner_t *scanner = NULL;
1958 const char *adv_data = NULL;
1959 int adv_data_len = 0;
1960 const char *scan_data = NULL;
1961 int scan_data_len = 0;
1963 ret_if(le_dev_info == NULL);
1964 if (_bt_get_le_scan_type() == BT_LE_ACTIVE_SCAN)
1965 ret_if(adv_info == NULL);
1967 if (_bt_get_le_scan_type() == BT_LE_PASSIVE_SCAN) {
1968 adv_data = le_dev_info->adv_data;
1969 adv_data_len = le_dev_info->adv_data_len;
1970 scan_data = le_dev_info->adv_data;
1973 adv_data = adv_info->data;
1974 adv_data_len = adv_info->data_len;
1975 scan_data = le_dev_info->adv_data;
1976 scan_data_len = le_dev_info->adv_data_len;
1979 for (l = scanner_list; l != NULL; l = g_slist_next(l)) {
1981 if (scanner->is_scanning == FALSE)
1984 if (__bt_check_scan_result_with_filter(le_dev_info->address,
1985 adv_data, adv_data_len, scan_data, scan_data_len,
1989 adv_data_param = g_variant_new_from_data((const GVariantType *)"ay",
1990 adv_data, adv_data_len, TRUE, NULL, NULL);
1991 scan_data_param = g_variant_new_from_data((const GVariantType *)"ay",
1992 scan_data, scan_data_len, TRUE, NULL, NULL);
1994 param = g_variant_new("(isnnn@ayn@ay)",
1996 le_dev_info->address,
1997 le_dev_info->addr_type,
2005 _bt_send_event_to_dest(scanner->sender, BT_LE_ADAPTER_EVENT,
2006 BLUETOOTH_EVENT_REMOTE_LE_DEVICE_FOUND, param);
2008 _bt_send_event(BT_LE_ADAPTER_EVENT, BLUETOOTH_EVENT_REMOTE_LE_DEVICE_FOUND, param);
2013 void _bt_send_ibeacon_scan_result_event(const bt_remote_ibeacon_dev_info_t *ibeacon_dev_info)
2015 int result = BLUETOOTH_ERROR_NONE;
2018 bt_adapter_le_scanner_t *scanner = NULL;
2020 ret_if(ibeacon_dev_info == NULL);
2021 BT_DBG("_bt_send_ibeacon_scan_result_event");
2023 for (l = scanner_list; l != NULL; l = g_slist_next(l)) {
2025 if (scanner->is_scanning == FALSE)
2028 param = g_variant_new("(isnnnsnnn)",
2030 ibeacon_dev_info->address,
2031 ibeacon_dev_info->addr_type,
2032 ibeacon_dev_info->company_id,
2033 ibeacon_dev_info->ibeacon_type,
2034 ibeacon_dev_info->uuid,
2035 ibeacon_dev_info->major_id,
2036 ibeacon_dev_info->minor_id,
2037 ibeacon_dev_info->measured_power);
2039 _bt_send_event(BT_LE_ADAPTER_EVENT, BLUETOOTH_EVENT_REMOTE_IBEACON_DEVICE_FOUND, param);
2043 int _bt_add_white_list(bluetooth_device_address_t *device_address, bluetooth_device_address_type_t address_type)
2046 char address[BT_ADDRESS_STRING_SIZE] = { 0 };
2047 GError *error = NULL;
2050 if (__bt_is_factory_test_mode()) {
2051 BT_ERR("Unable to add white list in factory binary !!");
2052 return BLUETOOTH_ERROR_NOT_SUPPORT;
2055 BT_CHECK_PARAMETER(device_address, return);
2057 if (address_type != BLUETOOTH_DEVICE_PUBLIC_ADDRESS &&
2058 address_type != BLUETOOTH_DEVICE_RANDOM_ADDRESS)
2059 return BLUETOOTH_ERROR_INVALID_PARAM;
2061 _bt_convert_addr_type_to_string(address, device_address->addr);
2063 proxy = _bt_get_adapter_proxy();
2064 retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
2066 ret = g_dbus_proxy_call_sync(proxy, "AddDeviceWhiteList",
2067 g_variant_new("(su)", address, address_type),
2068 G_DBUS_CALL_FLAGS_NONE, -1,
2072 BT_ERR("AddDeviceWhiteList Fail: %s", error->message);
2073 g_clear_error(&error);
2074 return BLUETOOTH_ERROR_INTERNAL;
2078 g_variant_unref(ret);
2079 BT_INFO("Add white list");
2081 return BLUETOOTH_ERROR_NONE;
2084 int _bt_remove_white_list(bluetooth_device_address_t *device_address, bluetooth_device_address_type_t address_type)
2087 char address[BT_ADDRESS_STRING_SIZE] = { 0 };
2088 GError *error = NULL;
2091 if (__bt_is_factory_test_mode()) {
2092 BT_ERR("Unable to remove white list in factory binary !!");
2093 return BLUETOOTH_ERROR_NOT_SUPPORT;
2096 BT_CHECK_PARAMETER(device_address, return);
2098 if (address_type != BLUETOOTH_DEVICE_PUBLIC_ADDRESS &&
2099 address_type != BLUETOOTH_DEVICE_RANDOM_ADDRESS)
2100 return BLUETOOTH_ERROR_INVALID_PARAM;
2102 _bt_convert_addr_type_to_string(address, device_address->addr);
2104 proxy = _bt_get_adapter_proxy();
2105 retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
2107 ret = g_dbus_proxy_call_sync(proxy, "RemoveDeviceWhiteList",
2108 g_variant_new("(su)", address, address_type),
2109 G_DBUS_CALL_FLAGS_NONE, -1,
2113 BT_ERR("RemoveDeviceWhiteList Fail: %s", error->message);
2114 g_clear_error(&error);
2115 return BLUETOOTH_ERROR_INTERNAL;
2119 g_variant_unref(ret);
2120 BT_INFO("Remove white list");
2122 return BLUETOOTH_ERROR_NONE;
2125 int _bt_clear_white_list(void)
2128 GError *error = NULL;
2131 if (__bt_is_factory_test_mode()) {
2132 BT_ERR("Unable to clear white list in factory binary !!");
2133 return BLUETOOTH_ERROR_NOT_SUPPORT;
2136 proxy = _bt_get_adapter_proxy();
2137 retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
2139 ret = g_dbus_proxy_call_sync(proxy, "ClearDeviceWhiteList",
2140 NULL, G_DBUS_CALL_FLAGS_NONE,
2144 BT_ERR("ClearDeviceWhiteList Fail: %s", error->message);
2145 g_clear_error(&error);
2146 return BLUETOOTH_ERROR_INTERNAL;
2149 g_variant_unref(ret);
2151 BT_INFO("Clear white list");
2153 return BLUETOOTH_ERROR_NONE;
2156 int _bt_initialize_ipsp(void)
2160 GError *error = NULL;
2163 if (_bt_adapter_get_status() != BT_ACTIVATED &&
2164 _bt_adapter_get_le_status() != BT_LE_ACTIVATED) {
2165 return BLUETOOTH_ERROR_DEVICE_NOT_ENABLED;
2168 proxy = _bt_get_adapter_proxy();
2169 retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
2171 ret = g_dbus_proxy_call_sync(proxy, "InitializeIpsp",
2172 NULL, G_DBUS_CALL_FLAGS_NONE,
2175 BT_ERR("Initialize IPSP Failed :[%s]", error->message);
2176 g_clear_error(&error);
2177 return BLUETOOTH_ERROR_INTERNAL;
2180 g_variant_unref(ret);
2182 BT_INFO("IPSP initialization called successfully");
2184 return BLUETOOTH_ERROR_NONE;
2187 int _bt_deinitialize_ipsp(void)
2191 GError *error = NULL;
2194 if (_bt_adapter_get_status() != BT_ACTIVATED &&
2195 _bt_adapter_get_le_status() != BT_LE_ACTIVATED) {
2196 return BLUETOOTH_ERROR_DEVICE_NOT_ENABLED;
2199 proxy = _bt_get_adapter_proxy();
2200 retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
2202 ret = g_dbus_proxy_call_sync(proxy, "DeinitializeIpsp",
2203 NULL, G_DBUS_CALL_FLAGS_NONE,
2206 BT_ERR("De-Initialize IPSP Failed :[%s]", error->message);
2207 g_clear_error(&error);
2208 return BLUETOOTH_ERROR_INTERNAL;
2211 g_variant_unref(ret);
2213 BT_INFO("IPSP De-initialization called successfully");
2215 return BLUETOOTH_ERROR_NONE;
2218 int _bt_le_read_maximum_data_length(
2219 bluetooth_le_read_maximum_data_length_t *max_le_datalength)
2221 GError *error = NULL;
2223 GVariant *reply = NULL;
2224 guint16 max_tx_octets, max_tx_time;
2225 guint16 max_rx_octets, max_rx_time;
2227 proxy = _bt_get_adapter_proxy();
2228 retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
2230 reply = g_dbus_proxy_call_sync(proxy, "LEReadMaximumDataLength",
2231 NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
2233 if (reply == NULL) {
2234 BT_ERR("LEReadMaximumDataLength dBUS-RPC failed");
2235 if (error != NULL) {
2236 BT_ERR("D-Bus API failure: errCode[%x], message[%s]",
2237 error->code, error->message);
2238 g_clear_error(&error);
2240 return BLUETOOTH_ERROR_INTERNAL;
2243 g_variant_get(reply, "(qqqq)", &max_tx_octets, &max_tx_time,
2244 &max_rx_octets, &max_rx_time);
2246 max_le_datalength->max_tx_octets = max_tx_octets;
2247 max_le_datalength->max_tx_time = max_tx_time;
2248 max_le_datalength->max_rx_octets = max_rx_octets;
2249 max_le_datalength->max_rx_time = max_rx_time;
2251 g_variant_unref(reply);
2253 return BLUETOOTH_ERROR_NONE;
2255 int _bt_le_write_host_suggested_default_data_length(
2256 const unsigned int def_tx_Octets, const unsigned int def_tx_Time)
2258 GError *error = NULL;
2260 GVariant *reply = NULL;
2262 proxy = _bt_get_adapter_proxy();
2263 retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
2265 reply = g_dbus_proxy_call_sync(proxy,
2266 "LEWriteHostSuggestedDataLength",
2267 g_variant_new("(qq)", def_tx_Octets, def_tx_Time),
2268 G_DBUS_CALL_FLAGS_NONE,
2273 if (reply == NULL) {
2274 BT_ERR("_bt_le_write_host_suggested_default_data_length dBUS-RPC failed");
2275 if (error != NULL) {
2276 BT_ERR("D-Bus API failure: errCode[%x], message[%s]",
2277 error->code, error->message);
2278 g_clear_error(&error);
2280 return BLUETOOTH_ERROR_INTERNAL;
2283 g_variant_unref(reply);
2285 return BLUETOOTH_ERROR_NONE;
2288 int _bt_le_read_host_suggested_default_data_length(
2289 bluetooth_le_read_host_suggested_data_length_t *def_data_length)
2291 GError *error = NULL;
2293 GVariant *reply = NULL;
2294 guint16 def_tx_octets, def_tx_time;
2296 proxy = _bt_get_adapter_proxy();
2297 retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
2299 reply = g_dbus_proxy_call_sync(proxy, "LEReadHostSuggestedDataLength",
2300 NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
2302 if (reply == NULL) {
2303 BT_ERR("LEReadHostSuggestedDataLength dBUS-RPC failed");
2304 if (error != NULL) {
2305 BT_ERR("D-Bus API failure: errCode[%x], message[%s]",
2306 error->code, error->message);
2307 g_clear_error(&error);
2309 return BLUETOOTH_ERROR_INTERNAL;
2312 g_variant_get(reply, "(qq)", &def_tx_octets, &def_tx_time);
2314 def_data_length->def_tx_octets = def_tx_octets;
2315 def_data_length->def_tx_time = def_tx_time;
2317 g_variant_unref(reply);
2319 return BLUETOOTH_ERROR_NONE;
2322 int _bt_le_set_data_length(bluetooth_device_address_t *device_address,
2323 const unsigned int max_tx_Octets, const unsigned int max_tx_Time)
2325 GError *error = NULL;
2326 guint16 txOctets = max_tx_Octets;
2327 guint16 txTime = max_tx_Time;
2328 char address[BT_ADDRESS_STRING_SIZE] = { 0 };
2329 gchar *device_path = NULL;
2330 GDBusConnection *conn;
2331 GDBusProxy *device_proxy;
2333 _bt_convert_addr_type_to_string(address, device_address->addr);
2335 device_path = _bt_get_device_object_path(address);
2337 if (device_path == NULL) {
2338 BT_DBG("Device path is null");
2339 return BLUETOOTH_ERROR_INTERNAL;
2342 conn = _bt_gdbus_get_system_gconn();
2344 BT_ERR("conn == NULL");
2345 g_free(device_path);
2346 return BLUETOOTH_ERROR_INTERNAL;
2349 device_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
2350 NULL, BT_BLUEZ_NAME,
2351 device_path, BT_DEVICE_INTERFACE, NULL, NULL);
2353 g_free(device_path);
2354 retv_if(device_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
2356 g_dbus_proxy_call_sync(device_proxy,
2358 g_variant_new("(qq)", txOctets, txTime),
2359 G_DBUS_CALL_FLAGS_NONE,
2364 g_object_unref(device_proxy);
2367 BT_ERR("LESetDataLength error: [%s]", error->message);
2368 g_error_free(error);
2369 return BLUETOOTH_ERROR_INTERNAL;
2372 return BLUETOOTH_ERROR_NONE;
2375 int _bt_service_adapter_le_init(void)
2377 le_adv_slot = g_malloc0(sizeof(bt_adapter_le_adv_slot_t) * le_feature_info.adv_inst_max);
2379 return BLUETOOTH_ERROR_NONE;
2382 void _bt_service_adapter_le_deinit(void)
2384 __bt_free_le_adv_slot();
2385 __bt_free_le_scanner();