You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by an...@apache.org on 2022/03/17 10:50:25 UTC

[mynewt-nimble] 15/22: babblesim/edtt: Update EDTT transport

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 f5a26ab05c55b4dd5d54f62e5001577743e8f8e0
Author: Andrzej Kaczmarek <an...@codecoup.pl>
AuthorDate: Sat Mar 5 17:34:03 2022 +0100

    babblesim/edtt: Update EDTT transport
---
 babblesim/edtt/hci_test/syscfg.yml              |   4 +-
 babblesim/edtt/hci_transport/pkg.yml            |   5 +-
 babblesim/edtt/hci_transport/src/ble_hci_edtt.c | 277 ++----------------------
 babblesim/edtt/hci_transport/syscfg.yml         |  21 +-
 4 files changed, 32 insertions(+), 275 deletions(-)

diff --git a/babblesim/edtt/hci_test/syscfg.yml b/babblesim/edtt/hci_test/syscfg.yml
index bdf21e7..8a7909a 100644
--- a/babblesim/edtt/hci_test/syscfg.yml
+++ b/babblesim/edtt/hci_test/syscfg.yml
@@ -18,8 +18,8 @@
 #
 
 syscfg.vals:
-    BLE_HOST: 0
-    BLE_HCI_TRANSPORT: custom
+    BLE_TRANSPORT_LL: native
+    BLE_TRANSPORT_HS: custom
 
     # EDTT requires 0x123456789ABC address for first device
     # and 0x456789ABCDEF for second
diff --git a/babblesim/edtt/hci_transport/pkg.yml b/babblesim/edtt/hci_transport/pkg.yml
index 8e1dd9f..8ad24cd 100644
--- a/babblesim/edtt/hci_transport/pkg.yml
+++ b/babblesim/edtt/hci_transport/pkg.yml
@@ -28,8 +28,11 @@ pkg.deps:
     - "@apache-mynewt-core/kernel/os"
     - nimble/controller
 
+# allows to override settings from nimble/transport
+pkg.subpriority: 1
+
 pkg.apis:
     - ble_transport
 
 pkg.init:
-    ble_hci_edtt_init: 500
+    ble_hci_edtt_init: 249
diff --git a/babblesim/edtt/hci_transport/src/ble_hci_edtt.c b/babblesim/edtt/hci_transport/src/ble_hci_edtt.c
index 36db846..aa70f05 100644
--- a/babblesim/edtt/hci_transport/src/ble_hci_edtt.c
+++ b/babblesim/edtt/hci_transport/src/ble_hci_edtt.c
@@ -17,7 +17,6 @@
 /* BLE */
 #include "nimble/ble.h"
 #include "nimble/hci_common.h"
-#include "nimble/ble_hci_trans.h"
 
 #include "bs_symbols.h"
 #include "bs_types.h"
@@ -26,9 +25,6 @@
 #include "edtt_driver.h"
 #include "commands.h"
 
-#define BLE_HCI_EDTT_EVT_COUNT  \
-    (MYNEWT_VAL(BLE_HCI_EVT_HI_BUF_COUNT) + MYNEWT_VAL(BLE_HCI_EVT_LO_BUF_COUNT))
-
 #define BLE_HCI_EDTT_NONE        0x00
 #define BLE_HCI_EDTT_CMD         0x01
 #define BLE_HCI_EDTT_ACL         0x02
@@ -36,49 +32,6 @@
 
 #define BT_HCI_OP_VS_WRITE_BD_ADDR 0xFC06
 
