Protect connection list with a mutex

Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/commit/cf46c07f
Tree: 
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/tree/cf46c07f
Diff: 
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/diff/cf46c07f

Branch: refs/heads/master
Commit: cf46c07f926c44aebbb3f79fb001af7008cda424
Parents: 7674b1b
Author: Christopher Collins <ccollins47...@gmail.com>
Authored: Mon Feb 1 11:56:20 2016 -0800
Committer: Christopher Collins <ccollins47...@gmail.com>
Committed: Mon Feb 1 19:40:59 2016 -0800

----------------------------------------------------------------------
 net/nimble/host/include/host/ble_gap.h      |    2 +-
 net/nimble/host/src/ble_att.c               |   60 +-
 net/nimble/host/src/ble_att_clt.c           |  218 +++--
 net/nimble/host/src/ble_att_priv.h          |   87 +-
 net/nimble/host/src/ble_att_svr.c           |  357 +++++--
 net/nimble/host/src/ble_gap_conn.c          |  710 ++++++++++----
 net/nimble/host/src/ble_gap_priv.h          |    2 +-
 net/nimble/host/src/ble_gatt_priv.h         |   32 +-
 net/nimble/host/src/ble_gattc.c             | 1141 ++++++++++++++--------
 net/nimble/host/src/ble_gatts.c             |  153 ++-
 net/nimble/host/src/ble_hs_adv.c            |    2 +
 net/nimble/host/src/ble_hs_conn.c           |  126 ++-
 net/nimble/host/src/ble_hs_conn.h           |    4 +
 net/nimble/host/src/ble_l2cap.c             |   63 +-
 net/nimble/host/src/ble_l2cap_priv.h        |    9 +-
 net/nimble/host/src/ble_l2cap_sig.c         |  249 +++--
 net/nimble/host/src/host_hci.c              |   59 +-
 net/nimble/host/src/test/ble_gap_test.c     |    2 +-
 net/nimble/host/src/test/ble_hs_test_util.c |   26 +-
 net/nimble/host/src/test/ble_hs_test_util.h |    3 +
 net/nimble/host/src/test/ble_l2cap_test.c   |   15 +-
 net/nimble/host/src/test/ble_os_test.c      |    8 +-
 project/bleshell/src/main.c                 |   10 +-
 23 files changed, 2323 insertions(+), 1015 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/cf46c07f/net/nimble/host/include/host/ble_gap.h
----------------------------------------------------------------------
diff --git a/net/nimble/host/include/host/ble_gap.h 
b/net/nimble/host/include/host/ble_gap.h
index 3b8705e..3ea1e17 100644
--- a/net/nimble/host/include/host/ble_gap.h
+++ b/net/nimble/host/include/host/ble_gap.h
@@ -126,7 +126,7 @@ struct ble_gap_conn_upd_params {
 };
 
 struct ble_gap_conn_ctxt {
-    struct ble_gap_conn_desc desc;
+    struct ble_gap_conn_desc *desc;
     struct ble_gap_conn_upd_params *peer_params;
     struct ble_gap_conn_upd_params *self_params;
 };

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/cf46c07f/net/nimble/host/src/ble_att.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/ble_att.c b/net/nimble/host/src/ble_att.c
index 219a66c..7567297 100644
--- a/net/nimble/host/src/ble_att.c
+++ b/net/nimble/host/src/ble_att.c
@@ -16,7 +16,9 @@
 
 #include <stddef.h>
 #include <errno.h>
+#include <assert.h>
 #include "ble_hs_priv.h"
+#include "ble_hs_conn.h"
 #include "ble_l2cap_priv.h"
 #include "ble_att_cmd.h"
 #include "ble_att_priv.h"
@@ -24,15 +26,13 @@
 static uint16_t ble_att_preferred_mtu;
 
 /** Dispatch table for incoming ATT requests.  Sorted by op code. */
-typedef int ble_att_rx_fn(struct ble_hs_conn *conn,
-                          struct ble_l2cap_chan *chan,
-                          struct os_mbuf **om);
+typedef int ble_att_rx_fn(uint16_t conn_handle, struct os_mbuf **om);
 struct ble_att_rx_dispatch_entry {
     uint8_t bde_op;
     ble_att_rx_fn *bde_fn;
 };
 
