nimble/att: Use new helpers for sending error response This constructs response directly on mbuf reducing number of memcopies.
Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/commit/b50707b6 Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/b50707b6 Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/b50707b6 Branch: refs/heads/master Commit: b50707b6a67dd8b4d6b168904b0a4d6b8a79bcf7 Parents: 71a8a47 Author: Szymon Janc <szymon.j...@codecoup.pl> Authored: Fri Mar 24 12:52:57 2017 +0100 Committer: Szymon Janc <szymon.j...@codecoup.pl> Committed: Mon Apr 10 11:31:16 2017 +0200 ---------------------------------------------------------------------- net/nimble/host/src/ble_att_svr.c | 71 +++++++++++++--------------------- 1 file changed, 27 insertions(+), 44 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/b50707b6/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 5ca2c87..ac6fa55 100644 --- a/net/nimble/host/src/ble_att_svr.c +++ b/net/nimble/host/src/ble_att_svr.c @@ -568,43 +568,26 @@ ble_att_svr_write_handle(uint16_t conn_handle, uint16_t attr_handle, } static int -ble_att_svr_tx_error_rsp(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan, - struct os_mbuf *txom, uint8_t req_op, - uint16_t handle, uint8_t error_code) +ble_att_svr_tx_error_rsp(uint16_t conn_handle, struct os_mbuf *txom, + uint8_t req_op, uint16_t handle, uint8_t error_code) { - struct ble_att_error_rsp rsp; - void *dst; - int rc; + struct ble_att_error_rsp *rsp; BLE_HS_DBG_ASSERT(error_code != 0); BLE_HS_DBG_ASSERT(OS_MBUF_PKTLEN(txom) == 0); - dst = os_mbuf_extend(txom, BLE_ATT_ERROR_RSP_SZ); - if (dst == NULL) { - rc = BLE_HS_ENOMEM; - goto err; - } - - rsp.baep_req_op = req_op; - rsp.baep_handle = handle; - rsp.baep_error_code = error_code; - - ble_att_error_rsp_write(dst, BLE_ATT_ERROR_RSP_SZ, &rsp); - - rc = ble_l2cap_tx(conn, chan, txom); - txom = NULL; - if (rc != 0) { - goto err; + rsp = ble_att_cmd_prepare(BLE_ATT_OP_ERROR_RSP, sizeof(*rsp), txom); + if (rsp == NULL) { + return BLE_HS_ENOMEM; } - BLE_ATT_LOG_CMD(1, "error rsp", conn->bhc_handle, - ble_att_error_rsp_log, &rsp); + rsp->baep_req_op = req_op; + rsp->baep_handle = htole16(handle); + rsp->baep_error_code = error_code; - return 0; + BLE_ATT_LOG_CMD(1, "error rsp", conn_handle, ble_att_error_rsp_log, rsp); -err: - os_mbuf_free_chain(txom); - return rc; + return ble_att_tx(conn_handle, txom); } /** @@ -664,26 +647,26 @@ ble_att_svr_tx_rsp(uint16_t conn_handle, int hs_status, struct os_mbuf *om, if (hs_status != 0) { err_status = BLE_ATT_ERR_UNLIKELY; } - } + } + } - if (hs_status != 0) { - STATS_INC(ble_att_stats, error_rsp_tx); + ble_hs_unlock(); - /* Reuse om for error response. */ - if (om == NULL) { - om = ble_hs_mbuf_l2cap_pkt(); - } else { - os_mbuf_adj(om, OS_MBUF_PKTLEN(om)); - } - if (om != NULL) { - ble_att_svr_tx_error_rsp(conn, chan, om, att_op, - err_handle, err_status); - om = NULL; - } + if (hs_status != 0) { + STATS_INC(ble_att_stats, error_rsp_tx); + + /* Reuse om for error response. */ + if (om == NULL) { + om = ble_hs_mbuf_l2cap_pkt(); + } else { + os_mbuf_adj(om, OS_MBUF_PKTLEN(om)); + } + if (om != NULL) { + ble_att_svr_tx_error_rsp(conn_handle, om, att_op, + err_handle, err_status); + om = NULL; } } - - ble_hs_unlock(); } /* Free mbuf if it was not consumed (i.e., if the send failed). */