Bluetooth: controller: Enable use of user defined protocols

Implements hooks to implement user protocols in ull.c
A user defined init function can now be called, this code is gated by
the CONFIG_BT_CTLR_USER_EXT define.
A user defined PDU length can now also be defined using the Kconfig
CONFIG_BT_RX_USER_PDU_LEN

Signed-off-by: Asger Munk Nielsen <asmk@oticon.com>
This commit is contained in:
Asger Munk Nielsen 2019-05-24 11:13:21 +02:00 committed by Anas Nashif
parent c8ae05dd80
commit 8844b7f5a5
2 changed files with 29 additions and 4 deletions

View file

@ -736,4 +736,13 @@ config BT_CTLR_USER_EVT_RANGE
Number of event types reserved for proprietary use. The range
is typically used when BT_CTLR_USER_EXT is in use.
config BT_RX_USER_PDU_LEN
int "Maximum supported proprietary PDU buffer length"
default 2
range 2 255
help
Maximum data size for each proprietary PDU. This size includes link layer
header and payload. It does not account for HCI event headers as these
PDUs are assumed to not go across HCI.
endif # BT_CTLR

View file

@ -150,16 +150,23 @@ static struct {
static MFIFO_DEFINE(pdu_rx_free, sizeof(void *), PDU_RX_CNT);
static MFIFO_DEFINE(ll_pdu_rx_free, sizeof(void *), LL_PDU_RX_CNT);
#if defined(CONFIG_BT_RX_USER_PDU_LEN)
#define PDU_RX_USER_PDU_OCTETS_MAX (CONFIG_BT_RX_USER_PDU_LEN)
#else
#define PDU_RX_USER_PDU_OCTETS_MAX 0
#endif
#define NODE_RX_HEADER_SIZE (offsetof(struct node_rx_pdu, pdu))
#define NODE_RX_STRUCT_OVERHEAD (NODE_RX_HEADER_SIZE)
#define PDU_ADVERTIZE_SIZE (PDU_AC_SIZE_MAX + PDU_AC_SIZE_EXTRA)
#define PDU_DATA_SIZE (PDU_DC_LL_HEADER_SIZE + LL_LENGTH_OCTETS_RX_MAX)
#define PDU_RX_NODE_POOL_ELEMENT_SIZE \
MROUND( \
NODE_RX_STRUCT_OVERHEAD \
+ MAX(PDU_ADVERTIZE_SIZE, PDU_DATA_SIZE) \
#define PDU_RX_NODE_POOL_ELEMENT_SIZE \
MROUND( \
NODE_RX_STRUCT_OVERHEAD \
+ MAX(MAX(PDU_ADVERTIZE_SIZE, \
PDU_DATA_SIZE), \
PDU_RX_USER_PDU_OCTETS_MAX) \
)
#define PDU_RX_POOL_SIZE (PDU_RX_NODE_POOL_ELEMENT_SIZE * (RX_CNT + 1))
@ -295,6 +302,13 @@ int ll_init(struct k_sem *sem_rx)
}
#endif /* CONFIG_BT_CONN */
#if defined(CONFIG_BT_CTLR_USER_EXT)
err = ull_user_init();
if (err) {
return err;
}
#endif /* CONFIG_BT_CTLR_USER_EXT */
/* reset whitelist, resolving list and initialise RPA timeout*/
if (IS_ENABLED(CONFIG_BT_CTLR_FILTER)) {
ull_filter_reset(true);
@ -466,6 +480,7 @@ void ll_rx_dequeue(void)
defined(CONFIG_BT_CTLR_PROFILE_ISR) || \
defined(CONFIG_BT_CTLR_ADV_INDICATION) || \
defined(CONFIG_BT_CTLR_SCAN_INDICATION) || \
defined(CONFIG_BT_CTLR_USER_EXT) || \
defined(CONFIG_BT_CONN)
#if defined(CONFIG_BT_CONN)
@ -550,6 +565,7 @@ void ll_rx_dequeue(void)
* CONFIG_BT_CTLR_PROFILE_ISR ||
* CONFIG_BT_CTLR_ADV_INDICATION ||
* CONFIG_BT_CTLR_SCAN_INDICATION ||
* CONFIG_BT_CTLR_USER_EXT ||
* CONFIG_BT_CONN
*/