diff --git a/subsys/bluetooth/controller/Kconfig b/subsys/bluetooth/controller/Kconfig index 0bcb7fae88573..74251a3cda045 100644 --- a/subsys/bluetooth/controller/Kconfig +++ b/subsys/bluetooth/controller/Kconfig @@ -465,6 +465,14 @@ config BT_CTLR_ADV_DATA_LEN_MAX help Maximum Extended Advertising Data Length. +config BT_CTLR_ADV_EXT_RX_PDU_LEN_MAX + int "Maximum Advertising Extensions Receive PDU Length" + range 255 255 if BT_HCI_RAW + range 31 255 + default 255 + help + Maximum Advertising Extensions Receive PDU Length. + config BT_CTLR_ADV_PERIODIC bool "LE Periodic Advertising in Advertising State" if !BT_LL_SW_SPLIT depends on BT_BROADCASTER && BT_CTLR_ADV_PERIODIC_SUPPORT diff --git a/subsys/bluetooth/controller/include/ll_feat.h b/subsys/bluetooth/controller/include/ll_feat.h index 26b5a478e00e1..c2c7886e33316 100644 --- a/subsys/bluetooth/controller/include/ll_feat.h +++ b/subsys/bluetooth/controller/include/ll_feat.h @@ -88,8 +88,10 @@ #if defined(CONFIG_BT_CTLR_ADV_EXT) #define LL_FEAT_BIT_EXT_ADV BIT64(BT_LE_FEAT_BIT_EXT_ADV) +#define LL_EXT_OCTETS_RX_MAX CONFIG_BT_CTLR_ADV_EXT_RX_PDU_LEN_MAX #else /* !CONFIG_BT_CTLR_ADV_EXT */ #define LL_FEAT_BIT_EXT_ADV 0 +#define LL_EXT_OCTETS_RX_MAX 0 #endif /* !CONFIG_BT_CTLR_ADV_EXT */ #if defined(CONFIG_BT_CTLR_ADV_PERIODIC) || \ diff --git a/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_scan_aux.c b/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_scan_aux.c index 918c693e84948..db97b4715a032 100644 --- a/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_scan_aux.c +++ b/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_scan_aux.c @@ -34,6 +34,8 @@ #include "lll_prof_internal.h" #include "lll_scan_internal.h" +#include "ll_feat.h" + #define BT_DBG_ENABLED IS_ENABLED(CONFIG_BT_DEBUG_HCI_DRIVER) #define LOG_MODULE_NAME bt_ctlr_lll_scan_aux #include "common/log.h" @@ -273,7 +275,7 @@ static int prepare_cb(struct lll_prepare_param *p) #endif radio_phy_set(lll->phy, 1); - radio_pkt_configure(8, PDU_AC_PAYLOAD_SIZE_MAX, (lll->phy << 1)); + radio_pkt_configure(8, LL_EXT_OCTETS_RX_MAX, (lll->phy << 1)); node_rx = ull_pdu_rx_alloc_peek(1); LL_ASSERT(node_rx); @@ -481,7 +483,7 @@ static void isr_scan_aux_setup(void *param) /* Setup radio for auxiliary PDU scan */ radio_phy_set(phy_aux, 1); - radio_pkt_configure(8, PDU_AC_PAYLOAD_SIZE_MAX, (phy_aux << 1)); + radio_pkt_configure(8, LL_EXT_OCTETS_RX_MAX, (phy_aux << 1)); lll_chan_set(aux_ptr->chan_idx); radio_pkt_rx_set(node_rx->pdu); diff --git a/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_sync.c b/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_sync.c index 2f6ba7f1f7dfc..30b271999c41c 100644 --- a/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_sync.c +++ b/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_sync.c @@ -32,6 +32,8 @@ #include "lll_df.h" #include "lll_df_internal.h" +#include "ll_feat.h" + #define BT_DBG_ENABLED IS_ENABLED(CONFIG_BT_DEBUG_HCI_DRIVER) #define LOG_MODULE_NAME bt_ctlr_lll_sync #include "common/log.h" @@ -154,13 +156,7 @@ static int prepare_cb(struct lll_prepare_param *p) #endif /* CONFIG_BT_CTLR_TX_PWR_DYNAMIC_CONTROL */ radio_phy_set(lll->phy, 1); - radio_pkt_configure(8, PDU_AC_PAYLOAD_SIZE_MAX, (lll->phy << 1)); - - node_rx = ull_pdu_rx_alloc_peek(1); - LL_ASSERT(node_rx); - - radio_pkt_rx_set(node_rx->pdu); - + radio_pkt_configure(8, LL_EXT_OCTETS_RX_MAX, (lll->phy << 1)); radio_aa_set(lll->access_addr); radio_crc_configure(((0x5bUL) | ((0x06UL) << 8) | ((0x00UL) << 16)), (((uint32_t)lll->crc_init[2] << 16) | @@ -169,6 +165,11 @@ static int prepare_cb(struct lll_prepare_param *p) lll_chan_set(data_chan_use); + node_rx = ull_pdu_rx_alloc_peek(1); + LL_ASSERT(node_rx); + + radio_pkt_rx_set(node_rx->pdu); + #if defined(CONFIG_BT_CTLR_DF_SCAN_CTE_RX) struct lll_df_sync_cfg *cfg; diff --git a/subsys/bluetooth/controller/ll_sw/pdu.h b/subsys/bluetooth/controller/ll_sw/pdu.h index 80ec52f1c55c0..9cb09889a1fa6 100644 --- a/subsys/bluetooth/controller/ll_sw/pdu.h +++ b/subsys/bluetooth/controller/ll_sw/pdu.h @@ -190,31 +190,6 @@ #define PKT_BIS_US(octets, mic, phy) PDU_MAX_US((octets), (mic), (phy)) -/* Extra bytes for enqueued node_rx metadata: rssi (always), resolving - * index, directed adv report, and mesh channel and instant. - */ -#define PDU_AC_SIZE_RSSI 1 -#if defined(CONFIG_BT_CTLR_PRIVACY) -#define PDU_AC_SIZE_PRIV 1 -#else -#define PDU_AC_SIZE_PRIV 0 -#endif /* CONFIG_BT_CTLR_PRIVACY */ -#if defined(CONFIG_BT_CTLR_EXT_SCAN_FP) -#define PDU_AC_SIZE_SCFP 1 -#else -#define PDU_AC_SIZE_SCFP 0 -#endif /* CONFIG_BT_CTLR_EXT_SCAN_FP */ -#if defined(CONFIG_BT_HCI_MESH_EXT) -#define PDU_AC_SIZE_MESH 5 -#else -#define PDU_AC_SIZE_MESH 0 -#endif /* CONFIG_BT_HCI_MESH_EXT */ - -#define PDU_AC_LL_SIZE_EXTRA (PDU_AC_SIZE_RSSI + \ - PDU_AC_SIZE_PRIV + \ - PDU_AC_SIZE_SCFP + \ - PDU_AC_SIZE_MESH) - struct pdu_adv_adv_ind { uint8_t addr[BDADDR_SIZE]; uint8_t data[PDU_AC_DATA_SIZE_MAX]; diff --git a/subsys/bluetooth/controller/ll_sw/ull.c b/subsys/bluetooth/controller/ll_sw/ull.c index 545e2c128a5d4..71865b4737858 100644 --- a/subsys/bluetooth/controller/ll_sw/ull.c +++ b/subsys/bluetooth/controller/ll_sw/ull.c @@ -358,21 +358,18 @@ static MFIFO_DEFINE(pdu_rx_free, sizeof(void *), PDU_RX_CNT); #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_LL_SIZE_MAX + PDU_AC_LL_SIZE_EXTRA) +#define PDU_ADV_SIZE MAX(PDU_AC_LL_SIZE_MAX, \ + (PDU_AC_LL_HEADER_SIZE + LL_EXT_OCTETS_RX_MAX)) #define PDU_DATA_SIZE MAX((PDU_DC_LL_HEADER_SIZE + LL_LENGTH_OCTETS_RX_MAX), \ (PDU_BIS_LL_HEADER_SIZE + LL_BIS_OCTETS_RX_MAX)) -#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 NODE_RX_HEADER_SIZE (offsetof(struct node_rx_pdu, pdu)) + +#define PDU_RX_NODE_POOL_ELEMENT_SIZE MROUND(NODE_RX_HEADER_SIZE + \ + MAX(MAX(PDU_ADV_SIZE, \ + PDU_DATA_SIZE), \ + PDU_RX_USER_PDU_OCTETS_MAX)) #if defined(CONFIG_BT_PER_ADV_SYNC_MAX) #define BT_CTLR_SCAN_SYNC_SET CONFIG_BT_PER_ADV_SYNC_MAX