Bluetooth: controller: User defined CPR intervals

Some proprietary protocols that reuse the Bluetooth LLCP logic requires
that the CPR interval has a valid range that differs from the Bluetooth
specification defined.

Vendor must implement the function (ull_vendor.h)
uint16_t ull_conn_interval_min_get(struct ll_conn *conn)
that returns the valid limit for the given connection.

Signed-off-by: Thomas Ebert Hansen <thoh@oticon.com>
This commit is contained in:
Thomas Ebert Hansen 2020-12-11 15:45:23 +01:00 committed by Carles Cufí
commit c3f557c12b
2 changed files with 22 additions and 3 deletions

View file

@ -551,6 +551,13 @@ config BT_RX_USER_PDU_LEN
header and payload. It does not account for HCI event headers as these header and payload. It does not account for HCI event headers as these
PDUs are assumed to not go across HCI. PDUs are assumed to not go across HCI.
config BT_CTLR_USER_CPR_INTERVAL_MIN
bool "Enable proprietary Connection Parameter Request minimum interval"
depends on BT_CTLR_USER_EXT
help
When enabled, controller will accept Connection Parameter Request
intervals down to a proprietary minimum value.
endmenu endmenu
comment "BLE Controller hardware configuration" comment "BLE Controller hardware configuration"

View file

@ -51,6 +51,18 @@
#include "ull_vendor.h" #include "ull_vendor.h"
#endif /* CONFIG_BT_CTLR_USER_EXT */ #endif /* CONFIG_BT_CTLR_USER_EXT */
/**
* User CPR Interval
*/
#if !defined(CONFIG_BT_CTLR_USER_CPR_INTERVAL_MIN)
/* Bluetooth defined CPR Interval Minimum (7.5ms) */
#define CONN_INTERVAL_MIN(x) (6)
#else /* CONFIG_BT_CTLR_USER_CPR_INTERVAL_MIN */
/* Proprietary user defined CPR Interval Minimum */
extern uint16_t ull_conn_interval_min_get(struct ll_conn *conn);
#define CONN_INTERVAL_MIN(x) (MAX(ull_conn_interval_min_get(x), 1))
#endif /* CONFIG_BT_CTLR_USER_CPR_INTERVAL_MIN */
inline void ull_conn_upd_curr_reset(void); inline void ull_conn_upd_curr_reset(void);
static int init_reset(void); static int init_reset(void);
@ -5697,7 +5709,7 @@ static inline int ctrl_rx(memq_link_t *link, struct node_rx_pdu **rx,
cpr->preferred_periodicity; cpr->preferred_periodicity;
/* Invalid parameters */ /* Invalid parameters */
if ((interval_min < 6) || if ((interval_min < CONN_INTERVAL_MIN(conn)) ||
(interval_max > 3200) || (interval_max > 3200) ||
(interval_min > interval_max) || (interval_min > interval_max) ||
(latency > 499) || (latency > 499) ||
@ -5803,7 +5815,7 @@ static inline int ctrl_rx(memq_link_t *link, struct node_rx_pdu **rx,
cpr->preferred_periodicity; cpr->preferred_periodicity;
/* Invalid parameters */ /* Invalid parameters */
if ((interval_min < 6) || if ((interval_min < CONN_INTERVAL_MIN(conn)) ||
(interval_max > 3200) || (interval_max > 3200) ||
(interval_min > interval_max) || (interval_min > interval_max) ||
(latency > 499) || (latency > 499) ||
@ -5899,7 +5911,7 @@ static inline int ctrl_rx(memq_link_t *link, struct node_rx_pdu **rx,
cpr->preferred_periodicity; cpr->preferred_periodicity;
/* Invalid parameters */ /* Invalid parameters */
if ((interval_min < 6) || if ((interval_min < CONN_INTERVAL_MIN(conn)) ||
(interval_max > 3200) || (interval_max > 3200) ||
(interval_min > interval_max) || (interval_min > interval_max) ||
(latency > 499) || (latency > 499) ||