gap: add gap_request_connection_subrating

This commit is contained in:
Matthias Ringwald 2024-10-24 15:40:06 +02:00
parent f266fcb126
commit 9007c8918e
3 changed files with 42 additions and 1 deletions

View File

@ -982,6 +982,19 @@ void gap_set_connection_parameter_range(le_connection_parameter_range_t * range)
*/
int gap_connection_parameter_range_included(le_connection_parameter_range_t * existing_range, uint16_t le_conn_interval_min, uint16_t le_conn_interval_max, uint16_t le_conn_latency, uint16_t le_supervision_timeout);
/**
* @brief Request an update of the connection subrating for a given LE connection
* @param handle
* @param subrate_min
* @param subrate_max
* @param max_latency (in units of subrated connection intervals)
* @param continuation_number (Minimum number of underlying connection events to remain active after a packet containing a Link Layer PDU with a non-zero Length field is sent or received)
* @param supervision_timeout (unit: 10ms) range: 10..3200 (100 ms to 32 s)
* @return status
*/
uint8_t gap_request_connection_subrating(hci_con_handle_t con_handle, uint16_t subrate_min, uint16_t subrate_max,
uint16_t max_latency, uint16_t continuation_number, uint16_t supervision_timeout);
/**
* @brief Set max number of connections in LE Peripheral role (if Bluetooth Controller supports it)
* @note: default: 1

View File

@ -7602,6 +7602,13 @@ static bool hci_run_general_pending_commands(void){
hci_send_cmd(&hci_le_set_phy, connection->con_handle, all_phys, connection->le_phy_update_tx_phys, connection->le_phy_update_rx_phys, connection->le_phy_update_phy_options);
return true;
}
if (connection->le_subrate_min > 0){
uint16_t subrate_min = connection->le_subrate_min;
connection->le_subrate_min = 0;
hci_send_cmd(&hci_le_subrate_request, connection->con_handle, subrate_min, connection->le_subrate_max, connection->le_subrate_max_latency,
connection->le_subrate_continuation_number, connection->le_supervision_timeout);
return true;
}
#ifdef ENABLE_LE_PERIODIC_ADVERTISING
if (connection->le_past_sync_handle != HCI_CON_HANDLE_INVALID){
hci_con_handle_t sync_handle = connection->le_past_sync_handle;
@ -8723,6 +8730,20 @@ int gap_request_connection_parameter_update(hci_con_handle_t con_handle, uint16_
return 0;
}
uint8_t gap_request_connection_subrating(hci_con_handle_t con_handle, uint16_t subrate_min, uint16_t subrate_max,
uint16_t max_latency, uint16_t continuation_number, uint16_t supervision_timeout){
hci_connection_t * connection = hci_connection_for_handle(con_handle);
if (!connection) return ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER;
connection->le_subrate_min = subrate_min;
connection->le_subrate_max = subrate_max;
connection->le_subrate_max_latency = max_latency;
connection->le_subrate_continuation_number = continuation_number;
connection->le_supervision_timeout = supervision_timeout;
hci_run();
return ERROR_CODE_SUCCESS;
}
#ifdef ENABLE_LE_PERIPHERAL
#ifdef ENABLE_LE_EXTENDED_ADVERTISING

View File

@ -200,7 +200,7 @@ typedef enum {
CON_PARAMETER_UPDATE_SEND_RESPONSE,
CON_PARAMETER_UPDATE_CHANGE_HCI_CON_PARAMETERS,
CON_PARAMETER_UPDATE_DENY,
// HCI - in respnose to HCI_SUBEVENT_LE_REMOTE_CONNECTION_PARAMETER_REQUEST
// HCI - in response to HCI_SUBEVENT_LE_REMOTE_CONNECTION_PARAMETER_REQUEST
CON_PARAMETER_UPDATE_REPLY,
CON_PARAMETER_UPDATE_NEGATIVE_REPLY,
} le_con_parameter_update_state_t;
@ -668,6 +668,13 @@ typedef struct {
uint8_t le_phy_update_rx_phys;
int8_t le_phy_update_phy_options;
// LE Subrating
uint16_t le_subrate_min;
uint16_t le_subrate_max;
uint16_t le_subrate_max_latency;
uint16_t le_subrate_continuation_number;
uint16_t le_subrate_supervision_timeout;
// LE Security Manager
sm_connection_t sm_connection;