-/* Callbacks for sending commands and acl data to ble_ll task */
-static ble_hci_trans_rx_cmd_fn *ble_hci_edtt_rx_cmd_cb;
-static void *ble_hci_edtt_rx_cmd_arg;
-static ble_hci_trans_rx_acl_fn *ble_hci_edtt_rx_acl_cb;
-static void *ble_hci_edtt_rx_acl_arg;
-
-/* Memory pool for hci events (high prio). 16 blocks x 70 bytes */
-static struct os_mempool ble_hci_edtt_evt_hi_pool;
-static os_membuf_t ble_hci_edtt_evt_hi_buf[
-    OS_MEMPOOL_SIZE(MYNEWT_VAL(BLE_HCI_EVT_HI_BUF_COUNT),
-                    MYNEWT_VAL(BLE_HCI_EVT_BUF_SIZE))
-];
-
-/* Memory pool for hci events (low prio). 16 blocks x 70 bytes */
-static struct os_mempool ble_hci_edtt_evt_lo_pool;
-static os_membuf_t ble_hci_edtt_evt_lo_buf[
-    OS_MEMPOOL_SIZE(MYNEWT_VAL(BLE_HCI_EVT_LO_BUF_COUNT),
-                    MYNEWT_VAL(BLE_HCI_EVT_BUF_SIZE))
-];
-
-/* Memory pool for hci commands. Only 1 block, so supports only 1 command at once. */
-static struct os_mempool ble_hci_edtt_cmd_pool;
-static os_membuf_t ble_hci_edtt_cmd_buf[
-    OS_MEMPOOL_SIZE(1, BLE_HCI_TRANS_CMD_SZ)
-];
-
-/*
- * The MBUF payload size must accommodate the HCI data header size plus the
- * maximum ACL data packet length. The ACL block size is the size of the
- * mbufs we will allocate.
- */
-#define ACL_BLOCK_SIZE  OS_ALIGN(MYNEWT_VAL(BLE_ACL_BUF_SIZE) \
-                                 + BLE_MBUF_MEMBLOCK_OVERHEAD \
-                                 + BLE_HCI_DATA_HDR_SZ, OS_ALIGNMENT)
-
-/* mbuf pool for acl data. 15 buffers x (255 bytes + some hdrs len)  */
-static struct os_mbuf_pool ble_hci_edtt_acl_mbuf_pool;
-static struct os_mempool_ext ble_hci_edtt_acl_pool;
-static os_membuf_t ble_hci_edtt_acl_buf[
-    OS_MEMPOOL_SIZE(MYNEWT_VAL(BLE_ACL_BUF_COUNT),
-                    ACL_BLOCK_SIZE)
-];
-
 /* A packet for queueing EDTT/HCI commands and events */
 struct ble_hci_edtt_pkt {
     struct os_event ev;
@@ -145,28 +98,6 @@ log_hci_init()
 }
 #endif
 
-/**
- * Allocates a buffer (mbuf) for ACL operation.
- *
- * @return                      The allocated buffer on success;
- *                              NULL on buffer exhaustion.
- */
-static struct os_mbuf *
-ble_hci_trans_acl_buf_alloc(void)
-{
-    struct os_mbuf *m;
-    uint8_t usrhdr_len;
-
-#if MYNEWT_VAL(BLE_CONTROLLER)
-    usrhdr_len = sizeof(struct ble_mbuf_hdr);
-#else
-    usrhdr_len = 0;
-#endif
-
-    m = os_mbuf_get_pkthdr(&ble_hci_edtt_acl_mbuf_pool, usrhdr_len);
-    return m;
-}
-
 static int
 ble_hci_edtt_acl_tx(struct os_mbuf *om)
 {
@@ -201,18 +132,6 @@ ble_hci_edtt_cmdevt_tx(uint8_t *hci_ev, uint8_t edtt_type)
     return 0;
 }
 
-static void
-ble_hci_edtt_set_rx_cbs(ble_hci_trans_rx_cmd_fn *cmd_cb,
-                        void *cmd_arg,
-                        ble_hci_trans_rx_acl_fn *acl_cb,
-                        void *acl_arg)
-{
-    ble_hci_edtt_rx_cmd_cb = cmd_cb;
-    ble_hci_edtt_rx_cmd_arg = cmd_arg;
-    ble_hci_edtt_rx_acl_cb = acl_cb;
-    ble_hci_edtt_rx_acl_arg = acl_arg;
-}
-
 /**
  * Sends an HCI event from the controller to the host.
  *
@@ -223,12 +142,9 @@ ble_hci_edtt_set_rx_cbs(ble_hci_trans_rx_cmd_fn *cmd_cb,
  *                              A BLE_ERR_[...] error code on failure.
  */
 int
-ble_hci_trans_ll_evt_tx(uint8_t *cmd)
+ble_transport_to_hs_evt(void *buf)
 {
-    int rc;
-
-    rc = ble_hci_edtt_cmdevt_tx(cmd, BLE_HCI_EDTT_EVT);
-    return rc;
+    return ble_hci_edtt_cmdevt_tx(buf, BLE_HCI_EDTT_EVT);
 }
 
 /**
@@ -240,120 +156,9 @@ ble_hci_trans_ll_evt_tx(uint8_t *cmd)
  *                              A BLE_ERR_[...] error code on failure.
  */
 int
