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 74d8f03a1a10b5261fac035fd61712084a9a7c64
Author: Andrzej Kaczmarek <[email protected]>
AuthorDate: Thu Mar 10 12:48:35 2022 +0100

    nimble/transport: Update socket transport
    
    This only works for external controller, external host can be
    implemented if needed (not sure who would use that though).
---
 nimble/transport/pkg.yml                     |   2 +
 nimble/transport/socket/src/ble_hci_socket.c | 270 ++++-----------------------
 nimble/transport/socket/syscfg.yml           |  20 --
 nimble/transport/syscfg.yml                  |   1 +
 4 files changed, 41 insertions(+), 252 deletions(-)

diff --git a/nimble/transport/pkg.yml b/nimble/transport/pkg.yml
index 287ed97..e5dad56 100644
--- a/nimble/transport/pkg.yml
+++ b/nimble/transport/pkg.yml
@@ -36,6 +36,8 @@ pkg.deps.'BLE_TRANSPORT_HS == "dialog_cmac" || 
BLE_TRANSPORT_LL == "dialog_cmac"
     - nimble/transport/dialog_cmac
 pkg.deps.'BLE_TRANSPORT_HS == "nrf5340" || BLE_TRANSPORT_LL == "nrf5340"':
     - nimble/transport/nrf5340
+pkg.deps.'BLE_TRANSPORT_LL == "socket"':
+    - nimble/transport/socket
 pkg.deps.'BLE_TRANSPORT_HS == "uart"':
     - nimble/transport/uart
 pkg.deps.'BLE_TRANSPORT_HS == "usb"':
