Added code for LE Data length extension feature. 73/48673/5
authorSudha Bheemanna <b.sudha@samsung.com>
Wed, 16 Sep 2015 06:06:03 +0000 (11:36 +0530)
committerSudha Bheemanna <b.sudha@samsung.com>
Mon, 7 Dec 2015 10:17:00 +0000 (15:47 +0530)
Added c-apis for supporting Le data length extension feature.

Change-Id: I3316c7fe22d1a3e47f6dbc69d07af04b40dd034f
Signed-off-by: Sudha Bheemanna <b.sudha@samsung.com>
include/bluetooth_private.h [changed mode: 0644->0755]
src/bluetooth-adapter.c
src/bluetooth-common.c [changed mode: 0644->0755]
src/bluetooth-device.c [changed mode: 0644->0755]
test/bt_unit_test.c [changed mode: 0644->0755]
test/bt_unit_test.h [changed mode: 0644->0755]

old mode 100644 (file)
new mode 100755 (executable)
index 79ffd13..1107154
@@ -110,6 +110,7 @@ typedef enum
        BT_EVENT_GATT_CLIENT_READ_CHARACTERISTIC_LEGACY, /**< GATT characteristic value read callback */
        BT_EVENT_GATT_CLIENT_WRITE_CHARACTERISTIC_LEGACY, /**< GATT characteristic value write callback */
 #endif
+       BT_EVENT_LE_DATA_LENGTH_CHANGED, /** LE data length changed callback */
        BT_EVENT_ADVERTISING_STATE_CHANGED, /**< Advertising state changed callback */
        BT_EVENT_MANUFACTURER_DATA_CHANGED, /**< Manufacturer data changed callback */
        BT_EVENT_CONNECTABLE_CHANGED_EVENT, /**< Adapter connectable changed callback */
@@ -453,6 +454,76 @@ const GSList* _bt_gatt_get_server_list(void);
 
 int _bt_gatt_client_update_all(bt_gatt_client_h client);
 
+/* HID device related type */
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_LE_MODULE
+ * @brief Reads the maximum data length of LE packets supported by the controller.
+ * @since_tizen 3.0
+ *
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_NOT_SUPPORTED  Not supported
+ *
+ * @see bt_initialize
+ */
+int bt_adapter_le_read_maximum_data_length(
+               int *max_tx_octets, int *max_tx_time,
+               int *max_rx_octets, int *max_rx_time);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_LE_MODULE
+ * @brief Writes the Host suggested default data length of LE packets to the controller.
+ * @since_tizen 3.0
+ *
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_NOT_SUPPORTED  Not supported
+ *
+ * @see bt_initialize
+ */
+int bt_adapter_le_write_host_suggested_default_data_length(
+       const unsigned int def_tx_Octets,  const unsigned int def_tx_Time);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_LE_MODULE
+ * @brief Reads the Host suggested data length values of LE packets from the controller.
+ * @since_tizen 3.0
+ *
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_NOT_SUPPORTED  Not supported
+ *
+ * @see bt_initialize
+ */
+int bt_adapter_le_read_suggested_default_data_length(
+       unsigned int *def_tx_Octets,  unsigned int *def_tx_Time);
+
+/**
+ * @ingroup CAPI_NETWORK_BLUETOOTH_LE_MODULE
+ * @brief Allows the host to suggest to controller, the data length parameters to be used
+ * for a given LE Connection.
+ * @since_tizen 3.0
+ *
+ * @retval #BT_ERROR_NONE  Successful
+ * @retval #BT_ERROR_NOT_INITIALIZED  Not initialized
+ * @retval #BT_ERROR_NOT_SUPPORTED  Not supported
+ *
+ * @see bt_initialize
+ */
+int bt_device_le_set_data_length(const char *remote_address,
+       unsigned int max_tx_Octets,  unsigned int max_tx_Time);
+
+/**
+ * @internal
+ * @brief LE data length changed callback
+ */
+typedef void (*_bt_le_set_data_length_changed_cb)
+               (int result, const char *remote_address, int max_tx_octets,
+               int max_tx_time, int max_rx_octets, int max_rx_time, void *user_data);
+
+int bt_device_le_set_data_length_change_cb(
+       _bt_le_set_data_length_changed_cb callback, void *user_data);
 #ifdef __cplusplus
 }
 #endif
