This is an automated email from the ASF dual-hosted git repository.
andk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-nimble.git
The following commit(s) were added to refs/heads/master by this push:
new dc8ba53cf nimble/ll: Advertising Coding Selection support
dc8ba53cf is described below
commit dc8ba53cf6c2feaeb6d1d50729ba729fa0bf209f
Author: Michal Gorecki <[email protected]>
AuthorDate: Mon Nov 18 16:05:44 2024 +0100
nimble/ll: Advertising Coding Selection support
---
nimble/controller/include/controller/ble_ll.h | 7 ++++--
nimble/controller/src/ble_ll.c | 17 +++++++++++++-
nimble/controller/src/ble_ll_scan_aux.c | 34 +++++++++++++++++++++++++--
nimble/controller/syscfg.yml | 7 ++++++
4 files changed, 60 insertions(+), 5 deletions(-)
diff --git a/nimble/controller/include/controller/ble_ll.h
b/nimble/controller/include/controller/ble_ll.h
index 752ca43e9..ab75edcba 100644
--- a/nimble/controller/include/controller/ble_ll.h
+++ b/nimble/controller/include/controller/ble_ll.h
@@ -285,6 +285,8 @@ extern STATS_SECT_DECL(ble_ll_stats) ble_ll_stats;
#define BLE_LL_FEAT_CONN_SUBRATING (0x0002000000000)
#define BLE_LL_FEAT_CONN_SUBRATING_HOST (0x0004000000000)
#define BLE_LL_FEAT_CHANNEL_CLASS (0x0008000000000)
+#define BLE_LL_FEAT_ADV_CODING_SEL (0x0010000000000)
+#define BLE_LL_FEAT_ADV_CODING_SEL_HOST (0x0020000000000)
#define BLE_LL_FEAT_CS (0x0400000000000)
#define BLE_LL_FEAT_CS_HOST_SUPPORT (0x0800000000000)
#define BLE_LL_FEAT_CS_PCT_QUALITY_IND (0x1000000000000)
@@ -298,8 +300,9 @@ extern STATS_SECT_DECL(ble_ll_stats) ble_ll_stats;
#define BLE_LL_CONN_CLEAR_FEATURE(connsm, feature) (connsm->conn_features &=
~(feature))
/* All the features which can be controlled by the Host */
-#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_ENHANCED_CONN_UPDATE)
-#define BLE_LL_HOST_CONTROLLED_FEATURES (BLE_LL_FEAT_CONN_SUBRATING_HOST)
+#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_ENHANCED_CONN_UPDATE) | \
+ MYNEWT_VAL(BLE_LL_ADV_CODING_SELECTION)
+#define BLE_LL_HOST_CONTROLLED_FEATURES (1)
#else
#define BLE_LL_HOST_CONTROLLED_FEATURES (0)
#endif
diff --git a/nimble/controller/src/ble_ll.c b/nimble/controller/src/ble_ll.c
index cc11a93b4..a0d6dbbc0 100644
--- a/nimble/controller/src/ble_ll.c
+++ b/nimble/controller/src/ble_ll.c
@@ -86,6 +86,17 @@ static int8_t g_ble_ll_tx_power_phy_current;
int8_t g_ble_ll_tx_power_compensation;
int8_t g_ble_ll_rx_power_compensation;
+#if BLE_LL_HOST_CONTROLLED_FEATURES
+static const uint64_t g_ble_ll_host_controlled_features =
+#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_ENHANCED_CONN_UPDATE)
+ BLE_LL_FEAT_CONN_SUBRATING_HOST |
+#endif
+#if MYNEWT_VAL(BLE_LL_ADV_CODING_SELECTION)
+ BLE_LL_FEAT_ADV_CODING_SEL_HOST |
+#endif
+ 0;
+#endif
+
/* Supported states */
#if MYNEWT_VAL(BLE_LL_ROLE_BROADCASTER)
#define BLE_LL_S_NCA ((uint64_t)1 << 0)
@@ -1491,7 +1502,7 @@ ble_ll_set_host_feat(const uint8_t *cmdbuf, uint8_t len)
}
mask = (uint64_t)1 << (cmd->bit_num);
- if (!(mask & BLE_LL_HOST_CONTROLLED_FEATURES)) {
+ if (!(mask & g_ble_ll_host_controlled_features)) {
return BLE_ERR_UNSUPPORTED;
}
@@ -1947,6 +1958,10 @@ ble_ll_init(void)
features |= BLE_LL_FEAT_PERIODIC_ADV_ADI;
#endif
+#if MYNEWT_VAL(BLE_LL_ADV_CODING_SELECTION)
+ features |= BLE_LL_FEAT_ADV_CODING_SEL;
+#endif
+
lldata->ll_supp_features = features;
/* Initialize random number generation */
diff --git a/nimble/controller/src/ble_ll_scan_aux.c
b/nimble/controller/src/ble_ll_scan_aux.c
index 535c9c647..0cb734a24 100644
--- a/nimble/controller/src/ble_ll_scan_aux.c
+++ b/nimble/controller/src/ble_ll_scan_aux.c
@@ -84,6 +84,9 @@ struct ble_ll_scan_aux_data {
#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY)
int8_t rpa_index;
#endif
+#if MYNEWT_VAL(BLE_LL_ADV_CODING_SELECTION)
+ uint8_t pri_phy_mode;
+#endif
};
#define AUX_MEMPOOL_SIZE (OS_MEMPOOL_SIZE( \
@@ -216,7 +219,8 @@ ble_ll_scan_aux_need_truncation(struct ble_ll_scan_aux_data
*aux)
}
static struct ble_hci_ev *
-ble_ll_hci_ev_alloc_ext_adv_report_for_aux(struct ble_ll_scan_addr_data *addrd,
+ble_ll_hci_ev_alloc_ext_adv_report_for_aux(struct ble_mbuf_hdr_rxinfo *rxinfo,
+ struct ble_ll_scan_addr_data *addrd,
struct ble_ll_scan_aux_data *aux)
{
struct ble_hci_ev_le_subev_ext_adv_rpt *hci_subev;
@@ -257,6 +261,16 @@ ble_ll_hci_ev_alloc_ext_adv_report_for_aux(struct
ble_ll_scan_addr_data *addrd,
report->tx_power = 0x7f;
report->rssi = 0x7f;
report->periodic_itvl = 0;
+
+#if MYNEWT_VAL(BLE_LL_ADV_CODING_SELECTION)
+ if (aux->pri_phy_mode == BLE_PHY_MODE_CODED_500KBPS) {
+ report->pri_phy = 0x04;
+ }
+ if (rxinfo->phy_mode == BLE_PHY_MODE_CODED_500KBPS) {
+ report->sec_phy = 0x04;
+ }
+#endif
+
if (addrd->targeta) {
report->evt_type |= BLE_HCI_ADV_DIRECT_MASK;
report->dir_addr_type = addrd->targeta_type;
@@ -326,6 +340,12 @@ ble_ll_hci_ev_update_ext_adv_report_from_aux(struct
ble_hci_ev *hci_ev,
}
report->sec_phy = rxhdr->rxinfo.phy;
+#if MYNEWT_VAL(BLE_LL_ADV_CODING_SELECTION)
+ if (rxhdr->rxinfo.phy_mode == BLE_PHY_MODE_CODED_500KBPS) {
+ report->sec_phy = 0x04;
+ }
+#endif
+
/* Strip PDU header and ext header, leave only AD */
os_mbuf_adj(rxpdu, 3 + eh_len);
@@ -419,6 +439,12 @@ ble_ll_hci_ev_update_ext_adv_report_from_ext(struct
ble_hci_ev *hci_ev,
report->periodic_itvl = 0;
report->data_len = 0;
+#if MYNEWT_VAL(BLE_LL_ADV_CODING_SELECTION)
+ if (rxinfo->phy_mode == BLE_PHY_MODE_CODED_500KBPS) {
+ report->pri_phy = 0x04;
+ }
+#endif
+
/* Now parse extended header... */
if (eh_flags & (1 << BLE_LL_EXT_ADV_ADVA_BIT)) {
@@ -609,7 +635,7 @@ ble_ll_hci_ev_send_ext_adv_report_for_aux(struct os_mbuf
*rxpdu,
hci_ev = aux->hci_ev;
aux->hci_ev = NULL;
} else {
- hci_ev = ble_ll_hci_ev_alloc_ext_adv_report_for_aux(addrd, aux);
+ hci_ev = ble_ll_hci_ev_alloc_ext_adv_report_for_aux(&rxhdr->rxinfo,
addrd, aux);
if (!hci_ev) {
aux->hci_state = BLE_LL_SCAN_AUX_H_DONE;
return -1;
@@ -1077,6 +1103,10 @@ ble_ll_scan_aux_rx_isr_end_on_ext(struct ble_ll_scan_sm
*scansm,
aux->pri_phy = rxinfo->phy;
aux->aux_ptr = aux_ptr;
+#if MYNEWT_VAL(BLE_LL_ADV_CODING_SELECTION)
+ aux->pri_phy_mode = rxinfo->phy_mode;
+#endif
+
if (addrd.adva) {
memcpy(aux->adva, addrd.adva, 6);
aux->adva_type = addrd.adva_type;
diff --git a/nimble/controller/syscfg.yml b/nimble/controller/syscfg.yml
index 7c3aeae9a..1e830dbec 100644
--- a/nimble/controller/syscfg.yml
+++ b/nimble/controller/syscfg.yml
@@ -357,6 +357,13 @@ syscfg.defs:
restrictions:
- '(BLE_VERSION >= 53) if 1'
+ BLE_LL_ADV_CODING_SELECTION:
+ description: >
+ Enables support Advertising Coding Selection.
+ value: 0
+ restrictions:
+ - '(BLE_VERSION >= 54) if 1'
+
BLE_LL_PERIODIC_ADV_SYNC_BIGINFO_REPORTS:
description: >
This option is used to enable/disable support for