diff --git a/nimble/transport/socket/src/ble_hci_socket.c 
b/nimble/transport/socket/src/ble_hci_socket.c
index 8a73389..ee974ec 100644
--- a/nimble/transport/socket/src/ble_hci_socket.c
+++ b/nimble/transport/socket/src/ble_hci_socket.c
@@ -85,7 +85,7 @@ struct sockaddr_hci {
 #include "nimble/nimble_opt.h"
 #include "nimble/hci_common.h"
 #include "nimble/nimble_npl.h"
-#include "nimble/ble_hci_trans.h"
+#include "nimble/transport.h"
 #include "socket/ble_hci_socket.h"
 
 /***
@@ -155,45 +155,6 @@ struct os_task ble_sock_task;
 
 #endif
 
-static struct os_mempool ble_hci_sock_evt_hi_pool;
-static os_membuf_t ble_hci_sock_evt_hi_buf[
-        OS_MEMPOOL_SIZE(MYNEWT_VAL(BLE_HCI_EVT_HI_BUF_COUNT),
-                        MYNEWT_VAL(BLE_HCI_EVT_BUF_SIZE))
-];
-
-static struct os_mempool ble_hci_sock_evt_lo_pool;
-static os_membuf_t ble_hci_sock_evt_lo_buf[
-        OS_MEMPOOL_SIZE(MYNEWT_VAL(BLE_HCI_EVT_LO_BUF_COUNT),
-                        MYNEWT_VAL(BLE_HCI_EVT_BUF_SIZE))
-];
-
-static struct os_mempool ble_hci_sock_cmd_pool;
-static os_membuf_t ble_hci_sock_cmd_buf[
-        OS_MEMPOOL_SIZE(1, BLE_HCI_TRANS_CMD_SZ)
-];
-
-static struct os_mempool ble_hci_sock_acl_pool;
-static struct os_mbuf_pool ble_hci_sock_acl_mbuf_pool;
-
-#define ACL_BLOCK_SIZE  OS_ALIGN(MYNEWT_VAL(BLE_ACL_BUF_SIZE) \
-                                 + BLE_MBUF_MEMBLOCK_OVERHEAD \
-                                 + BLE_HCI_DATA_HDR_SZ, OS_ALIGNMENT)
-/*
- * 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.
- */
-
-static os_membuf_t ble_hci_sock_acl_buf[
-        OS_MEMPOOL_SIZE(MYNEWT_VAL(BLE_ACL_BUF_COUNT),
-                        ACL_BLOCK_SIZE)
-];
-
-static ble_hci_trans_rx_cmd_fn *ble_hci_sock_rx_cmd_cb;
-static void *ble_hci_sock_rx_cmd_arg;
-static ble_hci_trans_rx_acl_fn *ble_hci_sock_rx_acl_cb;
-static void *ble_hci_sock_rx_acl_arg;
-
 static struct ble_hci_sock_state {
     int sock;
     struct ble_npl_eventq evq;
@@ -212,26 +173,6 @@ static int s_ble_hci_device = 
MYNEWT_VAL(BLE_SOCK_LINUX_DEV);
 static int s_ble_hci_device = 0;
 #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;
-
-    /*
-     * XXX: note that for host only there would be no need to allocate
-     * a user header. Address this later.
-     */
-    m = os_mbuf_get_pkthdr(&ble_hci_sock_acl_mbuf_pool,
-                           sizeof(struct ble_mbuf_hdr));
-    return m;
-}
-
 #if MYNEWT_VAL(BLE_SOCK_USE_LINUX_BLUE)
 static int
 ble_hci_sock_acl_tx(struct os_mbuf *om)
@@ -365,7 +306,7 @@ ble_hci_sock_cmdevt_tx(uint8_t *hci_ev, uint8_t h4_type)
     STATS_INCN(hci_sock_stats, obytes, len + 1);
 
     i = sendmsg(ble_hci_sock_state.sock, &msg, 0);
-    ble_hci_trans_buf_free(hci_ev);
+    ble_transport_free(hci_ev);
     if (i != len + 1) {
         if (i < 0) {
             dprintf(1, "sendmsg() failed : %d\n", errno);
@@ -468,17 +409,17 @@ ble_hci_sock_rx_msg(void)
             }
             STATS_INC(hci_sock_stats, imsg);
             STATS_INC(hci_sock_stats, icmd);
-            data = ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_CMD);
+            data = ble_transport_alloc_cmd();
             if (!data) {
                 STATS_INC(hci_sock_stats, ierr);
                 break;
             }
             memcpy(data, &bhss->rx_data[1], len - 1);
             OS_ENTER_CRITICAL(sr);
-            rc = ble_hci_sock_rx_cmd_cb(data, ble_hci_sock_rx_cmd_arg);
+            rc = ble_transport_to_ll_cmd(data);
             OS_EXIT_CRITICAL(sr);
             if (rc) {
-                ble_hci_trans_buf_free(data);
+                ble_transport_free(data);
                 STATS_INC(hci_sock_stats, ierr);
                 break;
             }
@@ -495,17 +436,17 @@ ble_hci_sock_rx_msg(void)
             }
             STATS_INC(hci_sock_stats, imsg);
             STATS_INC(hci_sock_stats, ievt);
-            data = ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_HI);
+            data = ble_transport_alloc_evt(0);
             if (!data) {
                 STATS_INC(hci_sock_stats, ierr);
                 break;
             }
             memcpy(data, &bhss->rx_data[1], len - 1);
             OS_ENTER_CRITICAL(sr);
-            rc = ble_hci_sock_rx_cmd_cb(data, ble_hci_sock_rx_cmd_arg);
+            rc = ble_transport_to_hs_evt(data);
             OS_EXIT_CRITICAL(sr);
             if (rc) {
-                ble_hci_trans_buf_free(data);
+                ble_transport_free(data);
                 STATS_INC(hci_sock_stats, ierr);
                 return 0;
             }
@@ -522,7 +463,11 @@ ble_hci_sock_rx_msg(void)
             }
             STATS_INC(hci_sock_stats, imsg);
             STATS_INC(hci_sock_stats, iacl);
-            m = ble_hci_trans_acl_buf_alloc();
+#if MYNEWT_VAL(BLE_CONTROLLER)
+            m = ble_transport_alloc_acl_from_hs();
+#else
+            m = ble_transport_alloc_acl_from_ll();
+#endif
             if (!m) {
                 STATS_INC(hci_sock_stats, imem);
                 break;
@@ -533,7 +478,11 @@ ble_hci_sock_rx_msg(void)
                 break;
             }
             OS_ENTER_CRITICAL(sr);