index c95097d..668d5a3 100755 (executable)
@@ -3080,3 +3080,81 @@ int bt_adapter_le_unregister_all_scan_filters(void)
 
        return BT_ERROR_NONE;
 }
+
+int bt_adapter_le_read_maximum_data_length(
+               int *max_tx_octets, int *max_tx_time,
+               int *max_rx_octets, int *max_rx_time)
+{
+       int ret = BT_ERROR_NONE;
+
+       BT_CHECK_BT_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+
+       bluetooth_le_read_maximum_data_length_t max_le_datalength;
+
+       ret = _bt_get_error_code(
+               bluetooth_le_read_maximum_data_length(&max_le_datalength));
+
+       if (ret != BT_ERROR_NONE) {
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
+               return ret;
+       }
+
+       *max_tx_octets = max_le_datalength.max_tx_octets;
+       *max_tx_time = max_le_datalength.max_tx_time;
+       *max_rx_octets = max_le_datalength.max_rx_octets;
+       *max_rx_time = max_le_datalength.max_rx_time;
+
+       return ret;
+}
+
+int bt_adapter_le_write_host_suggested_default_data_length(
+       const unsigned int def_tx_Octets, const unsigned int def_tx_Time)
+{
+       int ret = BT_ERROR_NONE;
+
+       BT_CHECK_BT_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+
+       /*Range for host suggested txtime is 0x001B-0x00FB  and
+       txocets is 0x0148- 0x0848 as per BT 4.2 spec*/
+       if (((def_tx_Octets < 27 || def_tx_Octets > 251) ||
+               (def_tx_Time < 328 || def_tx_Time > 2120)) ||
+               ((def_tx_Octets < 0x001B || def_tx_Octets > 0x00FB) ||
+               (def_tx_Time < 0x0148 || def_tx_Time > 0x0848))) {
+               return BT_ERROR_INVALID_PARAMETER;
+       }
+
+       ret = _bt_get_error_code(
+               bluetooth_le_write_host_suggested_default_data_length(
+                                       def_tx_Octets, def_tx_Time));
+
+       if (ret != BT_ERROR_NONE)
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
+
+       return ret;
+}
+
+int bt_adapter_le_read_suggested_default_data_length(
+       unsigned int *def_tx_Octets,  unsigned int *def_tx_Time)
+{
+       int ret = BT_ERROR_NONE;
+
+       BT_CHECK_BT_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+
+       bluetooth_le_read_host_suggested_data_length_t data_values;
+
+       ret = _bt_get_error_code(
+               bluetooth_le_read_suggested_default_data_length(&data_values));
+
+       if (ret != BT_ERROR_NONE) {
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
+               return ret;
+       }
+
+       *def_tx_Octets = data_values.def_tx_octets;
+       *def_tx_Time = data_values.def_tx_time;
+
+       return ret;
+}
old mode 100644 (file)
new mode 100755 (executable)
index 1358976..4bac46b
@@ -619,6 +619,7 @@ static void __bt_event_proxy(int event, bluetooth_event_param_t *param, void *us
        bt_hdp_data_ind_t *hdp_data_ind = NULL;
        bt_gatt_char_value_t *char_val = NULL;
        media_metadata_attributes_t *metadata = NULL;
+       bt_le_data_length_params_t  *data_length_info = NULL;
 
        event_index = __bt_get_cb_index(event);
 
@@ -1561,6 +1562,19 @@ static void __bt_event_proxy(int event, bluetooth_event_param_t *param, void *us
                  bt_event_slot_container[event_index].user_data);
 
                break;
+       case BLUETOOTH_EVENT_LE_DATA_LENGTH_CHANGED:
+               BT_INFO("__bt_le_set_data_length_changed_cb() will be called");
+               data_length_info = (bt_le_data_length_params_t *)(param->param_data);
+               _bt_convert_address_to_string(&device_addr, &data_length_info->device_address);
+
+               ((_bt_le_set_data_length_changed_cb)bt_event_slot_container[event_index].callback)
+               (_bt_get_error_code(param->result), device_addr, data_length_info->max_tx_octets,
+               data_length_info->max_tx_time, data_length_info->max_rx_octets, data_length_info->max_rx_time,
+               bt_event_slot_container[event_index].user_data);
+
+               if (device_addr != NULL)
+                       free(device_addr);
+               break;
 #ifdef TIZEN_WEARABLE
        case BLUETOOTH_PBAP_CONNECTED: {
                bt_pbap_enabled_cb cb = bt_event_slot_container[event_index].callback;
@@ -2248,6 +2262,8 @@ static int __bt_get_cb_index(int event)
                return BT_EVENT_MANUFACTURER_DATA_CHANGED;
        case BLUETOOTH_EVENT_CONNECTABLE_CHANGED:
                return BT_EVENT_CONNECTABLE_CHANGED_EVENT;
+       case BLUETOOTH_EVENT_LE_DATA_LENGTH_CHANGED:
+               return BT_EVENT_LE_DATA_LENGTH_CHANGED;
 #ifdef TIZEN_WEARABLE
        case BLUETOOTH_PBAP_CONNECTED:
                return BT_EVENT_PBAP_CONNECTION_STATUS;
old mode 100644 (file)
new mode 100755 (executable)
index 99a3806..df98001
@@ -574,3 +574,45 @@ int bt_device_get_service_mask_from_uuid_list(char **uuids,
 
        return BT_ERROR_NONE;
 }
+int bt_device_le_set_data_length(const char *remote_address,
+               unsigned int max_tx_Octets,  unsigned int max_tx_Time)
+{
+       int ret = BT_ERROR_NONE;
+
+       BT_CHECK_BT_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(remote_address);
+
+       bluetooth_device_address_t addr_hex = {{0,}};
+
+       //Range for host suggested txtime is 0x001B-0x00FB  and
+       // txocets is 0x0148- 0x0848 as per BT 4.2 spec
+       if (((max_tx_Octets < 27 || max_tx_Octets > 251) ||
+               (max_tx_Time < 328 || max_tx_Time > 2120)) ||
+               ((max_tx_Octets < 0x001B || max_tx_Octets > 0x00FB)
+               || (max_tx_Time < 0x0148 || max_tx_Time > 0x0848))) {
+               return BT_ERROR_INVALID_PARAMETER;
+       }
+
+       _bt_convert_address_to_hex(&addr_hex, remote_address);
+
+       ret = _bt_get_error_code(bluetooth_le_set_data_length(
+                                       &addr_hex,
+                                       max_tx_Octets,
+                                       max_tx_Time));
+
+       if (ret != BT_ERROR_NONE)
+               BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(ret), ret);
+
+       return ret;
+}
+
+int bt_device_le_set_data_length_change_cb(
+       _bt_le_set_data_length_changed_cb callback, void *user_data)
+{
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(callback);
+       _bt_set_cb(BT_EVENT_LE_DATA_LENGTH_CHANGED, callback, user_data);
+
+       return BT_ERROR_NONE;
+}
old mode 100644 (file)
new mode 100755 (executable)
index 9bd8fc6..7904128
@@ -202,6 +202,9 @@ tc_table_t tc_adapter_le[] = {
        {"bt_adapter_le_set_device_discovery_state_changed_cb"          , BT_UNIT_TEST_FUNCTION_ADAPTER_LE_SET_DEVICE_DISCOVERY_STATE_CHANGED_CB},
        {"bt_adapter_le_unset_device_discovery_state_changed_cb"        , BT_UNIT_TEST_FUNCTION_ADAPTER_LE_UNSET_DEVICE_DISCOVERY_STATE_CHANGED_CB},
 #endif
+       {"bt_adater_le_read_maximum_data_length",               BT_UNIT_TEST_FUNCTION_ADAPTER_LE_READ_MAXIMUM_DATA_LENGTH},
+       {"bt_adater_le_wite_host_suggested_def_data_length",            BT_UNIT_TEST_FUNCTION_ADAPTER_LE_WRITE_HOST_SUGGESTED_DEFAULT_DATA_LENGTH},
+       {"bt_adater_le_read_host_suggested_def_data_length",            BT_UNIT_TEST_FUNCTION_ADAPTER_LE_READ_HOST_SUGGESTED_DEFAULT_DATA_LENGTH},
        {"Select this menu to set parameters and then select the function again."                       , BT_UNIT_TEST_FUNCTION_ACTIVATE_FLAG_TO_SET_PARAMETERS},
        {NULL                                   , 0x0000},
 };
@@ -222,6 +225,8 @@ tc_table_t tc_device[] = {
        {"bt_device_create_bond"                                        , BT_UNIT_TEST_FUNCTION_DEVICE_CREATE_BOND},
        {"bt_device_create_bond_by_type"                                , BT_UNIT_TEST_FUNCTION_DEVICE_CREATE_BOND_BY_TYPE},
        {"bt_device_destroy_bond"                                       , BT_UNIT_TEST_FUNCTION_DEVICE_DESTROY_BOND},
+       {"bt_device_le_set_data_length"                                 , BT_UNIT_TEST_FUNCTION_LE_DEVICE_SET_DATA_LENGTH},
+       {"bt_device_le_data_length_changed_cb",         BT_UNIT_TEST_FUNCTION_LE_DEVICE_DATA_LENGTH_CHANGED_CB},
        {"Select this menu to set parameters and then select the function again."                       , BT_UNIT_TEST_FUNCTION_ACTIVATE_FLAG_TO_SET_PARAMETERS},
        {NULL                                   , 0x0000},
 };
@@ -1144,6 +1149,14 @@ static void __bt_socket_connection_state_changed_cb(int result,
        }
 }
 
