From: Anuj Jain Date: Mon, 21 Aug 2023 12:27:38 +0000 (+0530) Subject: BT 5.0 : Support for Extended Advertisement X-Git-Tag: accepted/tizen/unified/20230830.170543^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=38715dafe9431a25ee833d977f3aac78c2c5adf6;p=platform%2Fcore%2Fapi%2Fbluetooth.git BT 5.0 : Support for Extended Advertisement This patch provides initial support for extended advertisement As there is no support for Extended advertisement on bluez layer therefore this feature is currently disabled. Change-Id: I133ea5ed4535dc2fd3901fe29d6338e69109c3d8 Signed-off-by: Anuj Jain --- diff --git a/include/bluetooth_internal.h b/include/bluetooth_internal.h index e1fe06d..d28faf4 100644 --- a/include/bluetooth_internal.h +++ b/include/bluetooth_internal.h @@ -738,6 +738,70 @@ int bt_adapter_le_set_scan_role(bt_adapter_le_scan_role_e role); * @see bt_initialize() */ int bt_adapter_le_set_scan_phy(bt_adapter_le_phy_e phy); + +/** + * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_LE_MODULE + * @brief Sets Bluetooth LE scan role. + * @since_tizen 8.0 + * @privlevel public + * @privilege %http://tizen.org/privilege/bluetooth + * @param[in] isLegacy Advertisement is extended or legacy + * + * @return 0 on success, otherwise a negative error value. + * @retval #BT_ERROR_NONE Successful + * @retval #BT_ERROR_NOT_ENABLED Adapter is not enabled + * @retval #BT_ERROR_INVALID_PARAMETER Parameter is invalid + * @retval #BT_ERROR_PERMISSION_DENIED Permission denied + * @retval #BT_ERROR_NOT_SUPPORTED Not supported + * @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_set_advertising_legacy_mode(bt_advertiser_h advertiser, bool isLegacy); + +/** + * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_LE_MODULE + * @brief Sets Bluetooth LE scan role. + * @since_tizen 8.0 + * @privlevel public + * @privilege %http://tizen.org/privilege/bluetooth + * @param[in] primary_phy Primary phy of advertiser. Valid values are BT_LE_1M_PHY, BT_LE_CODED_PHY. + * + * @return 0 on success, otherwise a negative error value. + * @retval #BT_ERROR_NONE Successful + * @retval #BT_ERROR_NOT_ENABLED Adapter is not enabled + * @retval #BT_ERROR_INVALID_PARAMETER Parameter is invalid + * @retval #BT_ERROR_PERMISSION_DENIED Permission denied + * @retval #BT_ERROR_NOT_SUPPORTED Not supported + * @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_set_advertising_primary_phy(bt_advertiser_h advertiser, + bt_adapter_le_phy_e primary_phy); + +/** + * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_LE_MODULE + * @brief Sets Bluetooth LE scan role. + * @since_tizen 8.0 + * @privlevel public + * @privilege %http://tizen.org/privilege/bluetooth + * @param[in] secondary_phy Secondary phy of advertiser, Valid values are BT_LE_1M_PHY, + * BT_LE_2M_PHY, BT_LE_CODED_PHY. + * + * @return 0 on success, otherwise a negative error value. + * @retval #BT_ERROR_NONE Successful + * @retval #BT_ERROR_NOT_ENABLED Adapter is not enabled + * @retval #BT_ERROR_INVALID_PARAMETER Parameter is invalid + * @retval #BT_ERROR_PERMISSION_DENIED Permission denied + * @retval #BT_ERROR_NOT_SUPPORTED Not supported + * @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_set_advertising_secondary_phy(bt_advertiser_h advertiser, + bt_adapter_le_phy_e secondary_phy); + /** * @internal * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_MODULE diff --git a/include/bluetooth_private.h b/include/bluetooth_private.h index ac2b36c..2bf9a9a 100644 --- a/include/bluetooth_private.h +++ b/include/bluetooth_private.h @@ -310,6 +310,9 @@ typedef struct { int tx_power_level; int advertising_interval_min; int advertising_interval_max; + bool is_legacy; + int primary_phy; + int secondary_phy; } bt_adapter_le_advertising_parameters_s; typedef struct { diff --git a/src/bluetooth-adapter.c b/src/bluetooth-adapter.c index 6fb7108..dbb5d4a 100644 --- a/src/bluetooth-adapter.c +++ b/src/bluetooth-adapter.c @@ -1747,6 +1747,8 @@ int bt_adapter_le_create_advertiser(bt_advertiser_h *advertiser) __adv = (bt_advertiser_s *)g_malloc0(sizeof(bt_advertiser_s)); __adv->handle = GPOINTER_TO_INT(__adv); + __adv->adv_params.is_legacy = TRUE; + *advertiser = (bt_advertiser_h)__adv; advertiser_list = g_slist_append(advertiser_list, __adv); @@ -1871,6 +1873,7 @@ static int bt_adapter_le_add_advertising_data(bt_advertiser_h advertiser, char *new_p; int adv_flag_len = 0; int adv_ext_len = 0; + int max_data_len_supported = 0; BT_CHECK_LE_SUPPORT(); BT_CHECK_INIT_STATUS(); @@ -1900,8 +1903,18 @@ static int bt_adapter_le_add_advertising_data(bt_advertiser_h advertiser, data_type == BT_ADAPTER_LE_ADVERTISING_DATA_TX_POWER_LEVEL) adv_ext_len = *system_data_len + 1; + if (__adv->adv_params.is_legacy == FALSE) { + BT_DBG("Extended Advertiser!"); + max_data_len_supported = 251;//TODO: Make Enum for len + } + + else { + BT_DBG("Legacy advertiser!"); + max_data_len_supported = 31;//TODO: Make Enum for len + } + /* 2 bytes are required for Length and AD Type */ - if (adv_flag_len + *len + adv_ext_len + data_size + 2 > 31) { + if (adv_flag_len + *len + adv_ext_len + data_size + 2 > max_data_len_supported) { BT_ERR("Quota exceeded"); /* LCOV_EXCL_LINE */ return BT_ERROR_QUOTA_EXCEEDED; /* LCOV_EXCL_LINE */ } @@ -1928,6 +1941,87 @@ static int bt_adapter_le_add_advertising_data(bt_advertiser_h advertiser, return BT_ERROR_NONE; } +int bt_adapter_le_set_advertising_legacy_mode(bt_advertiser_h advertiser, bool isLegacy) +{ + int error_code; + bt_advertiser_s *__adv = (bt_advertiser_s *)advertiser; + + BT_CHECK_INIT_STATUS(); + BT_CHECK_LE_5_0_SUPPORT(); + BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_LE_ADV_EXT); + BT_CHECK_INPUT_PARAMETER(advertiser); + + error_code = _bt_get_error_code( + bluetooth_check_privilege_advertising_parameter()); + if (error_code != BT_ERROR_NONE) { + BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), + error_code); + return BT_ERROR_PERMISSION_DENIED; + } + + BT_DBG("Setting legacy mode %d", isLegacy); + __adv->adv_params.is_legacy = isLegacy; + + return BT_ERROR_NONE; +} + + +int bt_adapter_le_set_advertising_primary_phy(bt_advertiser_h advertiser, + bt_adapter_le_phy_e primary_phy) +{ + int error_code; + bt_advertiser_s *__adv = (bt_advertiser_s *)advertiser; + + BT_CHECK_INIT_STATUS(); + BT_CHECK_LE_5_0_SUPPORT(); + BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_LE_ADV_EXT); + BT_CHECK_INPUT_PARAMETER(advertiser); + + error_code = _bt_get_error_code( + bluetooth_check_privilege_advertising_parameter()); + if (error_code != BT_ERROR_NONE) { + BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), + error_code); + return BT_ERROR_PERMISSION_DENIED; + } + + if (primary_phy != BT_LE_1M_PHY || primary_phy != BT_LE_CODED_PHY) + return BT_ERROR_INVALID_PARAMETER; + + __adv->adv_params.primary_phy = primary_phy; + BT_INFO("Set primary PHY %d for advertiser", primary_phy); + + return BT_ERROR_NONE; +} + +int bt_adapter_le_set_advertising_secondary_phy(bt_advertiser_h advertiser, + bt_adapter_le_phy_e secondary_phy) +{ + int error_code; + bt_advertiser_s *__adv = (bt_advertiser_s *)advertiser; + + BT_CHECK_INIT_STATUS(); + BT_CHECK_LE_5_0_SUPPORT(); + BT_CHECK_SUPPORTED_FEATURE(BT_FEATURE_LE_ADV_EXT); + BT_CHECK_INPUT_PARAMETER(advertiser); + + error_code = _bt_get_error_code( + bluetooth_check_privilege_advertising_parameter()); + if (error_code != BT_ERROR_NONE) { + BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), + error_code); + return BT_ERROR_PERMISSION_DENIED; + } + + if (secondary_phy == BT_LE_ALL_PHY) + return BT_ERROR_INVALID_PARAMETER; + + __adv->adv_params.secondary_phy = secondary_phy; + BT_INFO("Set secondary PHY %d for advertiser", secondary_phy); + + return BT_ERROR_NONE; +} + /* LCOV_EXCL_START */ static int bt_adapter_le_remove_advertising_data(bt_advertiser_h advertiser, bt_adapter_le_packet_type_e pkt_type, @@ -2780,7 +2874,7 @@ int bt_adapter_le_start_advertising_new(bt_advertiser_h advertiser, memcpy(adv.data, __adv->adv_data, __adv->adv_data_len); error_code = bluetooth_set_advertising_data(__adv->handle, - &adv, __adv->adv_data_len); + &adv, __adv->adv_data_len, __adv->adv_params.is_legacy); ret = _bt_get_error_code(error_code); if (ret != BT_ERROR_NONE) { BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), @@ -2821,6 +2915,9 @@ int bt_adapter_le_start_advertising_new(bt_advertiser_h advertiser, param.interval_max = max_interval; param.filter_policy = __adv->adv_params.filter_policy; param.type = __adv->adv_params.type; + param.is_legacy = __adv->adv_params.is_legacy; + param.primary_phy = __adv->adv_params.primary_phy; + param.secondary_phy = __adv->adv_params.secondary_phy; param.tx_power_level = __adv->adv_params.tx_power_level; error_code = bluetooth_set_custom_advertising(__adv->handle, TRUE, ¶m); diff --git a/tests/test/bt_unit_test.c b/tests/test/bt_unit_test.c index ebe6d02..ef3f61a 100644 --- a/tests/test/bt_unit_test.c +++ b/tests/test/bt_unit_test.c @@ -339,6 +339,8 @@ tc_table_t tc_adapter_le[] = { , BT_UNIT_TEST_FUNCTION_ADAPTER_LE_SET_ADVERTISING_INTERVAL}, {"bt_adapter_le_start_advertising_new" , BT_UNIT_TEST_FUNCTION_ADAPTER_LE_START_ADVERTISING_NEW}, + {"bt_adapter_le_start_extended_advertising" + , BT_UNIT_TEST_FUNCTION_ADAPTER_LE_START_EXT_ADVERTISING}, {"bt_adapter_le_stop_advertising" , BT_UNIT_TEST_FUNCTION_ADAPTER_LE_STOP_ADVERTISING}, {"bt_adapter_le_add_white_list" @@ -5701,6 +5703,56 @@ int test_input_callback(void *data) TC_PRT("failed with : %s \n", __bt_get_error_message(ret)); break; } + case BT_UNIT_TEST_FUNCTION_ADAPTER_LE_START_EXT_ADVERTISING: { + bt_adapter_le_advertising_state_changed_cb cb; + + bool is_legacy = false;//TODO: Add set is_legacy API in unit test + int primary_phy = 1;//TODO: Add set Primary Phy API in unit test + int secondary_phy = 1;//TODO: Add set Secondary Phy API in unit test + char manufacture_data[] = {"SAMSUNG SAMSUNG SAMSUNG SAMSUNG SAMSUNG SAMSUNG SAMSUNG SAMSUNG SAMSUNG SAMSUNG\n"}; + int manufacturer_id = 117; + + if (advertiser_index == 0) + cb = __bt_adapter_le_advertising_state_changed_cb; + else if (advertiser_index == 1) + cb = __bt_adapter_le_advertising_state_changed_cb_2; + else + cb = __bt_adapter_le_advertising_state_changed_cb_3; + + advertiser = advertiser_list[advertiser_index]; + + if (advertiser == NULL) { + ret = bt_adapter_le_create_advertiser(&advertiser); + TC_PRT("created le advertiser(%d)", ret); + advertiser_list[advertiser_index] = advertiser; + } + + TC_PRT("advertiser: %p", advertiser); + + ret = bt_adapter_le_set_advertising_legacy_mode(advertiser, is_legacy); + if (ret != BT_ERROR_NONE) + TC_PRT("set legacy mode failed with : %s \n", __bt_get_error_message(ret)); + + ret = bt_adapter_le_set_advertising_primary_phy(advertiser, primary_phy); + if (ret != BT_ERROR_NONE) + TC_PRT("set primary phy failed with : %s \n", __bt_get_error_message(ret)); + + ret = bt_adapter_le_set_advertising_secondary_phy(advertiser, secondary_phy); + if (ret != BT_ERROR_NONE) + TC_PRT("set secondary phy failed with : %s \n", __bt_get_error_message(ret)); + + ret = bt_adapter_le_add_advertising_manufacturer_data(advertiser, BT_ADAPTER_LE_PACKET_ADVERTISING, + manufacturer_id, manufacture_data, sizeof(manufacture_data)); + if (ret != BT_ERROR_NONE) { + TC_PRT("add manufacturer data failed with : %s \n", __bt_get_error_message(ret)); + } + + ret = bt_adapter_le_start_advertising_new(advertiser, cb, NULL); + if (ret != BT_ERROR_NONE) + TC_PRT("Atart advertiser failed with : %s \n", __bt_get_error_message(ret)); + break; + } + case BT_UNIT_TEST_FUNCTION_ADAPTER_LE_STOP_ADVERTISING: { int slot_id = 0; diff --git a/tests/test/bt_unit_test.h b/tests/test/bt_unit_test.h index b916cea..d36a168 100644 --- a/tests/test/bt_unit_test.h +++ b/tests/test/bt_unit_test.h @@ -128,7 +128,9 @@ typedef enum { BT_UNIT_TEST_FUNCTION_ADAPTER_LE_SET_ADVERTISING_CUSTOM_TX_POWER, BT_UNIT_TEST_FUNCTION_ADAPTER_LE_SET_ADVERTISING_INTERVAL, BT_UNIT_TEST_FUNCTION_ADAPTER_LE_START_ADVERTISING_NEW, + BT_UNIT_TEST_FUNCTION_ADAPTER_LE_START_EXTENDED_ADVERTISING, BT_UNIT_TEST_FUNCTION_ADAPTER_LE_START_ADVERTISING, + BT_UNIT_TEST_FUNCTION_ADAPTER_LE_START_EXT_ADVERTISING, BT_UNIT_TEST_FUNCTION_ADAPTER_LE_STOP_ADVERTISING, BT_UNIT_TEST_FUNCTION_ADAPTER_LE_ADD_ALLOW_LIST, BT_UNIT_TEST_FUNCTION_ADAPTER_LE_REMOVE_ALLOW_LIST, diff --git a/tests/unittest/mock/bluetooth-mock.c b/tests/unittest/mock/bluetooth-mock.c index de6c825..40e3f9b 100644 --- a/tests/unittest/mock/bluetooth-mock.c +++ b/tests/unittest/mock/bluetooth-mock.c @@ -225,7 +225,7 @@ API int bluetooth_set_custom_advertising(int handle, gboolean enable, bluetooth_ return BLUETOOTH_ERROR_NONE; } -API int bluetooth_set_advertising_data(int handle, const bluetooth_advertising_data_t *value, int length) +API int bluetooth_set_advertising_data(int handle, const bluetooth_advertising_data_t *value, int length, bool is_legacy) { return BLUETOOTH_ERROR_NONE; }