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) {