-            ble_hci_sock_rx_acl_cb(m, ble_hci_sock_rx_acl_arg);
+#if MYNEWT_VAL(BLE_CONTROLLER)
+            ble_transport_to_ll_acl(m);
+#else
+            ble_transport_to_hs_acl(m);
+#endif
             OS_EXIT_CRITICAL(sr);
             break;
         default:
@@ -786,129 +735,6 @@ ble_hci_trans_hs_acl_tx(struct os_mbuf *om)
 }
 
 /**
- * Configures the HCI transport to call the specified callback upon receiving
- * HCI packets from the controller.  This function should only be called by by
- * host.
- *
- * @param cmd_cb                The callback to execute upon receiving an HCI
- *                                  event.
- * @param cmd_arg               Optional argument to pass to the command
- *                                  callback.
- * @param acl_cb                The callback to execute upon receiving ACL
- *                                  data.
- * @param acl_arg               Optional argument to pass to the ACL
- *                                  callback.
- */
-void
-ble_hci_trans_cfg_hs(ble_hci_trans_rx_cmd_fn *cmd_cb,
-                     void *cmd_arg,
-                     ble_hci_trans_rx_acl_fn *acl_cb,
-                     void *acl_arg)
-{
-    ble_hci_sock_rx_cmd_cb = cmd_cb;
-    ble_hci_sock_rx_cmd_arg = cmd_arg;
-    ble_hci_sock_rx_acl_cb = acl_cb;
-    ble_hci_sock_rx_acl_arg = acl_arg;
-}
-
-/**
- * Configures the HCI transport to operate with a host.  The transport will
- * execute specified callbacks upon receiving HCI packets from the controller.
- *
- * @param cmd_cb                The callback to execute upon receiving an HCI
- *                                  event.
- * @param cmd_arg               Optional argument to pass to the command
- *                                  callback.
- * @param acl_cb                The callback to execute upon receiving ACL
- *                                  data.
- * @param acl_arg               Optional argument to pass to the ACL
- *                                  callback.
- */
-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_sock_rx_cmd_cb = cmd_cb;
-    ble_hci_sock_rx_cmd_arg = cmd_arg;
-    ble_hci_sock_rx_acl_cb = acl_cb;
-    ble_hci_sock_rx_acl_arg = acl_arg;
-}
-
-/**
- * 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_sock_cmd_pool);
-        break;
-    case BLE_HCI_TRANS_BUF_EVT_HI:
-        buf = os_memblock_get(&ble_hci_sock_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_sock_evt_lo_pool);
-        }
-        break;
-
-    case BLE_HCI_TRANS_BUF_EVT_LO:
-        buf = os_memblock_get(&ble_hci_sock_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_sock_evt_hi_pool, buf)) {
-        rc = os_memblock_put(&ble_hci_sock_evt_hi_pool, buf);
-        assert(rc == 0);
-    } else if (os_memblock_from(&ble_hci_sock_evt_lo_pool, buf)) {
-        rc = os_memblock_put(&ble_hci_sock_evt_lo_pool, buf);
-        assert(rc == 0);
-    } else {
-        assert(os_memblock_from(&ble_hci_sock_cmd_pool, buf));
-        rc = os_memblock_put(&ble_hci_sock_cmd_pool, buf);
-        assert(rc == 0);
-    }
-}
-
-/**
  * Resets the HCI UART transport to a clean state.  Frees all buffers and
  * reconfigures the UART.
  *
@@ -997,46 +823,6 @@ ble_hci_sock_init(void)
     ble_hci_sock_init_task();
     ble_npl_event_init(&ble_hci_sock_state.ev, ble_hci_sock_rx_ev, NULL);
 
-    rc = os_mempool_init(&ble_hci_sock_acl_pool,
-                         MYNEWT_VAL(BLE_ACL_BUF_COUNT),
-                         ACL_BLOCK_SIZE,
-                         ble_hci_sock_acl_buf,
-                         "ble_hci_sock_acl_pool");
-    SYSINIT_PANIC_ASSERT(rc == 0);
-
-    rc = os_mbuf_pool_init(&ble_hci_sock_acl_mbuf_pool,
-                           &ble_hci_sock_acl_pool,
-                           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_sock_cmd_pool,
-                         1,
-                         BLE_HCI_TRANS_CMD_SZ,
-                         &ble_hci_sock_cmd_buf,
-                         "ble_hci_sock_cmd_pool");
-    SYSINIT_PANIC_ASSERT(rc == 0);
-
-    rc = os_mempool_init(&ble_hci_sock_evt_hi_pool,
-                         MYNEWT_VAL(BLE_HCI_EVT_HI_BUF_COUNT),
-                         MYNEWT_VAL(BLE_HCI_EVT_BUF_SIZE),
-                         &ble_hci_sock_evt_hi_buf,
-                         "ble_hci_sock_evt_hi_pool");
-    SYSINIT_PANIC_ASSERT(rc == 0);
-
-    rc = os_mempool_init(&ble_hci_sock_evt_lo_pool,
-                         MYNEWT_VAL(BLE_HCI_EVT_LO_BUF_COUNT),
-                         MYNEWT_VAL(BLE_HCI_EVT_BUF_SIZE),
-                         ble_hci_sock_evt_lo_buf,
-                         "ble_hci_sock_evt_lo_pool");
-    SYSINIT_PANIC_ASSERT(rc == 0);
-
     rc = ble_hci_sock_config();
     SYSINIT_PANIC_ASSERT_MSG(rc == 0, "Failure configuring socket HCI");
 
@@ -1045,3 +831,23 @@ ble_hci_sock_init(void)
                             STATS_NAME_INIT_PARMS(hci_sock_stats), 
"hci_socket");
     SYSINIT_PANIC_ASSERT(rc == 0);
 }
+
+void
+ble_transport_ll_init(void)
+{
+    ble_hci_sock_init();
+}
+
+int
+ble_transport_to_ll_acl(struct os_mbuf *om)
+{
+    return ble_hci_trans_hs_acl_tx(om);
+}
+
+int
+ble_transport_to_ll_cmd(void *buf)
+{
+    return ble_hci_trans_hs_cmd_tx(buf);
+}
+
+/* TODO: add ll-to-hs side if needed */
diff --git a/nimble/transport/socket/syscfg.yml 
b/nimble/transport/socket/syscfg.yml
index 63b9cdd..c74f056 100644
--- a/nimble/transport/socket/syscfg.yml
+++ b/nimble/transport/socket/syscfg.yml
@@ -17,16 +17,6 @@
 #
 
 syscfg.defs:
