BLE Host - Use chr val handle for stores. We used to use the definition handle. This was clumsy and provided no benefit.
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/d98f4d1a Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/d98f4d1a Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/d98f4d1a Branch: refs/heads/develop Commit: d98f4d1a3803c161e232619519dad357761f2132 Parents: 58dde84 Author: Christopher Collins <[email protected]> Authored: Sat May 21 13:48:04 2016 -0700 Committer: Christopher Collins <[email protected]> Committed: Sat May 21 13:48:04 2016 -0700 ---------------------------------------------------------------------- net/nimble/host/include/host/ble_store.h | 7 +-- net/nimble/host/src/ble_gatts.c | 48 +++++++++----------- .../host/src/test/ble_gatts_notify_test.c | 8 ++-- 3 files changed, 29 insertions(+), 34 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/d98f4d1a/net/nimble/host/include/host/ble_store.h ---------------------------------------------------------------------- diff --git a/net/nimble/host/include/host/ble_store.h b/net/nimble/host/include/host/ble_store.h index 9b8f37b..1bb27d5 100644 --- a/net/nimble/host/include/host/ble_store.h +++ b/net/nimble/host/include/host/ble_store.h @@ -49,10 +49,10 @@ struct ble_store_key_cccd { uint8_t peer_addr_type; /** - * Key by characteristic definition handle; - * chr_def_handle=0 means don't key off characteristic handle. + * Key by characteristic value handle; + * chr_val_handle=0 means don't key off characteristic handle. */ - uint16_t chr_def_handle; + uint16_t chr_val_handle; /** Number of results to skip; 0 means retrieve the first match. */ uint8_t idx; @@ -61,6 +61,7 @@ struct ble_store_key_cccd { struct ble_store_value_cccd { uint8_t peer_addr[6]; uint8_t peer_addr_type; + uint16_t chr_val_handle; uint16_t flags; unsigned value_changed:1; }; http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/d98f4d1a/net/nimble/host/src/ble_gatts.c ---------------------------------------------------------------------- diff --git a/net/nimble/host/src/ble_gatts.c b/net/nimble/host/src/ble_gatts.c index 9a1be0d..d56609d 100644 --- a/net/nimble/host/src/ble_gatts.c +++ b/net/nimble/host/src/ble_gatts.c @@ -17,8 +17,6 @@ * under the License. */ -/* XXX: Standardize on chr_val_handle; never use definition handle. */ - #include <stddef.h> #include <string.h> #include "console/console.h" @@ -43,7 +41,7 @@ static os_membuf_t *ble_gatts_clt_cfg_mem; static struct os_mempool ble_gatts_clt_cfg_pool; struct ble_gatts_clt_cfg { - uint16_t chr_def_handle; + uint16_t chr_val_handle; uint8_t flags; uint8_t allowed; }; @@ -500,14 +498,14 @@ ble_gatts_register_dsc(const struct ble_gatt_dsc_def *dsc, static int ble_gatts_clt_cfg_find_idx(struct ble_gatts_clt_cfg *cfgs, - uint16_t chr_def_handle) + uint16_t chr_val_handle) { struct ble_gatts_clt_cfg *cfg; int i; for (i = 0; i < ble_gatts_num_cfgable_chrs; i++) { cfg = cfgs + i; - if (cfg->chr_def_handle == chr_def_handle) { + if (cfg->chr_val_handle == chr_val_handle) { return i; } } @@ -517,11 +515,11 @@ ble_gatts_clt_cfg_find_idx(struct ble_gatts_clt_cfg *cfgs, static struct ble_gatts_clt_cfg * ble_gatts_clt_cfg_find(struct ble_gatts_clt_cfg *cfgs, - uint16_t chr_def_handle) + uint16_t chr_val_handle) { int idx; - idx = ble_gatts_clt_cfg_find_idx(cfgs, chr_def_handle); + idx = ble_gatts_clt_cfg_find_idx(cfgs, chr_val_handle); if (idx == -1) { return NULL; } else { @@ -542,7 +540,7 @@ ble_gatts_clt_cfg_access_locked(struct ble_hs_conn *conn, uint16_t attr_handle, struct ble_gatts_clt_cfg_record *out_record) { struct ble_gatts_clt_cfg *clt_cfg; - uint16_t chr_def_handle; + uint16_t chr_val_handle; uint16_t flags; uint8_t gatt_op; @@ -552,16 +550,16 @@ ble_gatts_clt_cfg_access_locked(struct ble_hs_conn *conn, uint16_t attr_handle, out_record->write = 0; /* We always register the client characteristics descriptor with handle - * (chr_def + 2). + * (chr_val + 1). */ - chr_def_handle = attr_handle - 2; - if (chr_def_handle > attr_handle) { + chr_val_handle = attr_handle - 1; + if (chr_val_handle > attr_handle) { /* Attribute handle wrapped somehow. */ return BLE_ATT_ERR_UNLIKELY; } clt_cfg = ble_gatts_clt_cfg_find(conn->bhc_gatt_svr.clt_cfgs, - attr_handle - 2); + chr_val_handle); if (clt_cfg == NULL) { return BLE_ATT_ERR_UNLIKELY; } @@ -594,6 +592,7 @@ ble_gatts_clt_cfg_access_locked(struct ble_hs_conn *conn, uint16_t attr_handle, if (conn->bhc_sec_state.bonded) { out_record->key.peer_addr_type = conn->bhc_addr_type; memcpy(out_record->key.peer_addr, conn->bhc_addr, 6); + out_record->value.chr_val_handle = chr_val_handle; out_record->value.flags = clt_cfg->flags; out_record->value.value_changed = 0; out_record->write = 1; @@ -984,7 +983,7 @@ ble_gatts_start(void) if (allowed_flags != 0) { BLE_HS_DBG_ASSERT_EVAL(idx < ble_gatts_num_cfgable_chrs); - ble_gatts_clt_cfgs[idx].chr_def_handle = ha->ha_handle_id; + ble_gatts_clt_cfgs[idx].chr_val_handle = ha->ha_handle_id + 1; ble_gatts_clt_cfgs[idx].allowed = allowed_flags; ble_gatts_clt_cfgs[idx].flags = 0; idx++; @@ -1041,9 +1040,10 @@ ble_gatts_send_next_indicate(uint16_t conn_handle) BLE_HS_DBG_ASSERT(clt_cfg->flags & BLE_GATTS_CLT_CFG_F_INDICATE); + chr_val_handle = clt_cfg->chr_val_handle; + /* Clear updated flag in anticipation of indication tx. */ clt_cfg->flags &= ~BLE_GATTS_CLT_CFG_F_UPDATED; - chr_val_handle = clt_cfg->chr_def_handle + 1; break; } } @@ -1073,15 +1073,12 @@ ble_gatts_rx_indicate_ack(uint16_t conn_handle, uint16_t chr_val_handle) struct ble_store_value_cccd cccd_value; struct ble_gatts_clt_cfg *clt_cfg; struct ble_hs_conn *conn; - uint16_t chr_def_handle; int clt_cfg_idx; int persist; int rc; - chr_def_handle = chr_val_handle - 1; - clt_cfg_idx = ble_gatts_clt_cfg_find_idx(ble_gatts_clt_cfgs, - chr_def_handle); + chr_val_handle); if (clt_cfg_idx == -1) { /* This characteristic does not have a CCCD. */ return BLE_HS_ENOENT; @@ -1111,13 +1108,14 @@ ble_gatts_rx_indicate_ack(uint16_t conn_handle, uint16_t chr_val_handle) */ BLE_HS_DBG_ASSERT(conn->bhc_gatt_svr.num_clt_cfgs > clt_cfg_idx); clt_cfg = conn->bhc_gatt_svr.clt_cfgs + clt_cfg_idx; - BLE_HS_DBG_ASSERT(clt_cfg->chr_def_handle == chr_def_handle); + BLE_HS_DBG_ASSERT(clt_cfg->chr_val_handle == chr_val_handle); persist = conn->bhc_sec_state.bonded && !(clt_cfg->flags & BLE_GATTS_CLT_CFG_F_UPDATED); if (persist) { cccd_value.peer_addr_type = conn->bhc_addr_type; memcpy(cccd_value.peer_addr, conn->bhc_addr, 6); + cccd_value.chr_val_handle = chr_val_handle; cccd_value.flags = clt_cfg->flags; cccd_value.value_changed = 0; } @@ -1145,13 +1143,12 @@ ble_gatts_rx_indicate_ack(uint16_t conn_handle, uint16_t chr_val_handle) } void -ble_gatts_chr_updated(uint16_t chr_def_handle) +ble_gatts_chr_updated(uint16_t chr_val_handle) { struct ble_store_value_cccd cccd_value; struct ble_store_key_cccd cccd_key; struct ble_gatts_clt_cfg *clt_cfg; struct ble_hs_conn *conn; - uint16_t chr_val_handle; uint16_t clt_cfg_flags; uint16_t conn_handle; int clt_cfg_idx; @@ -1162,14 +1159,11 @@ ble_gatts_chr_updated(uint16_t chr_def_handle) * characteristic. */ clt_cfg_idx = ble_gatts_clt_cfg_find_idx(ble_gatts_clt_cfgs, - chr_def_handle); + chr_val_handle); if (clt_cfg_idx == -1) { return; } - chr_val_handle = chr_def_handle + 1; - BLE_HS_DBG_ASSERT(chr_val_handle > chr_def_handle); - /* Handle the connected devices. */ for (i = 0; ; i++) { ble_hs_lock(); @@ -1179,7 +1173,7 @@ ble_gatts_chr_updated(uint16_t chr_def_handle) BLE_HS_DBG_ASSERT_EVAL(conn->bhc_gatt_svr.num_clt_cfgs > clt_cfg_idx); clt_cfg = conn->bhc_gatt_svr.clt_cfgs + clt_cfg_idx; - BLE_HS_DBG_ASSERT_EVAL(clt_cfg->chr_def_handle == chr_def_handle); + BLE_HS_DBG_ASSERT_EVAL(clt_cfg->chr_val_handle == chr_val_handle); if (clt_cfg->flags & BLE_GATTS_CLT_CFG_F_NOTIFY) { @@ -1222,7 +1216,7 @@ ble_gatts_chr_updated(uint16_t chr_def_handle) */ cccd_key = (struct ble_store_key_cccd) { .peer_addr_type = BLE_STORE_PEER_ADDR_TYPE_NONE, - .chr_def_handle = chr_def_handle, + .chr_val_handle = chr_val_handle, .idx = 0, }; http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/d98f4d1a/net/nimble/host/src/test/ble_gatts_notify_test.c ---------------------------------------------------------------------- diff --git a/net/nimble/host/src/test/ble_gatts_notify_test.c b/net/nimble/host/src/test/ble_gatts_notify_test.c index 526e6d6..74693e3 100644 --- a/net/nimble/host/src/test/ble_gatts_notify_test.c +++ b/net/nimble/host/src/test/ble_gatts_notify_test.c @@ -226,7 +226,7 @@ TEST_CASE(ble_gatts_notify_test_n) /* Update characteristic 1's value. */ ble_gatts_notify_test_chr_1_len = 1; ble_gatts_notify_test_chr_1_val[0] = 0xab; - ble_gatts_chr_updated(ble_gatts_notify_test_chr_1_def_handle); + ble_gatts_chr_updated(ble_gatts_notify_test_chr_1_def_handle + 1); /* Verify notification sent properly. */ ble_gatts_notify_test_misc_verify_tx_n(ble_gatts_notify_test_chr_1_val, @@ -236,7 +236,7 @@ TEST_CASE(ble_gatts_notify_test_n) ble_gatts_notify_test_chr_2_len = 16; memcpy(ble_gatts_notify_test_chr_2_val, ((uint8_t[]){0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}), 16); - ble_gatts_chr_updated(ble_gatts_notify_test_chr_2_def_handle); + ble_gatts_chr_updated(ble_gatts_notify_test_chr_2_def_handle + 1); /* Verify notification sent properly. */ ble_gatts_notify_test_misc_verify_tx_n(ble_gatts_notify_test_chr_2_val, @@ -265,7 +265,7 @@ TEST_CASE(ble_gatts_notify_test_i) /* Update characteristic 1's value. */ ble_gatts_notify_test_chr_1_len = 1; ble_gatts_notify_test_chr_1_val[0] = 0xab; - ble_gatts_chr_updated(ble_gatts_notify_test_chr_1_def_handle); + ble_gatts_chr_updated(ble_gatts_notify_test_chr_1_def_handle + 1); /* Verify indication sent properly. */ ble_gatts_notify_test_misc_verify_tx_i(ble_gatts_notify_test_chr_1_val, @@ -275,7 +275,7 @@ TEST_CASE(ble_gatts_notify_test_i) ble_gatts_notify_test_chr_2_len = 16; memcpy(ble_gatts_notify_test_chr_2_val, ((uint8_t[]){0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}), 16); - ble_gatts_chr_updated(ble_gatts_notify_test_chr_2_def_handle); + ble_gatts_chr_updated(ble_gatts_notify_test_chr_2_def_handle + 1); /* Verify the second indication doesn't get sent until the first is * confirmed.
