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.
24 #include <arpa/inet.h>
25 #include <bluetooth-api.h>
27 #include "bluetooth.h"
28 #include "bluetooth_internal.h"
29 #include "bluetooth_private.h"
31 #define BT_CHECK_LE_SUPPORT() \
33 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON); \
34 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_LE); \
37 #define BT_CHECK_LE_5_0_SUPPORT() \
39 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_LE); \
40 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_LE_5_0); \
43 static bt_scan_filter_h pxp_linkloss_alert_filter;
44 static bt_scan_filter_h pxp_immediate_alert_filter;
45 static bt_scan_filter_h pxp_signal_loss_filter;
47 static GSList *advertiser_list;
48 static GSList *scan_filter_list;
49 static int scan_filter_id;
52 int bt_adapter_enable(void)
54 int error_code = BT_ERROR_NONE;
56 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
57 BT_CHECK_INIT_STATUS();
58 error_code = _bt_get_error_code(bluetooth_enable_adapter());
59 if (error_code != BT_ERROR_NONE) { /* LCOV_EXCL_LINE */
60 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code),
61 error_code); /* LCOV_EXCL_LINE */
62 } /* LCOV_EXCL_LINE */
66 int bt_adapter_read_battery_info(bt_battery_info_s *battery_data)
69 int error_code = BT_ERROR_NONE;
71 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
72 BT_CHECK_INIT_STATUS();
73 BT_CHECK_INPUT_PARAMETER(battery_data);
74 memset(&data, 0, sizeof(bt_battery_data));
76 error_code = _bt_get_error_code(bluetooth_read_battery_data(&data));
78 if (error_code != BT_ERROR_NONE) { /* LCOV_EXCL_LINE */
79 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code),
80 error_code); /* LCOV_EXCL_LINE */
82 } /* LCOV_EXCL_LINE */
84 battery_data->session_start_time = data.session_start_time;
85 battery_data->session_end_time = data.session_end_time;
86 battery_data->session_scan_time = data.session_scan_time;
87 battery_data->session_connected_time = data.session_connected_time;
88 battery_data->tx_time = data.tx_time;
89 battery_data->rx_time = data.rx_time;
90 battery_data->idle_time = data.idle_time;
91 battery_data->atm_list = data.atm_list;
93 BT_DBG("Battery Data in application layer: %ld %ld %d %d",
94 battery_data->session_start_time, battery_data->session_end_time,
95 battery_data->session_scan_time, battery_data->session_connected_time);
97 if(data.atm_list == NULL) {
98 BT_DBG("No data transaction in this session");
102 BT_DBG("App-wise data transaction details:");
103 for (GSList *l = battery_data->atm_list; l != NULL; l = g_slist_next(l)) {
104 bt_battery_app_info_s *t = (bt_battery_app_info_s *)(l->data);
105 BT_DBG("%ld %ld %d %d %u", (long int)(t->uid), (long int)(t->pid), t->rx_bytes, t->tx_bytes, t->time);
111 int bt_adapter_disable(void)
113 int error_code = BT_ERROR_NONE;
115 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
116 BT_CHECK_INIT_STATUS();
117 error_code = _bt_get_error_code(bluetooth_disable_adapter());
118 if (error_code != BT_ERROR_NONE) { /* LCOV_EXCL_LINE */
119 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code),
120 error_code); /* LCOV_EXCL_LINE */
121 } /* LCOV_EXCL_LINE */
125 int bt_adapter_recover(void)
127 int error_code = BT_ERROR_NONE;
129 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
130 BT_CHECK_INIT_STATUS();
131 error_code = _bt_get_error_code(bluetooth_recover_adapter());
132 if (error_code != BT_ERROR_NONE) { /* LCOV_EXCL_LINE */
133 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code),
134 error_code); /* LCOV_EXCL_LINE */
135 } /* LCOV_EXCL_LINE */
139 int bt_adapter_reset(void)
141 int error_code = BT_ERROR_NONE;
143 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
144 BT_CHECK_INIT_STATUS();
145 error_code = _bt_get_error_code(bluetooth_reset_adapter());
146 if (error_code != BT_ERROR_NONE) { /* LCOV_EXCL_LINE */
147 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code),
148 error_code); /* LCOV_EXCL_LINE */
149 } /* LCOV_EXCL_LINE */
154 int bt_adapter_get_state(bt_adapter_state_e *adapter_state)
156 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
157 BT_CHECK_INIT_STATUS();
158 BT_CHECK_INPUT_PARAMETER(adapter_state);
160 *adapter_state = bluetooth_check_adapter();
161 return BT_ERROR_NONE;
164 /* LCOV_EXCL_START */
165 int bt_adapter_le_enable(void)
167 int error_code = BT_ERROR_NONE;
169 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
170 BT_CHECK_INIT_STATUS();
171 error_code = _bt_get_error_code(bluetooth_enable_adapter_le());
172 if (error_code != BT_ERROR_NONE) { /* LCOV_EXCL_LINE */
173 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code),
174 error_code); /* LCOV_EXCL_LINE */
175 } /* LCOV_EXCL_LINE */
179 int bt_adapter_le_disable(void)
181 int error_code = BT_ERROR_NONE;
183 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
184 BT_CHECK_INIT_STATUS();
186 error_code = _bt_get_error_code(bluetooth_disable_adapter_le());
187 if (error_code != BT_ERROR_NONE) { /* LCOV_EXCL_LINE */
188 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code),
189 error_code); /* LCOV_EXCL_LINE */
190 } /* LCOV_EXCL_LINE */
194 int bt_adapter_le_get_state(bt_adapter_le_state_e *adapter_le_state)
196 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
197 BT_CHECK_INIT_STATUS();
198 BT_CHECK_INPUT_PARAMETER(adapter_le_state);
200 *adapter_le_state = bluetooth_check_adapter_le();
201 return BT_ERROR_NONE;
205 int bt_adapter_get_address(char **address)
207 bluetooth_device_address_t loc_address = { {0} };
208 int error_code = BT_ERROR_NONE;
210 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
211 BT_CHECK_INIT_STATUS();
212 BT_CHECK_INPUT_PARAMETER(address);
214 error_code = _bt_get_error_code(bluetooth_get_local_address(&loc_address));
215 if (error_code != BT_ERROR_NONE) { /* LCOV_EXCL_LINE */
216 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), /* LCOV_EXCL_LINE */
217 error_code); /* LCOV_EXCL_LINE */
218 return error_code; /* LCOV_EXCL_LINE */
221 error_code = _bt_convert_address_to_string(address, &loc_address);
222 if (error_code != BT_ERROR_NONE) { /* LCOV_EXCL_LINE */
223 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), /* LCOV_EXCL_LINE */
224 error_code); /* LCOV_EXCL_LINE */
225 return error_code; /* LCOV_EXCL_LINE */
228 return BT_ERROR_NONE;
231 /* LCOV_EXCL_START */
232 int bt_adapter_get_version(char **version)
234 int ret = BT_ERROR_NONE;
235 bluetooth_version_t loc_ver = { { 0 } };
237 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
238 BT_CHECK_INIT_STATUS();
239 BT_CHECK_INPUT_PARAMETER(version);
241 ret = _bt_get_error_code(bluetooth_get_local_version(&loc_ver));
242 if (ret != BT_ERROR_NONE) { /* LCOV_EXCL_LINE */
243 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret),
244 ret); /* LCOV_EXCL_LINE */
245 return ret; /* LCOV_EXCL_LINE */
248 *version = strdup(loc_ver.version);
249 if (*version == NULL) {
250 BT_ERR("OUT_OF_MEMORY(0x%08x)", BT_ERROR_OUT_OF_MEMORY);
251 return BT_ERROR_OUT_OF_MEMORY;
254 return BT_ERROR_NONE;
258 #define BT_ADAPTER_FIRMWARE_INFO_FILE_PATH "/var/lib/bluetooth/bcmtool_log"
259 #define BT_ADAPTER_STACK_INFO_FILE_PATH "/usr/etc/bluetooth/stack_info"
260 #define BT_ADAPTER_MAX_BUFFER_SIZE (32767 * 1000)
262 /* LCOV_EXCL_START */
263 int bt_adapter_get_local_info(char **chipset, char **firmware,
264 char **stack_version, char **profiles)
266 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
267 BT_CHECK_INIT_STATUS();
269 int ret = BT_ERROR_NONE;
274 char *info_start = NULL;
275 char *info_end = NULL;
277 char *local_chipset = NULL;
278 char *local_firmware = NULL;
279 char *local_stack_version = NULL;
280 char *local_profiles = NULL;
282 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
283 BT_CHECK_INIT_STATUS();
284 BT_CHECK_INPUT_PARAMETER(chipset);
285 BT_CHECK_INPUT_PARAMETER(firmware);
286 BT_CHECK_INPUT_PARAMETER(stack_version);
287 BT_CHECK_INPUT_PARAMETER(profiles);
289 if ((fp = fopen(BT_ADAPTER_FIRMWARE_INFO_FILE_PATH, "r")) == NULL) {
290 BT_ERR("fopen() is failed(%s)",
291 BT_ADAPTER_FIRMWARE_INFO_FILE_PATH);
293 local_firmware = (char *)malloc(sizeof(char) *1);
294 if (local_firmware == NULL) {
295 ret = BT_ERROR_OUT_OF_MEMORY;
296 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret),
300 local_firmware[0] = '\0';
301 local_chipset = (char *)malloc(sizeof(char) *1);
302 if (local_chipset == NULL) {
303 ret = BT_ERROR_OUT_OF_MEMORY;
304 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret),
308 local_chipset[0] = '\0';
310 fseek(fp, 0, SEEK_END);
313 BT_ERR("ftell() error(0x%lx)", lsize);
314 ret = BT_ERROR_OPERATION_FAILED;
317 buf = (char *)malloc(sizeof(char) *(lsize + 1));
319 ret = BT_ERROR_OUT_OF_MEMORY;
320 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret),
324 fseek(fp, 0, SEEK_SET);
325 result = fread(buf, 1, lsize, fp);
329 BT_ERR("fread() error");
331 info_start = strstr(buf, "bluetooth");
332 if (info_start == NULL) {
333 BT_ERR("strstr() error info_start is NULL");
334 ret = BT_ERROR_OPERATION_FAILED;
338 info_end = strstr(buf, "hcd");
339 if (info_end == NULL) {
340 BT_ERR("strstr() error info_end is NULL");
341 ret = BT_ERROR_OPERATION_FAILED;
344 info_size = info_end - info_start - 1;
346 BT_ERR("info_size is invalid(%ld)", info_size);
347 ret = BT_ERROR_OPERATION_FAILED;
351 local_firmware = (char *)malloc(sizeof(char) *(info_size + 1));
352 if (local_firmware == NULL) {
353 ret = BT_ERROR_OUT_OF_MEMORY;
354 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret),
359 strncpy(local_firmware, info_start, info_size);
360 local_firmware[info_size] = '\0';
362 info_end = strchr(buf, '_');
363 if (info_end == NULL) {
364 BT_ERR("strchr() error info_end is NULL");
365 ret = BT_ERROR_OPERATION_FAILED;
368 info_size = info_end - info_start;
370 local_chipset = (char *)malloc(sizeof(char) *(info_size + 1));
371 if (local_chipset == NULL) {
372 ret = BT_ERROR_OUT_OF_MEMORY;
373 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret),
378 strncpy(local_chipset, info_start, info_size);
379 local_chipset[info_size] = '\0';
387 if ((fp = fopen(BT_ADAPTER_STACK_INFO_FILE_PATH, "r")) == NULL) {
388 BT_ERR("fopen() error");
389 ret = BT_ERROR_OPERATION_FAILED;
393 fseek(fp, 0, SEEK_END);
396 BT_ERR("ftell() error(0x%lx)", lsize);
397 ret = BT_ERROR_OPERATION_FAILED;
400 buf = (char *)malloc(sizeof(char) *(lsize + 1));
402 ret = BT_ERROR_OUT_OF_MEMORY;
403 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
406 fseek(fp, 0, SEEK_SET);
407 result = fread(buf, 1, lsize, fp);
410 if (result != lsize) {
411 BT_ERR("fread() error(0x%zd)", result);
412 ret = BT_ERROR_OPERATION_FAILED;
417 info_end = strchr(buf, ',');
418 if (info_end == NULL) {
419 BT_ERR("strchr() error info_end is NULL");
420 ret = BT_ERROR_OPERATION_FAILED;
423 info_size = info_end - info_start;
425 if (info_size < 0 || info_size > BT_ADAPTER_MAX_BUFFER_SIZE) {
426 BT_ERR("info size is incorrect: %ld", info_size);
427 ret = BT_ERROR_OPERATION_FAILED;
431 local_stack_version = (char *)malloc(sizeof(char) *(info_size + 1));
432 if (local_stack_version == NULL) {
433 ret = BT_ERROR_OUT_OF_MEMORY;
434 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
438 strncpy(local_stack_version, info_start, info_size);
439 local_stack_version[info_size] = '\0';
441 info_start = info_end + 2;
442 info_size = lsize - info_size - 3;
444 if (info_size < 0 || info_size > BT_ADAPTER_MAX_BUFFER_SIZE) {
445 BT_ERR("info size is incorrect: %ld", info_size);
446 ret = BT_ERROR_OPERATION_FAILED;
450 local_profiles = (char *)malloc(sizeof(char) *(info_size + 1));
451 if (local_profiles == NULL) {
452 ret = BT_ERROR_OUT_OF_MEMORY;
453 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
457 strncpy(local_profiles, info_start, info_size);
458 local_profiles[info_size] = '\0';
464 *chipset = local_chipset;
465 *firmware = local_firmware;
466 *stack_version = local_stack_version;
467 *profiles = local_profiles;
469 return BT_ERROR_NONE;
475 free(local_firmware);
476 if (local_stack_version)
477 free(local_stack_version);
486 int bt_adapter_get_name(char **name)
488 int ret = BT_ERROR_NONE;
489 bluetooth_device_name_t loc_name = { {0} };
491 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
492 BT_CHECK_INIT_STATUS();
493 BT_CHECK_INPUT_PARAMETER(name);
495 ret = _bt_get_error_code(bluetooth_get_local_name(&loc_name));
496 if (ret != BT_ERROR_NONE) { /* LCOV_EXCL_LINE */
497 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), /* LCOV_EXCL_LINE */
498 ret); /* LCOV_EXCL_LINE */
499 return ret; /* LCOV_EXCL_LINE */
502 *name = strdup(loc_name.name);
504 BT_ERR("OUT_OF_MEMORY(0x%08x)", /* LCOV_EXCL_LINE */
505 BT_ERROR_OUT_OF_MEMORY); /* LCOV_EXCL_LINE */
506 return BT_ERROR_OUT_OF_MEMORY;
509 return BT_ERROR_NONE;
512 int bt_adapter_set_name(const char *name)
514 bluetooth_device_name_t loc_name = { {0} };
515 int ret = BT_ERROR_NONE;
517 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
518 BT_CHECK_INIT_STATUS();
519 BT_CHECK_INPUT_PARAMETER(name);
521 strncpy(loc_name.name, name, BLUETOOTH_DEVICE_NAME_LENGTH_MAX);
522 loc_name.name[BLUETOOTH_DEVICE_NAME_LENGTH_MAX] = '\0';
524 ret = _bt_get_error_code(bluetooth_set_local_name(&loc_name));
525 if (ret != BT_ERROR_NONE) { /* LCOV_EXCL_LINE */
526 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), /* LCOV_EXCL_LINE */
527 ret); /* LCOV_EXCL_LINE */
528 } /* LCOV_EXCL_LINE */
533 /* LCOV_EXCL_START */
534 int bt_adapter_get_visibility(bt_adapter_visibility_mode_e *mode, int *duration)
536 bluetooth_discoverable_mode_t discoverable_mode = BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE;
537 int ret = BT_ERROR_NONE;
539 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
540 BT_CHECK_INIT_STATUS();
541 BT_CHECK_INPUT_PARAMETER(mode);
543 ret = _bt_get_error_code(bluetooth_get_discoverable_mode(&discoverable_mode));
544 if (ret != BT_ERROR_NONE) { /* LCOV_EXCL_LINE */
545 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret),
546 ret); /* LCOV_EXCL_LINE */
547 return ret; /* LCOV_EXCL_LINE */
550 *mode = _bt_get_bt_visibility_mode_e(discoverable_mode);
555 if (discoverable_mode == BLUETOOTH_DISCOVERABLE_MODE_TIME_LIMITED_DISCOVERABLE) {
556 if (duration == NULL)
557 return BT_ERROR_NONE;
558 ret = bluetooth_get_timeout_value(duration);
559 if (ret != BT_ERROR_NONE) { /* LCOV_EXCL_LINE */
560 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret),
561 ret); /* LCOV_EXCL_LINE */
562 } /* LCOV_EXCL_LINE */
568 int bt_adapter_set_visibility(bt_adapter_visibility_mode_e visibility_mode,
571 bluetooth_discoverable_mode_t discoverable_mode = BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE;
572 int error_code = BT_ERROR_NONE;
574 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
575 BT_CHECK_INIT_STATUS();
576 switch (visibility_mode) {
577 case BT_ADAPTER_VISIBILITY_MODE_LIMITED_DISCOVERABLE:
578 discoverable_mode = BLUETOOTH_DISCOVERABLE_MODE_TIME_LIMITED_DISCOVERABLE;
580 case BT_ADAPTER_VISIBILITY_MODE_NON_DISCOVERABLE:
581 discoverable_mode = BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE;
584 case BT_ADAPTER_VISIBILITY_MODE_GENERAL_DISCOVERABLE:
585 discoverable_mode = BLUETOOTH_DISCOVERABLE_MODE_GENERAL_DISCOVERABLE;
589 BT_ERR("INVALID_PARAMETER(0x%08x)", BT_ERROR_INVALID_PARAMETER);
590 return BT_ERROR_INVALID_PARAMETER;
593 error_code = _bt_get_error_code(bluetooth_set_discoverable_mode(
594 discoverable_mode, timeout_sec));
595 if (error_code != BT_ERROR_NONE) { /* LCOV_EXCL_LINE */
596 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code),
597 error_code); /* LCOV_EXCL_LINE */
598 } /* LCOV_EXCL_LINE */
603 int bt_adapter_set_connectable_changed_cb(bt_adapter_connectable_changed_cb callback,
606 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
607 BT_CHECK_INIT_STATUS();
608 BT_CHECK_INPUT_PARAMETER(callback);
609 _bt_set_cb(BT_EVENT_CONNECTABLE_CHANGED_EVENT, callback, user_data);
610 return BT_ERROR_NONE;
613 int bt_adapter_unset_connectable_changed_cb(void)
615 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
616 BT_CHECK_INIT_STATUS();
617 _bt_unset_cb(BT_EVENT_CONNECTABLE_CHANGED_EVENT);
618 return BT_ERROR_NONE;
621 int bt_adapter_init_battery_monitor(bt_adapter_disable_battery_cb callback,
624 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
625 BT_CHECK_INIT_STATUS();
626 //BT_CHECK_INPUT_PARAMETER(callback); Callback functionality to be implemented in a later version
628 int ret = bluetooth_set_battery_monitor_state(TRUE);
629 if (ret != BT_ERROR_NONE) {
630 BT_ERR("Battery monitor could not be activated");
631 return BT_ERROR_OPERATION_FAILED;
634 if (callback != NULL) /*Callback functionality to be implemented in a later version*/
635 _bt_set_cb(BT_EVENT_ADAPTER_DISABLED_BATTERY_DATA, callback, user_data);
637 return BT_ERROR_NONE;
640 int bt_adapter_deinit_battery_monitor(void)
642 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
643 BT_CHECK_INIT_STATUS();
645 int ret = bluetooth_set_battery_monitor_state(FALSE);
646 if (ret != BT_ERROR_NONE) {
647 BT_ERR("Battery monitor could not be deactivated");
648 return BT_ERROR_OPERATION_FAILED;
651 _bt_unset_cb(BT_EVENT_ADAPTER_DISABLED_BATTERY_DATA);
652 return BT_ERROR_NONE;
655 int bt_adapter_get_connectable(bool *connectable)
657 gboolean is_connectable = FALSE;
658 int ret = BT_ERROR_NONE;
660 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
661 BT_CHECK_INIT_STATUS();
662 BT_CHECK_INPUT_PARAMETER(connectable);
664 ret = _bt_get_error_code(bluetooth_is_connectable(&is_connectable));
665 if (ret != BT_ERROR_NONE) {
666 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
670 *connectable = is_connectable ? true : false;
672 return BT_ERROR_NONE;
675 int bt_adapter_set_connectable(bool connectable)
677 int error_code = BT_ERROR_NONE;
679 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
680 BT_CHECK_INIT_STATUS();
682 error_code = _bt_get_error_code(bluetooth_set_connectable(connectable));
683 if (error_code != BT_ERROR_NONE) { /* LCOV_EXCL_LINE */
684 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code),
685 error_code); /* LCOV_EXCL_LINE */
686 } /* LCOV_EXCL_LINE */
692 int bt_adapter_foreach_bonded_device(bt_adapter_bonded_device_cb foreach_cb,
695 GPtrArray *dev_list = NULL;
696 bt_device_info_s *dev_info = NULL;
697 bluetooth_device_info_t *ptr = NULL;
698 int ret = BT_ERROR_NONE;
701 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
702 BT_CHECK_INIT_STATUS();
703 BT_CHECK_INPUT_PARAMETER(foreach_cb);
705 dev_list = g_ptr_array_new();
706 if (dev_list == NULL) {
707 BT_ERR("OUT_OF_MEMORY(0x%08x)", /* LCOV_EXCL_LINE */
708 BT_ERROR_OUT_OF_MEMORY); /* LCOV_EXCL_LINE */
709 return BT_ERROR_OUT_OF_MEMORY;
712 ret = _bt_get_error_code(bluetooth_get_bonded_device_list(&dev_list));
713 if (ret != BT_ERROR_NONE) {
714 BT_ERR("%s(0x%08x) : Failed to get bonded device list", /* LCOV_EXCL_LINE */
715 _bt_convert_error_to_string(ret), ret); /* LCOV_EXCL_LINE */
716 g_ptr_array_free(dev_list, TRUE);
720 for (i = 0; i < dev_list->len; i++) { /* LCOV_EXCL_LINE */
721 ptr = g_ptr_array_index(dev_list, i);
723 ret = _bt_get_bt_device_info_s(&dev_info,
724 (bluetooth_device_info_t *)ptr);
725 if (ret != BT_ERROR_NONE) {
726 BT_ERR("%s(0x%08x) : Failed to get device info", /* LCOV_EXCL_LINE */
727 _bt_convert_error_to_string(ret),
728 ret); /* LCOV_EXCL_LINE */
732 if (!foreach_cb(dev_info, user_data)) {
733 _bt_free_bt_device_info_s(dev_info);
736 _bt_free_bt_device_info_s(dev_info); /* LCOV_EXCL_LINE */
738 BT_ERR("OPERATION_FAILED(0x%08x)", /* LCOV_EXCL_LINE */
739 BT_ERROR_OPERATION_FAILED); /* LCOV_EXCL_LINE */
740 ret = BT_ERROR_OPERATION_FAILED;
745 g_ptr_array_foreach(dev_list, (GFunc)g_free, NULL);
746 g_ptr_array_free(dev_list, TRUE);
751 int bt_adapter_get_bonded_device_info(const char *remote_address,
752 bt_device_info_s **device_info)
755 bluetooth_device_address_t addr_hex = { {0,} };
756 bluetooth_device_info_t *info;
758 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
759 BT_CHECK_INIT_STATUS();
760 BT_CHECK_INPUT_PARAMETER(remote_address); /* LCOV_EXCL_START */
762 info = (bluetooth_device_info_t *)malloc(sizeof(bluetooth_device_info_t));
764 return BT_ERROR_OUT_OF_MEMORY;
766 _bt_convert_address_to_hex(&addr_hex, remote_address);
768 ret = _bt_get_error_code(bluetooth_get_bonded_device(&addr_hex, info));
769 if (ret != BT_ERROR_NONE) {
770 BT_ERR("%s(0x%08x) : Failed to run function",
771 _bt_convert_error_to_string(ret),
774 ret = _bt_get_bt_device_info_s(device_info, info);
775 if (ret != BT_ERROR_NONE) {
776 BT_ERR("%s(0x%08x) : Failed to get device info",
777 _bt_convert_error_to_string(ret),
784 return ret; /* LCOV_EXCL_STOP */
787 int bt_adapter_free_device_info(bt_device_info_s *device_info)
789 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
790 BT_CHECK_INIT_STATUS();
791 BT_CHECK_INPUT_PARAMETER(device_info);
793 _bt_free_bt_device_info_s(device_info); /* LCOV_EXCL_LINE */
795 return BT_ERROR_NONE; /* LCOV_EXCL_LINE */
798 int bt_adapter_is_service_used(const char *service_uuid, bool *used)
800 int ret = BT_ERROR_NONE;
801 gboolean is_used = FALSE;
803 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
804 BT_CHECK_INIT_STATUS();
805 BT_CHECK_INPUT_PARAMETER(service_uuid);
806 BT_CHECK_INPUT_PARAMETER(used);
808 if (strcmp(service_uuid, OPP_UUID) == 0) {
809 *used = bluetooth_obex_server_is_activated();
811 ret = _bt_get_error_code(bluetooth_is_service_used(
812 service_uuid, /* LCOV_EXCL_LINE */
814 *used = is_used ? true : false; /* LCOV_EXCL_LINE */
816 /* TODO: MAP? see above */
818 if (ret != BT_ERROR_NONE) { /* LCOV_EXCL_LINE */
819 BT_ERR("%s(0x%08x) : Failed to run function",
820 _bt_convert_error_to_string(ret),
821 ret); /* LCOV_EXCL_LINE */
822 } /* LCOV_EXCL_LINE */
827 /* LCOV_EXCL_START */
828 int bt_adapter_foreach_profile_connected_devices(const char *profile_uuid,
829 bt_adapter_profile_connected_devices_cb callback, void *user_data)
832 GPtrArray *addr_list = NULL;
833 bluetooth_device_address_t *remote_addr = NULL;
834 char *remote_address = NULL;
835 int ret = BT_ERROR_NONE;
838 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
839 BT_CHECK_INIT_STATUS();
840 BT_CHECK_INPUT_PARAMETER(profile_uuid);
841 BT_CHECK_INPUT_PARAMETER(callback);
843 uuid128 = _bt_convert_uuid_to_uuid128(profile_uuid);
844 if (uuid128 == NULL) {
845 BT_ERR("Wrong type of uuid : %s", profile_uuid);
846 return BT_ERROR_INVALID_PARAMETER;
849 addr_list = g_ptr_array_new();
850 if (addr_list == NULL) {
851 BT_ERR("OUT_OF_MEMORY(0x%08x)", BT_ERROR_OUT_OF_MEMORY);
853 return BT_ERROR_OUT_OF_MEMORY;
856 ret = _bt_get_error_code(
857 bluetooth_get_profile_connected_device_list(uuid128, &addr_list));
859 if (ret != BT_ERROR_NONE) {
860 BT_ERR("%s(0x%08x) : Failed to get profile connected device list",
861 _bt_convert_error_to_string(ret), ret);
862 g_ptr_array_free(addr_list, TRUE);
866 for (i = 0; i < addr_list->len; i++) {
867 remote_addr = g_ptr_array_index(addr_list, i);
868 if (remote_addr != NULL) {
869 ret = _bt_convert_address_to_string(&remote_address, remote_addr);
870 if (ret != BT_ERROR_NONE) {
871 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
875 if (!callback(remote_address, user_data)) {
876 g_free(remote_address);
879 g_free(remote_address);
881 BT_ERR("OPERATION_FAILED(0x%08x)", BT_ERROR_OPERATION_FAILED);
882 ret = BT_ERROR_OPERATION_FAILED;
887 g_ptr_array_foreach(addr_list, (GFunc)g_free, NULL);
888 g_ptr_array_free(addr_list, TRUE);
894 int bt_adapter_set_state_changed_cb(bt_adapter_state_changed_cb callback,
897 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
898 BT_CHECK_INIT_STATUS();
899 BT_CHECK_INPUT_PARAMETER(callback);
901 _bt_set_cb(BT_EVENT_STATE_CHANGED, callback, user_data);
903 return BT_ERROR_NONE;
906 /* LCOV_EXCL_START */
907 int bt_adapter_le_set_state_changed_cb(bt_adapter_le_state_changed_cb callback,
910 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
911 BT_CHECK_INIT_STATUS();
912 BT_CHECK_INPUT_PARAMETER(callback);
914 _bt_le_adapter_init();
915 _bt_set_cb(BT_EVENT_LE_STATE_CHANGED, callback, user_data);
916 return BT_ERROR_NONE;
920 int bt_adapter_set_name_changed_cb(bt_adapter_name_changed_cb callback,
923 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
924 BT_CHECK_INIT_STATUS();
925 BT_CHECK_INPUT_PARAMETER(callback);
927 _bt_set_cb(BT_EVENT_NAME_CHANGED, callback, user_data);
929 return BT_ERROR_NONE;
932 int bt_adapter_set_visibility_mode_changed_cb(bt_adapter_visibility_mode_changed_cb callback,
935 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
936 BT_CHECK_INIT_STATUS();
937 BT_CHECK_INPUT_PARAMETER(callback);
939 _bt_set_cb(BT_EVENT_VISIBILITY_MODE_CHANGED, callback, user_data);
941 return BT_ERROR_NONE;
944 int bt_adapter_set_device_discovery_state_changed_cb(bt_adapter_device_discovery_state_changed_cb callback,
947 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
948 BT_CHECK_INIT_STATUS();
949 BT_CHECK_INPUT_PARAMETER(callback);
951 _bt_set_cb(BT_EVENT_DEVICE_DISCOVERY_STATE_CHANGED, callback, user_data);
953 return BT_ERROR_NONE;
956 int bt_adapter_unset_state_changed_cb(void)
958 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
959 BT_CHECK_INIT_STATUS();
960 _bt_unset_cb(BT_EVENT_STATE_CHANGED);
961 return BT_ERROR_NONE;
964 /* LCOV_EXCL_START */
965 int bt_adapter_le_unset_state_changed_cb(void)
967 BT_CHECK_LE_SUPPORT();
968 BT_CHECK_INIT_STATUS();
969 _bt_unset_cb(BT_EVENT_LE_STATE_CHANGED);
970 _bt_le_adapter_deinit();
971 return BT_ERROR_NONE;
975 int bt_adapter_unset_name_changed_cb(void)
977 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
978 BT_CHECK_INIT_STATUS();
979 _bt_unset_cb(BT_EVENT_NAME_CHANGED);
980 return BT_ERROR_NONE;
983 int bt_adapter_unset_visibility_mode_changed_cb(void)
985 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
986 BT_CHECK_INIT_STATUS();
987 _bt_unset_cb(BT_EVENT_VISIBILITY_MODE_CHANGED);
988 return BT_ERROR_NONE;
991 int bt_adapter_set_visibility_duration_changed_cb(bt_adapter_visibility_duration_changed_cb callback,
994 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
995 BT_CHECK_INIT_STATUS();
996 BT_CHECK_INPUT_PARAMETER(callback);
998 _bt_set_cb(BT_EVENT_VISIBILITY_DURATION_CHANGED, callback, user_data);
1000 return BT_ERROR_NONE;
1003 int bt_adapter_unset_visibility_duration_changed_cb(void)
1005 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
1006 BT_CHECK_INIT_STATUS();
1007 _bt_unset_cb(BT_EVENT_VISIBILITY_DURATION_CHANGED);
1008 return BT_ERROR_NONE;
1011 int bt_adapter_unset_device_discovery_state_changed_cb(void)
1013 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
1014 BT_CHECK_INIT_STATUS();
1015 _bt_unset_cb(BT_EVENT_DEVICE_DISCOVERY_STATE_CHANGED);
1016 return BT_ERROR_NONE;
1019 int bt_adapter_start_device_discovery(void)
1021 int error_code = BT_ERROR_NONE;
1023 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
1024 BT_CHECK_INIT_STATUS();
1025 error_code = _bt_get_error_code(bluetooth_start_discovery(0, 0,
1026 BLUETOOTH_DEVICE_MAJOR_MASK_MISC));
1027 if (error_code != BT_ERROR_NONE) { /* LCOV_EXCL_LINE */
1028 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code),
1029 error_code); /* LCOV_EXCL_LINE */
1030 } /* LCOV_EXCL_LINE */
1034 int bt_adapter_stop_device_discovery(void)
1036 int error_code = BT_ERROR_NONE;
1038 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
1039 BT_CHECK_INIT_STATUS();
1040 error_code = _bt_get_error_code(bluetooth_cancel_discovery());
1041 if (error_code != BT_ERROR_NONE) { /* LCOV_EXCL_LINE */
1042 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code),
1043 error_code); /* LCOV_EXCL_LINE */
1044 } /* LCOV_EXCL_LINE */
1048 int bt_adapter_is_discovering(bool *is_discovering)
1052 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
1053 BT_CHECK_INIT_STATUS();
1054 BT_CHECK_INPUT_PARAMETER(is_discovering);
1056 ret = bluetooth_is_discovering();
1057 if (ret >= BLUETOOTH_ERROR_BASE) {
1058 *is_discovering = (ret == 1) ? true : false;
1059 return BT_ERROR_NONE;
1061 ret = _bt_get_error_code(ret); /* LCOV_EXCL_LINE */
1062 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret),
1063 ret); /* LCOV_EXCL_LINE */
1064 return ret; /* LCOV_EXCL_LINE */
1068 /* LCOV_EXCL_START */
1069 int bt_adapter_le_is_discovering(bool *is_discovering)
1073 BT_CHECK_LE_SUPPORT();
1074 BT_CHECK_INIT_STATUS();
1075 BT_CHECK_INPUT_PARAMETER(is_discovering);
1077 ret = bluetooth_is_le_discovering();
1078 if (ret >= BLUETOOTH_ERROR_BASE) {
1079 *is_discovering = (ret == 1) ? true : false;
1080 return BT_ERROR_NONE;
1082 ret = _bt_get_error_code(ret); /* LCOV_EXCL_LINE */
1083 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret),
1084 ret); /* LCOV_EXCL_LINE */
1085 return ret; /* LCOV_EXCL_LINE */
1088 /* LCOV_EXCL_STOP */
1090 int bt_adapter_get_local_oob_data(unsigned char **hash,
1091 unsigned char **randomizer,
1092 int *hash_len, int *randomizer_len)
1094 int ret = BT_ERROR_NONE;
1096 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_OOB);
1097 BT_CHECK_INIT_STATUS();
1098 BT_CHECK_INPUT_PARAMETER(hash);
1099 BT_CHECK_INPUT_PARAMETER(randomizer);
1100 BT_CHECK_INPUT_PARAMETER(hash_len);
1101 BT_CHECK_INPUT_PARAMETER(randomizer_len);
1103 bt_oob_data_t oob_data;
1105 ret = _bt_get_error_code(bluetooth_oob_read_local_data(&oob_data));
1106 if (BT_ERROR_NONE == ret) {
1107 if (oob_data.hash_len > BLUETOOTH_OOB_DATA_LENGTH)
1108 oob_data.hash_len = BLUETOOTH_OOB_DATA_LENGTH;
1110 if (oob_data.randomizer_len > BLUETOOTH_OOB_DATA_LENGTH)
1111 oob_data.randomizer_len = BLUETOOTH_OOB_DATA_LENGTH;
1113 *hash = g_memdup(oob_data.hash, oob_data.hash_len);
1114 *randomizer = g_memdup(oob_data.randomizer,
1115 oob_data.randomizer_len);
1116 *hash_len = oob_data.hash_len;
1117 *randomizer_len = oob_data.randomizer_len;
1119 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret),
1120 ret); /* LCOV_EXCL_LINE */
1125 int bt_adapter_set_remote_oob_data(const char *remote_address,
1126 unsigned char *hash, unsigned char *randomizer,
1127 int hash_len, int randomizer_len)
1129 int ret = BT_ERROR_NONE;
1130 bluetooth_device_address_t addr_hex = { {0,} };
1131 bt_oob_data_t oob_data = { {0},};
1134 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_OOB);
1135 BT_CHECK_INIT_STATUS();
1136 BT_CHECK_INPUT_PARAMETER(remote_address); /* LCOV_EXCL_START */
1138 _bt_convert_address_to_hex(&addr_hex, remote_address);
1140 if (hash && randomizer) {
1141 len = hash_len < BLUETOOTH_OOB_DATA_LENGTH ?
1142 hash_len : BLUETOOTH_OOB_DATA_LENGTH;
1143 memcpy(oob_data.hash, hash, len);
1144 oob_data.hash_len = len;
1146 len = randomizer_len < BLUETOOTH_OOB_DATA_LENGTH ?
1147 randomizer_len : BLUETOOTH_OOB_DATA_LENGTH;
1148 memcpy(oob_data.randomizer, randomizer, len);
1149 oob_data.randomizer_len = len;
1151 return BT_ERROR_INVALID_PARAMETER;
1154 ret = _bt_get_error_code(bluetooth_oob_add_remote_data(&addr_hex,
1155 BLUETOOTH_BDADDR_BREDR,
1157 if (BT_ERROR_NONE != ret) {
1158 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret),
1161 return ret; /* LCOV_EXCL_STOP */
1164 int bt_adapter_get_local_oob_ext_data(unsigned char **hash192, unsigned char **randomizer192,
1165 int *hash192_len, int *randomizer192_len,
1166 unsigned char **hash256, unsigned char **randomizer256,
1167 int *hash256_len, int *randomizer256_len)
1169 int ret = BT_ERROR_NONE;
1171 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_OOB);
1172 BT_CHECK_INIT_STATUS();
1173 BT_CHECK_INPUT_PARAMETER(hash192);
1174 BT_CHECK_INPUT_PARAMETER(randomizer192);
1175 BT_CHECK_INPUT_PARAMETER(hash192_len);
1176 BT_CHECK_INPUT_PARAMETER(randomizer192_len);
1177 BT_CHECK_INPUT_PARAMETER(hash256);
1178 BT_CHECK_INPUT_PARAMETER(randomizer256);
1179 BT_CHECK_INPUT_PARAMETER(hash256_len);
1180 BT_CHECK_INPUT_PARAMETER(randomizer256_len);
1182 bt_oob_data_t oob_data;
1184 ret = _bt_get_error_code(bluetooth_oob_read_local_data(&oob_data));
1185 if (BT_ERROR_NONE == ret) {
1186 *hash192 = *randomizer192 = NULL;
1187 *hash192_len = *randomizer192_len = 0;
1189 *hash256 = *randomizer256 = NULL;
1190 *hash256_len = *randomizer256_len = 0;
1192 if (oob_data.hash_len && oob_data.randomizer_len) {
1193 *hash192 = g_memdup(oob_data.hash, oob_data.hash_len);
1194 *randomizer192 = g_memdup(oob_data.randomizer,
1195 oob_data.randomizer_len);
1197 *hash192_len = oob_data.hash_len;
1198 *randomizer192_len = oob_data.randomizer_len;
1201 if (oob_data.hash256_len && oob_data.randomizer256_len) {
1202 *hash256 = g_memdup(oob_data.hash256, oob_data.hash256_len);
1203 *randomizer256 = g_memdup(oob_data.randomizer256,
1204 oob_data.randomizer256_len);
1206 *hash256_len = oob_data.hash256_len;
1207 *randomizer256_len = oob_data.randomizer256_len;
1210 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
1216 int bt_adapter_set_remote_oob_ext_data(const char *remote_address,
1217 const unsigned char *hash192, const unsigned char *randomizer192,
1218 int hash192_len, int randomizer192_len,
1219 const unsigned char *hash256, const unsigned char *randomizer256,
1220 int hash256_len, int randomizer256_len)
1222 int ret = BT_ERROR_NONE;
1223 bluetooth_device_address_t addr_hex = { {0,} };
1224 bt_oob_data_t oob_data = { {0},};
1227 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_OOB);
1228 BT_CHECK_INIT_STATUS();
1229 BT_CHECK_INPUT_PARAMETER(remote_address);
1231 /* LCOV_EXCL_START */
1232 if ((!hash192 || !randomizer192) && (!hash256 || !randomizer256))
1233 return BT_ERROR_INVALID_PARAMETER;
1235 _bt_convert_address_to_hex(&addr_hex, remote_address);
1237 if (hash192 && randomizer192) {
1238 len = hash192_len < BLUETOOTH_OOB_DATA_LENGTH ?
1239 hash192_len : BLUETOOTH_OOB_DATA_LENGTH;
1240 memcpy(oob_data.hash, hash192, len);
1241 oob_data.hash_len = len;
1243 len = randomizer192_len < BLUETOOTH_OOB_DATA_LENGTH ?
1244 randomizer192_len : BLUETOOTH_OOB_DATA_LENGTH;
1245 memcpy(oob_data.randomizer, randomizer192, len);
1246 oob_data.randomizer_len = len;
1249 if (hash256 && randomizer256) {
1250 len = hash256_len < BLUETOOTH_OOB_DATA_LENGTH ?
1251 hash256_len : BLUETOOTH_OOB_DATA_LENGTH;
1252 memcpy(oob_data.hash256, hash256, len);
1253 oob_data.hash256_len = len;
1255 len = randomizer256_len < BLUETOOTH_OOB_DATA_LENGTH ?
1256 randomizer256_len : BLUETOOTH_OOB_DATA_LENGTH;
1257 memcpy(oob_data.randomizer256, randomizer256, len);
1258 oob_data.randomizer256_len = len;
1261 ret = _bt_get_error_code(bluetooth_oob_add_remote_data(&addr_hex,
1262 BLUETOOTH_BDADDR_BREDR, &oob_data));
1263 if (BT_ERROR_NONE != ret)
1264 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
1266 return ret; /* LCOV_EXCL_STOP */
1269 /* LCOV_EXCL_START */
1270 int bt_adapter_le_get_local_oob_ext_data(char **local_address, bt_device_address_type_e *address_type,
1271 unsigned char **confirmation, unsigned char **random,
1272 int *confirmation_len, int *random_len)
1274 int ret = BT_ERROR_NONE;
1275 unsigned char *eir_data = NULL;
1276 unsigned char *field_data = NULL;
1279 bt_oob_data_t oob_data;
1281 #define EIR_FLAGS 0x01
1282 #define EIR_LE_BDADDR 0x1B
1283 #define EIR_LE_ROLE 0x1C
1284 #define EIR_LE_SC_CONFIRM 0x22
1285 #define EIR_LE_SC_RANDOM 0x23
1287 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_OOB);
1288 BT_CHECK_INIT_STATUS();
1289 BT_CHECK_INPUT_PARAMETER(local_address);
1290 BT_CHECK_INPUT_PARAMETER(address_type);
1291 BT_CHECK_INPUT_PARAMETER(confirmation);
1292 BT_CHECK_INPUT_PARAMETER(random);
1293 BT_CHECK_INPUT_PARAMETER(confirmation_len);
1294 BT_CHECK_INPUT_PARAMETER(random_len);
1297 ret = _bt_get_error_code(bluetooth_le_oob_read_local_data(&oob_data));
1298 if (BT_ERROR_NONE == ret) {
1299 eir_data = oob_data.eir;
1300 eir_len = oob_data.eir_len;
1302 while (eir_len > 1) {
1303 BT_DBG("eir_data [%02x %02x ...]", eir_data[0], eir_data[1]);
1304 field_len = eir_data[0];
1305 if (eir_data[1] == EIR_LE_BDADDR || eir_data[1] == EIR_LE_SC_CONFIRM || eir_data[1] == EIR_LE_SC_RANDOM) {
1306 field_data = g_malloc0(sizeof(char) * field_len - 1);
1307 memcpy(field_data, &eir_data[2], field_len - 1);
1309 if (eir_data[1] == EIR_LE_BDADDR) {
1310 char address[18] = { 0, };
1311 snprintf(address, 18, "%02X:%02X:%02X:%02X:%02X:%02X",
1312 field_data[5], field_data[4], field_data[3], field_data[2], field_data[1], field_data[0]);
1313 *local_address = strdup(address);
1314 *address_type = field_data[6];
1316 } else if (eir_data[1] == EIR_LE_SC_CONFIRM) {
1317 *confirmation = field_data;
1318 *confirmation_len = field_len - 1;
1319 } else if (eir_data[1] == EIR_LE_SC_RANDOM) {
1320 *random = field_data;
1321 *random_len = field_len - 1;
1325 eir_len = eir_len - field_len - 1;
1326 eir_data += field_len + 1;
1329 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
1334 /* LCOV_EXCL_STOP */
1336 /* LCOV_EXCL_START */
1337 int bt_adapter_le_set_remote_oob_ext_data(const char *remote_address,
1338 bt_device_address_type_e address_type,
1339 const unsigned char *hash256, const unsigned char *randomizer256,
1340 int hash256_len, int randomizer256_len)
1342 int ret = BT_ERROR_NONE;
1343 bluetooth_device_address_t addr_hex = { {0,} };
1344 bt_oob_data_t oob_data = { {0},};
1345 bluetooth_bdaddr_type_e addr_type = BLUETOOTH_BDADDR_LE_PUBLIC;
1348 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_OOB);
1349 BT_CHECK_INIT_STATUS();
1350 BT_CHECK_INPUT_PARAMETER(remote_address);
1352 if (!hash256 || !randomizer256)
1353 return BT_ERROR_INVALID_PARAMETER;
1355 _bt_convert_address_to_hex(&addr_hex, remote_address);
1357 if (hash256 && randomizer256) {
1358 len = hash256_len < BLUETOOTH_OOB_DATA_LENGTH ?
1359 hash256_len : BLUETOOTH_OOB_DATA_LENGTH;
1360 memcpy(oob_data.hash256, hash256, len);
1361 oob_data.hash256_len = len;
1363 len = randomizer256_len < BLUETOOTH_OOB_DATA_LENGTH ?
1364 randomizer256_len : BLUETOOTH_OOB_DATA_LENGTH;
1365 memcpy(oob_data.randomizer256, randomizer256, len);
1366 oob_data.randomizer256_len = len;
1369 addr_type = (address_type == BT_DEVICE_PUBLIC_ADDRESS) ?
1370 BLUETOOTH_BDADDR_LE_PUBLIC : BLUETOOTH_BDADDR_LE_RANDOM;
1372 ret = _bt_get_error_code(bluetooth_le_oob_add_remote_data(&addr_hex,
1373 addr_type, &oob_data));
1374 if (BT_ERROR_NONE != ret)
1375 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
1379 /* LCOV_EXCL_STOP */
1381 int bt_adapter_remove_remote_oob_data(const char *remote_address)
1383 int ret = BT_ERROR_NONE;
1384 bluetooth_device_address_t addr_hex = { {0,} };
1386 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_OOB);
1387 BT_CHECK_INIT_STATUS();
1388 BT_CHECK_INPUT_PARAMETER(remote_address);
1390 _bt_convert_address_to_hex(&addr_hex,
1391 remote_address); /* LCOV_EXCL_LINE */
1393 ret = _bt_get_error_code(bluetooth_oob_remove_remote_data(
1394 &addr_hex)); /* LCOV_EXCL_LINE */
1395 if (BT_ERROR_NONE != ret) { /* LCOV_EXCL_LINE */
1396 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret),
1397 ret); /* LCOV_EXCL_LINE */
1398 } /* LCOV_EXCL_LINE */
1399 return ret; /* LCOV_EXCL_LINE */
1402 /* LCOV_EXCL_START */
1403 int bt_adapter_set_manufacturer_data(char *data, int len)
1407 bluetooth_manufacturer_data_t m_data = { 0 };
1409 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
1410 BT_CHECK_INIT_STATUS();
1411 BT_CHECK_INPUT_PARAMETER(data);
1413 if (len + 2 > sizeof(m_data.data) || len < 0)
1414 return BT_ERROR_INVALID_PARAMETER;
1416 m_data.data_len = len;
1417 m_data.data[0] = len + 1;
1418 m_data.data[1] = 0xFF;
1420 memcpy(&m_data.data[2], data, len);
1422 ret = _bt_get_error_code(bluetooth_set_manufacturer_data(&m_data));
1423 if (ret != BT_ERROR_NONE) {
1424 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret),
1431 int bt_adapter_parse_manufacturer_data(bt_manufacturer_data *data, char *manufacturer_data, int manufacturer_data_len)
1434 int cursor, name_len;
1436 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
1437 BT_CHECK_INIT_STATUS();
1438 BT_CHECK_INPUT_PARAMETER(data);
1439 BT_CHECK_INPUT_PARAMETER(manufacturer_data);
1441 if (manufacturer_data_len < 30) {
1442 BT_ERR("minimum Size of the smasung specific manufacturer data is greater than 30 ");
1443 return BT_ERROR_INVALID_PARAMETER;
1445 if (manufacturer_data[0] != 0x00 || manufacturer_data[1] != 0x75) {
1446 BT_ERR("This is not a samsung specific manufaturer data");
1447 return BT_ERROR_INVALID_PARAMETER;
1452 /* control and version */
1453 data->version = manufacturer_data[cursor++];
1456 data->service_id = manufacturer_data[cursor++];
1458 /* Samsung discovery version */
1459 data->discovery_version = manufacturer_data[cursor++];
1461 /* associated service ID */
1462 data->associated_service_id = manufacturer_data[cursor++];
1464 /* Proxamity and locality */
1466 data->proximity_locality_type = manufacturer_data[cursor++];
1469 data->proximity_locality_info = manufacturer_data[cursor++];
1473 data->device_type = manufacturer_data[cursor++];
1476 data->device_icon = manufacturer_data[cursor++];
1478 /* Authentication info */
1479 memcpy(data->auth_info, &(manufacturer_data[cursor]), 5);
1480 cursor = cursor + 5;
1484 data->addr_type = manufacturer_data[cursor++];
1487 memcpy(data->addr1, &(manufacturer_data[cursor]), 6);
1488 cursor = cursor + 6;
1491 memcpy(data->addr2, &(manufacturer_data[cursor]), 6);
1492 cursor = cursor + 6;
1495 data->channel_info = manufacturer_data[cursor++];
1498 /* Associated service data */
1499 data->associated_service_data_len = manufacturer_data[cursor++];
1500 if (data->associated_service_data_len) {
1501 data->associated_service_data_val = g_malloc0(data->associated_service_data_len);
1502 memcpy(data->associated_service_data_val, &(manufacturer_data[cursor]),
1503 data->associated_service_data_len);
1505 cursor = cursor + data->associated_service_data_len;
1508 /* name : include the null termination */
1509 name_len = manufacturer_data_len - cursor;
1511 data->name = g_malloc0(name_len + 1);
1512 memcpy(data->name, &(manufacturer_data[cursor]), name_len);
1513 data->name[name_len] = '\0';
1515 return BT_ERROR_NONE;
1518 int bt_adapter_free_manufacturer_data(bt_manufacturer_data *data)
1520 BT_CHECK_INPUT_PARAMETER(data);
1521 g_free(data->associated_service_data_val);
1523 return BT_ERROR_NONE;
1526 int bt_adapter_set_manufacturer_data_changed_cb(
1527 bt_adapter_manufacturer_data_changed_cb callback,
1530 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
1531 BT_CHECK_INIT_STATUS();
1532 BT_CHECK_INPUT_PARAMETER(callback);
1534 _bt_set_cb(BT_EVENT_MANUFACTURER_DATA_CHANGED,
1535 callback, user_data);
1537 return BT_ERROR_NONE;
1540 int bt_adapter_unset_manufacturer_data_changed_cb(void)
1542 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
1543 BT_CHECK_INIT_STATUS();
1544 _bt_unset_cb(BT_EVENT_MANUFACTURER_DATA_CHANGED);
1545 return BT_ERROR_NONE;
1548 int bt_adapter_set_passkey_notification(
1549 bt_adapter_passkey_notification_cb callback, void *user_data)
1551 int ret = BT_ERROR_NONE;
1553 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
1554 BT_CHECK_INIT_STATUS();
1555 BT_CHECK_INPUT_PARAMETER(callback);
1557 ret = _bt_get_error_code(bluetooth_set_passkey_notification(TRUE));
1558 if (ret == BT_ERROR_NONE) {
1559 _bt_set_cb(BT_EVENT_PASSKEY_NOTIFICATION_EVENT,
1560 callback, user_data);
1562 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
1568 int bt_adapter_unset_passkey_notification(void)
1570 int ret = BT_ERROR_NONE;
1572 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
1573 BT_CHECK_INIT_STATUS();
1575 ret = _bt_get_error_code(bluetooth_set_passkey_notification(FALSE));
1576 if (ret != BT_ERROR_NONE)
1577 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
1579 _bt_unset_cb(BT_EVENT_PASSKEY_NOTIFICATION_EVENT);
1584 int bt_adapter_le_add_white_list(const char *address,
1585 bt_device_address_type_e address_type)
1587 int error_code = BT_ERROR_NONE;
1588 bluetooth_device_address_t addr_hex = { {0,} };
1590 BT_CHECK_LE_SUPPORT();
1591 BT_CHECK_INIT_STATUS();
1592 BT_CHECK_INPUT_PARAMETER(address);
1593 _bt_convert_address_to_hex(&addr_hex, address);
1595 error_code = _bt_get_error_code(bluetooth_add_white_list(&addr_hex,
1597 if (error_code != BT_ERROR_NONE) { /* LCOV_EXCL_LINE */
1598 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code),
1599 error_code); /* LCOV_EXCL_LINE */
1600 } /* LCOV_EXCL_LINE */
1605 int bt_adapter_le_remove_white_list(const char *address, bt_device_address_type_e address_type)
1607 int error_code = BT_ERROR_NONE;
1608 bluetooth_device_address_t addr_hex = { {0,} };
1610 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
1611 BT_CHECK_INIT_STATUS();
1612 BT_CHECK_INPUT_PARAMETER(address);
1613 _bt_convert_address_to_hex(&addr_hex, address);
1615 error_code = _bt_get_error_code(bluetooth_remove_white_list(&addr_hex,
1617 if (error_code != BT_ERROR_NONE) { /* LCOV_EXCL_LINE */
1618 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code),
1619 error_code); /* LCOV_EXCL_LINE */
1620 } /* LCOV_EXCL_LINE */
1624 /* LCOV_EXCL_STOP */
1626 int bt_adapter_le_set_scan_mode(bt_adapter_le_scan_mode_e scan_mode)
1628 int ret = BT_ERROR_NONE;
1629 bluetooth_le_scan_params_t scan_params;
1631 BT_CHECK_LE_SUPPORT();
1632 BT_CHECK_INIT_STATUS();
1634 scan_params.type = BT_ADAPTER_LE_ACTIVE_SCAN;
1636 if (scan_mode == BT_ADAPTER_LE_SCAN_MODE_BALANCED) {
1637 scan_params.interval = 5000;
1638 scan_params.window = 2000;
1639 } else if (scan_mode == BT_ADAPTER_LE_SCAN_MODE_LOW_LATENCY) {
1640 scan_params.interval = 5000;
1641 scan_params.window = 5000;
1642 } else if (scan_mode == BT_ADAPTER_LE_SCAN_MODE_LOW_ENERGY) {
1643 scan_params.interval = 5000;
1644 scan_params.window = 500;
1646 return BT_ERROR_INVALID_PARAMETER;
1648 ret = _bt_get_error_code(bluetooth_set_scan_parameters(&scan_params));
1649 if (ret != BT_ERROR_NONE) { /* LCOV_EXCL_LINE */
1650 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret),
1651 ret); /* LCOV_EXCL_LINE */
1652 } /* LCOV_EXCL_LINE */
1656 /* LCOV_EXCL_START */
1657 int bt_adapter_le_set_scan_type(bt_adapter_le_scan_type_e scan_type)
1659 int ret = BT_ERROR_NONE;
1661 BT_CHECK_LE_SUPPORT();
1662 BT_CHECK_INIT_STATUS();
1664 ret = _bt_get_error_code(bluetooth_set_scan_type(scan_type));
1665 if (ret != BT_ERROR_NONE) { /* LCOV_EXCL_LINE */
1666 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret),
1667 ret); /* LCOV_EXCL_LINE */
1668 } /* LCOV_EXCL_LINE */
1671 /* LCOV_EXCL_STOP */
1673 /* LCOV_EXCL_START */
1674 int bt_adapter_le_set_customized_scan_mode(float scan_interval, float scan_window)
1676 int ret = BT_ERROR_NONE;
1677 bluetooth_le_scan_params_t scan_params;
1679 BT_CHECK_INIT_STATUS();
1681 scan_params.type = BT_ADAPTER_LE_ACTIVE_SCAN;
1682 scan_params.interval = scan_interval;
1683 scan_params.window = scan_window;
1685 ret = _bt_get_error_code(bluetooth_set_scan_parameters(&scan_params));
1686 if (ret != BT_ERROR_NONE)
1687 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
1691 /* LCOV_EXCL_STOP */
1693 int bt_adapter_le_create_advertiser(bt_advertiser_h *advertiser)
1695 bt_advertiser_s *__adv = NULL;
1697 BT_CHECK_LE_SUPPORT();
1698 BT_CHECK_INIT_STATUS();
1699 BT_CHECK_INPUT_PARAMETER(advertiser);
1701 __adv = (bt_advertiser_s *)g_malloc0(sizeof(bt_advertiser_s));
1702 __adv->handle = GPOINTER_TO_INT(__adv);
1704 *advertiser = (bt_advertiser_h)__adv;
1706 advertiser_list = g_slist_append(advertiser_list, __adv);
1708 return BT_ERROR_NONE;
1711 int bt_adapter_le_destroy_advertiser(bt_advertiser_h advertiser)
1713 int ret = BT_ERROR_NONE;
1715 gboolean is_advertising = FALSE;
1717 bt_advertiser_s *__adv = (bt_advertiser_s *)advertiser;
1719 BT_CHECK_LE_SUPPORT();
1720 BT_CHECK_INIT_STATUS();
1721 BT_CHECK_INPUT_PARAMETER(advertiser);
1723 _bt_unset_cb(BT_EVENT_ADVERTISING_STATE_CHANGED);
1725 /* This operation is not related to the result */
1726 error_code = bluetooth_is_advertising(&is_advertising);
1728 if (is_advertising == TRUE) {
1729 error_code = bluetooth_set_advertising(__adv->handle, FALSE);
1731 ret = _bt_get_error_code(error_code);
1733 if (ret != BT_ERROR_NONE) {
1734 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret),
1735 ret); /* LCOV_EXCL_LINE */
1737 if (ret == BT_ERROR_NOT_IN_PROGRESS) {
1738 /* Other advertising handle is in there */
1739 ret = BT_ERROR_NONE;
1741 #ifdef TIZEN_FEATURE_TCT_TMP_SUPPORT
1742 if (ret == BT_ERROR_NOT_SUPPORTED)
1743 ret = BT_ERROR_NONE;
1748 advertiser_list = g_slist_remove(advertiser_list, __adv);
1750 /* Free advertising data */
1751 g_free(__adv->adv_data);
1752 g_free(__adv->scan_rsp_data);
1758 /* LCOV_EXCL_START */
1759 static int __bt_remove_ad_data_by_type(char *in_data, unsigned int in_len,
1760 char in_type, char **data, unsigned int *data_len)
1762 if (in_data == NULL || data == NULL || data_len == NULL)
1763 return BT_ERROR_OPERATION_FAILED;
1770 for (i = 0; i < in_len; i++) {
1772 if (len <= 0 || i + 1 >= in_len) {
1773 BT_ERR("Invalid advertising data");
1774 return BT_ERROR_OPERATION_FAILED;
1777 type = in_data[i + 1];
1778 if (type == in_type) {
1788 if (i + len > in_len) {
1789 BT_ERR("Invalid advertising data");
1790 return BT_ERROR_OPERATION_FAILED;
1791 } else if (len == 0) {
1792 BT_INFO("AD Type 0x%02x data is not set", in_type);
1793 return BT_ERROR_OPERATION_FAILED;
1796 p = (char *)malloc(sizeof(char) *(in_len - len));
1798 return BT_ERROR_OUT_OF_MEMORY;
1800 memcpy(p, in_data, sizeof(char) *i);
1801 memcpy(p + i, in_data + i + len, sizeof(char) *(in_len - len - i));
1804 *data_len = in_len - len;
1806 return BT_ERROR_NONE;
1808 /* LCOV_EXCL_STOP */
1810 static int bt_adapter_le_add_advertising_data(bt_advertiser_h advertiser,
1811 bt_adapter_le_packet_type_e pkt_type,
1812 bt_adapter_le_advertising_data_type_e data_type,
1813 void *data, unsigned int data_size)
1815 bt_advertiser_s *__adv = (bt_advertiser_s *)advertiser;
1818 unsigned int *system_data_len;
1820 int adv_flag_len = 0;
1821 int adv_ext_len = 0;
1823 BT_CHECK_LE_SUPPORT();
1824 BT_CHECK_INIT_STATUS();
1825 if ((data == NULL || data_size == 0) &&
1826 (data_type != BT_ADAPTER_LE_ADVERTISING_DATA_LOCAL_NAME &&
1827 data_type != BT_ADAPTER_LE_ADVERTISING_DATA_TX_POWER_LEVEL)) {
1828 BT_ERR("empty data for packet type %d",
1829 pkt_type); /* LCOV_EXCL_LINE */
1830 return BT_ERROR_INVALID_PARAMETER; /* LCOV_EXCL_LINE */
1833 BT_CHECK_INPUT_PARAMETER(advertiser);
1835 if (pkt_type == BT_ADAPTER_LE_PACKET_ADVERTISING) {
1836 p = &__adv->adv_data;
1837 len = &__adv->adv_data_len;
1838 system_data_len = &__adv->adv_system_data_len;
1840 } else if (pkt_type == BT_ADAPTER_LE_PACKET_SCAN_RESPONSE) {
1841 p = &__adv->scan_rsp_data;
1842 len = &__adv->scan_rsp_data_len;
1843 system_data_len = &__adv->scan_rsp_system_data_len;
1845 return BT_ERROR_INVALID_PARAMETER;
1847 if (data_type == BT_ADAPTER_LE_ADVERTISING_DATA_LOCAL_NAME ||
1848 data_type == BT_ADAPTER_LE_ADVERTISING_DATA_TX_POWER_LEVEL)
1849 adv_ext_len = *system_data_len + 1;
1851 /* 2 bytes are required for Length and AD Type */
1852 if (adv_flag_len + *len + adv_ext_len + data_size + 2 > 31) {
1853 BT_ERR("Quota exceeded"); /* LCOV_EXCL_LINE */
1854 return BT_ERROR_QUOTA_EXCEEDED; /* LCOV_EXCL_LINE */
1860 new_p = realloc(*p, sizeof(char) *(*len + data_size + 2));
1862 return BT_ERROR_OUT_OF_MEMORY;
1864 new_p[*len] = data_size + 1;
1865 new_p[*len + 1] = data_type;
1866 if ((data != NULL) && (data_size != 0))
1867 memcpy(new_p + (*len + 2), data, data_size);
1870 *len += data_size + 2;
1872 if (data_type == BT_ADAPTER_LE_ADVERTISING_DATA_LOCAL_NAME ||
1873 data_type == BT_ADAPTER_LE_ADVERTISING_DATA_TX_POWER_LEVEL)
1874 *system_data_len += 1;
1876 return BT_ERROR_NONE;
1879 /* LCOV_EXCL_START */
1880 static int bt_adapter_le_remove_advertising_data(bt_advertiser_h advertiser,
1881 bt_adapter_le_packet_type_e pkt_type,
1882 bt_adapter_le_advertising_data_type_e data_type)
1884 int ret = BT_ERROR_NONE;
1885 bt_advertiser_s *__adv = (bt_advertiser_s *)advertiser;
1888 unsigned int *system_data_len;
1890 unsigned int new_len = 0;
1892 BT_CHECK_LE_SUPPORT();
1893 BT_CHECK_INIT_STATUS();
1894 BT_CHECK_INPUT_PARAMETER(advertiser);
1897 case BT_ADAPTER_LE_PACKET_ADVERTISING:
1898 p = &__adv->adv_data;
1899 len = &__adv->adv_data_len;
1900 system_data_len = &__adv->adv_system_data_len;
1903 case BT_ADAPTER_LE_PACKET_SCAN_RESPONSE:
1904 p = &__adv->scan_rsp_data;
1905 len = &__adv->scan_rsp_data_len;
1906 system_data_len = &__adv->scan_rsp_system_data_len;
1910 BT_ERR("Unknown LE packet type : %d",
1912 return BT_ERROR_INVALID_PARAMETER;
1915 ret = __bt_remove_ad_data_by_type(*p, *len, data_type, &new_p, &new_len);
1916 if (ret != BT_ERROR_NONE)
1923 if (data_type == BT_ADAPTER_LE_ADVERTISING_DATA_LOCAL_NAME ||
1924 data_type == BT_ADAPTER_LE_ADVERTISING_DATA_TX_POWER_LEVEL)
1925 *system_data_len -= 1;
1929 /* LCOV_EXCL_STOP */
1931 static int __bt_convert_string_to_uuid(const char *string,
1932 char **uuid, int *bit)
1936 if (strlen(string) == 4) { /* 16 bit uuid */
1938 data = g_malloc0(sizeof(char) * 2);
1940 val = (unsigned short)strtoul(string, NULL, 16);
1942 memcpy(data, &val, 2);
1944 *bit = 16; /* LCOV_EXCL_START */
1945 } else if (strlen(string) == 36) { /* 128 bit uuid */
1946 if (string[8] != '-' || string[13] != '-' ||
1947 string[18] != '-' || string[23] != '-') {
1948 BT_ERR("Invalid UUID");
1949 return BT_ERROR_INVALID_PARAMETER;
1952 char str_ptr[37] = { 0 };
1957 unsigned int val0, val4;
1958 unsigned short val1, val2, val3, val5;
1959 data = g_malloc0(sizeof(char) * 16);
1961 /* UUID format : %08x-%04hx-%04hx-%04hx-%08x%04hx */
1962 strncpy(str_ptr, string, 36);
1964 ptr[idx++] = strtok_r(str_ptr, "-", &next_ptr);
1965 while ((ptr[idx++] = strtok_r(NULL, "-", &next_ptr)) != NULL) {
1966 BT_INFO("ptr : %s", ptr[idx - 1]);
1971 /* ptr[4] contain "08x" and "04hx" */
1972 ptr[5] = g_malloc0(sizeof(char) * 8);
1973 ptr[6] = g_malloc0(sizeof(char) * 4);
1974 strncpy(ptr[5], ptr[4], 8);
1975 strncpy(ptr[6], ptr[4] + 8, 4);
1977 val0 = (unsigned int)strtoul(ptr[0], NULL, 16);
1978 val1 = (unsigned short)strtoul(ptr[1], NULL, 16);
1979 val2 = (unsigned short)strtoul(ptr[2], NULL, 16);
1980 val3 = (unsigned short)strtoul(ptr[3], NULL, 16);
1981 val4 = (unsigned int)strtoul(ptr[5], NULL, 16);
1982 val5 = (unsigned short)strtoul(ptr[6], NULL, 16);
1991 BT_INFO("%x, %x, %x, %x, %x, %x", val0, val1, val2, val3, val4, val5);
1993 memcpy(data, &val0, 4);
1994 memcpy(data + 4, &val1, 2);
1995 memcpy(data + 6, &val2, 2);
1996 memcpy(data + 8, &val3, 2);
1997 memcpy(data + 10, &val4, 4);
1998 memcpy(data + 14, &val5, 2);
2006 BT_ERR("Invalid UUID");
2007 return BT_ERROR_INVALID_PARAMETER;
2010 return BT_ERROR_NONE; /* LCOV_EXCL_STOP */
2013 static int __bt_convert_byte_ordering(char *data, int data_len,
2014 char **converted_data)
2019 /* Convert to little endian */
2020 swp = g_malloc0(data_len);
2021 for (i = 0, j = data_len - 1; i < data_len; i++, j--)
2024 *converted_data = swp;
2026 return BT_ERROR_NONE;
2029 static int __bt_find_adv_data_type(bt_advertiser_h advertiser,
2030 bt_adapter_le_packet_type_e pkt_type,
2031 bt_adapter_le_advertising_data_type_e data_type,
2032 char **data_ptr, int *data_len)
2037 char *adv_data = NULL;
2039 bt_advertiser_s *__adv = (bt_advertiser_s *)advertiser;
2041 if (pkt_type == BT_ADAPTER_LE_PACKET_ADVERTISING) {
2042 adv_data = __adv->adv_data;
2043 adv_len = __adv->adv_data_len;
2044 } else if (pkt_type == BT_ADAPTER_LE_PACKET_SCAN_RESPONSE) {
2045 adv_data = __adv->scan_rsp_data;
2046 adv_len = __adv->scan_rsp_data_len;
2048 return BT_ERROR_INVALID_PARAMETER;
2051 return BT_ERROR_OPERATION_FAILED;
2053 for (i = 0; i < adv_len ; i++) { /* LCOV_EXCL_START */
2055 type = adv_data[i + 1];
2057 if (type == data_type) {
2058 *data_ptr = &adv_data[i];
2060 return BT_ERROR_NONE;
2062 i = i + adv_data[i]; /* LCOV_EXCL_STOP */
2066 return BT_ERROR_NONE;
2070 /* LCOV_EXCL_START */
2071 static int __bt_append_adv_type_data(bt_advertiser_h advertiser,
2072 bt_adapter_le_packet_type_e pkt_type,
2073 char *new_data, int new_data_len,
2074 bt_adapter_le_advertising_data_type_e data_type,
2075 char *data_ptr, int data_len)
2081 char *new_adv = NULL;
2082 char *adv_data = NULL;
2084 int adv_flag_len = 0;
2085 int system_data_len = 0;
2086 bt_advertiser_s *__adv = (bt_advertiser_s *)advertiser;
2088 if (pkt_type == BT_ADAPTER_LE_PACKET_ADVERTISING) {
2089 adv_data = __adv->adv_data;
2090 adv_len = __adv->adv_data_len;
2091 system_data_len = __adv->adv_system_data_len;
2093 } else if (pkt_type == BT_ADAPTER_LE_PACKET_SCAN_RESPONSE) {
2094 adv_data = __adv->scan_rsp_data;
2095 adv_len = __adv->scan_rsp_data_len;
2096 system_data_len = __adv->scan_rsp_system_data_len;
2098 return BT_ERROR_INVALID_PARAMETER;
2101 return BT_ERROR_OPERATION_FAILED;
2103 dest_type = data_ptr[1];
2105 if (data_type != dest_type) {
2106 BT_ERR("Invalid data type");
2107 return BT_ERROR_INVALID_PARAMETER;
2110 if (adv_flag_len + adv_len + system_data_len + new_data_len > 31) {
2111 BT_ERR("Quota exceeded");
2112 return BT_ERROR_QUOTA_EXCEEDED;
2115 new_adv = g_malloc0(adv_len + new_data_len);
2117 for (i = 0; i < adv_len; i++) {
2119 type = adv_data[i + 1];
2121 if (type == dest_type) {
2124 memcpy(new_adv + i, &adv_data[i], len + 1);
2125 memcpy(new_adv + i + len + 1, new_data, new_data_len);
2126 new_adv[i] += new_data_len;
2128 rest_data_len = adv_len - (i + len + 1);
2129 if (rest_data_len > 0)
2130 memcpy(new_adv + i + len + 1 + new_data_len,
2131 &adv_data[i + len + 1], rest_data_len);
2135 memcpy(new_adv + i, &adv_data[i], len + 1);
2140 if (pkt_type == BT_ADAPTER_LE_PACKET_ADVERTISING) {
2141 g_free(__adv->adv_data);
2142 __adv->adv_data = new_adv;
2143 __adv->adv_data_len += new_data_len;
2144 } else if (pkt_type == BT_ADAPTER_LE_PACKET_SCAN_RESPONSE) {
2145 g_free(__adv->scan_rsp_data);
2146 __adv->scan_rsp_data = new_adv;
2147 __adv->scan_rsp_data_len += new_data_len;
2150 return BT_ERROR_NONE;
2152 /* LCOV_EXCL_STOP */
2154 int bt_adapter_le_add_advertising_service_uuid(bt_advertiser_h advertiser,
2155 bt_adapter_le_packet_type_e pkt_type, const char *uuid)
2157 int ret = BT_ERROR_NONE;
2158 bt_adapter_le_advertising_data_type_e data_type = 0;
2161 char *uuid_ptr = NULL;
2162 char *data_ptr = NULL;
2163 char *converted_uuid = NULL;
2166 BT_CHECK_LE_SUPPORT();
2167 BT_CHECK_INIT_STATUS();
2168 BT_CHECK_INPUT_PARAMETER(advertiser);
2169 BT_CHECK_INPUT_PARAMETER(uuid);
2171 ret = __bt_convert_string_to_uuid(uuid, &uuid_ptr, &uuid_bit);
2172 if (ret != BT_ERROR_NONE)
2175 if (uuid_bit == 16) {
2177 data_type = BT_ADAPTER_LE_ADVERTISING_DATA_INCOMP_LIST_16_BIT_SERVICE_CLASS_UUIDS;
2178 } else if (uuid_bit == 128) { /* LCOV_EXCL_LINE */
2179 byte_len = 16; /* LCOV_EXCL_LINE */
2180 data_type = BT_ADAPTER_LE_ADVERTISING_DATA_INCOMP_LIST_128_BIT_SERVICE_CLASS_UUIDS; /* LCOV_EXCL_LINE */
2183 __bt_convert_byte_ordering(uuid_ptr, byte_len, &converted_uuid);
2186 __bt_find_adv_data_type(advertiser, pkt_type, data_type, &data_ptr, &data_len);
2188 ret = __bt_append_adv_type_data(advertiser, pkt_type,
2189 converted_uuid, byte_len,
2190 data_type, data_ptr,
2191 data_len); /* LCOV_EXCL_LINE */
2193 ret = bt_adapter_le_add_advertising_data(advertiser, pkt_type,
2194 data_type, converted_uuid,
2197 g_free(converted_uuid);
2202 int bt_adapter_le_add_advertising_service_solicitation_uuid(bt_advertiser_h advertiser,
2203 bt_adapter_le_packet_type_e pkt_type, const char *uuid)
2205 int ret = BT_ERROR_NONE;
2206 bt_adapter_le_advertising_data_type_e data_type = 0;
2209 char *uuid_ptr = NULL;
2210 char *data_ptr = NULL;
2211 char *converted_uuid = NULL;
2214 BT_CHECK_LE_SUPPORT();
2215 BT_CHECK_INIT_STATUS();
2216 BT_CHECK_INPUT_PARAMETER(advertiser);
2217 BT_CHECK_INPUT_PARAMETER(uuid);
2219 ret = __bt_convert_string_to_uuid(uuid, &uuid_ptr, &uuid_bit);
2220 if (ret != BT_ERROR_NONE)
2223 if (uuid_bit == 16) {
2225 data_type = BT_ADAPTER_LE_ADVERTISING_DATA_16_BIT_SERVICE_SOLICITATION_UUIDS;
2226 } else if (uuid_bit == 128) { /* LCOV_EXCL_LINE */
2227 byte_len = 16; /* LCOV_EXCL_LINE */
2228 data_type = BT_ADAPTER_LE_ADVERTISING_DATA_128_BIT_SERVICE_SOLICITATION_UUIDS; /* LCOV_EXCL_LINE */
2231 __bt_convert_byte_ordering(uuid_ptr, byte_len, &converted_uuid);
2234 __bt_find_adv_data_type(advertiser, pkt_type, data_type, &data_ptr, &data_len);
2236 ret = __bt_append_adv_type_data(advertiser, pkt_type,
2237 converted_uuid, byte_len,
2238 data_type, data_ptr,
2239 data_len); /* LCOV_EXCL_LINE */
2241 ret = bt_adapter_le_add_advertising_data(advertiser, pkt_type,
2242 data_type, converted_uuid,
2245 g_free(converted_uuid);
2250 static int __bt_find_uuid_in_service_data(bt_advertiser_h advertiser,
2251 bt_adapter_le_packet_type_e pkt_type, char * uuid, bool *exist)
2256 char *adv_data = NULL;
2258 bt_advertiser_s *__adv = (bt_advertiser_s *)advertiser;
2259 bt_adapter_le_advertising_data_type_e data_type = BT_ADAPTER_LE_ADVERTISING_DATA_SERVICE_DATA;
2261 if (pkt_type == BT_ADAPTER_LE_PACKET_ADVERTISING) {
2263 adv_data = __adv->adv_data;
2264 adv_len = __adv->adv_data_len;
2265 } else if (pkt_type == BT_ADAPTER_LE_PACKET_SCAN_RESPONSE) {
2266 adv_data = __adv->scan_rsp_data;
2267 adv_len = __adv->scan_rsp_data_len;
2269 return BT_ERROR_INVALID_PARAMETER;
2272 BT_INFO("Currently there is no advertisement data");
2273 return BT_ERROR_NONE;
2277 while (i < adv_len) {
2279 type = adv_data[i + 1];
2281 if (type == data_type) {
2282 if (!memcmp((adv_data + i + 2), uuid, 2)) {
2283 BT_INFO("uuid matched");
2285 return BT_ERROR_NONE;
2293 return BT_ERROR_NONE;
2296 int bt_adapter_le_add_advertising_service_data(bt_advertiser_h advertiser,
2297 bt_adapter_le_packet_type_e pkt_type, const char *uuid,
2298 const char *service_data, int service_data_len)
2300 int ret = BT_ERROR_NONE;
2301 char *adv_data = NULL;
2305 char *converted_uuid = NULL;
2308 BT_CHECK_LE_SUPPORT();
2309 BT_CHECK_INIT_STATUS();
2310 BT_CHECK_INPUT_PARAMETER(advertiser);
2311 BT_CHECK_INPUT_PARAMETER(service_data);
2313 BT_INFO("Service Data uuid[%s]", uuid);
2314 ret = __bt_convert_string_to_uuid(uuid, &uuid_ptr, &uuid_bit);
2315 if (ret != BT_ERROR_NONE)
2318 if (uuid_bit == 16) {
2320 } else if (uuid_bit == 128) { /* LCOV_EXCL_LINE */
2321 BT_ERR("128 bit UUID is not supported"); /* LCOV_EXCL_LINE */
2322 g_free(uuid_ptr); /* LCOV_EXCL_LINE */
2323 return BT_ERROR_INVALID_PARAMETER; /* LCOV_EXCL_LINE */
2326 __bt_convert_byte_ordering(uuid_ptr, byte_len, &converted_uuid);
2329 ret = __bt_find_uuid_in_service_data(advertiser, pkt_type, converted_uuid, &exist);
2330 if (ret != BT_ERROR_NONE)
2334 BT_INFO("Aleady existed");
2335 return BT_ERROR_ALREADY_DONE;
2338 adv_data = g_malloc0(sizeof(char) *(service_data_len + 2));
2340 memcpy(adv_data, converted_uuid, 2);
2341 memcpy(adv_data + 2, service_data, service_data_len);
2343 ret = bt_adapter_le_add_advertising_data(advertiser,
2344 pkt_type, BT_ADAPTER_LE_ADVERTISING_DATA_SERVICE_DATA,
2345 adv_data, service_data_len + 2);
2348 g_free(converted_uuid);
2353 int bt_adapter_le_set_advertising_appearance(bt_advertiser_h advertiser,
2354 bt_adapter_le_packet_type_e pkt_type, int appearance)
2356 int ret = BT_ERROR_NONE;
2357 char *data_ptr = NULL;
2360 BT_CHECK_LE_SUPPORT();
2361 BT_CHECK_INIT_STATUS();
2362 BT_CHECK_INPUT_PARAMETER(advertiser);
2364 __bt_find_adv_data_type(advertiser, pkt_type, BT_ADAPTER_LE_ADVERTISING_DATA_APPEARANCE,
2365 &data_ptr, &data_len);
2367 BT_ERR("Aleady existed"); /* LCOV_EXCL_LINE */
2368 return BT_ERROR_ALREADY_DONE; /* LCOV_EXCL_LINE */
2371 ret = bt_adapter_le_add_advertising_data(advertiser,
2372 pkt_type, BT_ADAPTER_LE_ADVERTISING_DATA_APPEARANCE, &appearance, 2);
2377 int bt_adapter_le_add_advertising_manufacturer_data(bt_advertiser_h advertiser,
2378 bt_adapter_le_packet_type_e pkt_type, int manufacturer_id,
2379 const char *manufacturer_data, int manufacturer_data_len)
2381 int ret = BT_ERROR_NONE;
2382 char *data_ptr = NULL;
2384 char *adv_data = NULL;
2386 BT_CHECK_LE_SUPPORT();
2387 BT_CHECK_INIT_STATUS();
2388 BT_CHECK_INPUT_PARAMETER(advertiser);
2389 BT_CHECK_INPUT_PARAMETER(manufacturer_data);
2391 __bt_find_adv_data_type(advertiser, pkt_type,
2392 BT_ADAPTER_LE_ADVERTISING_DATA_MANUFACTURER_SPECIFIC_DATA,
2393 &data_ptr, &data_len);
2395 BT_ERR("Aleady existed"); /* LCOV_EXCL_LINE */
2396 return BT_ERROR_ALREADY_DONE; /* LCOV_EXCL_LINE */
2399 adv_data = g_malloc0(sizeof(char) *(manufacturer_data_len + 2));
2401 adv_data[0] = manufacturer_id & 0xffffffff;
2402 adv_data[1] = (manufacturer_id & 0xff00) >> 8;
2403 memcpy(adv_data + 2, manufacturer_data, manufacturer_data_len);
2405 ret = bt_adapter_le_add_advertising_data(advertiser,
2406 pkt_type, BT_ADAPTER_LE_ADVERTISING_DATA_MANUFACTURER_SPECIFIC_DATA,
2407 adv_data, manufacturer_data_len + 2);
2414 int bt_adapter_le_set_advertising_device_name(bt_advertiser_h advertiser,
2415 bt_adapter_le_packet_type_e pkt_type, bool include_name)
2417 int ret = BT_ERROR_NONE;
2418 char *data_ptr = NULL;
2421 BT_CHECK_LE_SUPPORT();
2422 BT_CHECK_INIT_STATUS();
2423 BT_CHECK_INPUT_PARAMETER(advertiser);
2425 if (!include_name) {
2426 ret = bt_adapter_le_remove_advertising_data(advertiser,
2427 pkt_type, /* LCOV_EXCL_LINE */
2428 BT_ADAPTER_LE_ADVERTISING_DATA_LOCAL_NAME);
2432 __bt_find_adv_data_type(advertiser, pkt_type,
2433 BT_ADAPTER_LE_ADVERTISING_DATA_LOCAL_NAME,
2434 &data_ptr, &data_len);
2436 BT_ERR("Aleady existed"); /* LCOV_EXCL_LINE */
2437 return BT_ERROR_ALREADY_DONE; /* LCOV_EXCL_LINE */
2440 ret = bt_adapter_le_add_advertising_data(advertiser,
2442 BT_ADAPTER_LE_ADVERTISING_DATA_LOCAL_NAME,
2448 int bt_adapter_le_set_advertising_tx_power_level(bt_advertiser_h advertiser,
2449 bt_adapter_le_packet_type_e pkt_type, bool include_tx_power)
2451 int ret = BT_ERROR_NONE;
2452 char *data_ptr = NULL;
2455 BT_CHECK_LE_SUPPORT();
2456 BT_CHECK_INIT_STATUS();
2457 BT_CHECK_INPUT_PARAMETER(advertiser);
2459 if (!include_tx_power) {
2460 ret = bt_adapter_le_remove_advertising_data(advertiser,
2461 pkt_type, /* LCOV_EXCL_LINE */
2462 BT_ADAPTER_LE_ADVERTISING_DATA_TX_POWER_LEVEL);
2466 __bt_find_adv_data_type(advertiser, pkt_type,
2467 BT_ADAPTER_LE_ADVERTISING_DATA_TX_POWER_LEVEL,
2468 &data_ptr, &data_len);
2470 BT_ERR("Aleady existed"); /* LCOV_EXCL_LINE */
2471 return BT_ERROR_ALREADY_DONE; /* LCOV_EXCL_LINE */
2474 ret = bt_adapter_le_add_advertising_data(advertiser,
2476 BT_ADAPTER_LE_ADVERTISING_DATA_TX_POWER_LEVEL,
2482 int bt_adapter_le_clear_advertising_data(bt_advertiser_h advertiser,
2483 bt_adapter_le_packet_type_e pkt_type)
2485 int ret = BT_ERROR_NONE;
2486 bt_advertiser_s *__adv = (bt_advertiser_s *)advertiser;
2489 unsigned int *system_data_len;
2491 BT_CHECK_LE_SUPPORT();
2492 BT_CHECK_INIT_STATUS();
2493 BT_CHECK_INPUT_PARAMETER(advertiser);
2496 case BT_ADAPTER_LE_PACKET_ADVERTISING:
2497 p = &__adv->adv_data;
2498 len = &__adv->adv_data_len;
2499 system_data_len = &__adv->adv_system_data_len;
2502 case BT_ADAPTER_LE_PACKET_SCAN_RESPONSE:
2503 p = &__adv->scan_rsp_data;
2504 len = &__adv->scan_rsp_data_len;
2505 system_data_len = &__adv->scan_rsp_system_data_len;
2509 BT_ERR("Unknown LE packet type : %d",
2510 pkt_type); /* LCOV_EXCL_LINE */
2511 return BT_ERROR_INVALID_PARAMETER; /* LCOV_EXCL_LINE */
2519 *system_data_len = 0;
2524 int bt_adapter_le_stop_advertising(bt_advertiser_h advertiser)
2526 int ret = BT_ERROR_NONE;
2527 bt_advertiser_s *__adv = (bt_advertiser_s *)advertiser;
2529 BT_CHECK_LE_SUPPORT();
2530 BT_CHECK_INIT_STATUS();
2531 BT_CHECK_INPUT_PARAMETER(advertiser);
2533 ret = _bt_get_error_code(bluetooth_set_advertising(__adv->handle,
2535 if (ret != BT_ERROR_NONE) {
2536 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret),
2537 ret); /* LCOV_EXCL_LINE */
2543 int bt_adapter_le_start_advertising_new(bt_advertiser_h advertiser,
2544 bt_adapter_le_advertising_state_changed_cb cb, void *user_data)
2546 int ret = BT_ERROR_NONE;
2548 bt_advertiser_s *__adv = (bt_advertiser_s *)advertiser;
2549 bluetooth_advertising_data_t adv = { {0} };
2550 bluetooth_scan_resp_data_t resp = { {0} };
2551 bluetooth_advertising_params_t param;
2552 float interval = 500;
2554 BT_CHECK_LE_SUPPORT();
2555 BT_CHECK_INIT_STATUS();
2556 BT_CHECK_INPUT_PARAMETER(advertiser);
2558 if (__adv->adv_data_len > 0 &&
2559 __adv->adv_data) { /* LCOV_EXCL_START */
2560 memcpy(adv.data, __adv->adv_data, __adv->adv_data_len);
2561 error_code = bluetooth_set_advertising_data(__adv->handle,
2562 &adv, __adv->adv_data_len);
2563 ret = _bt_get_error_code(error_code);
2564 if (ret != BT_ERROR_NONE) {
2565 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret),
2566 ret); /* LCOV_EXCL_STOP */
2571 if (__adv->scan_rsp_data_len > 0 &&
2572 __adv->scan_rsp_data) { /* LCOV_EXCL_START */
2573 memcpy(resp.data, __adv->scan_rsp_data, __adv->scan_rsp_data_len);
2574 error_code = bluetooth_set_scan_response_data(__adv->handle,
2575 &resp, __adv->scan_rsp_data_len);
2576 ret = _bt_get_error_code(error_code);
2577 if (ret != BT_ERROR_NONE) {
2578 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret),
2579 ret); /* LCOV_EXCL_STOP */
2584 if (__adv->adv_params.mode == BT_ADAPTER_LE_ADVERTISING_MODE_BALANCED)
2586 else if (__adv->adv_params.mode == BT_ADAPTER_LE_ADVERTISING_MODE_LOW_LATENCY)
2588 else if (__adv->adv_params.mode == BT_ADAPTER_LE_ADVERTISING_MODE_LOW_ENERGY)
2591 param.interval_min = interval;
2592 param.interval_max = interval;
2593 param.filter_policy = __adv->adv_params.filter_policy;
2594 param.type = __adv->adv_params.type;
2595 param.tx_power_level = __adv->adv_params.tx_power_level;
2596 error_code = bluetooth_set_custom_advertising(__adv->handle,
2599 ret = _bt_get_error_code(error_code);
2600 if (ret != BT_ERROR_NONE) {
2601 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret),
2602 ret); /* LCOV_EXCL_LINE */
2607 __adv->user_data = user_data;
2612 void _bt_adapter_le_invoke_advertising_state_cb(int handle, int result,
2613 bt_adapter_le_advertising_state_e adv_state)
2615 const GSList *l = NULL;
2617 for (l = advertiser_list; l; l = g_slist_next(l)) {
2618 bt_advertiser_s *__adv = (bt_advertiser_s *)l->data;
2619 if (__adv->handle == handle) {
2620 if (__adv->cb == NULL) {
2621 BT_ERR("advertiser cb is NULL"); /* LCOV_EXCL_LINE */
2622 return; /* LCOV_EXCL_LINE */
2625 __adv->cb(result, (bt_advertiser_h)__adv,
2626 adv_state, __adv->user_data);
2631 BT_ERR("No available advertiser"); /* LCOV_EXCL_LINE */
2634 int bt_adapter_le_set_advertising_mode(bt_advertiser_h advertiser,
2635 bt_adapter_le_advertising_mode_e mode)
2637 int error_code = BT_ERROR_NONE;
2638 bt_advertiser_s *__adv = (bt_advertiser_s *)advertiser;
2640 BT_CHECK_LE_SUPPORT();
2641 BT_CHECK_INIT_STATUS();
2642 BT_CHECK_INPUT_PARAMETER(advertiser);
2644 if (mode < BT_ADAPTER_LE_ADVERTISING_MODE_BALANCED ||
2645 mode > BT_ADAPTER_LE_ADVERTISING_MODE_LOW_ENERGY)
2646 return BT_ERROR_INVALID_PARAMETER;
2648 error_code = _bt_get_error_code(bluetooth_check_privilege_advertising_parameter());
2649 if (error_code != BT_ERROR_NONE) {
2650 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code),
2651 error_code); /* LCOV_EXCL_LINE */
2652 return BT_ERROR_PERMISSION_DENIED; /* LCOV_EXCL_LINE */
2655 /* TODO : Before set the mode, check the inprogress status */
2656 __adv->adv_params.mode = mode;
2661 /* LCOV_EXCL_START */
2662 int bt_adapter_le_set_advertising_filter_policy(bt_advertiser_h advertiser,
2663 bt_adapter_le_advertising_filter_policy_e filter_policy)
2665 int error_code = BT_ERROR_NONE;
2666 bt_advertiser_s *__adv = (bt_advertiser_s *)advertiser;
2668 BT_CHECK_LE_SUPPORT();
2669 BT_CHECK_INIT_STATUS();
2670 BT_CHECK_INPUT_PARAMETER(advertiser);
2672 if (filter_policy < BT_ADAPTER_LE_ADVERTISING_FILTER_DEFAULT ||
2673 filter_policy > BT_ADAPTER_LE_ADVERTISING_FILTER_ALLOW_SCAN_CONN_WL)
2674 return BT_ERROR_INVALID_PARAMETER;
2676 error_code = _bt_get_error_code(bluetooth_check_privilege_advertising_parameter());
2677 if (error_code != BT_ERROR_NONE) {
2678 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code),
2680 return BT_ERROR_PERMISSION_DENIED;
2683 /* TODO : Before set the filter policy, check the inprogress status */
2684 __adv->adv_params.filter_policy = filter_policy;
2688 /* LCOV_EXCL_STOP */
2690 int bt_adapter_le_set_advertising_connectable(bt_advertiser_h advertiser,
2693 int error_code = BT_ERROR_NONE;
2694 bt_advertiser_s *__adv = (bt_advertiser_s *)advertiser;
2696 BT_CHECK_LE_SUPPORT();
2697 BT_CHECK_INIT_STATUS();
2698 BT_CHECK_INPUT_PARAMETER(advertiser);
2700 error_code = _bt_get_error_code(
2701 bluetooth_check_privilege_advertising_parameter());
2702 if (error_code != BT_ERROR_NONE) {
2703 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code),
2704 error_code); /* LCOV_EXCL_LINE */
2705 return BT_ERROR_PERMISSION_DENIED; /* LCOV_EXCL_LINE */
2709 __adv->adv_params.type = BT_ADAPTER_LE_ADVERTISING_CONNECTABLE; /* LCOV_EXCL_LINE */
2711 __adv->adv_params.type = BT_ADAPTER_LE_ADVERTISING_SCANNABLE;
2713 /* TODO : Before set the type, check the inprogress status */
2718 /* LCOV_EXCL_START */
2719 int bt_adapter_le_set_advertising_custom_tx_power_level(bt_advertiser_h advertiser,
2722 int error_code = BT_ERROR_NONE;
2723 bt_advertiser_s *__adv = (bt_advertiser_s *)advertiser;
2725 BT_CHECK_LE_SUPPORT();
2726 BT_CHECK_INIT_STATUS();
2727 BT_CHECK_INPUT_PARAMETER(advertiser);
2729 error_code = _bt_get_error_code(
2730 bluetooth_check_privilege_advertising_parameter());
2731 if (error_code != BT_ERROR_NONE) {
2732 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code),
2733 error_code); /* LCOV_EXCL_LINE */
2734 return BT_ERROR_PERMISSION_DENIED; /* LCOV_EXCL_LINE */
2737 __adv->adv_params.tx_power_level = tx_power_level;
2741 /* LCOV_EXCL_STOP */
2743 /* LCOV_EXCL_START */
2744 int bt_adapter_le_enable_privacy(bool enable_privacy)
2746 int error_code = BT_ERROR_NONE;
2748 BT_CHECK_LE_SUPPORT();
2749 BT_CHECK_INIT_STATUS();
2751 error_code = _bt_get_error_code(
2752 bluetooth_enable_le_privacy(enable_privacy));
2754 if (error_code != BT_ERROR_NONE) {
2755 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code),
2761 int bt_adapter_le_set_static_random_address(bool enable)
2763 int error_code = BT_ERROR_NONE;
2765 BT_CHECK_LE_SUPPORT();
2766 BT_CHECK_INIT_STATUS();
2768 error_code = _bt_get_error_code(bluetooth_set_le_static_random_address(enable));
2770 if (error_code != BT_ERROR_NONE)
2771 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), error_code);
2776 static void __bt_adapter_le_convert_scan_filter(
2777 bluetooth_le_scan_filter_t *dest,
2778 bt_le_scan_filter_s *src)
2782 char *converted_uuid = NULL;
2784 memset(dest, 0x00, sizeof(bluetooth_le_scan_filter_t));
2786 if (src->device_address) {
2787 dest->added_features |= BLUETOOTH_LE_SCAN_FILTER_FEATURE_DEVICE_ADDRESS;
2788 _bt_convert_address_to_hex(&dest->device_address,
2789 src->device_address);
2792 if (src->device_name) {
2793 dest->added_features |= BLUETOOTH_LE_SCAN_FILTER_FEATURE_DEVICE_NAME;
2794 strncpy(dest->device_name, src->device_name,
2795 BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX - 1);
2796 dest->device_name[BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX - 1] = '\0';
2799 if (src->service_uuid) {
2800 if (__bt_convert_string_to_uuid(src->service_uuid,
2801 &data, &bit) == BT_ERROR_NONE) {
2802 dest->added_features |= BLUETOOTH_LE_SCAN_FILTER_FEATURE_SERVICE_UUID;
2804 dest->service_uuid.data_len = 2;
2806 dest->service_uuid.data_len = 16;
2808 if (__bt_convert_byte_ordering(data, dest->service_uuid.data_len,
2809 &converted_uuid) == BT_ERROR_NONE) {
2810 memcpy(dest->service_uuid.data.data, converted_uuid,
2811 dest->service_uuid.data_len);
2812 g_free(converted_uuid);
2813 converted_uuid = NULL;
2818 dest->service_uuid_mask.data_len = dest->service_uuid.data_len;
2819 if (src->service_uuid_mask) {
2820 __bt_convert_string_to_uuid(src->service_uuid_mask, &data, &bit);
2822 if (__bt_convert_byte_ordering(data, dest->service_uuid_mask.data_len,
2823 &converted_uuid) == BT_ERROR_NONE) {
2824 memcpy(dest->service_uuid_mask.data.data, converted_uuid,
2825 dest->service_uuid_mask.data_len);
2826 g_free(converted_uuid);
2827 converted_uuid = NULL;
2832 memset(dest->service_uuid_mask.data.data, 0xFF,
2833 dest->service_uuid_mask.data_len);
2838 if (src->service_solicitation_uuid) {
2839 if (__bt_convert_string_to_uuid(src->service_solicitation_uuid,
2840 &data, &bit) == BT_ERROR_NONE) {
2841 dest->added_features |= BLUETOOTH_LE_SCAN_FILTER_FEATURE_SERVICE_SOLICITATION_UUID;
2844 dest->service_solicitation_uuid.data_len = 2;
2846 dest->service_solicitation_uuid.data_len = 16;
2848 if (__bt_convert_byte_ordering(data, dest->service_solicitation_uuid.data_len,
2849 &converted_uuid) == BT_ERROR_NONE) {
2850 memcpy(dest->service_solicitation_uuid.data.data,
2851 converted_uuid, dest->service_solicitation_uuid.data_len);
2852 g_free(converted_uuid);
2853 converted_uuid = NULL;
2858 dest->service_solicitation_uuid_mask.data_len = dest->service_solicitation_uuid.data_len;
2859 if (src->service_solicitation_uuid_mask) {
2860 __bt_convert_string_to_uuid(src->service_solicitation_uuid_mask, &data, &bit);
2862 if (__bt_convert_byte_ordering(data, dest->service_solicitation_uuid_mask.data_len,
2863 &converted_uuid) == BT_ERROR_NONE) {
2864 memcpy(dest->service_solicitation_uuid_mask.data.data,
2865 converted_uuid, dest->service_solicitation_uuid_mask.data_len);
2866 g_free(converted_uuid);
2867 converted_uuid = NULL;
2872 memset(dest->service_solicitation_uuid_mask.data.data, 0xFF, dest->service_solicitation_uuid_mask.data_len);
2877 if (src->service_data_uuid) {
2879 if (__bt_convert_string_to_uuid(src->service_data_uuid, &data, &bit) == BT_ERROR_NONE) {
2880 dest->added_features |= BLUETOOTH_LE_SCAN_FILTER_FEATURE_SERVICE_DATA;
2886 if (__bt_convert_byte_ordering(data, uuid_len, &converted_uuid)
2888 memcpy(dest->service_data.data.data, converted_uuid, uuid_len);
2889 g_free(converted_uuid);
2890 converted_uuid = NULL;
2895 memcpy(dest->service_data.data.data + uuid_len, src->service_data, src->service_data_len);
2896 dest->service_data.data_len = uuid_len + src->service_data_len;
2898 dest->service_data_mask.data_len = dest->service_data.data_len;
2899 memset(dest->service_data_mask.data.data, 0xFF, uuid_len);
2900 if (src->service_data_mask)
2901 memcpy(dest->service_data_mask.data.data + uuid_len, src->service_data_mask, src->service_data_len);
2903 memset(dest->service_data_mask.data.data + uuid_len, 0xFF, src->service_data_len);
2907 if (src->manufacturer_id > -1) {
2908 dest->added_features |= BLUETOOTH_LE_SCAN_FILTER_FEATURE_MANUFACTURER_DATA;
2909 dest->manufacturer_id = src->manufacturer_id;
2911 if (src->manufacturer_data) {
2912 memcpy(dest->manufacturer_data.data.data,
2913 src->manufacturer_data,
2914 src->manufacturer_data_len);
2915 dest->manufacturer_data.data_len = src->manufacturer_data_len;
2917 dest->manufacturer_data_mask.data_len = src->manufacturer_data_len;
2918 if (src->manufacturer_data_mask)
2919 memcpy(dest->manufacturer_data_mask.data.data,
2920 src->manufacturer_data_mask,
2921 src->manufacturer_data_len);
2923 memset(dest->manufacturer_data_mask.data.data,
2924 0xFF, src->manufacturer_data_len);
2929 static bt_le_scan_filter_s *__bt_adapter_le_duplicate_scan_filter(
2930 const bt_le_scan_filter_s *src)
2932 bt_le_scan_filter_s *filter = g_malloc0(sizeof(bt_le_scan_filter_s));
2934 filter->filter_id = src->filter_id;
2935 filter->device_address = g_strdup(src->device_address);
2936 filter->device_name = g_strdup(src->device_name);
2937 filter->service_uuid = g_strdup(src->service_uuid);
2938 filter->service_uuid_mask = g_strdup(src->service_uuid_mask);
2939 filter->service_solicitation_uuid = g_strdup(src->service_solicitation_uuid);
2940 filter->service_solicitation_uuid_mask = g_strdup(src->service_solicitation_uuid_mask);
2941 filter->service_data_uuid = g_strdup(src->service_data_uuid);
2942 filter->service_data = g_memdup(src->service_data, src->service_data_len);
2943 filter->service_data_len = src->service_data_len;
2944 filter->service_data_mask = g_memdup(src->service_data_mask, src->service_data_len);
2945 filter->manufacturer_id = src->manufacturer_id;
2946 filter->manufacturer_data = g_memdup(src->manufacturer_data, src->manufacturer_data_len);
2947 filter->manufacturer_data_len = src->manufacturer_data_len;
2948 filter->manufacturer_data_mask = g_memdup(src->manufacturer_data_mask, src->manufacturer_data_len);
2953 static void __bt_adapter_le_free_scan_filter(bt_le_scan_filter_s *filter)
2958 g_free(filter->device_address);
2959 g_free(filter->device_name);
2960 g_free(filter->service_uuid);
2961 g_free(filter->service_uuid_mask);
2962 g_free(filter->service_solicitation_uuid);
2963 g_free(filter->service_solicitation_uuid_mask);
2964 g_free(filter->service_data_uuid);
2965 g_free(filter->service_data);
2966 g_free(filter->service_data_mask);
2967 g_free(filter->manufacturer_data);
2968 g_free(filter->manufacturer_data_mask);
2971 /* LCOV_EXCL_STOP */
2973 int bt_adapter_le_start_scan(bt_adapter_le_scan_result_cb cb, void *user_data)
2975 int error_code = BT_ERROR_NONE;
2978 BT_CHECK_LE_SUPPORT();
2979 BT_CHECK_INIT_STATUS();
2980 BT_CHECK_INPUT_PARAMETER(cb);
2982 _bt_le_adapter_init();
2984 for (l = scan_filter_list; l != NULL; l = l->next) {
2985 bluetooth_le_scan_filter_t filter;
2986 bt_le_scan_filter_s *__filter = l->data;
2987 __bt_adapter_le_convert_scan_filter(&filter, __filter);
2989 error_code = _bt_get_error_code(bluetooth_register_scan_filter(&filter));
2990 if (error_code != BT_ERROR_NONE) {
2991 BT_ERR("Scan filter error %s(0x%08x)",
2992 _bt_convert_error_to_string(error_code),
2993 error_code); /* LCOV_EXCL_LINE */
2997 error_code = _bt_get_error_code(bluetooth_start_le_discovery());
2998 if (error_code != BT_ERROR_NONE) {
2999 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), error_code); /* LCOV_EXCL_LINE */
3003 _bt_set_cb(BT_EVENT_LE_SCAN_RESULT_UPDATED, cb, user_data);
3007 int bt_adapter_le_stop_scan(void)
3009 int error_code = BT_ERROR_NONE;
3011 BT_CHECK_LE_SUPPORT();
3012 BT_CHECK_INIT_STATUS();
3014 error_code = _bt_get_error_code(bluetooth_stop_le_discovery());
3015 if (error_code != BT_ERROR_NONE) {
3016 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), error_code); /* LCOV_EXCL_LINE */
3020 _bt_unset_cb(BT_EVENT_LE_SCAN_RESULT_UPDATED);
3021 _bt_le_adapter_deinit();
3025 int bt_adapter_le_get_scan_result_service_uuids(const bt_adapter_le_device_scan_result_info_s *info,
3026 bt_adapter_le_packet_type_e pkt_type,
3027 char ***uuids, int *count)
3029 BT_CHECK_LE_SUPPORT();
3030 BT_CHECK_INIT_STATUS();
3031 BT_CHECK_INPUT_PARAMETER(info);
3032 BT_CHECK_INPUT_PARAMETER(uuids); /* LCOV_EXCL_START */
3033 BT_CHECK_INPUT_PARAMETER(count);
3036 char *adv_data = NULL;
3037 char *remain_data = NULL;
3045 if (pkt_type == BT_ADAPTER_LE_PACKET_ADVERTISING) {
3046 adv_data = info->adv_data;
3047 adv_length = info->adv_data_len;
3048 } else if (pkt_type == BT_ADAPTER_LE_PACKET_SCAN_RESPONSE) {
3049 adv_data = info->scan_data;
3050 adv_length = info->scan_data_len;
3052 return BT_ERROR_INVALID_PARAMETER;
3054 if (!adv_data || adv_length < 3)
3055 return BT_ERROR_NO_DATA;
3057 remain_data = adv_data;
3058 remain_len = adv_length;
3060 while (remain_len > 0) {
3061 field_len = remain_data[0];
3062 if (remain_data[1] == BT_ADAPTER_LE_ADVERTISING_DATA_INCOMP_LIST_16_BIT_SERVICE_CLASS_UUIDS ||
3063 remain_data[1] == BT_ADAPTER_LE_ADVERTISING_DATA_COMP_LIST_16_BIT_SERVICE_CLASS_UUIDS)
3064 uuid_count += (field_len - 1) / 2;
3065 else if (remain_data[1] == BT_ADAPTER_LE_ADVERTISING_DATA_INCOMP_LIST_128_BIT_SERVICE_CLASS_UUIDS ||
3066 remain_data[1] == BT_ADAPTER_LE_ADVERTISING_DATA_COMP_LIST_128_BIT_SERVICE_CLASS_UUIDS)
3067 uuid_count += (field_len - 1) / 16;
3069 remain_len = remain_len - field_len - 1;
3070 remain_data += field_len + 1;
3073 if (uuid_count == 0)
3074 return BT_ERROR_NO_DATA;
3076 *uuids = g_malloc0(sizeof(char *) *uuid_count);
3078 *count = uuid_count;
3080 remain_data = adv_data;
3081 remain_len = adv_length;
3083 while (remain_len) {
3084 field_len = remain_data[0];
3085 if (remain_data[1] == BT_ADAPTER_LE_ADVERTISING_DATA_INCOMP_LIST_16_BIT_SERVICE_CLASS_UUIDS ||
3086 remain_data[1] == BT_ADAPTER_LE_ADVERTISING_DATA_COMP_LIST_16_BIT_SERVICE_CLASS_UUIDS)
3088 else if (remain_data[1] == BT_ADAPTER_LE_ADVERTISING_DATA_INCOMP_LIST_128_BIT_SERVICE_CLASS_UUIDS ||
3089 remain_data[1] == BT_ADAPTER_LE_ADVERTISING_DATA_COMP_LIST_128_BIT_SERVICE_CLASS_UUIDS)
3094 if (uuid_size != 0) {
3095 for (i = 0; i < (field_len - 1); i += uuid_size) {
3096 if (uuid_size == 2) {
3097 (*uuids)[uuid_index] = g_malloc0(sizeof(char) * 4 + 1);
3098 snprintf((*uuids)[uuid_index], 5,
3103 (*uuids)[uuid_index] = g_malloc0(sizeof(char) * 36 + 1);
3104 snprintf((*uuids)[uuid_index], 37, "%2.2X%2.2X%2.2X%2.2X-%2.2X%2.2X-%2.2X%2.2X-%2.2X%2.2X-%2.2X%2.2X%2.2X%2.2X%2.2X%2.2X",
3105 remain_data[i+17], remain_data[i+16], remain_data[i+15], remain_data[i+14],
3106 remain_data[i+13], remain_data[i+12], remain_data[i+11], remain_data[i+10], remain_data[i+9], remain_data[i+8],
3107 remain_data[i+7], remain_data[i+6], remain_data[i+5], remain_data[i+4], remain_data[i+3], remain_data[i+2]);
3113 remain_len = remain_len - field_len - 1;
3114 remain_data += field_len + 1;
3117 return BT_ERROR_NONE;
3118 } /* LCOV_EXCL_STOP */
3120 int bt_adapter_le_get_scan_result_device_name(const bt_adapter_le_device_scan_result_info_s *info,
3121 bt_adapter_le_packet_type_e pkt_type, char **name)
3123 BT_CHECK_LE_SUPPORT();
3124 BT_CHECK_INIT_STATUS();
3125 BT_CHECK_INPUT_PARAMETER(info); /* LCOV_EXCL_START */
3126 BT_CHECK_INPUT_PARAMETER(name);
3129 char *adv_data = NULL;
3132 if (pkt_type == BT_ADAPTER_LE_PACKET_ADVERTISING) {
3133 adv_data = info->adv_data;
3134 adv_length = info->adv_data_len;
3135 } else if (pkt_type == BT_ADAPTER_LE_PACKET_SCAN_RESPONSE) {
3136 adv_data = info->scan_data;
3137 adv_length = info->scan_data_len;
3139 return BT_ERROR_INVALID_PARAMETER;
3141 if (!adv_data || adv_length < 3)
3142 return BT_ERROR_NO_DATA;
3144 while (adv_length > 0) {
3145 field_len = adv_data[0];
3146 if (adv_data[1] == BT_ADAPTER_LE_ADVERTISING_DATA_LOCAL_NAME ||
3147 adv_data[1] == BT_ADAPTER_LE_ADVERTISING_DATA_SHORT_LOCAL_NAME) {
3149 if (field_len <= 0) {
3150 BT_ERR("Wrong field len for name");
3151 return BT_ERROR_NO_DATA;
3154 *name = g_malloc0(sizeof(char) *field_len);
3155 memcpy(*name, &adv_data[2], field_len - 1);
3157 return BT_ERROR_NONE;
3160 adv_length = adv_length - field_len - 1;
3161 adv_data += field_len + 1;
3164 return BT_ERROR_NO_DATA; /* LCOV_EXCL_STOP */
3167 int bt_adapter_le_get_scan_result_tx_power_level(const bt_adapter_le_device_scan_result_info_s *info,
3168 bt_adapter_le_packet_type_e pkt_type, int *power_level)
3170 BT_CHECK_LE_SUPPORT();
3171 BT_CHECK_INIT_STATUS();
3172 BT_CHECK_INPUT_PARAMETER(info); /* LCOV_EXCL_START */
3173 BT_CHECK_INPUT_PARAMETER(power_level);
3176 char *adv_data = NULL;
3179 if (pkt_type == BT_ADAPTER_LE_PACKET_ADVERTISING) {
3180 adv_data = info->adv_data;
3181 adv_length = info->adv_data_len;
3182 } else if (pkt_type == BT_ADAPTER_LE_PACKET_SCAN_RESPONSE) {
3183 adv_data = info->scan_data;
3184 adv_length = info->scan_data_len;
3186 return BT_ERROR_INVALID_PARAMETER;
3188 if (!adv_data || adv_length < 3)
3189 return BT_ERROR_NO_DATA;
3191 while (adv_length > 0) {
3192 field_len = adv_data[0];
3193 if (adv_data[1] == BT_ADAPTER_LE_ADVERTISING_DATA_TX_POWER_LEVEL) {
3194 if (adv_data[2] & 0x80)
3195 *power_level = 0xffffff00 | adv_data[2];
3197 *power_level = (int)adv_data[2];
3199 return BT_ERROR_NONE;
3202 adv_length = adv_length - field_len - 1;
3203 adv_data += field_len + 1;
3206 return BT_ERROR_NO_DATA; /* LCOV_EXCL_STOP */
3209 int bt_adapter_le_get_scan_result_service_solicitation_uuids(const bt_adapter_le_device_scan_result_info_s *info,
3210 bt_adapter_le_packet_type_e pkt_type,
3211 char ***uuids, int *count)
3213 BT_CHECK_LE_SUPPORT();
3214 BT_CHECK_INIT_STATUS();
3215 BT_CHECK_INPUT_PARAMETER(info); /* LCOV_EXCL_START */
3216 BT_CHECK_INPUT_PARAMETER(uuids);
3217 BT_CHECK_INPUT_PARAMETER(count);
3220 char *adv_data = NULL;
3221 char *remain_data = NULL;
3229 if (pkt_type == BT_ADAPTER_LE_PACKET_ADVERTISING) {
3230 adv_data = info->adv_data;
3231 adv_length = info->adv_data_len;
3232 } else if (pkt_type == BT_ADAPTER_LE_PACKET_SCAN_RESPONSE) {
3233 adv_data = info->scan_data;
3234 adv_length = info->scan_data_len;
3236 return BT_ERROR_INVALID_PARAMETER;
3238 if (!adv_data || adv_length < 3)
3239 return BT_ERROR_NO_DATA;
3241 remain_data = adv_data;
3242 remain_len = adv_length;
3244 while (remain_len > 0) {
3245 field_len = remain_data[0];
3246 if (remain_data[1] == BT_ADAPTER_LE_ADVERTISING_DATA_16_BIT_SERVICE_SOLICITATION_UUIDS)
3247 uuid_count += (field_len - 1) / 2;
3248 else if (remain_data[1] == BT_ADAPTER_LE_ADVERTISING_DATA_128_BIT_SERVICE_SOLICITATION_UUIDS)
3249 uuid_count += (field_len - 1) / 16;
3251 remain_len = remain_len - field_len - 1;
3252 remain_data += field_len + 1;
3255 if (uuid_count == 0)
3256 return BT_ERROR_NO_DATA;
3258 *uuids = g_malloc0(sizeof(char *) * uuid_count);
3259 *count = uuid_count;
3261 remain_data = adv_data;
3262 remain_len = adv_length;
3264 while (remain_len > 0) {
3265 field_len = remain_data[0];
3266 if (remain_data[1] == BT_ADAPTER_LE_ADVERTISING_DATA_16_BIT_SERVICE_SOLICITATION_UUIDS)
3268 else if (remain_data[1] == BT_ADAPTER_LE_ADVERTISING_DATA_128_BIT_SERVICE_SOLICITATION_UUIDS)
3273 if (uuid_size != 0) {
3274 for (i = 0; i < (field_len - 1); i += uuid_size) {
3275 if (uuid_size == 2) {
3276 (*uuids)[uuid_index] = g_malloc0(sizeof(char) * 4 + 1);
3277 snprintf((*uuids)[uuid_index], 5,
3278 "%2.2X%2.2X", remain_data[i+3],
3281 (*uuids)[uuid_index] = g_malloc0(sizeof(char) * 36 + 1);
3282 snprintf((*uuids)[uuid_index], 37, "%2.2X%2.2X%2.2X%2.2X-%2.2X%2.2X-%2.2X%2.2X-%2.2X%2.2X-%2.2X%2.2X%2.2X%2.2X%2.2X%2.2X",
3283 remain_data[i+17], remain_data[i+16], remain_data[i+15], remain_data[i+14],
3284 remain_data[i+13], remain_data[i+12], remain_data[i+11], remain_data[i+10], remain_data[i+9], remain_data[i+8],
3285 remain_data[i+7], remain_data[i+6], remain_data[i+5], remain_data[i+4], remain_data[i+3], remain_data[i+2]);
3291 remain_len = remain_len - field_len - 1;
3292 remain_data += field_len + 1;
3295 return BT_ERROR_NONE; /* LCOV_EXCL_STOP */
3298 int bt_adapter_le_get_scan_result_service_data_list(const bt_adapter_le_device_scan_result_info_s *info,
3299 bt_adapter_le_packet_type_e pkt_type,
3300 bt_adapter_le_service_data_s **data_list, int *count)
3302 BT_CHECK_LE_SUPPORT();
3303 BT_CHECK_INIT_STATUS();
3304 BT_CHECK_INPUT_PARAMETER(info); /* LCOV_EXCL_START */
3305 BT_CHECK_INPUT_PARAMETER(count);
3308 char *adv_data = NULL;
3309 char *remain_data = NULL;
3315 if (pkt_type == BT_ADAPTER_LE_PACKET_ADVERTISING) {
3316 adv_data = info->adv_data;
3317 adv_length = info->adv_data_len;
3318 } else if (pkt_type == BT_ADAPTER_LE_PACKET_SCAN_RESPONSE) {
3319 adv_data = info->scan_data;
3320 adv_length = info->scan_data_len;
3322 return BT_ERROR_INVALID_PARAMETER;
3324 if (!adv_data || adv_length < 3)
3325 return BT_ERROR_NO_DATA;
3327 remain_data = adv_data;
3328 remain_len = adv_length;
3330 while (remain_len > 0) {
3331 field_len = remain_data[0];
3332 if (remain_data[1] == BT_ADAPTER_LE_ADVERTISING_DATA_SERVICE_DATA ||
3333 remain_data[1] == BT_ADAPTER_LE_ADVERTISING_DATA_128_BIT_SERVICE_DATA)
3336 remain_len = remain_len - field_len - 1;
3337 remain_data += field_len + 1;
3340 if (data_count == 0)
3341 return BT_ERROR_NO_DATA;
3343 *data_list = g_malloc0(sizeof(bt_adapter_le_service_data_s) * data_count);
3344 *count = data_count;
3346 remain_data = adv_data;
3347 remain_len = adv_length;
3349 while (remain_len > 0) {
3350 field_len = remain_data[0];
3352 if (remain_data[1] == BT_ADAPTER_LE_ADVERTISING_DATA_SERVICE_DATA) {
3353 (*data_list)[data_index].service_uuid = g_malloc0(sizeof(char) * 4 + 1);
3354 snprintf((*data_list)[data_index].service_uuid, 5,
3355 "%2.2X%2.2X", remain_data[3], remain_data[2]);
3357 (*data_list)[data_index].service_data = g_memdup(
3358 &remain_data[4], field_len - 3);
3359 (*data_list)[data_index].service_data_len = field_len - 3;
3362 } else if (remain_data[1] == BT_ADAPTER_LE_ADVERTISING_DATA_128_BIT_SERVICE_DATA) {
3363 (*data_list)[data_index].service_uuid = g_malloc0(sizeof(char) * 36 + 1);
3364 snprintf((*data_list)[data_index].service_uuid, 37,
3365 "%2.2X%2.2X%2.2X%2.2X-%2.2X%2.2X-%2.2X%2.2X-%2.2X%2.2X-%2.2X%2.2X%2.2X%2.2X%2.2X%2.2X",
3366 remain_data[17], remain_data[16],
3367 remain_data[15], remain_data[14],
3368 remain_data[13], remain_data[12],
3369 remain_data[11], remain_data[10],
3370 remain_data[9], remain_data[8],
3371 remain_data[7], remain_data[6],
3372 remain_data[5], remain_data[4],
3373 remain_data[3], remain_data[2]);
3375 (*data_list)[data_index].service_data = g_memdup(
3376 &remain_data[18], field_len - 17);
3377 (*data_list)[data_index].service_data_len = field_len - 17;
3382 remain_len = remain_len - field_len - 1;
3383 remain_data += field_len + 1;
3386 return BT_ERROR_NONE; /* LCOV_EXCL_STOP */
3389 int bt_adapter_le_free_service_data_list(bt_adapter_le_service_data_s *data_list,
3394 BT_CHECK_LE_SUPPORT();
3395 BT_CHECK_INIT_STATUS();
3396 BT_CHECK_INPUT_PARAMETER(data_list); /* LCOV_EXCL_START */
3398 for (i = 0; i < count; i++) {
3399 g_free(data_list[i].service_uuid);
3400 g_free(data_list[i].service_data);
3404 return BT_ERROR_NONE; /* LCOV_EXCL_STOP */
3407 int bt_adapter_le_get_scan_result_appearance(const bt_adapter_le_device_scan_result_info_s *info,
3408 bt_adapter_le_packet_type_e pkt_type, int *appearance)
3410 BT_CHECK_LE_SUPPORT();
3411 BT_CHECK_INIT_STATUS();
3412 BT_CHECK_INPUT_PARAMETER(info); /* LCOV_EXCL_START */
3413 BT_CHECK_INPUT_PARAMETER(appearance);
3416 char *adv_data = NULL;
3419 if (pkt_type == BT_ADAPTER_LE_PACKET_ADVERTISING) {
3420 adv_data = info->adv_data;
3421 adv_length = info->adv_data_len;
3422 } else if (pkt_type == BT_ADAPTER_LE_PACKET_SCAN_RESPONSE) {
3423 adv_data = info->scan_data;
3424 adv_length = info->scan_data_len;
3426 return BT_ERROR_INVALID_PARAMETER;
3428 if (!adv_data || adv_length < 3)
3429 return BT_ERROR_NO_DATA;
3431 while (adv_length > 0) {
3432 field_len = adv_data[0];
3433 if (adv_data[1] == BT_ADAPTER_LE_ADVERTISING_DATA_APPEARANCE) {
3434 *appearance = adv_data[3] << 8;
3435 *appearance += adv_data[2];
3438 return BT_ERROR_NONE;
3441 adv_length = adv_length - field_len - 1;
3442 adv_data += field_len + 1;
3445 return BT_ERROR_NO_DATA; /* LCOV_EXCL_STOP */
3449 int bt_adapter_le_get_scan_result_manufacturer_data(const bt_adapter_le_device_scan_result_info_s *info,
3450 bt_adapter_le_packet_type_e pkt_type,
3451 int *manufacturer_id, char **manufacturer_data,
3452 int *manufacturer_data_len)
3454 BT_CHECK_LE_SUPPORT();
3455 BT_CHECK_INIT_STATUS();
3456 BT_CHECK_INPUT_PARAMETER(info);
3457 BT_CHECK_INPUT_PARAMETER(manufacturer_id); /* LCOV_EXCL_START */
3458 BT_CHECK_INPUT_PARAMETER(manufacturer_data);
3459 BT_CHECK_INPUT_PARAMETER(manufacturer_data_len);
3462 char *adv_data = NULL;
3463 char *remain_data = NULL;
3467 if (pkt_type == BT_ADAPTER_LE_PACKET_ADVERTISING) {
3468 adv_data = info->adv_data;
3469 adv_length = info->adv_data_len;
3470 } else if (pkt_type == BT_ADAPTER_LE_PACKET_SCAN_RESPONSE) {
3471 adv_data = info->scan_data;
3472 adv_length = info->scan_data_len;
3474 return BT_ERROR_INVALID_PARAMETER;
3476 if (!adv_data || adv_length < 3)
3477 return BT_ERROR_NO_DATA;
3479 remain_data = adv_data;
3480 remain_len = adv_length;
3482 while (remain_len > 0) {
3483 field_len = remain_data[0];
3484 if ((uint64_t)(remain_data[1] & 0xff) == BT_ADAPTER_LE_ADVERTISING_DATA_MANUFACTURER_SPECIFIC_DATA) {
3485 if (field_len < 3 || (remain_len - 1 < field_len)) {
3486 /* Manufacturer Specific Data (2 or more octets)
3487 - The first 2 octets contain the Company Identifier
3488 Code followed by additional manufacturer specific data
3490 |field_len|0xff|Company ID (2 bytes)|data (size: field_len - 3|
3492 And field_len should be smaller than "remain_len - 1"
3495 return BT_ERROR_NO_DATA;
3498 *manufacturer_id = remain_data[3] << 8;
3499 *manufacturer_id += remain_data[2];
3501 *manufacturer_data = g_memdup(&remain_data[4], field_len - 3);
3502 *manufacturer_data_len = field_len - 3;
3504 return BT_ERROR_NONE;
3507 remain_len = remain_len - field_len - 1;
3508 remain_data += field_len + 1;
3511 return BT_ERROR_NO_DATA; /* LCOV_EXCL_STOP */
3514 int bt_adapter_le_free_ibeacon_report(bt_adapter_le_ibeacon_scan_result_info_s *ibeacon_info)
3517 BT_CHECK_LE_SUPPORT();
3518 BT_CHECK_INIT_STATUS();
3519 BT_CHECK_INPUT_PARAMETER(ibeacon_info); /* LCOV_EXCL_START */
3521 g_free(ibeacon_info->uuid);
3523 g_free(ibeacon_info);
3525 return BT_ERROR_NONE; /* LCOV_EXCL_STOP */
3528 int bt_adapter_le_get_scan_result_ibeacon_report(const bt_adapter_le_device_scan_result_info_s *info,
3529 bt_adapter_le_packet_type_e pkt_type, bt_adapter_le_ibeacon_scan_result_info_s **ibeacon_info)
3531 int manufacturer_id;
3532 char *manufacturer_data = NULL;
3533 int manufacturer_data_len;
3535 BT_CHECK_LE_SUPPORT();
3536 BT_CHECK_INIT_STATUS();
3537 BT_CHECK_INPUT_PARAMETER(info);
3539 if (bt_adapter_le_get_scan_result_manufacturer_data(
3540 info, pkt_type, &manufacturer_id, &manufacturer_data,
3541 &manufacturer_data_len) != BT_ERROR_NONE)
3542 return BT_ERROR_NO_DATA;
3544 if (manufacturer_data == NULL)
3545 return BT_ERROR_NO_DATA;
3547 if (manufacturer_data_len < 23) {
3548 g_free(manufacturer_data);
3549 return BT_ERROR_NO_DATA;
3552 if (manufacturer_id != COMPANY_ID_APPLE) {
3553 g_free(manufacturer_data);
3554 return BT_ERROR_NO_DATA;
3557 *ibeacon_info = g_malloc0(sizeof(bt_adapter_le_ibeacon_scan_result_info_s));
3559 (*ibeacon_info)->company_id = manufacturer_id;
3560 (*ibeacon_info)->ibeacon_type = manufacturer_data[1] << 8;
3561 (*ibeacon_info)->ibeacon_type += manufacturer_data[0];
3563 (*ibeacon_info)->uuid = g_malloc0(sizeof(char) * 36 + 1);
3565 snprintf((*ibeacon_info)->uuid, 37, "%2.2X%2.2X%2.2X%2.2X-%2.2X%2.2X-%2.2X%2.2X-%2.2X%2.2X-%2.2X%2.2X%2.2X%2.2X%2.2X%2.2X",
3566 manufacturer_data[17], manufacturer_data[16], manufacturer_data[15], manufacturer_data[14],
3567 manufacturer_data[13], manufacturer_data[12], manufacturer_data[11], manufacturer_data[10], manufacturer_data[9], manufacturer_data[8],
3568 manufacturer_data[7], manufacturer_data[6], manufacturer_data[5], manufacturer_data[4], manufacturer_data[3], manufacturer_data[2]);
3570 (*ibeacon_info)->major_id = manufacturer_data[19] << 8;
3571 (*ibeacon_info)->major_id += manufacturer_data[18];
3573 (*ibeacon_info)->minor_id = manufacturer_data[21] << 8;
3574 (*ibeacon_info)->minor_id += manufacturer_data[20];
3576 (*ibeacon_info)->measured_power = manufacturer_data[22];
3578 g_free(manufacturer_data);
3580 return BT_ERROR_NONE;
3583 int bt_adapter_le_scan_filter_create(bt_scan_filter_h *scan_filter)
3585 bt_le_scan_filter_s *__filter = NULL;
3587 BT_CHECK_LE_SUPPORT();
3588 BT_CHECK_INIT_STATUS();
3589 BT_CHECK_INPUT_PARAMETER(scan_filter);
3591 __filter = (bt_le_scan_filter_s *)g_malloc0(sizeof(bt_le_scan_filter_s));
3593 __filter->filter_id = scan_filter_id++;
3594 __filter->manufacturer_id = -1;
3595 *scan_filter = (bt_scan_filter_h)__filter;
3597 return BT_ERROR_NONE;
3600 int bt_adapter_le_scan_filter_destroy(bt_scan_filter_h scan_filter)
3602 bt_le_scan_filter_s *__filter = (bt_le_scan_filter_s *)scan_filter;
3604 BT_CHECK_LE_SUPPORT();
3605 BT_CHECK_INIT_STATUS();
3606 BT_CHECK_INPUT_PARAMETER(scan_filter);
3608 __bt_adapter_le_free_scan_filter(__filter);
3610 return BT_ERROR_NONE;
3613 int bt_adapter_le_scan_filter_set_device_address(bt_scan_filter_h scan_filter,
3614 const char *address)
3616 bt_le_scan_filter_s *__filter = (bt_le_scan_filter_s *)scan_filter;
3618 BT_CHECK_LE_SUPPORT();
3619 BT_CHECK_INIT_STATUS();
3620 BT_CHECK_INPUT_PARAMETER(scan_filter);
3621 BT_CHECK_INPUT_PARAMETER(address);
3623 g_free(__filter->device_address);
3625 __filter->device_address = strdup(address);
3627 return BT_ERROR_NONE;
3630 int bt_adapter_le_scan_filter_set_device_name(bt_scan_filter_h scan_filter, const char *name)
3632 bt_le_scan_filter_s *__filter = (bt_le_scan_filter_s *)scan_filter;
3634 BT_CHECK_LE_SUPPORT();
3635 BT_CHECK_INIT_STATUS();
3636 BT_CHECK_INPUT_PARAMETER(scan_filter);
3637 BT_CHECK_INPUT_PARAMETER(name);
3639 if (strlen(name) > 29) {
3640 BT_ERR("INVALID_PARAMETER(0x%08x)",
3641 BT_ERROR_INVALID_PARAMETER);
3642 return BT_ERROR_INVALID_PARAMETER;
3645 g_free(__filter->device_name);
3647 __filter->device_name = strdup(name);
3649 return BT_ERROR_NONE;
3652 int bt_adapter_le_scan_filter_set_service_uuid(bt_scan_filter_h scan_filter,
3655 bt_le_scan_filter_s *__filter = (bt_le_scan_filter_s *)scan_filter;
3657 BT_CHECK_LE_SUPPORT();
3658 BT_CHECK_INIT_STATUS();
3659 BT_CHECK_INPUT_PARAMETER(scan_filter);
3660 BT_CHECK_INPUT_PARAMETER(uuid);
3662 g_free(__filter->service_uuid);
3663 g_free(__filter->service_uuid_mask);
3665 __filter->service_uuid = strdup(uuid);
3666 __filter->service_uuid_mask = NULL;
3668 return BT_ERROR_NONE;
3671 int bt_adapter_le_scan_filter_set_service_uuid_with_mask(bt_scan_filter_h scan_filter,
3672 const char *uuid, const char *mask)
3674 bt_le_scan_filter_s *__filter = (bt_le_scan_filter_s *)scan_filter;
3676 BT_CHECK_LE_SUPPORT();
3677 BT_CHECK_INIT_STATUS();
3678 BT_CHECK_INPUT_PARAMETER(scan_filter);
3679 BT_CHECK_INPUT_PARAMETER(uuid);
3680 BT_CHECK_INPUT_PARAMETER(mask);
3682 if (strlen(uuid) != strlen(mask)) {
3683 BT_ERR("INVALID_PARAMETER(0x%08x)",
3684 BT_ERROR_INVALID_PARAMETER); /* LCOV_EXCL_LINE */
3685 return BT_ERROR_INVALID_PARAMETER;
3688 g_free(__filter->service_uuid);
3689 g_free(__filter->service_uuid_mask);
3691 __filter->service_uuid = strdup(uuid);
3692 __filter->service_uuid_mask = strdup(mask);
3694 return BT_ERROR_NONE;
3697 int bt_adapter_le_scan_filter_set_service_solicitation_uuid(bt_scan_filter_h scan_filter,
3700 bt_le_scan_filter_s *__filter = (bt_le_scan_filter_s *)scan_filter;
3702 BT_CHECK_LE_SUPPORT();
3703 BT_CHECK_INIT_STATUS();
3704 BT_CHECK_INPUT_PARAMETER(scan_filter);
3705 BT_CHECK_INPUT_PARAMETER(uuid);
3707 g_free(__filter->service_solicitation_uuid);
3708 g_free(__filter->service_solicitation_uuid_mask);
3710 __filter->service_solicitation_uuid = strdup(uuid);
3711 __filter->service_solicitation_uuid_mask = NULL;
3713 return BT_ERROR_NONE;
3716 int bt_adapter_le_scan_filter_set_service_solicitation_uuid_with_mask(bt_scan_filter_h scan_filter,
3717 const char *uuid, const char *mask)
3719 bt_le_scan_filter_s *__filter = (bt_le_scan_filter_s *)scan_filter;
3721 BT_CHECK_LE_SUPPORT();
3722 BT_CHECK_INIT_STATUS();
3723 BT_CHECK_INPUT_PARAMETER(scan_filter);
3724 BT_CHECK_INPUT_PARAMETER(uuid);
3725 BT_CHECK_INPUT_PARAMETER(mask);
3727 if (strlen(uuid) != strlen(mask)) {
3728 BT_ERR("INVALID_PARAMETER(0x%08x)",
3729 BT_ERROR_INVALID_PARAMETER); /* LCOV_EXCL_LINE */
3730 return BT_ERROR_INVALID_PARAMETER;
3733 g_free(__filter->service_solicitation_uuid);
3734 g_free(__filter->service_solicitation_uuid_mask);
3736 __filter->service_solicitation_uuid = strdup(uuid);
3737 __filter->service_solicitation_uuid_mask = strdup(mask);
3739 return BT_ERROR_NONE;
3742 int bt_adapter_le_scan_filter_set_service_data(bt_scan_filter_h scan_filter,
3743 const char *uuid, const char *data,
3744 unsigned int data_len)
3746 bt_le_scan_filter_s *__filter = (bt_le_scan_filter_s *)scan_filter;
3748 BT_CHECK_LE_SUPPORT();
3749 BT_CHECK_INIT_STATUS();
3750 BT_CHECK_INPUT_PARAMETER(scan_filter);
3751 BT_CHECK_INPUT_PARAMETER(uuid);
3752 BT_CHECK_INPUT_PARAMETER(data);
3754 if (data_len > 27) {
3755 BT_ERR("INVALID_PARAMETER(0x%08x)",
3756 BT_ERROR_INVALID_PARAMETER); /* LCOV_EXCL_LINE */
3757 return BT_ERROR_INVALID_PARAMETER;
3760 g_free(__filter->service_data_uuid);
3761 g_free(__filter->service_data);
3762 g_free(__filter->service_data_mask);
3764 __filter->service_data_uuid = strdup(uuid);
3765 __filter->service_data = g_memdup(data, data_len);
3766 __filter->service_data_len = data_len;
3767 __filter->service_data_mask = NULL;
3769 return BT_ERROR_NONE;
3772 int bt_adapter_le_scan_filter_set_service_data_with_mask(bt_scan_filter_h scan_filter,
3773 const char *uuid, const char *data, unsigned int data_len,
3774 const char *mask, unsigned int mask_len)
3776 bt_le_scan_filter_s *__filter = (bt_le_scan_filter_s *)scan_filter;
3778 BT_CHECK_LE_SUPPORT();
3779 BT_CHECK_INIT_STATUS();
3780 BT_CHECK_INPUT_PARAMETER(scan_filter);
3781 BT_CHECK_INPUT_PARAMETER(uuid);
3782 BT_CHECK_INPUT_PARAMETER(data);
3783 BT_CHECK_INPUT_PARAMETER(mask);
3785 if (data_len != mask_len || data_len > 27) {
3786 BT_ERR("INVALID_PARAMETER(0x%08x)",
3787 BT_ERROR_INVALID_PARAMETER); /* LCOV_EXCL_LINE */
3788 return BT_ERROR_INVALID_PARAMETER;
3791 g_free(__filter->service_data_uuid);
3792 g_free(__filter->service_data);
3793 g_free(__filter->service_data_mask);
3795 __filter->service_data_uuid = strdup(uuid);
3796 __filter->service_data = g_memdup(data, data_len);
3797 __filter->service_data_len = data_len;
3798 __filter->service_data_mask = g_memdup(mask, data_len);
3800 return BT_ERROR_NONE;
3803 int bt_adapter_le_scan_filter_set_manufacturer_data(bt_scan_filter_h scan_filter,
3804 int manufacturer_id, const char *data,
3805 unsigned int data_len)
3807 bt_le_scan_filter_s *__filter = (bt_le_scan_filter_s *)scan_filter;
3809 BT_CHECK_LE_SUPPORT();
3810 BT_CHECK_INIT_STATUS();
3811 BT_CHECK_INPUT_PARAMETER(scan_filter);
3813 if (manufacturer_id < 0 || manufacturer_id > 0xFFFF) {
3814 BT_ERR("manufacturer_id is %.8x(0x%08x)", manufacturer_id,
3815 BT_ERROR_INVALID_PARAMETER); /* LCOV_EXCL_LINE */
3816 return BT_ERROR_INVALID_PARAMETER;
3819 if (data_len > 27) {
3820 BT_ERR("INVALID_PARAMETER(0x%08x)",
3821 BT_ERROR_INVALID_PARAMETER); /* LCOV_EXCL_LINE */
3822 return BT_ERROR_INVALID_PARAMETER;
3825 g_free(__filter->manufacturer_data);
3826 g_free(__filter->manufacturer_data_mask);
3828 __filter->manufacturer_id = manufacturer_id;
3830 __filter->manufacturer_data = g_memdup(data, data_len);
3831 __filter->manufacturer_data_len = data_len;
3833 __filter->manufacturer_data = NULL;
3834 __filter->manufacturer_data_len = 0;
3836 __filter->manufacturer_data_mask = NULL;
3838 return BT_ERROR_NONE;
3841 int bt_adapter_le_scan_filter_set_manufacturer_data_with_mask(bt_scan_filter_h scan_filter,
3842 int manufacturer_id, const char *data,
3843 unsigned int data_len, const char *mask,
3844 unsigned int mask_len)
3846 bt_le_scan_filter_s *__filter = (bt_le_scan_filter_s *)scan_filter;
3848 BT_CHECK_LE_SUPPORT();
3849 BT_CHECK_INIT_STATUS();
3850 BT_CHECK_INPUT_PARAMETER(scan_filter);
3851 BT_CHECK_INPUT_PARAMETER(data);
3852 BT_CHECK_INPUT_PARAMETER(mask);
3854 if (manufacturer_id < 0 || manufacturer_id > 0xFFFF) {
3855 BT_ERR("manufacturer_id is %.8x(0x%08x)", manufacturer_id,
3856 BT_ERROR_INVALID_PARAMETER); /* LCOV_EXCL_LINE */
3857 return BT_ERROR_INVALID_PARAMETER;
3860 if (data_len != mask_len || data_len > 27) {
3861 BT_ERR("INVALID_PARAMETER(0x%08x)",
3862 BT_ERROR_INVALID_PARAMETER); /* LCOV_EXCL_LINE */
3863 return BT_ERROR_INVALID_PARAMETER;
3866 g_free(__filter->manufacturer_data);
3867 g_free(__filter->manufacturer_data_mask);
3869 __filter->manufacturer_id = manufacturer_id;
3870 __filter->manufacturer_data = g_memdup(data, data_len);
3871 __filter->manufacturer_data_len = data_len;
3872 __filter->manufacturer_data_mask = g_memdup(mask, data_len);
3874 return BT_ERROR_NONE;
3877 int bt_adapter_le_scan_filter_register(bt_scan_filter_h scan_filter)
3879 bt_le_scan_filter_s *__filter = (bt_le_scan_filter_s *)scan_filter;
3882 BT_CHECK_LE_SUPPORT();
3883 BT_CHECK_INIT_STATUS();
3884 BT_CHECK_INPUT_PARAMETER(scan_filter);
3885 if (bluetooth_is_le_scanning() == TRUE) {
3886 BT_ERR("NOW_IN_PROGRESS(0x%08x)",
3887 BT_ERROR_NOW_IN_PROGRESS); /* LCOV_EXCL_LINE */
3888 return BT_ERROR_NOW_IN_PROGRESS;
3891 for (l = scan_filter_list; l != NULL; l = l->next) {
3892 bt_le_scan_filter_s *filter = l->data;
3893 if (__filter->filter_id == filter->filter_id) {
3894 scan_filter_list = g_slist_remove(scan_filter_list, filter);
3895 __bt_adapter_le_free_scan_filter(filter);
3900 scan_filter_list = g_slist_append(scan_filter_list,
3901 __bt_adapter_le_duplicate_scan_filter(__filter));
3903 return BT_ERROR_NONE;
3906 int bt_adapter_le_scan_filter_unregister(bt_scan_filter_h scan_filter)
3908 bt_le_scan_filter_s *__filter = (bt_le_scan_filter_s *)scan_filter;
3911 BT_CHECK_LE_SUPPORT();
3912 BT_CHECK_INIT_STATUS();
3913 BT_CHECK_INPUT_PARAMETER(scan_filter);
3914 if (bluetooth_is_le_scanning() == TRUE) {
3915 BT_ERR("NOW_IN_PROGRESS(0x%08x)",
3916 BT_ERROR_NOW_IN_PROGRESS); /* LCOV_EXCL_LINE */
3917 return BT_ERROR_NOW_IN_PROGRESS;
3920 for (l = scan_filter_list; l != NULL; l = l->next) {
3921 bt_le_scan_filter_s *filter = l->data;
3922 if (__filter->filter_id == filter->filter_id) {
3923 scan_filter_list = g_slist_remove(scan_filter_list, filter);
3924 __bt_adapter_le_free_scan_filter(filter);
3929 return BT_ERROR_NONE;
3932 int bt_adapter_le_scan_filter_unregister_all(void)
3934 int error_code = BT_ERROR_NONE;
3936 BT_CHECK_LE_SUPPORT();
3937 BT_CHECK_INIT_STATUS();
3939 if (bluetooth_is_le_scanning() == TRUE) {
3940 BT_ERR("NOW_IN_PROGRESS(0x%08x)",
3941 BT_ERROR_NOW_IN_PROGRESS); /* LCOV_EXCL_LINE */
3942 return BT_ERROR_NOW_IN_PROGRESS;
3945 g_slist_free_full(scan_filter_list, (GDestroyNotify)__bt_adapter_le_free_scan_filter);
3946 scan_filter_list = NULL;
3951 /* LCOV_EXCL_START */
3952 int bt_adapter_le_read_maximum_data_length(
3953 int *max_tx_octets, int *max_tx_time,
3954 int *max_rx_octets, int *max_rx_time)
3956 int ret = BT_ERROR_NONE;
3958 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
3959 BT_CHECK_INIT_STATUS();
3961 bluetooth_le_read_maximum_data_length_t max_le_datalength;
3963 ret = _bt_get_error_code(
3964 bluetooth_le_read_maximum_data_length(&max_le_datalength));
3966 if (ret != BT_ERROR_NONE) {
3967 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret),
3968 ret); /* LCOV_EXCL_LINE */
3972 *max_tx_octets = max_le_datalength.max_tx_octets;
3973 *max_tx_time = max_le_datalength.max_tx_time;
3974 *max_rx_octets = max_le_datalength.max_rx_octets;
3975 *max_rx_time = max_le_datalength.max_rx_time;
3980 int bt_adapter_le_write_host_suggested_default_data_length(
3981 const unsigned int def_tx_Octets,
3982 const unsigned int def_tx_Time)
3984 int ret = BT_ERROR_NONE;
3986 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
3987 BT_CHECK_INIT_STATUS();
3989 /*Range for host suggested txtime is 0x001B-0x00FB and
3990 txocets is 0x0148- 0x0848 as per BT 4.2 spec*/
3991 if (((def_tx_Octets < 27 || def_tx_Octets > 251) ||
3992 (def_tx_Time < 328 || def_tx_Time > 2120)) ||
3993 ((def_tx_Octets < 0x001B || def_tx_Octets > 0x00FB) ||
3994 (def_tx_Time < 0x0148 || def_tx_Time > 0x0848))) {
3995 return BT_ERROR_INVALID_PARAMETER;
3998 ret = _bt_get_error_code(
3999 bluetooth_le_write_host_suggested_default_data_length(
4000 def_tx_Octets, def_tx_Time));
4002 if (ret != BT_ERROR_NONE)
4003 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret),
4004 ret); /* LCOV_EXCL_LINE */
4009 int bt_adapter_le_read_suggested_default_data_length(
4010 unsigned int *def_tx_Octets, unsigned int *def_tx_Time)
4012 int ret = BT_ERROR_NONE;
4014 BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_COMMON);
4015 BT_CHECK_INIT_STATUS();
4017 bluetooth_le_read_host_suggested_data_length_t data_values;
4019 ret = _bt_get_error_code(
4020 bluetooth_le_read_suggested_default_data_length(&data_values));
4022 if (ret != BT_ERROR_NONE) {
4023 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret),
4024 ret); /* LCOV_EXCL_LINE */
4028 *def_tx_Octets = data_values.def_tx_octets;
4029 *def_tx_Time = data_values.def_tx_time;
4034 int bt_adapter_force_hcidump(int timeout)
4036 int error_code = BT_ERROR_NONE;
4038 BT_CHECK_LE_SUPPORT();
4039 BT_CHECK_INIT_STATUS();
4041 error_code = _bt_get_error_code(bluetooth_force_hcidump(timeout));
4043 if (error_code != BT_ERROR_NONE)
4044 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), error_code);
4049 int bt_adapter_set_authentication_req_cb(bt_adapter_authentication_req_cb callback,
4052 BT_CHECK_INIT_STATUS();
4053 _bt_set_cb(BT_EVENT_AUTHENTICATION_REQUEST, callback, user_data);
4054 return BT_ERROR_NONE;
4057 int bt_adapter_set_authentication_request_cb(bt_adapter_authentication_request_cb callback,
4060 BT_CHECK_INIT_STATUS();
4061 BT_INFO("Setting callback for bt_adapter_authentication_request_cb for event %d", BT_EVENT_AUTHENTICATION_REQUEST_NEW);
4062 _bt_set_cb(BT_EVENT_AUTHENTICATION_REQUEST_NEW, callback, user_data);
4063 return BT_ERROR_NONE;
4066 int bt_adapter_unset_authentication_req_cb(void)
4068 BT_CHECK_INIT_STATUS();
4069 _bt_unset_cb(BT_EVENT_AUTHENTICATION_REQUEST);
4070 return BT_ERROR_NONE;
4073 int bt_adapter_unset_authentication_request_cb(void)
4075 BT_CHECK_INIT_STATUS();
4076 _bt_unset_cb(BT_EVENT_AUTHENTICATION_REQUEST_NEW);
4077 return BT_ERROR_NONE;
4080 int bt_adapter_le_scan_filter_set_ibeacon(bt_scan_filter_h scan_filter)
4082 bt_le_scan_filter_s *__filter = (bt_le_scan_filter_s *)scan_filter;
4083 int ibeacon_manufacturer_id = COMPANY_ID_APPLE;
4085 BT_CHECK_LE_SUPPORT();
4086 BT_CHECK_INIT_STATUS();
4087 BT_CHECK_INPUT_PARAMETER(scan_filter);
4091 g_free(__filter->manufacturer_data);
4092 g_free(__filter->manufacturer_data_mask);
4094 __filter->manufacturer_id = ibeacon_manufacturer_id;
4095 __filter->manufacturer_data = NULL;
4096 __filter->manufacturer_data_len = 0;
4097 __filter->manufacturer_data_mask = NULL;
4099 return BT_ERROR_NONE;
4102 int bt_adapter_le_scan_filter_set_proximity_uuid(bt_scan_filter_h scan_filter)
4106 BT_CHECK_LE_SUPPORT();
4107 BT_CHECK_INIT_STATUS();
4108 BT_CHECK_INPUT_PARAMETER(scan_filter);
4110 /* register Linkloss alert scan filter */
4111 ret = bt_adapter_le_scan_filter_create(&pxp_linkloss_alert_filter);
4112 if (ret == BT_ERROR_NONE) {
4114 ret = bt_adapter_le_scan_filter_set_service_uuid(pxp_linkloss_alert_filter, PXP_LINK_LOSS_SVC_UUID);
4115 if (ret == BT_ERROR_NONE)
4116 ret = bt_adapter_le_scan_filter_register(pxp_linkloss_alert_filter);
4117 if (ret != BT_ERROR_NONE) {
4118 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
4120 ret = bt_adapter_le_scan_filter_destroy(pxp_linkloss_alert_filter);
4121 if (ret != BT_ERROR_NONE)
4122 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
4124 pxp_linkloss_alert_filter = NULL;
4127 return BT_ERROR_OPERATION_FAILED;
4130 /* register Immediate alert scan filter */
4131 ret = bt_adapter_le_scan_filter_create(&pxp_immediate_alert_filter);
4132 if (ret == BT_ERROR_NONE) {
4134 ret = bt_adapter_le_scan_filter_set_service_uuid(pxp_immediate_alert_filter, PXP_IMMEDIATE_ALERT_SVC_UUID);
4135 if (ret == BT_ERROR_NONE)
4136 ret = bt_adapter_le_scan_filter_register(pxp_immediate_alert_filter);
4137 if (ret != BT_ERROR_NONE) {
4138 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
4140 ret = bt_adapter_le_scan_filter_destroy(pxp_immediate_alert_filter);
4141 if (ret != BT_ERROR_NONE)
4142 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
4144 pxp_immediate_alert_filter = NULL;
4147 return BT_ERROR_OPERATION_FAILED;
4150 /* register Signal loss scan filter */
4151 ret = bt_adapter_le_scan_filter_create(&pxp_signal_loss_filter);
4152 if (ret == BT_ERROR_NONE) {
4154 ret = bt_adapter_le_scan_filter_set_service_uuid(pxp_signal_loss_filter, PXP_TX_POWER_SVC_UUID);
4155 if (ret == BT_ERROR_NONE)
4156 ret = bt_adapter_le_scan_filter_register(pxp_signal_loss_filter);
4157 if (ret != BT_ERROR_NONE) {
4158 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
4160 ret = bt_adapter_le_scan_filter_destroy(pxp_signal_loss_filter);
4161 if (ret != BT_ERROR_NONE)
4162 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
4164 pxp_signal_loss_filter = NULL;
4167 return BT_ERROR_OPERATION_FAILED;
4172 int bt_adapter_le_scan_filter_unset_proximity_uuid(bt_scan_filter_h scan_filter)
4174 int ret = BT_ERROR_NONE;
4176 BT_CHECK_LE_SUPPORT();
4177 BT_CHECK_INIT_STATUS();
4178 BT_CHECK_INPUT_PARAMETER(scan_filter);
4180 /* unregister Linkloss alert scan filter */
4181 if (pxp_linkloss_alert_filter) {
4183 ret = bt_adapter_le_scan_filter_unregister(pxp_linkloss_alert_filter);
4184 if (ret != BT_ERROR_NONE)
4185 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
4187 ret = bt_adapter_le_scan_filter_destroy(pxp_linkloss_alert_filter);
4188 if (ret != BT_ERROR_NONE)
4189 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
4191 pxp_linkloss_alert_filter = NULL;
4194 /* unregister Immediate alert scan filter */
4195 if (pxp_immediate_alert_filter) {
4197 ret = bt_adapter_le_scan_filter_unregister(pxp_immediate_alert_filter);
4198 if (ret != BT_ERROR_NONE)
4199 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
4201 ret = bt_adapter_le_scan_filter_destroy(pxp_immediate_alert_filter);
4202 if (ret != BT_ERROR_NONE)
4203 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
4205 pxp_immediate_alert_filter = NULL;
4208 /* unregister Signal loss scan filter */
4209 if (pxp_signal_loss_filter) {
4211 ret = bt_adapter_le_scan_filter_unregister(pxp_signal_loss_filter);
4212 if (ret != BT_ERROR_NONE)
4213 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
4215 ret = bt_adapter_le_scan_filter_destroy(pxp_signal_loss_filter);
4216 if (ret != BT_ERROR_NONE)
4217 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
4219 pxp_signal_loss_filter = NULL;
4224 /* LCOV_EXCL_STOP */
4226 int bt_adapter_le_scan_filter_set_type(bt_scan_filter_h scan_filter,
4227 bt_adapter_le_scan_filter_type_e mode)
4229 if (mode == BT_ADAPTER_LE_SCAN_FILTER_TYPE_IBEACON)
4230 return bt_adapter_le_scan_filter_set_ibeacon(scan_filter);
4231 else if (mode == BT_ADAPTER_LE_SCAN_FILTER_TYPE_PROXIMITY_UUID) /* LCOV_EXCL_LINE */
4232 return bt_adapter_le_scan_filter_set_proximity_uuid(scan_filter); /* LCOV_EXCL_LINE */
4234 return BT_ERROR_INVALID_PARAMETER;
4237 /* LCOV_EXCL_START */
4238 int bt_adapter_passkey_reply(char *passkey, bool authentication_reply)
4240 BT_CHECK_INIT_STATUS();
4241 BT_CHECK_INPUT_PARAMETER(passkey); /* LCOV_EXCL_LINE */
4242 int error_code = BT_ERROR_NONE; /* LCOV_EXCL_LINE */
4243 error_code = _bt_get_error_code(bluetooth_passkey_reply(passkey, authentication_reply)); /* LCOV_EXCL_LINE */
4244 if (error_code != BT_ERROR_NONE) /* LCOV_EXCL_LINE */
4245 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), error_code); /* LCOV_EXCL_LINE */
4250 int bt_adapter_passkey_confirmation_reply(bool confirmation_reply)
4252 BT_CHECK_INIT_STATUS();
4254 int error_code = BT_ERROR_NONE; /* LCOV_EXCL_LINE */
4255 error_code = _bt_get_error_code(bluetooth_passkey_confirmation_reply(confirmation_reply)); /* LCOV_EXCL_LINE */
4256 if (error_code != BT_ERROR_NONE) /* LCOV_EXCL_LINE */
4257 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), error_code); /* LCOV_EXCL_LINE */
4261 /* LCOV_EXCL_STOP */
4263 int bt_adapter_le_is_2m_phy_supported(bool *is_supported)
4265 int ret = BT_ERROR_NONE;
4266 gboolean support = FALSE;
4268 BT_CHECK_LE_5_0_SUPPORT();
4269 BT_CHECK_INIT_STATUS();
4270 BT_CHECK_INPUT_PARAMETER(is_supported);
4272 ret = _bt_get_error_code(bluetooth_is_le_2m_phy_supported(&support));
4273 if (ret != BT_ERROR_NONE) {
4274 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
4278 *is_supported = support ? true : false;
4280 return BT_ERROR_NONE;
4283 int bt_adapter_le_is_coded_phy_supported(bool *is_supported)
4285 int ret = BT_ERROR_NONE;
4286 gboolean support = FALSE;
4288 BT_CHECK_LE_5_0_SUPPORT();
4289 BT_CHECK_INIT_STATUS();
4290 BT_CHECK_INPUT_PARAMETER(is_supported);
4292 ret = _bt_get_error_code(bluetooth_is_le_coded_phy_supported(&support));
4293 if (ret != BT_ERROR_NONE) {
4294 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
4298 *is_supported = support ? true : false;
4300 return BT_ERROR_NONE;
4303 /* LCOV_EXCL_START */
4304 int bt_adapter_le_is_scan_filter_supported(bool *is_supported)
4306 int ret = BT_ERROR_NONE;
4307 gboolean support = FALSE;
4309 BT_CHECK_ADAPTER_STATUS();
4310 BT_CHECK_INIT_STATUS();
4311 BT_CHECK_INPUT_PARAMETER(is_supported);
4313 ret = _bt_get_error_code(bluetooth_is_scan_filter_supported(&support));
4315 if (ret != BT_ERROR_NONE) {
4316 BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
4320 *is_supported = support ? true : false;
4322 return BT_ERROR_NONE;
4324 /* LCOV_EXCL_STOP */