+static void __bt_le_set_data_length_changed_cb(int result, const char *remote_address, int max_tx_octets,
+               int max_tx_time, int max_rx_octets, int max_rx_time,void *user_data)
+{
+       TC_PRT("__bt_le_set_data_length_changed_cb \n");
+       TC_PRT("max_tx_octets: %d  max_tx_time: %d  max_rx_octets: %d  max_rx_time: %d",
+                       max_tx_octets, max_tx_time, max_rx_octets, max_rx_time);
+       TC_PRT("result: %s", __bt_get_error_message(result));
+}
 void __bt_opp_client_push_responded_cb(int result,
                                        const char *remote_address,
                                        void *user_data)
@@ -3423,7 +3436,50 @@ int test_input_callback(void *data)
                        TC_PRT("returns %s\n", __bt_get_error_message(ret));
                        break;
 #endif
+               case BT_UNIT_TEST_FUNCTION_ADAPTER_LE_READ_MAXIMUM_DATA_LENGTH: {
+
+                       TC_PRT("Read Maximum LE Data length");
+
+                       int max_tx_octects = 0;
+                       int max_rx_octects = 0;
+                       int max_tx_time = 0;
+                       int max_rx_time = 0;
+                       ret = bt_adapter_le_read_maximum_data_length(
+                               &max_tx_octects, &max_tx_time,
+                               &max_rx_octects, &max_rx_time);
+                       TC_PRT("max data length values are  %d %d %d %d",
+                               max_tx_octects, max_tx_time,
+                               max_rx_octects, max_rx_time);
+                       TC_PRT("returns %s\n", __bt_get_error_message(ret));
+
+                       break;
+               }
+               case BT_UNIT_TEST_FUNCTION_ADAPTER_LE_WRITE_HOST_SUGGESTED_DEFAULT_DATA_LENGTH: {
+
+                       TC_PRT("Testing: Write Host suggested default LE Data length");
+
+                       unsigned int def_tx_octects = 30;
+                       unsigned int def_tx_time = 330;
+                       ret = bt_adapter_le_write_host_suggested_default_data_length(
+                               def_tx_octects, def_tx_time);
+                       TC_PRT("returns %s\n", __bt_get_error_message(ret));
+
+                       break;
+               }
+               case BT_UNIT_TEST_FUNCTION_ADAPTER_LE_READ_HOST_SUGGESTED_DEFAULT_DATA_LENGTH: {
+
+                       TC_PRT("Read host suggested default LE Data length");
+
+                       unsigned int def_tx_octets = 0;
+                       unsigned        int def_tx_time = 0;
+                       ret = bt_adapter_le_read_suggested_default_data_length(
+                               &def_tx_octets, &def_tx_time);
+                       TC_PRT("host suggested default le data length values are  %d %d",
+                                       def_tx_octets, def_tx_time);
 
+                       TC_PRT("returns %s\n", __bt_get_error_message(ret));
+                       break;
+               }
                case BT_UNIT_TEST_FUNCTION_ACTIVATE_FLAG_TO_SET_PARAMETERS:
                        need_to_set_params = true;
                        TC_PRT("Select the function again");