-    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
-
     BLE_SOCK_USE_TCP:
         description: 'Use TCP socket, connects to BLE_SOCK_TCP_PORT'
         value: 1
@@ -60,13 +50,3 @@ syscfg.defs:
         description: >
             Sysinit stage for the socket BLE transport.
         value: 500
-
-syscfg.vals.'!BLE_HCI_BRIDGE && BLE_EXT_ADV':
-    BLE_HCI_EVT_BUF_SIZE: 257
-
-syscfg.vals.'!BLE_HCI_BRIDGE && !BLE_EXT_ADV':
-    BLE_HCI_EVT_BUF_SIZE: 70
-    BLE_HCI_EVT_HI_BUF_COUNT: 8
-    BLE_HCI_EVT_LO_BUF_COUNT: 8
-    BLE_ACL_BUF_COUNT: 24
-    BLE_ACL_BUF_SIZE: 255
diff --git a/nimble/transport/syscfg.yml b/nimble/transport/syscfg.yml
index d2404e1..cb9e07e 100644
--- a/nimble/transport/syscfg.yml
+++ b/nimble/transport/syscfg.yml
@@ -42,6 +42,7 @@ syscfg.defs:
             - native
             - dialog_cmac
             - nrf5340
+            - socket
             - custom
 
     BLE_TRANSPORT_ACL_COUNT:

Reply via email to