diff options
author | Pyun DoHyun <dh79.pyun@samsung.com> | 2019-09-16 06:14:00 +0000 |
---|---|---|
committer | Gerrit Code Review <gerrit@review.ap-northeast-2.compute.internal> | 2019-09-16 06:14:00 +0000 |
commit | 2c053cbe89cf2ec03b894ddc29d5666a4267a1b3 (patch) | |
tree | 3994032b382d207313734a3d2996061f51af2f87 | |
parent | 515efd20780d78bc7d0c6051a65ed73b83e15e14 (diff) | |
parent | 2eb5fd42c86a3b9475f48c1f538660defbead9ae (diff) | |
download | bluetooth-2c053cbe89cf2ec03b894ddc29d5666a4267a1b3.tar.gz bluetooth-2c053cbe89cf2ec03b894ddc29d5666a4267a1b3.tar.bz2 bluetooth-2c053cbe89cf2ec03b894ddc29d5666a4267a1b3.zip |
Merge "Implement new API to get le oob data" into tizen
-rw-r--r-- | include/bluetooth_internal.h | 33 | ||||
-rw-r--r-- | src/bluetooth-adapter.c | 69 | ||||
-rw-r--r-- | test/bt_unit_test.c | 48 | ||||
-rw-r--r-- | test/bt_unit_test.h | 1 |
4 files changed, 147 insertions, 4 deletions
diff --git a/include/bluetooth_internal.h b/include/bluetooth_internal.h index 1db7f4a..d1ef153 100644 --- a/include/bluetooth_internal.h +++ b/include/bluetooth_internal.h @@ -815,6 +815,38 @@ int bt_adapter_le_enable_privacy(bool enable_privacy); /** * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_LE_MODULE + * @brief Gets the Confirmation and Random value, synchronously. + * @since_tizen 5.5 + * @privlevel platform + * @privilege %http://tizen.org/privilege/bluetooth.admin + * + * @remarks The @a local_address, confirmation and random must be released using free() + * + * @param[out] local_address Local device address + * @param[out] address_type Local device address type + * @param[out] confirmation The confirmation value + * @param[out] random The random value + * @param[out] confirmation_len The length of @a confirmation + * @param[out] random_len The length of @a random + * @return 0 on success, otherwise a negative error value. + * @retval #BT_ERROR_NONE Successful + * @retval #BT_ERROR_NOT_INITIALIZED Not initialized + * @retval #BT_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #BT_ERROR_NOT_ENABLED Not enabled + * @retval #BT_ERROR_OPERATION_FAILED Operation failed + * @retval #BT_ERROR_NOT_SUPPORTED Not supported + * @retval #BT_ERROR_PERMISSION_DENIED Permission denied + * + * @pre The state of local Bluetooth must be #BT_ADAPTER_ENABLED. + * @pre The Bluetooth service must be initialized with bt_initialize(). + * @see bt_initialize() + */ +int bt_adapter_le_get_local_oob_ext_data(char **local_address, bt_device_address_type_e *address_type, + unsigned char **confirmation, unsigned char **random, + int *confirmation_len, int *random_len); + +/** + * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_LE_MODULE * @brief Sets the Hash and Randomizer value, synchronously for LE OOB pairing. * @since_tizen 4.0 * @privlevel platform @@ -844,7 +876,6 @@ int bt_adapter_le_set_remote_oob_ext_data(const char *remote_address, const unsigned char *hash256, const unsigned char *randomizer256, int hash256_len, int randomizer256_len); - /** * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_LE_MODULE * @brief Set advertising filter policy to use white list diff --git a/src/bluetooth-adapter.c b/src/bluetooth-adapter.c index 956e8c8..bb8c1ab 100644 --- a/src/bluetooth-adapter.c +++ b/src/bluetooth-adapter.c @@ -1205,6 +1205,73 @@ int bt_adapter_set_remote_oob_ext_data(const char *remote_address, } /* LCOV_EXCL_START */ +int bt_adapter_le_get_local_oob_ext_data(char **local_address, bt_device_address_type_e *address_type, + unsigned char **confirmation, unsigned char **random, + int *confirmation_len, int *random_len) +{ + int ret = BT_ERROR_NONE; + unsigned char *eir_data = NULL; + unsigned char *field_data = NULL; + int eir_len = 0; + int field_len = 0; + bt_oob_data_t oob_data; + + #define EIR_FLAGS 0x01 + #define EIR_LE_BDADDR 0x1B + #define EIR_LE_ROLE 0x1C + #define EIR_LE_SC_CONFIRM 0x22 + #define EIR_LE_SC_RANDOM 0x23 + + BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_OOB); + BT_CHECK_INIT_STATUS(); + BT_CHECK_INPUT_PARAMETER(local_address); + BT_CHECK_INPUT_PARAMETER(address_type); + BT_CHECK_INPUT_PARAMETER(confirmation); + BT_CHECK_INPUT_PARAMETER(random); + BT_CHECK_INPUT_PARAMETER(confirmation_len); + BT_CHECK_INPUT_PARAMETER(random_len); + + + ret = _bt_get_error_code(bluetooth_le_oob_read_local_data(&oob_data)); + if (BT_ERROR_NONE == ret) { + eir_data = oob_data.eir; + eir_len = oob_data.eir_len; + + while (eir_len > 1) { + BT_DBG("eir_data [%02x %02x ...]", eir_data[0], eir_data[1]); + field_len = eir_data[0]; + if (eir_data[1] == EIR_LE_BDADDR || eir_data[1] == EIR_LE_SC_CONFIRM || eir_data[1] == EIR_LE_SC_RANDOM) { + field_data = g_malloc0(sizeof(char) * field_len - 1); + memcpy(field_data, &eir_data[2], field_len - 1); + + if (eir_data[1] == EIR_LE_BDADDR) { + char address[18] = { 0, }; + snprintf(address, 18, "%02X:%02X:%02X:%02X:%02X:%02X", + field_data[5], field_data[4], field_data[3], field_data[2], field_data[1], field_data[0]); + *local_address = strdup(address); + *address_type = field_data[6]; + g_free(field_data); + } else if (eir_data[1] == EIR_LE_SC_CONFIRM) { + *confirmation = field_data; + *confirmation_len = field_len - 1; + } else if (eir_data[1] == EIR_LE_SC_RANDOM) { + *random = field_data; + *random_len = field_len - 1; + } + } + + eir_len = eir_len - field_len - 1; + eir_data += field_len + 1; + } + } else { + BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret); + } + + return ret; +} +/* LCOV_EXCL_STOP */ + +/* LCOV_EXCL_START */ int bt_adapter_le_set_remote_oob_ext_data(const char *remote_address, bt_device_address_type_e address_type, const unsigned char *hash256, const unsigned char *randomizer256, @@ -1240,7 +1307,7 @@ int bt_adapter_le_set_remote_oob_ext_data(const char *remote_address, addr_type = (address_type == BT_DEVICE_PUBLIC_ADDRESS) ? BLUETOOTH_BDADDR_LE_PUBLIC : BLUETOOTH_BDADDR_LE_RANDOM; - ret = _bt_get_error_code(bluetooth_oob_add_remote_data(&addr_hex, + ret = _bt_get_error_code(bluetooth_le_oob_add_remote_data(&addr_hex, addr_type, &oob_data)); if (BT_ERROR_NONE != ret) BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret); diff --git a/test/bt_unit_test.c b/test/bt_unit_test.c index 5259e00..ea6003e 100644 --- a/test/bt_unit_test.c +++ b/test/bt_unit_test.c @@ -324,6 +324,8 @@ tc_table_t tc_adapter_le[] = { , BT_UNIT_TEST_FUNCTION_ADAPTER_LE_REMOVE_WHITE_LIST}, {"bt_adapter_le_enable_privacy" , BT_UNIT_TEST_FUNCTION_ADAPTER_LE_ENABLE_PRIVACY}, + {"bt_adapter_le_get_local_oob_ext_data" + , BT_UNIT_TEST_FUNCTION_ADAPTER_LE_GET_LOCAL_OOB_EXT_DATA}, {"bt_adapter_le_set_remote_oob_ext_data" , BT_UNIT_TEST_FUNCTION_ADAPTER_LE_SET_REMOTE_OOB_EXT_DATA}, {"Register scan filter (Device Address)" @@ -3457,9 +3459,22 @@ int test_set_params(int test_id, char *param) TC_PRT("Input param(%d) type:%s", param_index + 1, param_type); break; case BT_UNIT_TEST_FUNCTION_ADAPTER_LE_SET_REMOTE_OOB_EXT_DATA: - param_count = 3; + param_count = 4; param_type = BT_UNIT_TEST_PARAM_TYPE_STRING; - TC_PRT("Input param(%d) type:%s", param_index + 1, param_type); + switch (param_index) { + case 0: + TC_PRT("Remote address"); + break; + case 1: + TC_PRT("Address type (0 : Public, 1 : Random"); + break; + case 2: + TC_PRT("confirmation"); + break; + case 3: + TC_PRT("random"); + break; + } break; default: TC_PRT("There is no param to set\n"); @@ -4928,6 +4943,35 @@ int test_input_callback(void *data) break; } + case BT_UNIT_TEST_FUNCTION_ADAPTER_LE_GET_LOCAL_OOB_EXT_DATA: { + char *local_address; + bt_device_address_type_e address_type = 0; + unsigned char *confirm; + unsigned char *random; + int confirm_len; + int random_len; + int i; + + bt_adapter_le_get_local_oob_ext_data(&local_address, &address_type, + &confirm, &random, + &confirm_len, &random_len); + + printf("local address : %s\n", local_address); + printf("address type : %d\n", address_type); + printf("confirm : "); + for (i=0; i<confirm_len; i++) + printf("%02x", confirm[i]); + printf("\nrandom : "); + for (i=0; i<random_len; i++) + printf("%02x", random[i]); + printf("\n"); + + g_free(local_address); + g_free(confirm); + g_free(random); + break; + } + case BT_UNIT_TEST_FUNCTION_ADAPTER_LE_SET_REMOTE_OOB_EXT_DATA: { char remote_addr[18]; unsigned char *param_data[2]; diff --git a/test/bt_unit_test.h b/test/bt_unit_test.h index c98f52a..4d7cf69 100644 --- a/test/bt_unit_test.h +++ b/test/bt_unit_test.h @@ -127,6 +127,7 @@ BT_UNIT_TEST_FUNCTION_ADAPTER_LE_SET_SCAN_TYPE, BT_UNIT_TEST_FUNCTION_ADAPTER_LE_REMOVE_WHITE_LIST, BT_UNIT_TEST_FUNCTION_ADAPTER_LE_CLEAR_WHITE_LIST, BT_UNIT_TEST_FUNCTION_ADAPTER_LE_ENABLE_PRIVACY, + BT_UNIT_TEST_FUNCTION_ADAPTER_LE_GET_LOCAL_OOB_EXT_DATA, BT_UNIT_TEST_FUNCTION_ADAPTER_LE_SET_REMOTE_OOB_EXT_DATA, BT_UNIT_TEST_FUNCTION_ADAPTER_LE_REGISTER_SCAN_FILTER_DEVICE_ADDRESS, BT_UNIT_TEST_FUNCTION_ADAPTER_LE_REGISTER_SCAN_FILTER_SERVICE_UUID, |