Implement new API to get le oob data 50/213850/1
authorinjun.yang <injun.yang@samsung.com>
Tue, 22 Jan 2019 08:49:28 +0000 (17:49 +0900)
committerDoHyun Pyun <dh79.pyun@samsung.com>
Mon, 16 Sep 2019 01:13:08 +0000 (10:13 +0900)
[Model] All
[BinType] AP
[Customer] OPEN

[Issue#] N/A
[Request] Internal
[Occurrence Version] N/A

[Problem] n/a
[Cause & Measure] Implement new API to get le oob data
[Checking Method] n/a

[Team] IoT Hub
[Developer] Injun Yang
[Solution company] Samsung
[Change Type] Specification change

Change-Id: If2bf516b9351807c3223873403bceb137f6ec36f
Signed-off-by: injun.yang <injun.yang@samsung.com>
Signed-off-by: DoHyun Pyun <dh79.pyun@samsung.com>
include/bluetooth_internal.h
src/bluetooth-adapter.c
test/bt_unit_test.c
test/bt_unit_test.h

index 318fc70a63e34fe843035fa042352adc5798e62e..da9e0002028a4d8c833cd43c00de7aa2fc784e71 100644 (file)
@@ -787,6 +787,38 @@ int bt_adapter_le_remove_white_list(const char *address, bt_device_address_type_
  */
 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.
@@ -818,7 +850,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
index a9f7b4ded310649b2cb0e8c551d357ba1726345c..8884a47344983dd6387245e9815c43f6ddec43d7 100644 (file)
@@ -1177,6 +1177,73 @@ int bt_adapter_set_remote_oob_ext_data(const char *remote_address,
        return ret; /* LCOV_EXCL_STOP */
 }
 
+/* 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,
@@ -1213,7 +1280,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);
index 3f9794d9394e64b1eece1f1bfbce302f191c318a..15799fb895bff2c71e02d944ffbd7f4b80fe3e97 100644 (file)
@@ -322,6 +322,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)"
@@ -3455,9 +3457,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");
@@ -4916,6 +4931,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];
index c92f27d017f537a161ee1d1d8d4030101dcb4eb2..d88de2647f4860295c0d8d35996356aa230ea569 100644 (file)
@@ -126,6 +126,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,