-ble_hci_trans_ll_acl_tx(struct os_mbuf *om)
+ble_transport_to_hs_acl(struct os_mbuf *om)
 {
-    int rc;
-
-    rc = ble_hci_edtt_acl_tx(om);
-    return rc;
-}
-
-int
-ble_hci_trans_hs_cmd_tx(uint8_t *cmd)
-{
-    int rc;
-
-    rc = ble_hci_edtt_cmdevt_tx(cmd, BLE_HCI_EDTT_CMD);
-    return rc;
-}
-
-int
-ble_hci_trans_hs_acl_tx(struct os_mbuf *om)
-{
-    int rc;
-
-    rc = ble_hci_edtt_acl_tx(om);
-    return rc;
-}
-
-/**
- * Allocates a flat buffer of the specified type.
- *
- * @param type                  The type of buffer to allocate; one of the
- *                                  BLE_HCI_TRANS_BUF_[...] constants.
- *
- * @return                      The allocated buffer on success;
- *                              NULL on buffer exhaustion.
- */
-uint8_t *
-ble_hci_trans_buf_alloc(int type) {
-    uint8_t *buf;
-
-    switch (type) {
-        case BLE_HCI_TRANS_BUF_CMD:
-            buf = os_memblock_get(&ble_hci_edtt_cmd_pool);
-            break;
-        case BLE_HCI_TRANS_BUF_EVT_HI:
-            buf = os_memblock_get(&ble_hci_edtt_evt_hi_pool);
-            if (buf == NULL) {
-                /* If no high-priority event buffers remain, try to grab a
-                 * low-priority one.
-                 */
-                buf = os_memblock_get(&ble_hci_edtt_evt_lo_pool);
-            }
-            break;
-
-        case BLE_HCI_TRANS_BUF_EVT_LO:
-            buf = os_memblock_get(&ble_hci_edtt_evt_lo_pool);
-            break;
-
-        default:
-            assert(0);
-            buf = NULL;
-    }
-
-    return buf;
-}
-
-/**
- * Frees the specified flat buffer.  The buffer must have been allocated via
- * ble_hci_trans_buf_alloc().
- *
- * @param buf                   The buffer to free.
- */
-void
-ble_hci_trans_buf_free(uint8_t *buf)
-{
-    int rc;
-
-    /*
-     * XXX: this may look a bit odd, but the controller uses the command
-     * buffer to send back the command complete/status as an immediate
-     * response to the command. This was done to insure that the controller
-     * could always send back one of these events when a command was received.
-     * Thus, we check to see which pool the buffer came from so we can free
-     * it to the appropriate pool
-     */
-    if (os_memblock_from(&ble_hci_edtt_evt_hi_pool, buf)) {
-        rc = os_memblock_put(&ble_hci_edtt_evt_hi_pool, buf);
-        assert(rc == 0);
-    } else if (os_memblock_from(&ble_hci_edtt_evt_lo_pool, buf)) {
-        rc = os_memblock_put(&ble_hci_edtt_evt_lo_pool, buf);
-        assert(rc == 0);
-    } else if (os_memblock_from(&ble_hci_edtt_cmd_pool, buf)) {
-        assert(os_memblock_from(&ble_hci_edtt_cmd_pool, buf));
-        rc = os_memblock_put(&ble_hci_edtt_cmd_pool, buf);
-        assert(rc == 0);
-    } else {
-        free(buf);
-    }
-}
-
-int
-ble_hci_trans_set_acl_free_cb(os_mempool_put_fn *cb, void *arg)
-{
-    ble_hci_edtt_acl_pool.mpe_put_cb = cb;
-    ble_hci_edtt_acl_pool.mpe_put_arg = arg;
-    return 0;
-}
-
-void
-ble_hci_trans_cfg_ll(ble_hci_trans_rx_cmd_fn *cmd_cb,
-                     void *cmd_arg,
-                     ble_hci_trans_rx_acl_fn *acl_cb,
-                     void *acl_arg)
-{
-    ble_hci_edtt_set_rx_cbs(cmd_cb, cmd_arg, acl_cb, acl_arg);
+    return ble_hci_edtt_acl_tx(om);
 }
 
 /**
@@ -398,8 +203,7 @@ send_hci_cmd_to_ctrl(uint16_t opcode, uint8_t param_len, uint16_t response) {
     waiting_response = response;
     waiting_opcode = opcode;
 
-    buf = (void *) ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_CMD);
-
+    buf = ble_transport_alloc_cmd();
     if (buf != NULL) {
         buf->opcode = opcode;
         buf->length = param_len;
@@ -412,9 +216,9 @@ send_hci_cmd_to_ctrl(uint16_t opcode, uint8_t param_len, uint16_t response) {
         log_hci_cmd(opcode, buf->data, param_len);
 #endif
 
-        err = ble_hci_edtt_rx_cmd_cb((uint8_t *) buf, NULL);
+        err = ble_transport_to_ll_cmd(buf);
         if (err) {
-            ble_hci_trans_buf_free((uint8_t *) buf);
+            ble_transport_free(buf);
             bs_trace_raw_time(3, "Failed to send HCI command %d (err %d)", opcode, err);
             error_response(err);
         }
@@ -454,7 +258,9 @@ command_complete(struct ble_hci_ev *evt)
     uint16_t response = waiting_response;
     uint16_t size = evt->length - sizeof(evt_cc->num_packets) - sizeof(evt_cc->opcode);
 
-    if (evt_cc->opcode == waiting_opcode) {
+    if (evt_cc->opcode == 0) {
+        /* ignore nop */
+    } else if (evt_cc->opcode == waiting_opcode) {
         bs_trace_raw_time(9, "Command complete for 0x%04x", waiting_opcode);
 
         edtt_write((uint8_t *) &response, sizeof(response), EDTTT_BLOCK);
@@ -507,7 +313,7 @@ static void
 free_event(struct ble_hci_edtt_pkt *pkt)
 {
     assert(pkt);
-    ble_hci_trans_buf_free((void *)pkt->data);
+    ble_transport_free(pkt->data);
     free(pkt);
 }
 
@@ -553,9 +359,10 @@ dup_complete_evt(void *evt)
 {
     struct ble_hci_ev *evt_copy;
 
-    evt_copy = calloc(1, BLE_HCI_TRANS_CMD_SZ);
-    memcpy(evt_copy, evt, BLE_HCI_TRANS_CMD_SZ);
-    ble_hci_trans_buf_free((void *)evt);
+    /* max evt size is always 257 */
+    evt_copy = ble_transport_alloc_evt(0);
+    memcpy(evt_copy, evt, 257);
+    ble_transport_free(evt);
 
     return evt_copy;
 }
@@ -598,14 +405,14 @@ service_events(void *arg)
                 assert(evt_ncp->count == 1);
                 if (evt_ncp->completed[0].packets == 0) {
                     /* Discard, because EDTT does not like it */
-                    ble_hci_trans_buf_free((void *)evt);
+                    ble_transport_free(evt);
                 } else {
                     queue_event(evt);
                 }
                 break;
             case BLE_HCI_OPCODE_NOP:
                 /* Ignore noop bytes from Link layer */
-                ble_hci_trans_buf_free((void *)evt);
+                ble_transport_free(evt);
                 break;
             default:
                 /* Queue HCI events. We will send them to EDTT
@@ -831,7 +638,7 @@ le_data_write(uint16_t size)
     int err;
 
     if (size >= sizeof(hdr)) {
-        om = ble_hci_trans_acl_buf_alloc();
+        om = ble_transport_alloc_acl_from_hs();
         if (om) {
             edtt_read((void *)&hdr, sizeof(hdr), EDTTT_BLOCK);
             size -= sizeof(hdr);
@@ -848,7 +655,7 @@ le_data_write(uint16_t size)
                 os_mbuf_append(om, tmp, hdr.hdh_len);
             }
 
-            err = ble_hci_edtt_rx_acl_cb(om, NULL);
+            err = ble_transport_to_ll_acl(om);
             if (err) {
                 bs_trace_raw_time(3, "Failed to send ACL Data (err %d)", err);
             }
@@ -874,7 +681,7 @@ fake_write_bd_addr_cc()
     waiting_opcode = BT_HCI_OP_VS_WRITE_BD_ADDR;
     waiting_response = CMD_WRITE_BD_ADDR_RSP;
 
-    hci_ev = (void *) ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_HI);
+    hci_ev = ble_transport_alloc_evt(0);
     if (hci_ev) {
         hci_ev->opcode = BLE_HCI_EVCODE_COMMAND_COMPLETE;
         hci_ev->length = sizeof(*ev);
@@ -997,53 +804,9 @@ edtt_init(void)
 void
 ble_hci_edtt_init(void)
 {
-    int rc;
-
     /* Ensure this function only gets called by sysinit. */
     SYSINIT_ASSERT_ACTIVE();
 
-    rc = os_mempool_ext_init(&ble_hci_edtt_acl_pool,
-                             MYNEWT_VAL(BLE_ACL_BUF_COUNT),
-                             ACL_BLOCK_SIZE,
-                             ble_hci_edtt_acl_buf,
-                             "ble_hci_edtt_acl_pool");
-    SYSINIT_PANIC_ASSERT(rc == 0);
-
-    rc = os_mbuf_pool_init(&ble_hci_edtt_acl_mbuf_pool,
-                           &ble_hci_edtt_acl_pool.mpe_mp,
-                           ACL_BLOCK_SIZE,
-                           MYNEWT_VAL(BLE_ACL_BUF_COUNT));
-    SYSINIT_PANIC_ASSERT(rc == 0);
-
-    /*
-     * Create memory pool of HCI command buffers. NOTE: we currently dont
-     * allow this to be configured. The controller will only allow one
-     * outstanding command. We decided to keep this a pool in case we allow
-     * allow the controller to handle more than one outstanding command.
-     */
-    rc = os_mempool_init(&ble_hci_edtt_cmd_pool,
-                         1,
-                         BLE_HCI_TRANS_CMD_SZ,
-                         ble_hci_edtt_cmd_buf,
-                         "ble_hci_edtt_cmd_pool");
-    SYSINIT_PANIC_ASSERT(rc == 0);
-
-    rc = os_mempool_init(&ble_hci_edtt_evt_hi_pool,
-                         MYNEWT_VAL(BLE_HCI_EVT_HI_BUF_COUNT),
-                         MYNEWT_VAL(BLE_HCI_EVT_BUF_SIZE),
-                         ble_hci_edtt_evt_hi_buf,
-                         "ble_hci_edtt_evt_hi_pool");
-    SYSINIT_PANIC_ASSERT(rc == 0);
-
-    rc = os_mempool_init(&ble_hci_edtt_evt_lo_pool,
-                         MYNEWT_VAL(BLE_HCI_EVT_LO_BUF_COUNT),
-                         MYNEWT_VAL(BLE_HCI_EVT_BUF_SIZE),
-                         ble_hci_edtt_evt_lo_buf,
-                         "ble_hci_edtt_evt_lo_pool");
-    SYSINIT_PANIC_ASSERT(rc == 0);
-
-    SYSINIT_PANIC_ASSERT_MSG(rc == 0, "Failure configuring edtt HCI");
-
     os_eventq_init(&edtt_q_svc);
     os_eventq_init(&edtt_q_event);
     os_eventq_init(&edtt_q_data);
diff --git a/babblesim/edtt/hci_transport/syscfg.yml b/babblesim/edtt/hci_transport/syscfg.yml
index b203361..ad12f7b 100644
--- a/babblesim/edtt/hci_transport/syscfg.yml
+++ b/babblesim/edtt/hci_transport/syscfg.yml
@@ -31,19 +31,10 @@ syscfg.defs:
         type: task_priority
         value: 2
 
-    BLE_HCI_ACL_OUT_COUNT:
-        description: >
-            This count is used in creating a pool of elements used by the
-            code to enqueue various elements. In the case of the controller
-            only HCI, this number should be equal to the number of mbufs in
-            the msys pool. For host only, it is really dependent on the
-            number of ACL buffers that the controller tells the host it
-            has.
-        value: 12
-
 syscfg.vals:
-    BLE_ACL_BUF_COUNT: 32
-    BLE_ACL_BUF_SIZE: 255
-    BLE_HCI_EVT_BUF_SIZE: 257
-    BLE_HCI_EVT_HI_BUF_COUNT: 32
-    BLE_HCI_EVT_LO_BUF_COUNT: 32
+    BLE_TRANSPORT_ACL_COUNT: 32
+    BLE_TRANSPORT_EVT_COUNT: 64
+
+syscfg.restrictions:
+    - BLE_TRANSPORT_HS == "custom"
+    - BLE_TRANSPORT_LL == "native"
\ No newline at end of file