-static struct ble_att_rx_dispatch_entry ble_att_rx_dispatch[] = {
+static const struct ble_att_rx_dispatch_entry ble_att_rx_dispatch[] = {
     { BLE_ATT_OP_ERROR_RSP,            ble_att_clt_rx_error },
     { BLE_ATT_OP_MTU_REQ,              ble_att_svr_rx_mtu },
     { BLE_ATT_OP_MTU_RSP,              ble_att_clt_rx_mtu },
@@ -64,10 +64,13 @@ static struct ble_att_rx_dispatch_entry 
ble_att_rx_dispatch[] = {
 #define BLE_ATT_RX_DISPATCH_SZ \
     (sizeof ble_att_rx_dispatch / sizeof ble_att_rx_dispatch[0])
 
-static struct ble_att_rx_dispatch_entry *
+/**
+ * Lock restrictions: None.
+ */
+static const struct ble_att_rx_dispatch_entry *
 ble_att_rx_dispatch_entry_find(uint8_t op)
 {
-    struct ble_att_rx_dispatch_entry *entry;
+    const struct ble_att_rx_dispatch_entry *entry;
     int i;
 
     for (i = 0; i < BLE_ATT_RX_DISPATCH_SZ; i++) {
@@ -84,11 +87,31 @@ ble_att_rx_dispatch_entry_find(uint8_t op)
     return NULL;
 }
 
+/**
+ * Lock restrictions: Caller must lock ble_hs_conn mutex.
+ */
+int
+ble_att_conn_chan_find(uint16_t conn_handle, struct ble_hs_conn **out_conn,
+                       struct ble_l2cap_chan **out_chan)
+{
+    *out_conn = ble_hs_conn_find(conn_handle);
+    if (*out_conn == NULL) {
+        return BLE_HS_ENOTCONN;
+    }
+
+    *out_chan = ble_hs_conn_chan_find(*out_conn, BLE_L2CAP_CID_ATT);
+    assert(*out_chan != NULL);
+
+    return 0;
+}
+
+/**
+ * Lock restrictions: Caller must lock ble_hs_conn mutex.
+ */
 static int
-ble_att_rx(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan,
-           struct os_mbuf **om)
+ble_att_rx(uint16_t conn_handle, struct os_mbuf **om)
 {
-    struct ble_att_rx_dispatch_entry *entry;
+    const struct ble_att_rx_dispatch_entry *entry;
     uint8_t op;
     int rc;
 
@@ -102,7 +125,7 @@ ble_att_rx(struct ble_hs_conn *conn, struct ble_l2cap_chan 
*chan,
         return BLE_HS_EINVAL;
     }
 
-    rc = entry->bde_fn(conn, chan, om);
+    rc = entry->bde_fn(conn_handle, om);
     if (rc != 0) {
         return rc;
     }
@@ -110,6 +133,9 @@ ble_att_rx(struct ble_hs_conn *conn, struct ble_l2cap_chan 
*chan,
     return 0;
 }
 
+/**
+ * Lock restrictions: None.
+ */
 void
 ble_att_set_notify_cb(ble_att_svr_notify_fn *cb, void *cb_arg)
 {
@@ -117,6 +143,9 @@ ble_att_set_notify_cb(ble_att_svr_notify_fn *cb, void 
*cb_arg)
     ble_att_svr_notify_cb_arg = cb_arg;
 }
 
+/**
+ * Lock restrictions: Caller must lock ble_hs_conn mutex.
+ */
 void
 ble_att_set_peer_mtu(struct ble_l2cap_chan *chan, uint16_t peer_mtu)
 {
@@ -127,6 +156,9 @@ ble_att_set_peer_mtu(struct ble_l2cap_chan *chan, uint16_t 
peer_mtu)
     chan->blc_peer_mtu = peer_mtu;
 }
 
+/**
+ * Lock restrictions: None.
+ */
 int
 ble_att_set_preferred_mtu(uint16_t mtu)
 {
@@ -144,6 +176,9 @@ ble_att_set_preferred_mtu(uint16_t mtu)
     return 0;
 }
 
+/**
+ * Lock restrictions: None.
+ */
 struct ble_l2cap_chan *
 ble_att_create_chan(void)
 {
@@ -164,6 +199,8 @@ ble_att_create_chan(void)
 
 /**
  * Allocates an mbuf for use as an ATT request or response.
+ *
+ * Lock restrictions: None.
  */
 struct os_mbuf *
 ble_att_get_pkthdr(void)
@@ -181,6 +218,9 @@ ble_att_get_pkthdr(void)
     return om;
 }
 
+/**
+ * Lock restrictions: None.
+ */
 void
 ble_att_init(void)
 {

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/cf46c07f/net/nimble/host/src/ble_att_clt.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/ble_att_clt.c 
b/net/nimble/host/src/ble_att_clt.c
index d977e51..b9de412 100644
--- a/net/nimble/host/src/ble_att_clt.c
+++ b/net/nimble/host/src/ble_att_clt.c
@@ -27,6 +27,9 @@
 #include "ble_att_cmd.h"
 #include "ble_att_priv.h"
 
+/**
+ * Lock restrictions: Caller must lock ble_hs_conn mutex.
+ */
 static int
 ble_att_clt_init_req(struct ble_hs_conn *conn, struct ble_l2cap_chan **chan,
                      struct os_mbuf **txom, uint16_t initial_sz)
@@ -67,6 +70,9 @@ err:
     return rc;
 }
 
+/**
+ * Lock restrictions: Caller must lock ble_hs_conn mutex.
+ */
 static int
 ble_att_clt_append_blob(struct ble_l2cap_chan *chan, struct os_mbuf *txom,
                         void *blob, int blob_len)
@@ -102,9 +108,11 @@ ble_att_clt_append_blob(struct ble_l2cap_chan *chan, 
struct os_mbuf *txom,
  * $error response                                                           *
  *****************************************************************************/
 
+/**
+ * Lock restrictions: Caller must NOT lock ble_hs_conn mutex.
+ */
 int
-ble_att_clt_rx_error(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan,
-                     struct os_mbuf **om)
+ble_att_clt_rx_error(uint16_t conn_handle, struct os_mbuf **om)
 {
     struct ble_att_error_rsp rsp;
     int rc;
@@ -119,7 +127,7 @@ ble_att_clt_rx_error(struct ble_hs_conn *conn, struct 
ble_l2cap_chan *chan,
         return rc;
     }
 
-    ble_gattc_rx_err(conn->bhc_handle, &rsp);
+    ble_gattc_rx_err(conn_handle, &rsp);
 
     return 0;
 }
@@ -128,6 +136,9 @@ ble_att_clt_rx_error(struct ble_hs_conn *conn, struct 
ble_l2cap_chan *chan,
  * $mtu exchange                                                             *
  *****************************************************************************/
 
+/**
+ * Lock restrictions: Caller must lock ble_hs_conn mutex.
+ */
 int
 ble_att_clt_tx_mtu(struct ble_hs_conn *conn, struct ble_att_mtu_cmd *req)
 {
@@ -165,28 +176,45 @@ err:
     return rc;
 }
 
+/**
+ * Lock restrictions: Caller must NOT lock ble_hs_conn mutex.
+ */
 int
-ble_att_clt_rx_mtu(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan,
-                   struct os_mbuf **om)
+ble_att_clt_rx_mtu(uint16_t conn_handle, struct os_mbuf **om)
 {
     struct ble_att_mtu_cmd rsp;
+    struct ble_l2cap_chan *chan;
+    struct ble_hs_conn *conn;
+    uint16_t mtu;
     int rc;
 
+    mtu = 0;
+
     *om = os_mbuf_pullup(*om, BLE_ATT_MTU_CMD_SZ);
     if (*om == NULL) {
         rc = BLE_HS_ENOMEM;
-        goto done;
-    }
+    } else {
+        rc = ble_att_mtu_cmd_parse((*om)->om_data, (*om)->om_len, &rsp);
+        assert(rc == 0);
 
-    rc = ble_att_mtu_cmd_parse((*om)->om_data, (*om)->om_len, &rsp);
-    assert(rc == 0);
+        ble_hs_conn_lock();
 
-    ble_att_set_peer_mtu(chan, rsp.bamc_mtu);
+        conn = ble_hs_conn_find(conn_handle);
+        if (conn == NULL) {
+            rc = BLE_HS_ENOTCONN;
+        } else {
+            chan = ble_hs_conn_chan_find(conn, BLE_L2CAP_CID_ATT);
+            assert(chan != NULL);
 
-    rc = 0;
+            ble_att_set_peer_mtu(chan, rsp.bamc_mtu);
+            mtu = ble_l2cap_chan_mtu(chan);
+            rc = 0;
+        }
 
-done:
-    ble_gattc_rx_mtu(conn, rc, ble_l2cap_chan_mtu(chan));
+        ble_hs_conn_unlock();
+    }
+
+    ble_gattc_rx_mtu(conn_handle, rc, mtu);
     return rc;
 }
 
@@ -194,6 +222,9 @@ done:
  * $find information                                                         *
  *****************************************************************************/
 
+/**
+ * Lock restrictions: Caller must lock ble_hs_conn mutex.
+ */
 int
 ble_att_clt_tx_find_info(struct ble_hs_conn *conn,
                          struct ble_att_find_info_req *req)
@@ -232,9 +263,11 @@ err:
     return rc;
 }
 
+/**
+ * Lock restrictions: Caller must lock ble_hs_conn mutex.
+ */
 int
-ble_att_clt_rx_find_info(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan,
-                         struct os_mbuf **om)
+ble_att_clt_rx_find_info(uint16_t conn_handle, struct os_mbuf **om)
 {
     struct ble_att_find_info_rsp rsp;
     struct ble_att_find_info_idata idata;
@@ -299,7 +332,7 @@ ble_att_clt_rx_find_info(struct ble_hs_conn *conn, struct 
ble_l2cap_chan *chan,
             goto done;
         }
 
-        ble_gattc_rx_find_info_idata(conn, &idata);
+        ble_gattc_rx_find_info_idata(conn_handle, &idata);
     }
 
     rc = 0;
@@ -307,7 +340,7 @@ ble_att_clt_rx_find_info(struct ble_hs_conn *conn, struct 
ble_l2cap_chan *chan,
 done:
     *om = rxom;
 
-    ble_gattc_rx_find_info_complete(conn, rc);
+    ble_gattc_rx_find_info_complete(conn_handle, rc);
     return rc;
 }
 
@@ -315,6 +348,9 @@ done:
  * $find by type value                                                       *
  *****************************************************************************/
 
+/**
+ * Lock restrictions: Caller must lock ble_hs_conn mutex.
+ */
 int
 ble_att_clt_tx_find_type_value(struct ble_hs_conn *conn,
                                struct ble_att_find_type_value_req *req,
@@ -376,10 +412,11 @@ ble_att_clt_parse_find_type_value_hinfo(
     return 0;
 }
 
+/**
+ * Lock restrictions: Caller must lock ble_hs_conn mutex.
+ */
 int
-ble_att_clt_rx_find_type_value(struct ble_hs_conn *conn,
-                               struct ble_l2cap_chan *chan,
-                               struct os_mbuf **rxom)
+ble_att_clt_rx_find_type_value(uint16_t conn_handle, struct os_mbuf **rxom)
 {
     struct ble_att_find_type_value_hinfo hinfo;
     int rc;
@@ -398,12 +435,12 @@ ble_att_clt_rx_find_type_value(struct ble_hs_conn *conn,
             break;
         }
 
-        ble_gattc_rx_find_type_value_hinfo(conn, &hinfo);
+        ble_gattc_rx_find_type_value_hinfo(conn_handle, &hinfo);
         os_mbuf_adj(*rxom, BLE_ATT_FIND_TYPE_VALUE_HINFO_BASE_SZ);
     }
 
     /* Notify GATT client that the full response has been parsed. */
-    ble_gattc_rx_find_type_value_complete(conn, rc);
+    ble_gattc_rx_find_type_value_complete(conn_handle, rc);
 
     return 0;
 }
@@ -412,6 +449,9 @@ ble_att_clt_rx_find_type_value(struct ble_hs_conn *conn,
  * $read by type                                                             *
  *****************************************************************************/
 
+/**
+ * Lock restrictions: Caller must lock ble_hs_conn mutex.
+ */
 int
 ble_att_clt_tx_read_type(struct ble_hs_conn *conn,
                          struct ble_att_read_type_req *req,
@@ -457,6 +497,9 @@ err:
     return rc;
 }
 
+/**
+ * Lock restrictions: None.
+ */
 static int
 ble_att_clt_parse_read_type_adata(struct os_mbuf **om, int data_len,
                                   struct ble_att_read_type_adata *adata)
@@ -477,9 +520,11 @@ ble_att_clt_parse_read_type_adata(struct os_mbuf **om, int 
data_len,
     return 0;
 }
 
+/**
+ * Lock restrictions: Caller must lock ble_hs_conn mutex.
+ */
 int
-ble_att_clt_rx_read_type(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan,
-                         struct os_mbuf **rxom)
+ble_att_clt_rx_read_type(uint16_t conn_handle, struct os_mbuf **rxom)
 {
     struct ble_att_read_type_adata adata;
     struct ble_att_read_type_rsp rsp;
@@ -504,13 +549,13 @@ ble_att_clt_rx_read_type(struct ble_hs_conn *conn, struct 
ble_l2cap_chan *chan,
             goto done;
         }
 
-        ble_gattc_rx_read_type_adata(conn, &adata);
+        ble_gattc_rx_read_type_adata(conn_handle, &adata);
         os_mbuf_adj(*rxom, rsp.batp_length);
     }
 
 done:
     /* Notify GATT that the response is done being parsed. */
-    ble_gattc_rx_read_type_complete(conn, rc);
+    ble_gattc_rx_read_type_complete(conn_handle, rc);
     return rc;
 
 }
@@ -519,6 +564,9 @@ done:
  * $read                                                                     *
  *****************************************************************************/
 
+/**
+ * Lock restrictions: Caller must lock ble_hs_conn mutex.
+ */
 int
 ble_att_clt_tx_read(struct ble_hs_conn *conn, struct ble_att_read_req *req)
 {
@@ -554,9 +602,11 @@ err:
     return rc;
 }
 
+/**
+ * Lock restrictions: Caller must NOT lock ble_hs_conn mutex.
+ */
 int
-ble_att_clt_rx_read(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan,
-                    struct os_mbuf **rxom)
+ble_att_clt_rx_read(uint16_t conn_handle, struct os_mbuf **rxom)
 {
     void *value;
     int value_len;
@@ -583,7 +633,7 @@ ble_att_clt_rx_read(struct ble_hs_conn *conn, struct 
ble_l2cap_chan *chan,
     rc = 0;
 
 done:
-    ble_gattc_rx_read_rsp(conn, rc, value, value_len);
+    ble_gattc_rx_read_rsp(conn_handle, rc, value, value_len);
     return rc;
 }
 
@@ -591,6 +641,9 @@ done:
  * $read blob                                                                *
  *****************************************************************************/
 
+/**
+ * Lock restrictions: Caller must lock ble_hs_conn mutex.
+ */
 int
 ble_att_clt_tx_read_blob(struct ble_hs_conn *conn,
                          struct ble_att_read_blob_req *req)
@@ -627,9 +680,11 @@ err:
     return rc;
 }
 
+/**
+ * Lock restrictions: Caller must lock ble_hs_conn mutex.
+ */
 int
-ble_att_clt_rx_read_blob(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan,
-                         struct os_mbuf **rxom)
+ble_att_clt_rx_read_blob(uint16_t conn_handle, struct os_mbuf **rxom)
 {
     void *value;
     int value_len;
@@ -656,7 +711,7 @@ ble_att_clt_rx_read_blob(struct ble_hs_conn *conn, struct 
ble_l2cap_chan *chan,
 
 done:
     /* Pass the Attribute Value field to GATT. */
-    ble_gattc_rx_read_blob_rsp(conn, rc, value, value_len);
+    ble_gattc_rx_read_blob_rsp(conn_handle, rc, value, value_len);
     return rc;
 }
 
@@ -664,6 +719,9 @@ done:
  * $read multiple                                                            *
  *****************************************************************************/
 
+/**
+ * Lock restrictions: Caller must lock ble_hs_conn mutex.
+ */
 int
 ble_att_clt_tx_read_mult(struct ble_hs_conn *conn,
                          uint16_t *handles, int num_handles)
@@ -713,9 +771,11 @@ err:
     return rc;
 }
 
+/**
+ * Lock restrictions: Caller must lock ble_hs_conn mutex.
+ */
 int
-ble_att_clt_rx_read_mult(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan,
-                         struct os_mbuf **rxom)
+ble_att_clt_rx_read_mult(uint16_t conn_handle, struct os_mbuf **rxom)
 {
     void *value;
     int value_len;
@@ -742,7 +802,7 @@ ble_att_clt_rx_read_mult(struct ble_hs_conn *conn, struct 
ble_l2cap_chan *chan,
 
 done:
     /* Pass the Attribute Value field to GATT. */
-    ble_gattc_rx_read_mult_rsp(conn, rc, value, value_len);
+    ble_gattc_rx_read_mult_rsp(conn_handle, rc, value, value_len);
     return rc;
 }
 
@@ -750,6 +810,9 @@ done:
  * $read by group type                                                       *
  *****************************************************************************/
 
+/**
+ * Lock restrictions: Caller must lock ble_hs_conn mutex.
+ */
 int
 ble_att_clt_tx_read_group_type(struct ble_hs_conn *conn,
                                struct ble_att_read_group_type_req *req,
@@ -795,6 +858,9 @@ err:
     return rc;
 }
 
+/**
+ * Lock restrictions: None.
+ */
 static int
 ble_att_clt_parse_read_group_type_adata(
     struct os_mbuf **om, int data_len,
@@ -817,13 +883,14 @@ ble_att_clt_parse_read_group_type_adata(
     return 0;
 }
 
+/**
+ * Lock restrictions: Caller must lock ble_hs_conn mutex.
+ */
 int
-ble_att_clt_rx_read_group_type(struct ble_hs_conn *conn,
-                               struct ble_l2cap_chan *chan,
-                               struct os_mbuf **rxom)
+ble_att_clt_rx_read_group_type(uint16_t conn_handle, struct os_mbuf **rxom)
 {
-    struct ble_att_read_group_type_rsp rsp;
     struct ble_att_read_group_type_adata adata;
+    struct ble_att_read_group_type_rsp rsp;
     int rc;
 
     *rxom = os_mbuf_pullup(*rxom, BLE_ATT_READ_GROUP_TYPE_RSP_BASE_SZ);
@@ -847,13 +914,13 @@ ble_att_clt_rx_read_group_type(struct ble_hs_conn *conn,
             goto done;
         }
 
-        ble_gattc_rx_read_group_type_adata(conn, &adata);
+        ble_gattc_rx_read_group_type_adata(conn_handle, &adata);
         os_mbuf_adj(*rxom, rsp.bagp_length);
     }
 
 done:
     /* Notify GATT that the response is done being parsed. */
-    ble_gattc_rx_read_group_type_complete(conn, rc);
+    ble_gattc_rx_read_group_type_complete(conn_handle, rc);
     return rc;
 }
 
@@ -861,6 +928,9 @@ done:
  * $write                                                                    *
  *****************************************************************************/
 
+/**
+ * Lock restrictions: Caller must lock ble_hs_conn mutex.
+ */
 static int
 ble_att_clt_tx_write_req_or_cmd(struct ble_hs_conn *conn,
                                 struct ble_att_write_req *req,
@@ -903,6 +973,9 @@ err:
     return rc;
 }
 
+/**
+ * Lock restrictions: Caller must lock ble_hs_conn mutex.
+ */
 int
 ble_att_clt_tx_write_req(struct ble_hs_conn *conn,
                          struct ble_att_write_req *req,
@@ -918,6 +991,9 @@ ble_att_clt_tx_write_req(struct ble_hs_conn *conn,
     return 0;
 }
 
+/**
+ * Lock restrictions: Caller must lock ble_hs_conn mutex.
+ */
 int
 ble_att_clt_tx_write_cmd(struct ble_hs_conn *conn,
                          struct ble_att_write_req *req,
@@ -933,13 +1009,14 @@ ble_att_clt_tx_write_cmd(struct ble_hs_conn *conn,
     return 0;
 }
 
+/**
+ * Lock restrictions: Caller must lock ble_hs_conn mutex.
+ */
 int
-ble_att_clt_rx_write(struct ble_hs_conn *conn,
-                     struct ble_l2cap_chan *chan,
-                     struct os_mbuf **rxom)
+ble_att_clt_rx_write(uint16_t conn_handle, struct os_mbuf **rxom)
 {
     /* No payload. */
-    ble_gattc_rx_write_rsp(conn);
+    ble_gattc_rx_write_rsp(conn_handle);
     return 0;
 }
 
@@ -947,6 +1024,9 @@ ble_att_clt_rx_write(struct ble_hs_conn *conn,
  * $prepare write request                                                    *
  *****************************************************************************/
 
+/**
+ * Lock restrictions: Caller must lock ble_hs_conn mutex.
+ */
 int
 ble_att_clt_tx_prep_write(struct ble_hs_conn *conn,
                           struct ble_att_prep_write_cmd *req,
@@ -1002,10 +1082,11 @@ err:
     return rc;
 }
 
+/**
+ * Lock restrictions: Caller must lock ble_hs_conn mutex.
+ */
 int
-ble_att_clt_rx_prep_write(struct ble_hs_conn *conn,
-                          struct ble_l2cap_chan *chan,
-                          struct os_mbuf **rxom)
+ble_att_clt_rx_prep_write(uint16_t conn_handle, struct os_mbuf **rxom)
 {
     struct ble_att_prep_write_cmd rsp;
     int rc;
@@ -1028,12 +1109,12 @@ ble_att_clt_rx_prep_write(struct ble_hs_conn *conn,
     /* Strip the base from the front of the response. */
     os_mbuf_adj(*rxom, BLE_ATT_PREP_WRITE_CMD_BASE_SZ);
 
-    ble_gattc_rx_prep_write_rsp(conn, 0, &rsp, (*rxom)->om_data,
+    ble_gattc_rx_prep_write_rsp(conn_handle, 0, &rsp, (*rxom)->om_data,
                                 (*rxom)->om_len);
     return 0;
 
 err:
-    ble_gattc_rx_prep_write_rsp(conn, rc, NULL, NULL, 0);
+    ble_gattc_rx_prep_write_rsp(conn_handle, rc, NULL, NULL, 0);
     return rc;
 }
 
@@ -1041,6 +1122,9 @@ err:
  * $execute write request                                                    *
  *****************************************************************************/
 
+/**
+ * Lock restrictions: Caller must lock ble_hs_conn mutex.
+ */
 int
 ble_att_clt_tx_exec_write(struct ble_hs_conn *conn,
                           struct ble_att_exec_write_req *req)
@@ -1077,26 +1161,23 @@ err:
     return rc;
 }
 
+/**
+ * Lock restrictions: Caller must lock ble_hs_conn mutex.
+ */
 int
-ble_att_clt_rx_exec_write(struct ble_hs_conn *conn,
-                          struct ble_l2cap_chan *chan,
-                          struct os_mbuf **rxom)
+ble_att_clt_rx_exec_write(uint16_t conn_handle, struct os_mbuf **rxom)
 {
     int rc;
 
     *rxom = os_mbuf_pullup(*rxom, BLE_ATT_EXEC_WRITE_RSP_SZ);
     if (*rxom == NULL) {
         rc = BLE_HS_EBADDATA;
-        goto done;
+    } else {
+        rc = ble_att_exec_write_rsp_parse((*rxom)->om_data, (*rxom)->om_len);
+        assert(rc == 0);
     }
 
-    rc = ble_att_exec_write_rsp_parse((*rxom)->om_data, (*rxom)->om_len);
-    assert(rc == 0);
-
-    rc = 0;
-
-done:
-    ble_gattc_rx_exec_write_rsp(conn, rc);
+    ble_gattc_rx_exec_write_rsp(conn_handle, rc);
     return rc;
 }
 
@@ -1104,6 +1185,9 @@ done:
  * $handle value notification                                                *
  *****************************************************************************/
 
+/**
+ * Lock restrictions: Caller must lock ble_hs_conn mutex.
+ */
 int
 ble_att_clt_tx_notify(struct ble_hs_conn *conn, struct ble_att_notify_req *req,
                       void *value, uint16_t value_len)
@@ -1149,6 +1233,9 @@ err:
  * $handle value indication                                                  *
  *****************************************************************************/
 
+/**
+ * Lock restrictions: Caller must lock ble_hs_conn mutex.
+ */
 int
 ble_att_clt_tx_indicate(struct ble_hs_conn *conn,
                         struct ble_att_indicate_req *req,
@@ -1192,12 +1279,13 @@ err:
     return rc;
 }
 
+/**
+ * Lock restrictions: Caller must lock ble_hs_conn mutex.
+ */
 int
-ble_att_clt_rx_indicate(struct ble_hs_conn *conn,
-                        struct ble_l2cap_chan *chan,
-                        struct os_mbuf **rxom)
+ble_att_clt_rx_indicate(uint16_t conn_handle, struct os_mbuf **rxom)
 {
     /* No payload. */
-    ble_gattc_rx_indicate_rsp(conn);
+    ble_gattc_rx_indicate_rsp(conn_handle);
     return 0;
 }

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/cf46c07f/net/nimble/host/src/ble_att_priv.h
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/ble_att_priv.h 
b/net/nimble/host/src/ble_att_priv.h
index 384ad20..879ef47 100644
--- a/net/nimble/host/src/ble_att_priv.h
+++ b/net/nimble/host/src/ble_att_priv.h
@@ -89,6 +89,8 @@ SLIST_HEAD(ble_att_clt_entry_list, ble_att_clt_entry);
 /*** @gen */
 
 struct ble_l2cap_chan *ble_att_create_chan(void);
+int ble_att_conn_chan_find(uint16_t conn_handle, struct ble_hs_conn **out_conn,
+                           struct ble_l2cap_chan **out_chan);
 void ble_att_set_peer_mtu(struct ble_l2cap_chan *chan, uint16_t peer_mtu);
 struct os_mbuf *ble_att_get_pkthdr(void);
 void ble_att_init(void);
@@ -101,41 +103,29 @@ extern void *ble_att_svr_notify_cb_arg;
 
 int ble_att_svr_find_by_uuid(uint8_t *uuid, struct ble_att_svr_entry **ha_ptr);
 uint16_t ble_att_svr_prev_handle(void);
-int ble_att_svr_rx_mtu(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan,
-                       struct os_mbuf **rxom);
-int ble_att_svr_rx_find_info(struct ble_hs_conn *conn,
-                             struct ble_l2cap_chan *chan,
-                             struct os_mbuf **rxom);
-int ble_att_svr_rx_find_type_value(struct ble_hs_conn *conn,
-                                   struct ble_l2cap_chan *chan,
+int ble_att_svr_rx_mtu(uint16_t conn_handle, struct os_mbuf **om);
+int ble_att_svr_rx_find_info(uint16_t conn_handle, struct os_mbuf **rxom);
+int ble_att_svr_rx_find_type_value(uint16_t conn_handle,
                                    struct os_mbuf **rxom);
-int ble_att_svr_rx_read_type(struct ble_hs_conn *conn,
-                             struct ble_l2cap_chan *chan,
+int ble_att_svr_rx_read_type(uint16_t conn_handle,
                              struct os_mbuf **rxom);
-int ble_att_svr_rx_read_group_type(struct ble_hs_conn *conn,
-                                   struct ble_l2cap_chan *chan,
+int ble_att_svr_rx_read_group_type(uint16_t conn_handle,
                                    struct os_mbuf **rxom);
-int ble_att_svr_rx_read(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan,
+int ble_att_svr_rx_read(uint16_t conn_handle,
                         struct os_mbuf **rxom);
-int ble_att_svr_rx_read_blob(struct ble_hs_conn *conn,
-                             struct ble_l2cap_chan *chan,
+int ble_att_svr_rx_read_blob(uint16_t conn_handle,
                              struct os_mbuf **rxom);
-int ble_att_svr_rx_read_mult(struct ble_hs_conn *conn,
-                             struct ble_l2cap_chan *chan,
+int ble_att_svr_rx_read_mult(uint16_t conn_handle,
                              struct os_mbuf **rxom);
-int ble_att_svr_rx_write(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan,
+int ble_att_svr_rx_write(uint16_t conn_handle,
                          struct os_mbuf **rxom);
-int ble_att_svr_rx_prep_write(struct ble_hs_conn *conn,
-                              struct ble_l2cap_chan *chan,
+int ble_att_svr_rx_prep_write(uint16_t conn_handle,
                               struct os_mbuf **rxom);
-int ble_att_svr_rx_exec_write(struct ble_hs_conn *conn,
-                              struct ble_l2cap_chan *chan,
+int ble_att_svr_rx_exec_write(uint16_t conn_handle,
                               struct os_mbuf **rxom);
-int ble_att_svr_rx_notify(struct ble_hs_conn *conn,
-                          struct ble_l2cap_chan *chan,
+int ble_att_svr_rx_notify(uint16_t conn_handle,
                           struct os_mbuf **rxom);
-int ble_att_svr_rx_indicate(struct ble_hs_conn *conn,
-                            struct ble_l2cap_chan *chan,
+int ble_att_svr_rx_indicate(uint16_t conn_handle,
                             struct os_mbuf **rxom);
 void ble_att_svr_prep_clear(struct ble_att_svr_conn *basc);
 int ble_att_svr_read_handle(struct ble_hs_conn *conn, uint16_t attr_handle,
@@ -173,48 +163,35 @@ struct ble_att_read_group_type_adata {
     uint8_t *value;
 };
 
-int ble_att_clt_rx_error(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan,
-                         struct os_mbuf **rxom);
+int ble_att_clt_rx_error(uint16_t conn_handle, struct os_mbuf **rxom);
 int ble_att_clt_tx_mtu(struct ble_hs_conn *conn,
                        struct ble_att_mtu_cmd *req);
-int ble_att_clt_rx_mtu(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan,
-                       struct os_mbuf **rxom);
+int ble_att_clt_rx_mtu(uint16_t conn_handle, struct os_mbuf **rxom);
 int ble_att_clt_tx_read(struct ble_hs_conn *conn,
                         struct ble_att_read_req *req);
-int ble_att_clt_rx_read(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan,
-                        struct os_mbuf **rxom);
+int ble_att_clt_rx_read(uint16_t conn_handle, struct os_mbuf **rxom);
 int ble_att_clt_tx_read_blob(struct ble_hs_conn *conn,
                              struct ble_att_read_blob_req *req);
-int ble_att_clt_rx_read_blob(struct ble_hs_conn *conn,
-                             struct ble_l2cap_chan *chan,
-                             struct os_mbuf **rxom);
+int ble_att_clt_rx_read_blob(uint16_t conn_handle, struct os_mbuf **rxom);
 int ble_att_clt_tx_read_mult(struct ble_hs_conn *conn,
                              uint16_t *handles, int num_handles);
-int ble_att_clt_rx_read_mult(struct ble_hs_conn *conn,
-                             struct ble_l2cap_chan *chan,
-                             struct os_mbuf **rxom);
+int ble_att_clt_rx_read_mult(uint16_t conn_handle, struct os_mbuf **rxom);
 int ble_att_clt_tx_read_type(struct ble_hs_conn *conn,
                              struct ble_att_read_type_req *req,
                              void *uuid128);
-int ble_att_clt_rx_read_type(struct ble_hs_conn *conn,
-                             struct ble_l2cap_chan *chan,
-                             struct os_mbuf **rxom);
+int ble_att_clt_rx_read_type(uint16_t conn_handle, struct os_mbuf **rxom);
 int ble_att_clt_tx_read_group_type(struct ble_hs_conn *conn,
                                    struct ble_att_read_group_type_req *req,
                                    void *uuid128);
-int ble_att_clt_rx_read_group_type(struct ble_hs_conn *conn,
-                                   struct ble_l2cap_chan *chan,
+int ble_att_clt_rx_read_group_type(uint16_t conn_handle,
                                    struct os_mbuf **rxom);
 int ble_att_clt_tx_find_info(struct ble_hs_conn *conn,
                              struct ble_att_find_info_req *req);
-int ble_att_clt_rx_find_info(struct ble_hs_conn *conn,
-                             struct ble_l2cap_chan *chan,
-                             struct os_mbuf **rxom);
+int ble_att_clt_rx_find_info(uint16_t conn_handle, struct os_mbuf **om);
 int ble_att_clt_tx_find_type_value(struct ble_hs_conn *conn,
                                    struct ble_att_find_type_value_req *req,
                                    void *attribute_value, int value_len);
-int ble_att_clt_rx_find_type_value(struct ble_hs_conn *conn,
-                                   struct ble_l2cap_chan *chan,
+int ble_att_clt_rx_find_type_value(uint16_t conn_handle,
                                    struct os_mbuf **rxom);
 int ble_att_clt_tx_write_req(struct ble_hs_conn *conn,
                              struct ble_att_write_req *req,
@@ -225,25 +202,17 @@ int ble_att_clt_tx_write_cmd(struct ble_hs_conn *conn,
 int ble_att_clt_tx_prep_write(struct ble_hs_conn *conn,
                               struct ble_att_prep_write_cmd *req,
                               void *value, uint16_t value_len);
-int ble_att_clt_rx_prep_write(struct ble_hs_conn *conn,
-                              struct ble_l2cap_chan *chan,
-                              struct os_mbuf **rxom);
+int ble_att_clt_rx_prep_write(uint16_t conn_handle, struct os_mbuf **rxom);
 int ble_att_clt_tx_exec_write(struct ble_hs_conn *conn,
                               struct ble_att_exec_write_req *req);
-int ble_att_clt_rx_exec_write(struct ble_hs_conn *conn,
-                              struct ble_l2cap_chan *chan,
-                              struct os_mbuf **rxom);
-int ble_att_clt_rx_write(struct ble_hs_conn *conn,
-                         struct ble_l2cap_chan *chan,
-                         struct os_mbuf **rxom);
+int ble_att_clt_rx_exec_write(uint16_t conn_handle, struct os_mbuf **rxom);
+int ble_att_clt_rx_write(uint16_t conn_handle, struct os_mbuf **rxom);
 int ble_att_clt_tx_notify(struct ble_hs_conn *conn,
                           struct ble_att_notify_req *req,
                           void *value, uint16_t value_len);
 int ble_att_clt_tx_indicate(struct ble_hs_conn *conn,
                             struct ble_att_indicate_req *req,
                             void *value, uint16_t value_len);
-int ble_att_clt_rx_indicate(struct ble_hs_conn *conn,
-                            struct ble_l2cap_chan *chan,
-                            struct os_mbuf **rxom);
+int ble_att_clt_rx_indicate(uint16_t conn_handle, struct os_mbuf **rxom);
 
 #endif

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/cf46c07f/net/nimble/host/src/ble_att_svr.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/ble_att_svr.c 
b/net/nimble/host/src/ble_att_svr.c
index 9ff872f..e1c80be 100644
--- a/net/nimble/host/src/ble_att_svr.c
+++ b/net/nimble/host/src/ble_att_svr.c
@@ -524,34 +524,41 @@ err:
 }
 
 int
-ble_att_svr_rx_mtu(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan,
-                   struct os_mbuf **om)
+ble_att_svr_rx_mtu(uint16_t conn_handle, struct os_mbuf **om)
 {
     struct ble_att_mtu_cmd cmd;
+    struct ble_l2cap_chan *chan;
+    struct ble_hs_conn *conn;
     uint8_t att_err;
     int rc;
 
-    *om = os_mbuf_pullup(*om, BLE_ATT_MTU_CMD_SZ);
-    if (*om == NULL) {
-        att_err = BLE_ATT_ERR_INSUFFICIENT_RES;
-        rc = BLE_HS_ENOMEM;
-        goto err;
-    }
+    ble_hs_conn_lock();
 
-    rc = ble_att_mtu_cmd_parse((*om)->om_data, (*om)->om_len, &cmd);
-    assert(rc == 0);
+    rc = ble_att_conn_chan_find(conn_handle, &conn, &chan);
+    if (rc == 0) {
+        *om = os_mbuf_pullup(*om, BLE_ATT_MTU_CMD_SZ);
+        if (*om == NULL) {
+            att_err = BLE_ATT_ERR_INSUFFICIENT_RES;
+            rc = BLE_HS_ENOMEM;
+        } else {
+            rc = ble_att_mtu_cmd_parse((*om)->om_data, (*om)->om_len, &cmd);
+            assert(rc == 0);
 
-    ble_att_set_peer_mtu(chan, cmd.bamc_mtu);
-    rc = ble_att_svr_tx_mtu_rsp(conn, chan, BLE_ATT_OP_MTU_RSP,
-                                chan->blc_my_mtu, &att_err);
-    if (rc != 0) {
-        goto err;
+            ble_att_set_peer_mtu(chan, cmd.bamc_mtu);
+        }
+
+        if (rc == 0) {
+            rc = ble_att_svr_tx_mtu_rsp(conn, chan, BLE_ATT_OP_MTU_RSP,
+                                        chan->blc_my_mtu, &att_err);
+        }
+        if (rc != 0) {
+            ble_att_svr_tx_error_rsp(conn, chan, BLE_ATT_OP_MTU_REQ, 0,
+                                     att_err);
+        }
     }
 
-    return 0;
+    ble_hs_conn_unlock();
 
-err:
-    ble_att_svr_tx_error_rsp(conn, chan, BLE_ATT_OP_MTU_REQ, 0, att_err);
     return rc;
 }
 
@@ -727,9 +734,10 @@ err:
     return rc;
 }
 
-int
-ble_att_svr_rx_find_info(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan,
-                         struct os_mbuf **rxom)
+static int
+ble_att_svr_rx_find_info_locked(struct ble_hs_conn *conn,
+                                struct ble_l2cap_chan *chan,
+                                struct os_mbuf **rxom)
 {
     struct ble_att_find_info_req req;
     uint16_t err_handle;
@@ -773,6 +781,25 @@ err:
     return rc;
 }
 
+int
+ble_att_svr_rx_find_info(uint16_t conn_handle, struct os_mbuf **rxom)
+{
+    struct ble_l2cap_chan *chan;
+    struct ble_hs_conn *conn;
+    int rc;
+
+    ble_hs_conn_lock();
+
+    rc = ble_att_conn_chan_find(conn_handle, &conn, &chan);
+    if (rc == 0) {
+        rc = ble_att_svr_rx_find_info_locked(conn, chan, rxom);
+    }
+
+    ble_hs_conn_unlock();
+
+    return rc;
+}
+
 /**
  * Processes a single non-matching attribute entry while filling a
  * Find-By-Type-Value-Response.
@@ -1042,10 +1069,10 @@ err:
     return rc;
 }
 
-int
-ble_att_svr_rx_find_type_value(struct ble_hs_conn *conn,
-                               struct ble_l2cap_chan *chan,
-                               struct os_mbuf **rxom)
+static int
+ble_att_svr_rx_find_type_value_locked(struct ble_hs_conn *conn,
+                                      struct ble_l2cap_chan *chan,
+                                      struct os_mbuf **rxom)
 {
     struct ble_att_find_type_value_req req;
     uint16_t err_handle;
@@ -1090,6 +1117,25 @@ err:
     return rc;
 }
 
+int
+ble_att_svr_rx_find_type_value(uint16_t conn_handle, struct os_mbuf **rxom)
+{
+    struct ble_l2cap_chan *chan;
+    struct ble_hs_conn *conn;
+    int rc;
+
+    ble_hs_conn_lock();
+
+    rc = ble_att_conn_chan_find(conn_handle, &conn, &chan);
+    if (rc == 0) {
+        rc = ble_att_svr_rx_find_type_value_locked(conn, chan, rxom);
+    }
+
+    ble_hs_conn_unlock();
+
+    return rc;
+}
+
 static int
 ble_att_svr_tx_read_type_rsp(struct ble_hs_conn *conn,
                              struct ble_l2cap_chan *chan,
@@ -1217,9 +1263,10 @@ done:
     return rc;
 }
 
-int
-ble_att_svr_rx_read_type(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan,
-                         struct os_mbuf **rxom)
+static int
+ble_att_svr_rx_read_type_locked(struct ble_hs_conn *conn,
+                                struct ble_l2cap_chan *chan,
+                                struct os_mbuf **rxom)
 {
     struct ble_att_read_type_req req;
     uint16_t err_handle;
@@ -1285,6 +1332,25 @@ err:
     return rc;
 }
 
+int
+ble_att_svr_rx_read_type(uint16_t conn_handle, struct os_mbuf **rxom)
+{
+    struct ble_l2cap_chan *chan;
+    struct ble_hs_conn *conn;
+    int rc;
+
+    ble_hs_conn_lock();
+
+    rc = ble_att_conn_chan_find(conn_handle, &conn, &chan);
+    if (rc == 0) {
+        rc = ble_att_svr_rx_read_type_locked(conn, chan, rxom);
+    }
+
+    ble_hs_conn_unlock();
+
+    return rc;
+}
+
 /**
  * @return                      0 on success; nonzero on failure.
  */
@@ -1394,9 +1460,10 @@ err:
     return rc;
 }
 
-int
-ble_att_svr_rx_read(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan,
-                    struct os_mbuf **rxom)
+static int
+ble_att_svr_rx_read_locked(struct ble_hs_conn *conn,
+                           struct ble_l2cap_chan *chan,
+                           struct os_mbuf **rxom)
 {
     struct ble_att_svr_access_ctxt ctxt;
     struct ble_att_svr_entry *entry;
@@ -1461,8 +1528,28 @@ err:
 }
 
 int
-ble_att_svr_rx_read_blob(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan,
-                         struct os_mbuf **rxom)
+ble_att_svr_rx_read(uint16_t conn_handle, struct os_mbuf **rxom)
+{
+    struct ble_l2cap_chan *chan;
+    struct ble_hs_conn *conn;
+    int rc;
+
+    ble_hs_conn_lock();
+
+    rc = ble_att_conn_chan_find(conn_handle, &conn, &chan);
+    if (rc == 0) {
+        rc = ble_att_svr_rx_read_locked(conn, chan, rxom);
+    }
+
+    ble_hs_conn_unlock();
+
+    return rc;
+}
+
+static int
+ble_att_svr_rx_read_blob_locked(struct ble_hs_conn *conn,
+                                struct ble_l2cap_chan *chan,
+                                struct os_mbuf **rxom)
 {
     struct ble_att_svr_access_ctxt ctxt;
     struct ble_att_svr_entry *entry;
@@ -1533,6 +1620,25 @@ err:
     return rc;
 }
 
+int
+ble_att_svr_rx_read_blob(uint16_t conn_handle, struct os_mbuf **rxom)
+{
+    struct ble_l2cap_chan *chan;
+    struct ble_hs_conn *conn;
+    int rc;
+
+    ble_hs_conn_lock();
+
+    rc = ble_att_conn_chan_find(conn_handle, &conn, &chan);
+    if (rc == 0) {
+        rc = ble_att_svr_rx_read_blob_locked(conn, chan, rxom);
+    }
+
+    ble_hs_conn_unlock();
+
+    return rc;
+}
+
 static int
 ble_att_svr_tx_read_mult(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan,
                          struct os_mbuf **rxom, uint8_t *att_err,
@@ -1624,9 +1730,10 @@ err:
     return rc;
 }
 
-int
-ble_att_svr_rx_read_mult(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan,
-                         struct os_mbuf **rxom)
+static int
+ble_att_svr_rx_read_mult_locked(struct ble_hs_conn *conn,
+                                struct ble_l2cap_chan *chan,
+                                struct os_mbuf **rxom)
 {
     uint16_t err_handle;
     uint8_t att_err;
@@ -1666,6 +1773,25 @@ err:
     return rc;
 }
 
+int
+ble_att_svr_rx_read_mult(uint16_t conn_handle, struct os_mbuf **rxom)
+{
+    struct ble_l2cap_chan *chan;
+    struct ble_hs_conn *conn;
+    int rc;
+
+    ble_hs_conn_lock();
+
+    rc = ble_att_conn_chan_find(conn_handle, &conn, &chan);
+    if (rc == 0) {
+        rc = ble_att_svr_rx_read_mult_locked(conn, chan, rxom);
+    }
+
+    ble_hs_conn_unlock();
+
+    return rc;
+}
+
 static int
 ble_att_svr_is_valid_group_type(uint8_t *uuid128)
 {
@@ -1921,10 +2047,10 @@ done:
 }
 
 
-int
-ble_att_svr_rx_read_group_type(struct ble_hs_conn *conn,
-                               struct ble_l2cap_chan *chan,
-                               struct os_mbuf **rxom)
+static int
+ble_att_svr_rx_read_group_type_locked(struct ble_hs_conn *conn,
+                                      struct ble_l2cap_chan *chan,
+                                      struct os_mbuf **rxom)
 {
     struct ble_att_read_group_type_req req;
     uint8_t uuid128[16];
@@ -1988,6 +2114,25 @@ err:
     return rc;
 }
 
+int
+ble_att_svr_rx_read_group_type(uint16_t conn_handle, struct os_mbuf **rxom)
+{
+    struct ble_l2cap_chan *chan;
+    struct ble_hs_conn *conn;
+    int rc;
+
+    ble_hs_conn_lock();
+
+    rc = ble_att_conn_chan_find(conn_handle, &conn, &chan);
+    if (rc == 0) {
+        rc = ble_att_svr_rx_read_group_type_locked(conn, chan, rxom);
+    }
+
+    ble_hs_conn_unlock();
+
+    return rc;
+}
+
 static int
 ble_att_svr_tx_write_rsp(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan,
                          uint8_t *att_err)
@@ -2025,9 +2170,10 @@ err:
     return rc;
 }
 
-int
-ble_att_svr_rx_write(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan,
-                     struct os_mbuf **rxom)
+static int
+ble_att_svr_rx_write_locked(struct ble_hs_conn *conn,
+                            struct ble_l2cap_chan *chan,
+                            struct os_mbuf **rxom)
 {
     struct ble_att_svr_access_ctxt ctxt;
     struct ble_att_svr_entry *entry;
@@ -2089,6 +2235,25 @@ err:
 }
 
 int
+ble_att_svr_rx_write(uint16_t conn_handle, struct os_mbuf **rxom)
+{
+    struct ble_l2cap_chan *chan;
+    struct ble_hs_conn *conn;
+    int rc;
+
+    ble_hs_conn_lock();
+
+    rc = ble_att_conn_chan_find(conn_handle, &conn, &chan);
+    if (rc == 0) {
+        rc = ble_att_svr_rx_write_locked(conn, chan, rxom);
+    }
+
+    ble_hs_conn_unlock();
+
+    return rc;
+}
+
+int
 ble_att_svr_write_local(uint16_t attr_handle, void *data, uint16_t data_len)
 {
     struct ble_att_svr_access_ctxt ctxt;
@@ -2271,10 +2436,10 @@ ble_att_svr_prep_write(struct ble_hs_conn *conn, 
uint16_t *err_handle)
     return 0;
 }
 
-int
-ble_att_svr_rx_prep_write(struct ble_hs_conn *conn,
-                          struct ble_l2cap_chan *chan,
-                          struct os_mbuf **rxom)
+static int
+ble_att_svr_rx_prep_write_locked(struct ble_hs_conn *conn,
+                                 struct ble_l2cap_chan *chan,
+                                 struct os_mbuf **rxom)
 {
     struct ble_att_prep_write_cmd req;
     struct ble_att_prep_entry *prep_entry;
@@ -2387,6 +2552,25 @@ err:
     return rc;
 }
 
+int
+ble_att_svr_rx_prep_write(uint16_t conn_handle, struct os_mbuf **rxom)
+{
+    struct ble_l2cap_chan *chan;
+    struct ble_hs_conn *conn;
+    int rc;
+
+    ble_hs_conn_lock();
+
+    rc = ble_att_conn_chan_find(conn_handle, &conn, &chan);
+    if (rc == 0) {
+        rc = ble_att_svr_rx_prep_write_locked(conn, chan, rxom);
+    }
+
+    ble_hs_conn_unlock();
+
+    return rc;
+}
+
 /**
  * @return                      0 on success; nonzero on failure.
  */
@@ -2429,10 +2613,10 @@ err:
     return rc;
 }
 
-int
-ble_att_svr_rx_exec_write(struct ble_hs_conn *conn,
-                          struct ble_l2cap_chan *chan,
-                          struct os_mbuf **rxom)
+static int
+ble_att_svr_rx_exec_write_locked(struct ble_hs_conn *conn,
+                                 struct ble_l2cap_chan *chan,
+                                 struct os_mbuf **rxom)
 {
     struct ble_att_exec_write_req req;
     uint16_t err_handle;
@@ -2482,9 +2666,28 @@ err:
 }
 
 int
-ble_att_svr_rx_notify(struct ble_hs_conn *conn,
-                      struct ble_l2cap_chan *chan,
-                      struct os_mbuf **rxom)
+ble_att_svr_rx_exec_write(uint16_t conn_handle, struct os_mbuf **rxom)
+{
+    struct ble_l2cap_chan *chan;
+    struct ble_hs_conn *conn;
+    int rc;
+
+    ble_hs_conn_lock();
+
+    rc = ble_att_conn_chan_find(conn_handle, &conn, &chan);
+    if (rc == 0) {
+        rc = ble_att_svr_rx_exec_write_locked(conn, chan, rxom);
+    }
+
+    ble_hs_conn_unlock();
+
+    return rc;
+}
+
+static int
+ble_att_svr_rx_notify_locked(struct ble_hs_conn *conn,
+                             struct ble_l2cap_chan *chan,
+                             struct os_mbuf **rxom)
 {
     struct ble_att_notify_req req;
     uint16_t attr_len;
@@ -2525,6 +2728,25 @@ ble_att_svr_rx_notify(struct ble_hs_conn *conn,
     return 0;
 }
 
+int
+ble_att_svr_rx_notify(uint16_t conn_handle, struct os_mbuf **rxom)
+{
+    struct ble_l2cap_chan *chan;
+    struct ble_hs_conn *conn;
+    int rc;
+
+    ble_hs_conn_lock();
+
+    rc = ble_att_conn_chan_find(conn_handle, &conn, &chan);
+    if (rc == 0) {
+        rc = ble_att_svr_rx_notify_locked(conn, chan, rxom);
+    }
+
+    ble_hs_conn_unlock();
+
+    return rc;
+}
+
 /**
  * @return                      0 on success; nonzero on failure.
  */
@@ -2564,10 +2786,10 @@ err:
     return rc;
 }
 
-int
-ble_att_svr_rx_indicate(struct ble_hs_conn *conn,
-                        struct ble_l2cap_chan *chan,
-                        struct os_mbuf **rxom)
+static int
+ble_att_svr_rx_indicate_locked(struct ble_hs_conn *conn,
+                               struct ble_l2cap_chan *chan,
+                               struct os_mbuf **rxom)
 {
     struct ble_att_indicate_req req;
     uint16_t attr_len;
@@ -2619,6 +2841,25 @@ done:
     return rc;
 }
 
+int
+ble_att_svr_rx_indicate(uint16_t conn_handle, struct os_mbuf **rxom)
+{
+    struct ble_l2cap_chan *chan;
+    struct ble_hs_conn *conn;
+    int rc;
+
+    ble_hs_conn_lock();
+
+    rc = ble_att_conn_chan_find(conn_handle, &conn, &chan);
+    if (rc == 0) {
+        rc = ble_att_svr_rx_indicate_locked(conn, chan, rxom);
+    }
+
+    ble_hs_conn_unlock();
+
+    return rc;
+}
+
 static void
 ble_att_svr_free_mem(void)
 {


Reply via email to