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

commit ded0999a47eb62d6c23dd0d4fc8c1957c973c11a
Author: Andrzej Kaczmarek <[email protected]>
AuthorDate: Thu Feb 20 18:30:18 2025 +0100

    nimble/ll: Add HCI Read Transmit Power Level command support
    
    This command is mandatory if central or peripheral roles are supported.
---
 nimble/controller/src/ble_ll_conn_hci.c     | 34 +++++++++++++++++++++++++++++
 nimble/controller/src/ble_ll_conn_priv.h    |  3 +++
 nimble/controller/src/ble_ll_hci.c          |  5 +++++
 nimble/controller/src/ble_ll_hci_supp_cmd.c |  3 +++
 4 files changed, 45 insertions(+)

diff --git a/nimble/controller/src/ble_ll_conn_hci.c 
b/nimble/controller/src/ble_ll_conn_hci.c
index 158464ed5..20ad4c1b8 100644
--- a/nimble/controller/src/ble_ll_conn_hci.c
+++ b/nimble/controller/src/ble_ll_conn_hci.c
@@ -32,6 +32,7 @@
 #include "controller/ble_ll_ctrl.h"
 #include "controller/ble_ll_scan.h"
 #include "controller/ble_ll_adv.h"
+#include "ble_ll_priv.h"
 #include "ble_ll_conn_priv.h"
 
 #if MYNEWT_VAL(BLE_LL_ROLE_CENTRAL) || MYNEWT_VAL(BLE_LL_ROLE_PERIPHERAL)
@@ -1939,6 +1940,39 @@ ble_ll_conn_hci_wr_auth_pyld_tmo(const uint8_t *cmdbuf, 
uint8_t len,
 }
 #endif
 
+#if MYNEWT_VAL(BLE_LL_ROLE_PERIPHERAL) || MYNEWT_VAL(BLE_LL_ROLE_CENTRAL)
+int
+ble_ll_conn_hci_cb_read_tx_pwr(const uint8_t *cmdbuf, uint8_t len,
+                               uint8_t *rspbuf, uint8_t *rsplen)
+{
+    const struct ble_hci_cb_read_tx_pwr_cp *cmd = (const void *)cmdbuf;
+    struct ble_hci_cb_read_tx_pwr_rp *rsp = (void *)rspbuf;
+    struct ble_ll_conn_sm *connsm;
+    uint16_t handle;
+
+    if (len != sizeof(*cmd)) {
+        return BLE_ERR_INV_HCI_CMD_PARMS;
+    }
+
+    if (cmd->type != 0x01) {
+        return BLE_ERR_INV_HCI_CMD_PARMS;
+    }
+
+    handle = le16toh(cmd->conn_handle);
+    connsm = ble_ll_conn_find_by_handle(handle);
+    if (!connsm) {
+        return BLE_ERR_UNK_CONN_ID;
+    }
+
+    rsp->conn_handle = cmd->conn_handle;
+    rsp->tx_level = g_ble_ll_tx_power;
+
+    *rsplen = sizeof(*rsp);
+
+    return BLE_ERR_SUCCESS;
+}
+#endif
+
 #if MYNEWT_VAL(BLE_LL_PHY)
 /**
  * Read current phy for connection (OGF=8, OCF==0x0030)
diff --git a/nimble/controller/src/ble_ll_conn_priv.h 
b/nimble/controller/src/ble_ll_conn_priv.h
index 954a27663..460a836ff 100644
--- a/nimble/controller/src/ble_ll_conn_priv.h
+++ b/nimble/controller/src/ble_ll_conn_priv.h
@@ -227,6 +227,9 @@ int ble_ll_conn_hci_wr_auth_pyld_tmo(const uint8_t *cmdbuf, 
uint8_t len,
                                      uint8_t *rspbuf, uint8_t *rsplen);
 int ble_ll_conn_hci_rd_auth_pyld_tmo(const uint8_t *cmdbuf, uint8_t len,
                                      uint8_t *rspbuf, uint8_t *rsplen);
+int ble_ll_conn_hci_cb_read_tx_pwr(const uint8_t *cmdbuf, uint8_t len,
+                                   uint8_t *rspbuf, uint8_t *rsplen);
+
 #if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_SCA_UPDATE)
 int ble_ll_conn_req_peer_sca(const uint8_t *cmdbuf, uint8_t len,
                              uint8_t *rspbuf, uint8_t *rsplen);
diff --git a/nimble/controller/src/ble_ll_hci.c 
b/nimble/controller/src/ble_ll_hci.c
index d07473301..93fac9d60 100644
--- a/nimble/controller/src/ble_ll_hci.c
+++ b/nimble/controller/src/ble_ll_hci.c
@@ -1541,6 +1541,11 @@ ble_ll_hci_ctlr_bb_cmd_proc(const uint8_t *cmdbuf, 
uint8_t len, uint16_t ocf,
             rc = ble_ll_reset();
         }
         break;
+#if MYNEWT_VAL(BLE_LL_ROLE_PERIPHERAL) || MYNEWT_VAL(BLE_LL_ROLE_CENTRAL)
+    case BLE_HCI_OCF_CB_READ_TX_PWR:
+        rc = ble_ll_conn_hci_cb_read_tx_pwr(cmdbuf, len, rspbuf, rsplen);
+        break;
+#endif
 #if MYNEWT_VAL(BLE_LL_CFG_FEAT_CTRL_TO_HOST_FLOW_CONTROL)
     case BLE_HCI_OCF_CB_SET_CTLR_TO_HOST_FC:
         rc = ble_ll_hci_cb_set_ctrlr_to_host_fc(cmdbuf, len);
diff --git a/nimble/controller/src/ble_ll_hci_supp_cmd.c 
b/nimble/controller/src/ble_ll_hci_supp_cmd.c
index abf292222..d9d6bd604 100644
--- a/nimble/controller/src/ble_ll_hci_supp_cmd.c
+++ b/nimble/controller/src/ble_ll_hci_supp_cmd.c
@@ -45,6 +45,9 @@ static const uint8_t octet_5 = OCTET(
 );
 
 static const uint8_t octet_10 = OCTET(
+#if MYNEWT_VAL(BLE_LL_ROLE_PERIPHERAL) || MYNEWT_VAL(BLE_LL_ROLE_CENTRAL)
+    BIT(2) /* HCI Read Transmit Power Level */
+#endif
 #if MYNEWT_VAL(BLE_LL_CFG_FEAT_CTRL_TO_HOST_FLOW_CONTROL)
     BIT(5) /* HCI Set Controller To Host Flow Control */
     BIT(6) /* HCI Host Buffer Size */

Reply via email to