@@ -3530,6 +3586,32 @@ int test_input_callback(void *data)
                        break;
                }
 
+               case BT_UNIT_TEST_FUNCTION_LE_DEVICE_SET_DATA_LENGTH: {
+
+                       TC_PRT("Set LE Data length paramters cmd");
+
+                       unsigned int tx_octets = 249; //range 27- 251
+                       unsigned int tx_time = 500; //range 328-2120
+
+                       TC_PRT("settting le data length values  tx octects: %d  tx time: %d",
+                       tx_octets, tx_time);
+                       ret = bt_device_le_set_data_length(remote_addr,
+                               tx_octets, tx_time);
+                       TC_PRT("returns %s\n", __bt_get_error_message(ret));
+
+                       break;
+               }
+               case BT_UNIT_TEST_FUNCTION_LE_DEVICE_DATA_LENGTH_CHANGED_CB: {
+
+                       TC_PRT("Setting LE Data length change callback");
+
+                       ret = bt_device_le_set_data_length_change_cb(__bt_le_set_data_length_changed_cb,
+                               NULL);
+                       TC_PRT("returns %s\n", __bt_get_error_message(ret));
+
+                       break;
+               }
+
                case BT_UNIT_TEST_FUNCTION_DEVICE_GET_CONNECTION_STATE: {
                        bool bredr_connected = false;
                        bool le_connected = false;
old mode 100644 (file)
new mode 100755 (executable)
index 263af9b..c6ebe28
@@ -121,6 +121,9 @@ typedef enum
        BT_UNIT_TEST_FUNCTION_ADAPTER_LE_SET_DEVICE_DISCOVERY_STATE_CHANGED_CB,
        BT_UNIT_TEST_FUNCTION_ADAPTER_LE_UNSET_DEVICE_DISCOVERY_STATE_CHANGED_CB,
 #endif
+       BT_UNIT_TEST_FUNCTION_ADAPTER_LE_READ_MAXIMUM_DATA_LENGTH,
+       BT_UNIT_TEST_FUNCTION_ADAPTER_LE_WRITE_HOST_SUGGESTED_DEFAULT_DATA_LENGTH,
+       BT_UNIT_TEST_FUNCTION_ADAPTER_LE_READ_HOST_SUGGESTED_DEFAULT_DATA_LENGTH,
        BT_UNIT_TEST_FUNCTION_DEVICE_SET_AUTHORIZATION_TRUE = 1,
        BT_UNIT_TEST_FUNCTION_DEVICE_SET_AUTHORIZATION_FALSE,
        BT_UNIT_TEST_FUNCTION_DEVICE_SET_AUTHORIZATION_CHANGED_CB,
@@ -134,6 +137,8 @@ typedef enum
        BT_UNIT_TEST_FUNCTION_DEVICE_CREATE_BOND,
        BT_UNIT_TEST_FUNCTION_DEVICE_CREATE_BOND_BY_TYPE,
        BT_UNIT_TEST_FUNCTION_DEVICE_DESTROY_BOND,
+       BT_UNIT_TEST_FUNCTION_LE_DEVICE_SET_DATA_LENGTH,
+       BT_UNIT_TEST_FUNCTION_LE_DEVICE_DATA_LENGTH_CHANGED_CB,
        BT_UNIT_TEST_FUNCTION_DEVICE_ENABLE_RSSI_MONITOR,
        BT_UNIT_TEST_FUNCTION_DEVICE_DISABLE_RSSI_MONITOR,
        BT_UNIT_TEST_FUNCTION_DEVICE_GET_RSSI_STRENGTH,