Hi,
I found some thing not seems to be right in SDK 16. I wonder if this is intentional or a bug. Bluetooth 5 max MTU can be up to 512 bytes. I found the definitions in the structures bellow that MTU size is uint16_t but data length is uint8_t. This seems not rights also nrf_ble_gatt sets a hardcoded max data length to 251. Which is Bluetooth 4.2 max data length. That too is bad. So how did the Bluetooth 5 throughput test demo able to set data length to 512 bytes when it is hard coded in nrf_ble_gatt to 251 ?
Data length defined as uint8_t in nrf_ble_gatt.h which is max at 255. So cannot use 512 bytes of Bluetooth 5.
/**@brief GATT information for each connection. */
typedef struct
{
uint16_t att_mtu_desired; //!< Requested ATT_MTU size (in bytes).
uint16_t att_mtu_effective; //!< Effective ATT_MTU size (in bytes).
bool att_mtu_exchange_pending; //!< Indicates that an ATT_MTU exchange request is pending (the call to @ref sd_ble_gattc_exchange_mtu_request returned @ref NRF_ERROR_BUSY).
bool att_mtu_exchange_requested; //!< Indicates that an ATT_MTU exchange request was made.
#if !defined (S112) && !defined(S312)
uint8_t data_length_desired; //!< Desired data length (in bytes).
uint8_t data_length_effective; //!< Requested data length (in bytes).
#endif // !defined (S112) && !defined(S312)
} nrf_ble_gatt_link_t;
/**@brief GATT structure that contains status information for the GATT module. */
struct nrf_ble_gatt_s
{
uint16_t att_mtu_desired_periph; //!< Requested ATT_MTU size for the next peripheral connection that is established.
uint16_t att_mtu_desired_central; //!< Requested ATT_MTU size for the next central connection that is established.
uint8_t data_length; //!< Data length to use for the next connection that is established.
nrf_ble_gatt_link_t links[NRF_BLE_GATT_LINK_COUNT]; //!< GATT related information for all active connections.
nrf_ble_gatt_evt_handler_t evt_handler; //!< GATT event handler.
};
Data length is hardcoded inside nrf_ble_gatt.c
#define BLE_GAP_DATA_LENGTH_DEFAULT 27 //!< The stack's default data length.
#define BLE_GAP_DATA_LENGTH_MAX 251 //!< Maximum data length.
ret_code_t nrf_ble_gatt_data_length_set(nrf_ble_gatt_t * p_gatt,
uint16_t conn_handle,
uint8_t data_length)
{
if (p_gatt == NULL)
{
return NRF_ERROR_NULL;
}
// Check early to avoid requesting an invalid data length for upcoming connections.
if ( (data_length > BLE_GAP_DATA_LENGTH_MAX)
|| (data_length < BLE_GAP_DATA_LENGTH_DEFAULT))
{
return NRF_ERROR_INVALID_PARAM;
}
if (conn_handle == BLE_CONN_HANDLE_INVALID)
{
// Save value and request upon connection.
p_gatt->data_length = data_length;
return NRF_SUCCESS;
}
if (conn_handle >= NRF_BLE_GATT_LINK_COUNT)
{
return NRF_ERROR_INVALID_PARAM;
}
// Request data length on existing link.
p_gatt->links[conn_handle].data_length_desired = data_length;
return data_length_update(conn_handle, data_length);
}