Re: Storing Bonding information in NVS memory
Hi Chris, Thank you for your response. As I build my understanding from your response, The `idx` field most probably is useful in searching the case where `key.sec.peer_addr = *BLE_ADDR_ANY`, which most probably is useful to search our security keys. Correct me if I am wrong. The reason behind asking use-case of `idx` was, when we are to write security keys to database, we call `ble_store_key_from_value_sec` which does the following: { out_key->peer_addr = value->peer_addr; out_key->ediv = value->ediv; out_key->rand_num = value->rand_num; out_key->ediv_rand_present = 1; *o**ut_key->idx = 0;* // /This made me wonder why we need to search based on this criteria./ } Thank you for response anyways. Really helpful. Regards Prasad On 13/02/19 9:44 PM, Christopher Collins wrote: Hi Prasad, On Wed, Feb 13, 2019 at 03:13:26PM +0530, prasad wrote: Hi all, As it happens, I fixed the bug in my code. It now correctly retrieves LTKs and bond is maintained even after reboot. Apart from this I just wanted to understand reason behind including 'idx' in structure 'ble_store_key_sec'. Could you please help me understand use-case behind including 'idx'? /** Number of results to skip; 0 means retrieve the first match. */ uint8_t idx; The `idx` field is useful when your search criteria matches several entries and you want to process them one by one. For example, the `ble_store_iterate()` function constructs a `ble_store_key_sec` object with the following values: { /** * Key by peer identity address; * peer_addr=BLE_ADDR_NONE means don't key off peer. */ peer_addr = *BLE_ADDR_ANY, /** Key by ediv; ediv_rand_present=0 means don't key off ediv. */ ediv = 0, /** Key by rand_num; ediv_rand_present=0 means don't key off rand_num. */ rand_num = 0 ediv_rand_present = 0, /** Number of results to skip; 0 means retrieve the first match. */ idx = 0, } Then it repeatedly calls `ble_store_read()`, incrementing the `idx` member each time. This allows all stored bonds to be processed. Chris)
Re: Storing Bonding information in NVS memory
Hi Prasad, On Wed, Feb 13, 2019 at 03:13:26PM +0530, prasad wrote: > Hi all, > > As it happens, I fixed the bug in my code. It now correctly retrieves > LTKs and bond is maintained even after reboot. > > Apart from this I just wanted to understand reason behind including > 'idx' in structure 'ble_store_key_sec'. Could you please help me > understand use-case behind including 'idx'? > > /** Number of results to skip; 0 means retrieve the first match. */ > uint8_t idx; The `idx` field is useful when your search criteria matches several entries and you want to process them one by one. For example, the `ble_store_iterate()` function constructs a `ble_store_key_sec` object with the following values: { /** * Key by peer identity address; * peer_addr=BLE_ADDR_NONE means don't key off peer. */ peer_addr = *BLE_ADDR_ANY, /** Key by ediv; ediv_rand_present=0 means don't key off ediv. */ ediv = 0, /** Key by rand_num; ediv_rand_present=0 means don't key off rand_num. */ rand_num = 0 ediv_rand_present = 0, /** Number of results to skip; 0 means retrieve the first match. */ idx = 0, } Then it repeatedly calls `ble_store_read()`, incrementing the `idx` member each time. This allows all stored bonds to be processed. Chris
Re: Storing Bonding information in NVS memory
Hi all, As it happens, I fixed the bug in my code. It now correctly retrieves LTKs and bond is maintained even after reboot. Apart from this I just wanted to understand reason behind including 'idx' in structure 'ble_store_key_sec'. Could you please help me understand use-case behind including 'idx'? /** Number of results to skip; 0 means retrieve the first match. */ uint8_t idx; Regards Prasad On 12/02/19 7:35 PM, prasad wrote: Hi all, With further debug effort the disconnect happens with HCI error 0x3d: BLE_ERR_CONN_TERM_MIC. Once the connection is establish, if we disconnect and try to reconnect it is disconnecting with said reason. I am attaching logs with additional prints. Please help me to know if I am making any obvious mistake. Regards Prasad On 11/02/19 7:10 PM, prasad wrote: Hi all, Are there any pointers/documentation for storing NIMBLE bond information in NVS memory? I tried to quickly implement simple application by modifying '*ble_store_ram.c*'. I modified /ble_hs_cfg.store_read_cb/store_write_cb/store_delete_cb/ callbacks according to the requirement. I find this much of change is not sufficient to get NVS bond stored in NVS as I am continuously getting disconnect HCI event. FYI, I am putting snippet of my code for each of these 3 callbacks which will help you understand the changes I have made. 1.**/*ble_hs_cfg.store_read_cb* : / /case BLE_STORE_OBJ_TYPE_OUR_SEC: nvs_open("nimble_bond", NVS_READWRITE, _handle); BLE_HS_LOG(DEBUG, "looking up our sec; "); err = nvs_get_blob(nimble_handle, "our_sec_key", NULL, _size); if (err != ESP_OK && err != ESP_ERR_NVS_NOT_FOUND) return err; if (required_size == 0) { nvs_close(nimble_handle); return BLE_HS_ENOENT; } else { struct ble_store_key_sec* our_sec_key = malloc(required_size); err = nvs_get_blob(nimble_handle, "our_sec_key", our_sec_key, _size); if (err != ESP_OK) { free(our_sec_key); return err; } if (ble_addr_cmp(>sec.peer_addr, BLE_ADDR_ANY)) { if (ble_addr_cmp(_sec_key->peer_addr, >sec.peer_addr)){ err = nvs_get_blob(nimble_handle, "our_sec", NULL, _size); if (err != ESP_OK && err != ESP_ERR_NVS_NOT_FOUND) return err; struct ble_store_value_sec* our_sec = malloc(required_size); err = nvs_get_blob(nimble_handle, "our_sec", our_sec, _size); if (err != ESP_OK) { free(our_sec); return err; } memcpy(>sec, our_sec, required_size); free(our_sec); } } free(our_sec_key); } /* NVS Close */ nvs_close(nimble_handle); / /2. ///*ble_hs_cfg.store_write_cb *// //case BLE_STORE_OBJ_TYPE_OUR_SEC: ble_store_key_from_value_sec(_sec, >sec); required_size = sizeof(struct ble_store_key_sec); err = nvs_set_blob(nimble_handle, "our_sec_key", _sec, required_size); required_size = sizeof(struct ble_store_value_sec); err = nvs_set_blob(nimble_handle, "our_sec", >sec, required_size); /* NVS Commit */ err = nvs_commit(nimble_handle); if (err != ESP_OK) return err; /* NVS Close */ nvs_close(nimble_handle); return 0;// Regards Prasad