You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by cc...@apache.org on 2016/02/02 04:42:25 UTC
[4/5] incubator-mynewt-larva git commit: Protect connection list with
a mutex
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 <cc...@gmail.com>
Authored: Mon Feb 1 11:56:20 2016 -0800
Committer: Christopher Collins <cc...@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)
{