nimble/att: Use new helpers for sending Write Request and Command 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/a9549fdb Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/a9549fdb Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/a9549fdb Branch: refs/heads/master Commit: a9549fdbc17383c00851dde7bd555cf628d3876b Parents: 191acab Author: Szymon Janc <szymon.j...@codecoup.pl> Authored: Fri Mar 24 15:34:01 2017 +0100 Committer: Szymon Janc <szymon.j...@codecoup.pl> Committed: Mon Apr 10 11:31:31 2017 +0200 ---------------------------------------------------------------------- net/nimble/host/src/ble_att_clt.c | 65 +++++++++--------------- net/nimble/host/src/ble_att_cmd.c | 10 +++- net/nimble/host/src/ble_att_cmd_priv.h | 17 ++++++- net/nimble/host/src/ble_att_priv.h | 6 +-- net/nimble/host/src/ble_att_svr.c | 4 +- net/nimble/host/src/ble_gattc.c | 8 +-- net/nimble/host/test/src/ble_att_clt_test.c | 14 ++--- 7 files changed, 59 insertions(+), 65 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/a9549fdb/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 0464821..114abea 100644 --- a/net/nimble/host/src/ble_att_clt.c +++ b/net/nimble/host/src/ble_att_clt.c @@ -789,62 +789,41 @@ done: * $write * *****************************************************************************/ -static int -ble_att_clt_tx_write_req_or_cmd(uint16_t conn_handle, - const struct ble_att_write_req *req, - struct os_mbuf *txom, int is_req) -{ - int rc; - - txom = os_mbuf_prepend_pullup(txom, BLE_ATT_WRITE_REQ_BASE_SZ); - if (txom == NULL) { - return BLE_HS_ENOMEM; - } - - if (is_req) { - ble_att_write_req_write(txom->om_data, BLE_ATT_WRITE_REQ_BASE_SZ, req); - } else { - ble_att_write_cmd_write(txom->om_data, BLE_ATT_WRITE_REQ_BASE_SZ, req); - } - - rc = ble_att_clt_tx_req(conn_handle, txom); - if (rc != 0) { - return rc; - } - - return 0; -} - int -ble_att_clt_tx_write_req(uint16_t conn_handle, - const struct ble_att_write_req *req, +ble_att_clt_tx_write_req(uint16_t conn_handle, uint16_t handle, struct os_mbuf *txom) { #if !NIMBLE_BLE_ATT_CLT_WRITE return BLE_HS_ENOTSUP; #endif - int rc; + struct ble_att_write_req *req; + struct os_mbuf *txom2; - rc = ble_att_clt_tx_write_req_or_cmd(conn_handle, req, txom, 1); - if (rc != 0) { - return rc; + req = ble_att_cmd_get(BLE_ATT_OP_WRITE_REQ, sizeof(*req), &txom2); + if (req == NULL) { + os_mbuf_free_chain(txom); + return BLE_HS_ENOMEM; } - BLE_ATT_LOG_CMD(1, "write req", conn_handle, ble_att_write_cmd_log, req); + req->bawq_handle = htole16(handle); + os_mbuf_concat(txom2, txom); - return 0; + BLE_ATT_LOG_CMD(1, "write req", conn_handle, ble_att_write_req_log, req); + + return ble_att_tx(conn_handle, txom2); } int -ble_att_clt_tx_write_cmd(uint16_t conn_handle, - const struct ble_att_write_req *req, +ble_att_clt_tx_write_cmd(uint16_t conn_handle, uint16_t handle, struct os_mbuf *txom) { #if !NIMBLE_BLE_ATT_CLT_WRITE_NO_RSP return BLE_HS_ENOTSUP; #endif + struct ble_att_write_cmd *cmd; + struct os_mbuf *txom2; uint8_t b; int rc; int i; @@ -860,14 +839,18 @@ ble_att_clt_tx_write_cmd(uint16_t conn_handle, } - rc = ble_att_clt_tx_write_req_or_cmd(conn_handle, req, txom, 0); - if (rc != 0) { - return rc; + cmd = ble_att_cmd_get(BLE_ATT_OP_WRITE_CMD, sizeof(*cmd), &txom2); + if (cmd == NULL) { + os_mbuf_free_chain(txom); + return BLE_HS_ENOMEM; } - BLE_ATT_LOG_CMD(1, "write cmd", conn_handle, ble_att_write_cmd_log, req); + cmd->handle = htole16(handle); + os_mbuf_concat(txom2, txom); - return 0; + BLE_ATT_LOG_CMD(1, "write cmd", conn_handle, ble_att_write_cmd_log, cmd); + + return ble_att_tx(conn_handle, txom2); } int http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/a9549fdb/net/nimble/host/src/ble_att_cmd.c ---------------------------------------------------------------------- diff --git a/net/nimble/host/src/ble_att_cmd.c b/net/nimble/host/src/ble_att_cmd.c index 7997ff1..9fb81d1 100644 --- a/net/nimble/host/src/ble_att_cmd.c +++ b/net/nimble/host/src/ble_att_cmd.c @@ -610,9 +610,15 @@ ble_att_write_cmd_write(void *payload, int len, } void -ble_att_write_cmd_log(const struct ble_att_write_req *cmd) +ble_att_write_cmd_log(const struct ble_att_write_cmd *cmd) { - BLE_HS_LOG(DEBUG, "handle=0x%04x", cmd->bawq_handle); + BLE_HS_LOG(DEBUG, "handle=0x%04x", cmd->handle); +} + +void +ble_att_write_req_log(const struct ble_att_write_req *req) +{ + BLE_HS_LOG(DEBUG, "handle=0x%04x", req->bawq_handle); } static void http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/a9549fdb/net/nimble/host/src/ble_att_cmd_priv.h ---------------------------------------------------------------------- diff --git a/net/nimble/host/src/ble_att_cmd_priv.h b/net/nimble/host/src/ble_att_cmd_priv.h index 80fe713..491dc99 100644 --- a/net/nimble/host/src/ble_att_cmd_priv.h +++ b/net/nimble/host/src/ble_att_cmd_priv.h @@ -252,6 +252,7 @@ struct ble_att_read_group_type_rsp { #define BLE_ATT_WRITE_REQ_BASE_SZ 3 struct ble_att_write_req { uint16_t bawq_handle; + uint8_t value[0]; } __attribute__((packed)); #define BLE_ATT_WRITE_RSP_SZ 1 @@ -322,6 +323,19 @@ struct ble_att_indicate_req { */ #define BLE_ATT_INDICATE_RSP_SZ 1 +/** + * | Parameter | Size (octets) | + * +------------------------------------+-------------------+ + * | Attribute Opcode | 1 | + * | Attribute Handle | 2 | + * | Attribute Value | 0 to (ATT_MTU-3) | + */ +#define BLE_ATT_WRITE_CMD_BASE_SZ 3 +struct ble_att_write_cmd { + uint16_t handle; + uint8_t value[0]; +} __attribute__((packed)); + void ble_att_error_rsp_parse(const void *payload, int len, struct ble_att_error_rsp *rsp); void ble_att_error_rsp_write(void *payload, int len, @@ -396,7 +410,8 @@ void ble_att_write_cmd_parse(const void *payload, int len, struct ble_att_write_req *req); void ble_att_write_cmd_write(void *payload, int len, const struct ble_att_write_req *req); -void ble_att_write_cmd_log(const struct ble_att_write_req *cmd); +void ble_att_write_cmd_log(const struct ble_att_write_cmd *cmd); +void ble_att_write_req_log(const struct ble_att_write_req *req); void ble_att_prep_write_req_parse(const void *payload, int len, struct ble_att_prep_write_cmd *cmd); void ble_att_prep_write_req_write(void *payload, int len, http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/a9549fdb/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 a51f7cc..b7def41 100644 --- a/net/nimble/host/src/ble_att_priv.h +++ b/net/nimble/host/src/ble_att_priv.h @@ -276,11 +276,9 @@ int ble_att_clt_tx_find_type_value(uint16_t conn_handle, uint16_t start_handle, const void *attribute_value, int value_len); int ble_att_clt_rx_find_type_value(uint16_t conn_handle, struct os_mbuf **rxom); -int ble_att_clt_tx_write_req(uint16_t conn_handle, - const struct ble_att_write_req *req, +int ble_att_clt_tx_write_req(uint16_t conn_handle, uint16_t handle, struct os_mbuf *txom); -int ble_att_clt_tx_write_cmd(uint16_t conn_handle, - const struct ble_att_write_req *req, +int ble_att_clt_tx_write_cmd(uint16_t conn_handle, uint16_t handle, struct os_mbuf *txom); int ble_att_clt_tx_prep_write(uint16_t conn_handle, const struct ble_att_prep_write_cmd *req, http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/a9549fdb/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 ac6fa55..3aea795 100644 --- a/net/nimble/host/src/ble_att_svr.c +++ b/net/nimble/host/src/ble_att_svr.c @@ -2055,7 +2055,7 @@ ble_att_svr_rx_write(uint16_t conn_handle, struct os_mbuf **rxom) ble_att_write_req_parse((*rxom)->om_data, (*rxom)->om_len, &req); BLE_ATT_LOG_CMD(0, "write req", conn_handle, - ble_att_write_cmd_log, &req); + ble_att_write_req_log, &req); err_handle = req.bawq_handle; @@ -2105,7 +2105,7 @@ ble_att_svr_rx_write_no_rsp(uint16_t conn_handle, struct os_mbuf **rxom) ble_att_write_cmd_parse((*rxom)->om_data, (*rxom)->om_len, &req); BLE_ATT_LOG_CMD(0, "write cmd", conn_handle, - ble_att_write_cmd_log, &req); + ble_att_write_req_log, &req); /* Strip the request base from the front of the mbuf. */ os_mbuf_adj(*rxom, BLE_ATT_WRITE_REQ_BASE_SZ); http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/a9549fdb/net/nimble/host/src/ble_gattc.c ---------------------------------------------------------------------- diff --git a/net/nimble/host/src/ble_gattc.c b/net/nimble/host/src/ble_gattc.c index 6aa8bb1..7e57433 100644 --- a/net/nimble/host/src/ble_gattc.c +++ b/net/nimble/host/src/ble_gattc.c @@ -3560,15 +3560,13 @@ ble_gattc_write_no_rsp(uint16_t conn_handle, uint16_t attr_handle, return BLE_HS_ENOTSUP; #endif - struct ble_att_write_req req; int rc; STATS_INC(ble_gattc_stats, write_no_rsp); ble_gattc_log_write(attr_handle, OS_MBUF_PKTLEN(txom), 0); - req.bawq_handle = attr_handle; - rc = ble_att_clt_tx_write_cmd(conn_handle, &req, txom); + rc = ble_att_clt_tx_write_cmd(conn_handle, attr_handle, txom); if (rc != 0) { STATS_INC(ble_gattc_stats, write); } @@ -3692,7 +3690,6 @@ ble_gattc_write(uint16_t conn_handle, uint16_t attr_handle, return BLE_HS_ENOTSUP; #endif - struct ble_att_write_req req; struct ble_gattc_proc *proc; int rc; @@ -3712,8 +3709,7 @@ ble_gattc_write(uint16_t conn_handle, uint16_t attr_handle, ble_gattc_log_write(attr_handle, OS_MBUF_PKTLEN(txom), 1); - req.bawq_handle = attr_handle; - rc = ble_att_clt_tx_write_req(conn_handle, &req, txom); + rc = ble_att_clt_tx_write_req(conn_handle, attr_handle, txom); txom = NULL; if (rc != 0) { goto done; http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/a9549fdb/net/nimble/host/test/src/ble_att_clt_test.c ---------------------------------------------------------------------- diff --git a/net/nimble/host/test/src/ble_att_clt_test.c b/net/nimble/host/test/src/ble_att_clt_test.c index dec4695..97a1a44 100644 --- a/net/nimble/host/test/src/ble_att_clt_test.c +++ b/net/nimble/host/test/src/ble_att_clt_test.c @@ -59,8 +59,7 @@ ble_att_clt_test_misc_verify_tx_write(uint16_t handle_id, void *value, } static void -ble_att_clt_test_tx_write_req_or_cmd(uint16_t conn_handle, - struct ble_att_write_req *req, +ble_att_clt_test_tx_write_req_or_cmd(uint16_t conn_handle, uint16_t handle, void *value, int value_len, int is_req) { struct os_mbuf *om; @@ -68,9 +67,9 @@ ble_att_clt_test_tx_write_req_or_cmd(uint16_t conn_handle, om = ble_hs_test_util_om_from_flat(value, value_len); if (is_req) { - rc = ble_att_clt_tx_write_req(conn_handle, req, om); + rc = ble_att_clt_tx_write_req(conn_handle, handle, om); } else { - rc = ble_att_clt_tx_write_cmd(conn_handle, req, om); + rc = ble_att_clt_tx_write_cmd(conn_handle, handle, om); } TEST_ASSERT(rc == 0); } @@ -167,7 +166,6 @@ TEST_CASE(ble_att_clt_test_rx_find_info) static void ble_att_clt_test_case_tx_write_req_or_cmd(int is_req) { - struct ble_att_write_req req; uint16_t conn_handle; uint8_t value300[500] = { 0 }; uint8_t value5[5] = { 6, 7, 54, 34, 8 }; @@ -175,16 +173,14 @@ ble_att_clt_test_case_tx_write_req_or_cmd(int is_req) conn_handle = ble_att_clt_test_misc_init(); /*** 5-byte write. */ - req.bawq_handle = 0x1234; - ble_att_clt_test_tx_write_req_or_cmd(conn_handle, &req, value5, + ble_att_clt_test_tx_write_req_or_cmd(conn_handle, 0x1234, value5, sizeof value5, is_req); ble_hs_test_util_tx_all(); ble_att_clt_test_misc_verify_tx_write(0x1234, value5, sizeof value5, is_req); /*** Overlong write; verify command truncated to ATT MTU. */ - req.bawq_handle = 0xab83; - ble_att_clt_test_tx_write_req_or_cmd(conn_handle, &req, value300, + ble_att_clt_test_tx_write_req_or_cmd(conn_handle, 0xab83, value300, sizeof value300, is_req); ble_hs_test_util_tx_all(); ble_att_clt_test_misc_verify_tx_write(0xab83, value300,