Merge branch 'bugfix/ble_mesh_settings_fix_v4.1' into 'release/v4.1'

Bugfix/ble mesh settings fix (v4.1)

See merge request espressif/esp-idf!10785
This commit is contained in:
Island 2020-10-13 10:50:03 +08:00
commit c01f0a08fc
34 changed files with 490 additions and 301 deletions

View File

@ -1132,6 +1132,7 @@ typedef union {
*/ */
struct ble_mesh_provisioner_add_local_app_key_comp_param { struct ble_mesh_provisioner_add_local_app_key_comp_param {
int err_code; /*!< Indicate the result of adding local AppKey by the Provisioner */ int err_code; /*!< Indicate the result of adding local AppKey by the Provisioner */
uint16_t net_idx; /*!< NetKey Index */
uint16_t app_idx; /*!< AppKey Index */ uint16_t app_idx; /*!< AppKey Index */
} provisioner_add_app_key_comp; /*!< Event parameter of ESP_BLE_MESH_PROVISIONER_ADD_LOCAL_APP_KEY_COMP_EVT */ } provisioner_add_app_key_comp; /*!< Event parameter of ESP_BLE_MESH_PROVISIONER_ADD_LOCAL_APP_KEY_COMP_EVT */
/** /**
@ -1176,14 +1177,14 @@ typedef union {
/** /**
* @brief ESP_BLE_MESH_PROVISIONER_DELETE_NODE_WITH_UUID_COMP_EVT * @brief ESP_BLE_MESH_PROVISIONER_DELETE_NODE_WITH_UUID_COMP_EVT
*/ */
struct ble_mesh_provisioner_delete_node_with_uuid_comp_data_comp_param { struct ble_mesh_provisioner_delete_node_with_uuid_comp_param {
int err_code; /*!< Indicate the result of deleting node with uuid by the Provisioner */ int err_code; /*!< Indicate the result of deleting node with uuid by the Provisioner */
uint8_t uuid[16]; /*!< Node device uuid */ uint8_t uuid[16]; /*!< Node device uuid */
} provisioner_delete_node_with_uuid_comp; /*!< Event parameter of ESP_BLE_MESH_PROVISIONER_DELETE_NODE_WITH_UUID_COMP_EVT */ } provisioner_delete_node_with_uuid_comp; /*!< Event parameter of ESP_BLE_MESH_PROVISIONER_DELETE_NODE_WITH_UUID_COMP_EVT */
/** /**
* @brief ESP_BLE_MESH_PROVISIONER_DELETE_NODE_WITH_ADDR_COMP_EVT * @brief ESP_BLE_MESH_PROVISIONER_DELETE_NODE_WITH_ADDR_COMP_EVT
*/ */
struct ble_mesh_provisioner_delete_node_with_addr_comp_data_comp_param { struct ble_mesh_provisioner_delete_node_with_addr_comp_param {
int err_code; /*!< Indicate the result of deleting node with unicast address by the Provisioner */ int err_code; /*!< Indicate the result of deleting node with unicast address by the Provisioner */
uint16_t unicast_addr; /*!< Node unicast address */ uint16_t unicast_addr; /*!< Node unicast address */
} provisioner_delete_node_with_addr_comp; /*!< Event parameter of ESP_BLE_MESH_PROVISIONER_DELETE_NODE_WITH_ADDR_COMP_EVT */ } provisioner_delete_node_with_addr_comp; /*!< Event parameter of ESP_BLE_MESH_PROVISIONER_DELETE_NODE_WITH_ADDR_COMP_EVT */

View File

@ -1823,10 +1823,11 @@ void btc_ble_mesh_prov_call_handler(btc_msg_t *msg)
app_key = arg->add_local_app_key.app_key; app_key = arg->add_local_app_key.app_key;
} }
act = ESP_BLE_MESH_PROVISIONER_ADD_LOCAL_APP_KEY_COMP_EVT; act = ESP_BLE_MESH_PROVISIONER_ADD_LOCAL_APP_KEY_COMP_EVT;
param.provisioner_add_app_key_comp.app_idx = arg->add_local_app_key.app_idx;
param.provisioner_add_app_key_comp.err_code = param.provisioner_add_app_key_comp.err_code =
bt_mesh_provisioner_local_app_key_add(app_key, arg->add_local_app_key.net_idx, bt_mesh_provisioner_local_app_key_add(app_key, arg->add_local_app_key.net_idx,
&arg->add_local_app_key.app_idx); &arg->add_local_app_key.app_idx);
param.provisioner_add_app_key_comp.net_idx = arg->add_local_app_key.net_idx;
param.provisioner_add_app_key_comp.app_idx = arg->add_local_app_key.app_idx;
break; break;
} }
case BTC_BLE_MESH_ACT_PROVISIONER_UPDATE_LOCAL_APP_KEY: case BTC_BLE_MESH_ACT_PROVISIONER_UPDATE_LOCAL_APP_KEY:
@ -1856,9 +1857,9 @@ void btc_ble_mesh_prov_call_handler(btc_msg_t *msg)
net_key = arg->add_local_net_key.net_key; net_key = arg->add_local_net_key.net_key;
} }
act = ESP_BLE_MESH_PROVISIONER_ADD_LOCAL_NET_KEY_COMP_EVT; act = ESP_BLE_MESH_PROVISIONER_ADD_LOCAL_NET_KEY_COMP_EVT;
param.provisioner_add_net_key_comp.net_idx = arg->add_local_net_key.net_idx;
param.provisioner_add_net_key_comp.err_code = param.provisioner_add_net_key_comp.err_code =
bt_mesh_provisioner_local_net_key_add(net_key, &arg->add_local_net_key.net_idx); bt_mesh_provisioner_local_net_key_add(net_key, &arg->add_local_net_key.net_idx);
param.provisioner_add_net_key_comp.net_idx = arg->add_local_net_key.net_idx;
break; break;
} }
case BTC_BLE_MESH_ACT_PROVISIONER_UPDATE_LOCAL_NET_KEY: case BTC_BLE_MESH_ACT_PROVISIONER_UPDATE_LOCAL_NET_KEY:

View File

@ -35,6 +35,11 @@ void bt_mesh_model_foreach(void (*func)(struct bt_mesh_model *mod,
{ {
int i, j; int i, j;
if (dev_comp == NULL) {
BT_ERR("Invalid device composition");
return;
}
for (i = 0; i < dev_comp->elem_count; i++) { for (i = 0; i < dev_comp->elem_count; i++) {
struct bt_mesh_elem *elem = &dev_comp->elem[i]; struct bt_mesh_elem *elem = &dev_comp->elem[i];

View File

@ -218,7 +218,7 @@ static void clear_friendship(bool force, bool disable)
return; return;
} }
bt_mesh_rx_reset(); bt_mesh_rx_reset(true);
k_delayed_work_cancel(&lpn->timer); k_delayed_work_cancel(&lpn->timer);

View File

@ -107,7 +107,7 @@ void bt_mesh_node_reset(void)
bt_mesh_cfg_reset(); bt_mesh_cfg_reset();
bt_mesh_rx_reset(); bt_mesh_rx_reset(true);
bt_mesh_tx_reset(); bt_mesh_tx_reset();
if (IS_ENABLED(CONFIG_BLE_MESH_LOW_POWER)) { if (IS_ENABLED(CONFIG_BLE_MESH_LOW_POWER)) {
@ -199,10 +199,27 @@ int bt_mesh_prov_enable(bt_mesh_prov_bearer_t bearers)
return -EINVAL; return -EINVAL;
} }
bt_mesh_atomic_set_bit(bt_mesh.flags, BLE_MESH_NODE); /* Add this judgement here in case the device worked as a
* Provisioner previously. Before the corresponding info
* of Provisioner is erased from flash, users try to use
* the device as a node, which will cause the information
* in NVS been handled incorrectly.
*/
u8_t role = bt_mesh_atomic_get(bt_mesh.flags) & BLE_MESH_SETTINGS_ROLE_BIT_MASK;
if (role != BLE_MESH_SETTINGS_ROLE_NONE &&
role != BLE_MESH_SETTINGS_ROLE_NODE) {
BT_ERR("%s, Mismatch role %u", __func__, role);
return -EIO;
}
if (IS_ENABLED(CONFIG_BLE_MESH_SETTINGS)) { if (role == BLE_MESH_SETTINGS_ROLE_NONE) {
bt_mesh_store_role(); bt_mesh_atomic_set_bit(bt_mesh.flags, BLE_MESH_NODE);
}
if (IS_ENABLED(CONFIG_BLE_MESH_SETTINGS_BACKWARD_COMPATIBILITY) ||
role == BLE_MESH_SETTINGS_ROLE_NONE) {
if (IS_ENABLED(CONFIG_BLE_MESH_SETTINGS)) {
bt_mesh_store_role();
}
} }
if (IS_ENABLED(CONFIG_BLE_MESH_PB_ADV) && if (IS_ENABLED(CONFIG_BLE_MESH_PB_ADV) &&
@ -225,6 +242,7 @@ int bt_mesh_prov_enable(bt_mesh_prov_bearer_t bearers)
int bt_mesh_prov_disable(bt_mesh_prov_bearer_t bearers) int bt_mesh_prov_disable(bt_mesh_prov_bearer_t bearers)
{ {
if (bt_mesh_is_provisioned()) { if (bt_mesh_is_provisioned()) {
BT_WARN("%s, Already provisioned", __func__);
return -EALREADY; return -EALREADY;
} }
@ -504,10 +522,7 @@ int bt_mesh_deinit(struct bt_mesh_deinit_param *param)
bt_mesh_comp_unprovision(); bt_mesh_comp_unprovision();
if (IS_ENABLED(CONFIG_BLE_MESH_SETTINGS)) { if (IS_ENABLED(CONFIG_BLE_MESH_SETTINGS)) {
if (param->erase) { bt_mesh_settings_deinit(param->erase);
bt_mesh_clear_role();
}
bt_mesh_settings_deinit();
} }
bt_mesh_timer_deinit(); bt_mesh_timer_deinit();
@ -532,6 +547,27 @@ int bt_mesh_provisioner_enable(bt_mesh_prov_bearer_t bearers)
return -EINVAL; return -EINVAL;
} }
/* Add this judgement here in case the device worked as a
* node previously. Before the corresponding information
* of the node is erased from flash, users try to use the
* device as a Provisioner, which will cause the information
* in NVS been handled incorrectly.
*/
u8_t role = bt_mesh_atomic_get(bt_mesh.flags) & BLE_MESH_SETTINGS_ROLE_BIT_MASK;
if (role != BLE_MESH_SETTINGS_ROLE_NONE &&
role != BLE_MESH_SETTINGS_ROLE_PROV) {
BT_ERR("%s, Mismatch role %u", __func__, role);
return -EIO;
}
if (role == BLE_MESH_SETTINGS_ROLE_NONE) {
bt_mesh_atomic_set_bit(bt_mesh.flags, BLE_MESH_PROVISIONER);
if (IS_ENABLED(CONFIG_BLE_MESH_SETTINGS)) {
bt_mesh_store_role();
}
}
err = bt_mesh_provisioner_net_create(); err = bt_mesh_provisioner_net_create();
if (err) { if (err) {
BT_ERR("Failed to create network"); BT_ERR("Failed to create network");
@ -548,12 +584,6 @@ int bt_mesh_provisioner_enable(bt_mesh_prov_bearer_t bearers)
bt_mesh_comp_provision(bt_mesh_provisioner_get_primary_elem_addr()); bt_mesh_comp_provision(bt_mesh_provisioner_get_primary_elem_addr());
bt_mesh_atomic_set_bit(bt_mesh.flags, BLE_MESH_PROVISIONER);
if (IS_ENABLED(CONFIG_BLE_MESH_SETTINGS)) {
bt_mesh_store_role();
}
#if defined(CONFIG_BLE_MESH_USE_DUPLICATE_SCAN) #if defined(CONFIG_BLE_MESH_USE_DUPLICATE_SCAN)
if (IS_ENABLED(CONFIG_BLE_MESH_PB_ADV) && if (IS_ENABLED(CONFIG_BLE_MESH_PB_ADV) &&
(bearers & BLE_MESH_PROV_ADV)) { (bearers & BLE_MESH_PROV_ADV)) {

View File

@ -2,6 +2,7 @@
/* /*
* Copyright (c) 2017 Intel Corporation * Copyright (c) 2017 Intel Corporation
* Additional Copyright (c) 2020 Espressif Systems (Shanghai) PTE LTD
* *
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
@ -15,13 +16,13 @@
extern "C" { extern "C" {
#endif #endif
#define BLE_MESH_KEY_PRIMARY 0x0000 #define BLE_MESH_KEY_PRIMARY 0x0000
#define BLE_MESH_KEY_ANY 0xffff #define BLE_MESH_KEY_ANY 0xffff
#define BLE_MESH_ADDR_IS_UNICAST(addr) ((addr) && (addr) < 0x8000) #define BLE_MESH_ADDR_IS_UNICAST(addr) ((addr) && (addr) < 0x8000)
#define BLE_MESH_ADDR_IS_GROUP(addr) ((addr) >= 0xc000 && (addr) <= 0xff00) #define BLE_MESH_ADDR_IS_GROUP(addr) ((addr) >= 0xc000 && (addr) <= 0xff00)
#define BLE_MESH_ADDR_IS_VIRTUAL(addr) ((addr) >= 0x8000 && (addr) < 0xc000) #define BLE_MESH_ADDR_IS_VIRTUAL(addr) ((addr) >= 0x8000 && (addr) < 0xc000)
#define BLE_MESH_ADDR_IS_RFU(addr) ((addr) >= 0xff00 && (addr) <= 0xfffb) #define BLE_MESH_ADDR_IS_RFU(addr) ((addr) >= 0xff00 && (addr) <= 0xfffb)
struct bt_mesh_net; struct bt_mesh_net;

View File

@ -165,7 +165,7 @@ int bt_mesh_provisioner_deinit(bool erase)
for (i = 0; i < CONFIG_BLE_MESH_PROVISIONER_SUBNET_COUNT; i++) { for (i = 0; i < CONFIG_BLE_MESH_PROVISIONER_SUBNET_COUNT; i++) {
if (bt_mesh.p_sub[i]) { if (bt_mesh.p_sub[i]) {
if (erase && IS_ENABLED(CONFIG_BLE_MESH_SETTINGS)) { if (erase && IS_ENABLED(CONFIG_BLE_MESH_SETTINGS)) {
bt_mesh_clear_p_subnet(bt_mesh.p_sub[i]); bt_mesh_clear_p_subnet(bt_mesh.p_sub[i]->net_idx);
} }
bt_mesh_free(bt_mesh.p_sub[i]); bt_mesh_free(bt_mesh.p_sub[i]);
bt_mesh.p_sub[i] = NULL; bt_mesh.p_sub[i] = NULL;
@ -175,7 +175,7 @@ int bt_mesh_provisioner_deinit(bool erase)
for (i = 0; i < CONFIG_BLE_MESH_PROVISIONER_APP_KEY_COUNT; i++) { for (i = 0; i < CONFIG_BLE_MESH_PROVISIONER_APP_KEY_COUNT; i++) {
if (bt_mesh.p_app_keys[i]) { if (bt_mesh.p_app_keys[i]) {
if (erase && IS_ENABLED(CONFIG_BLE_MESH_SETTINGS)) { if (erase && IS_ENABLED(CONFIG_BLE_MESH_SETTINGS)) {
bt_mesh_clear_p_app_key(bt_mesh.p_app_keys[i]); bt_mesh_clear_p_app_key(bt_mesh.p_app_keys[i]->app_idx);
} }
bt_mesh_free(bt_mesh.p_app_keys[i]); bt_mesh_free(bt_mesh.p_app_keys[i]);
bt_mesh.p_app_keys[i] = NULL; bt_mesh.p_app_keys[i] = NULL;
@ -1027,6 +1027,7 @@ int bt_mesh_provisioner_local_app_key_add(const u8_t app_key[16],
} }
} }
*app_idx = key->app_idx; *app_idx = key->app_idx;
bt_mesh.p_app_idx_next++;
} }
key->updated = false; key->updated = false;
@ -1198,7 +1199,7 @@ int bt_mesh_provisioner_local_app_key_delete(u16_t net_idx, u16_t app_idx)
bt_mesh_model_foreach(_model_unbind, &app_idx); bt_mesh_model_foreach(_model_unbind, &app_idx);
if (IS_ENABLED(CONFIG_BLE_MESH_SETTINGS)) { if (IS_ENABLED(CONFIG_BLE_MESH_SETTINGS)) {
bt_mesh_clear_p_app_key(key); bt_mesh_clear_p_app_key(app_idx);
} }
bt_mesh_free(bt_mesh.p_app_keys[i]); bt_mesh_free(bt_mesh.p_app_keys[i]);
@ -1283,6 +1284,7 @@ int bt_mesh_provisioner_local_net_key_add(const u8_t net_key[16], u16_t *net_idx
} }
} }
*net_idx = sub->net_idx; *net_idx = sub->net_idx;
bt_mesh.p_net_idx_next++;
} }
sub->kr_phase = BLE_MESH_KR_NORMAL; sub->kr_phase = BLE_MESH_KR_NORMAL;
sub->kr_flag = false; sub->kr_flag = false;
@ -1391,7 +1393,7 @@ int bt_mesh_provisioner_local_net_key_delete(u16_t net_idx)
} }
if (IS_ENABLED(CONFIG_BLE_MESH_SETTINGS)) { if (IS_ENABLED(CONFIG_BLE_MESH_SETTINGS)) {
bt_mesh_clear_p_subnet(sub); bt_mesh_clear_p_subnet(net_idx);
} }
bt_mesh_free(bt_mesh.p_sub[i]); bt_mesh_free(bt_mesh.p_sub[i]);

View File

@ -1117,6 +1117,11 @@ int bt_mesh_provisioner_init_prov_info(void)
/* If unicast address of primary element of Provisioner has not been set /* If unicast address of primary element of Provisioner has not been set
* before, then the following initialization procedure will be used. * before, then the following initialization procedure will be used.
*/ */
if (prov == NULL) {
BT_ERR("No provisioning context provided");
return -EINVAL;
}
if (!BLE_MESH_ADDR_IS_UNICAST(prov->prov_unicast_addr) || if (!BLE_MESH_ADDR_IS_UNICAST(prov->prov_unicast_addr) ||
!BLE_MESH_ADDR_IS_UNICAST(prov->prov_start_address)) { !BLE_MESH_ADDR_IS_UNICAST(prov->prov_start_address)) {
BT_ERR("Invalid address, own 0x%04x, start 0x%04x", BT_ERR("Invalid address, own 0x%04x, start 0x%04x",

View File

@ -19,6 +19,7 @@
#include "cfg_srv.h" #include "cfg_srv.h"
#include "mesh_common.h" #include "mesh_common.h"
#include "settings_nvs.h" #include "settings_nvs.h"
#include "settings.h"
#include "provisioner_main.h" #include "provisioner_main.h"
#include "provisioner_prov.h" #include "provisioner_prov.h"
@ -167,7 +168,29 @@ struct node_info {
u8_t dev_key[16]; u8_t dev_key[16];
} __packed; } __packed;
#define DEVICE_ROLE_BITS (BIT(BLE_MESH_NODE) | BIT(BLE_MESH_PROVISIONER)) static bt_mesh_mutex_t settings_lock;
static void bt_mesh_settings_mutex_new(void)
{
if (settings_lock.mutex == NULL) {
bt_mesh_mutex_create(&settings_lock);
}
}
static void bt_mesh_settings_mutex_free(void)
{
bt_mesh_mutex_free(&settings_lock);
}
void bt_mesh_settings_lock(void)
{
bt_mesh_mutex_lock(&settings_lock);
}
void bt_mesh_settings_unlock(void)
{
bt_mesh_mutex_unlock(&settings_lock);
}
static int role_set(const char *name) static int role_set(const char *name)
{ {
@ -340,13 +363,18 @@ static int rpl_set(const char *name)
for (i = 0; i < length / SETTINGS_ITEM_SIZE; i++) { for (i = 0; i < length / SETTINGS_ITEM_SIZE; i++) {
u16_t src = net_buf_simple_pull_le16(buf); u16_t src = net_buf_simple_pull_le16(buf);
if (!BLE_MESH_ADDR_IS_UNICAST(src)) {
BT_ERR("Invalid source address 0x%04x", src);
continue;
}
sprintf(get, "mesh/rpl/%04x", src); sprintf(get, "mesh/rpl/%04x", src);
err = bt_mesh_load_core_settings(get, (u8_t *)&rpl, sizeof(rpl), &exist); err = bt_mesh_load_core_settings(get, (u8_t *)&rpl, sizeof(rpl), &exist);
if (err) { if (err) {
BT_ERR("Failed to load RPL entry 0x%04x", src); BT_ERR("Failed to load RPL entry 0x%04x", src);
bt_mesh_rpl_reset(); continue;
goto free;
} }
if (exist == false) { if (exist == false) {
@ -363,10 +391,11 @@ static int rpl_set(const char *name)
} }
} }
BT_INFO("Restored RPL entry 0x%04x: seq 0x%06x, old_iv %u", src, rpl.seq, rpl.old_iv);
entry->src = src; entry->src = src;
entry->seq = rpl.seq; entry->seq = rpl.seq;
entry->old_iv = rpl.old_iv; entry->old_iv = rpl.old_iv;
BT_INFO("Restored RPL entry 0x%04x: seq 0x%06x, old_iv %u", src, rpl.seq, rpl.old_iv);
} }
free: free:
@ -415,7 +444,7 @@ static int net_key_set(const char *name)
err = bt_mesh_load_core_settings(get, (u8_t *)&key, sizeof(key), &exist); err = bt_mesh_load_core_settings(get, (u8_t *)&key, sizeof(key), &exist);
if (err) { if (err) {
BT_ERR("Failed to load NetKey 0x%03x", net_idx); BT_ERR("Failed to load NetKey 0x%03x", net_idx);
goto free; continue;
} }
if (exist == false) { if (exist == false) {
@ -475,7 +504,7 @@ static int app_key_set(const char *name)
err = bt_mesh_load_core_settings(get, (u8_t *)&key, sizeof(key), &exist); err = bt_mesh_load_core_settings(get, (u8_t *)&key, sizeof(key), &exist);
if (err) { if (err) {
BT_ERR("Failed to load AppKey 0x%03x", app_idx); BT_ERR("Failed to load AppKey 0x%03x", app_idx);
goto free; continue;
} }
if (exist == false) { if (exist == false) {
@ -485,8 +514,7 @@ static int app_key_set(const char *name)
sub = bt_mesh_subnet_get(key.net_idx); sub = bt_mesh_subnet_get(key.net_idx);
if (!sub) { if (!sub) {
BT_ERR("Failed to find subnet 0x%03x", key.net_idx); BT_ERR("Failed to find subnet 0x%03x", key.net_idx);
err = -ENOENT; continue;
goto free;
} }
app = bt_mesh_app_key_find(app_idx); app = bt_mesh_app_key_find(app_idx);
@ -527,13 +555,13 @@ static int hb_pub_set(const char *name)
BT_DBG("%s", __func__); BT_DBG("%s", __func__);
if (!hb_pub) { if (!hb_pub) {
BT_ERR("Invalid heartbeat pub"); BT_ERR("Invalid heartbeat publication");
return -EINVAL; return -EINVAL;
} }
err = bt_mesh_load_core_settings(name, (u8_t *)&hb_val, sizeof(hb_val), &exist); err = bt_mesh_load_core_settings(name, (u8_t *)&hb_val, sizeof(hb_val), &exist);
if (err) { if (err) {
BT_ERR("Failed to load heartbeat pub"); BT_ERR("Failed to load heartbeat publication");
hb_pub->dst = BLE_MESH_ADDR_UNASSIGNED; hb_pub->dst = BLE_MESH_ADDR_UNASSIGNED;
hb_pub->count = 0U; hb_pub->count = 0U;
hb_pub->ttl = 0U; hb_pub->ttl = 0U;
@ -557,7 +585,8 @@ static int hb_pub_set(const char *name)
hb_pub->count = 0U; hb_pub->count = 0U;
} }
BT_INFO("Restored Heartbeat Publication, dst 0x%04x", hb_pub->dst); BT_INFO("Restored Heartbeat Publication, dst 0x%04x, period %d, net_idx 0x%03x",
hb_pub->dst, hb_pub->period, hb_pub->net_idx);
return 0; return 0;
} }
@ -590,7 +619,10 @@ static int cfg_set(const char *name)
memcpy(&stored_cfg.cfg, &val, sizeof(val)); memcpy(&stored_cfg.cfg, &val, sizeof(val));
stored_cfg.valid = true; stored_cfg.valid = true;
BT_INFO("Restored Configuration State");
BT_INFO("Restored Configuration, ttl %d, transmit 0x%02x, retransmit 0x%02x",
val.default_ttl, val.net_transmit, val.relay_retransmit);
return 0; return 0;
} }
@ -613,6 +645,10 @@ static int model_set_bind(bool vnd, struct bt_mesh_model *model, u16_t model_key
return -EIO; return -EIO;
} }
if (exist == true) {
BT_INFO("Restored Model Bound AppKey, index %s", bt_hex(model->keys, sizeof(model->keys)));
}
return 0; return 0;
} }
@ -635,6 +671,10 @@ static int model_set_sub(bool vnd, struct bt_mesh_model *model, u16_t model_key)
return -EIO; return -EIO;
} }
if (exist == true) {
BT_INFO("Restored Model Subscription, address %s", bt_hex(model->groups, sizeof(model->groups)));
}
return 0; return 0;
} }
@ -662,7 +702,7 @@ static int model_set_pub(bool vnd, struct bt_mesh_model *model, u16_t model_key)
model->pub->period = 0U; model->pub->period = 0U;
model->pub->retransmit = 0U; model->pub->retransmit = 0U;
model->pub->count = 0U; model->pub->count = 0U;
return 0; return -EIO;
} }
if (exist == false) { if (exist == false) {
@ -677,8 +717,7 @@ static int model_set_pub(bool vnd, struct bt_mesh_model *model, u16_t model_key)
model->pub->retransmit = pub.retransmit; model->pub->retransmit = pub.retransmit;
model->pub->count = 0U; model->pub->count = 0U;
BT_INFO("Restored Model Publication, address 0x%04x, app_idx 0x%03x", BT_INFO("Restored Model Publication, address 0x%04x, app_idx 0x%03x", pub.addr, pub.key);
pub.addr, pub.key);
return 0; return 0;
} }
@ -689,7 +728,6 @@ static int model_set(bool vnd, const char *name)
struct net_buf_simple *buf = NULL; struct net_buf_simple *buf = NULL;
u8_t elem_idx = 0U, model_idx = 0U; u8_t elem_idx = 0U, model_idx = 0U;
size_t length = 0U; size_t length = 0U;
int err = 0;
int i; int i;
BT_DBG("%s", __func__); BT_DBG("%s", __func__);
@ -703,6 +741,7 @@ static int model_set(bool vnd, const char *name)
for (i = 0; i < length / SETTINGS_ITEM_SIZE; i++) { for (i = 0; i < length / SETTINGS_ITEM_SIZE; i++) {
u16_t model_key = net_buf_simple_pull_le16(buf); u16_t model_key = net_buf_simple_pull_le16(buf);
elem_idx = BLE_MESH_GET_ELEM_IDX(model_key); elem_idx = BLE_MESH_GET_ELEM_IDX(model_key);
model_idx = BLE_MESH_GET_MODEL_IDX(model_key); model_idx = BLE_MESH_GET_MODEL_IDX(model_key);
@ -710,29 +749,16 @@ static int model_set(bool vnd, const char *name)
if (!model) { if (!model) {
BT_ERR("%s model not found, elem_idx %u, model_idx %u", BT_ERR("%s model not found, elem_idx %u, model_idx %u",
vnd ? "vnd" : "sig", elem_idx, model_idx); vnd ? "vnd" : "sig", elem_idx, model_idx);
err = -ENOENT; continue;
goto free;
} }
err = model_set_bind(vnd, model, model_key); model_set_bind(vnd, model, model_key);
if (err) { model_set_sub(vnd, model, model_key);
goto free; model_set_pub(vnd, model, model_key);
}
err = model_set_sub(vnd, model, model_key);
if (err) {
goto free;
}
err = model_set_pub(vnd, model, model_key);
if (err) {
goto free;
}
} }
free:
bt_mesh_free_buf(buf); bt_mesh_free_buf(buf);
return err; return 0;
} }
static int sig_mod_set(const char *name) static int sig_mod_set(const char *name)
@ -773,7 +799,7 @@ static int va_set(const char *name)
err = bt_mesh_load_core_settings(get, (u8_t *)&va, sizeof(va), &exist); err = bt_mesh_load_core_settings(get, (u8_t *)&va, sizeof(va), &exist);
if (err) { if (err) {
BT_ERR("Failed to load virtual address 0x%04x", index); BT_ERR("Failed to load virtual address 0x%04x", index);
goto free; continue;
} }
if (exist == false) { if (exist == false) {
@ -782,7 +808,7 @@ static int va_set(const char *name)
if (va.ref == 0) { if (va.ref == 0) {
BT_DBG("Ignore virtual address %s with ref = 0", get); BT_DBG("Ignore virtual address %s with ref = 0", get);
goto free; continue;
} }
lab = get_label(index); lab = get_label(index);
@ -947,7 +973,7 @@ static int p_net_key_set(const char *name)
err = bt_mesh_load_core_settings(get, (u8_t *)&key, sizeof(key), &exist); err = bt_mesh_load_core_settings(get, (u8_t *)&key, sizeof(key), &exist);
if (err) { if (err) {
BT_ERR("Failed to load NetKey 0x%03x", net_idx); BT_ERR("Failed to load NetKey 0x%03x", net_idx);
goto free; continue;
} }
if (exist == false) { if (exist == false) {
@ -1007,7 +1033,7 @@ static int p_app_key_set(const char *name)
err = bt_mesh_load_core_settings(get, (u8_t *)&key, sizeof(key), &exist); err = bt_mesh_load_core_settings(get, (u8_t *)&key, sizeof(key), &exist);
if (err) { if (err) {
BT_ERR("Failed to load AppKey 0x%03x", app_idx); BT_ERR("Failed to load AppKey 0x%03x", app_idx);
goto free; continue;
} }
if (exist == false) { if (exist == false) {
@ -1017,8 +1043,7 @@ static int p_app_key_set(const char *name)
sub = bt_mesh_provisioner_subnet_get(key.net_idx); sub = bt_mesh_provisioner_subnet_get(key.net_idx);
if (!sub) { if (!sub) {
BT_ERR("Failed to find subnet 0x%03x", key.net_idx); BT_ERR("Failed to find subnet 0x%03x", key.net_idx);
err = -ENOENT; continue;
goto free;
} }
app = bt_mesh_provisioner_app_key_find(app_idx); app = bt_mesh_provisioner_app_key_find(app_idx);
@ -1188,43 +1213,44 @@ const struct bt_mesh_setting {
const char *name; const char *name;
int (*func)(const char *name); int (*func)(const char *name);
} settings[] = { } settings[] = {
{ "mesh/role", role_set }, { "mesh/role", role_set }, /* For Node & Provisioner */
{ "mesh/net", net_set }, { "mesh/net", net_set }, /* For Node */
{ "mesh/iv", iv_set }, { "mesh/iv", iv_set }, /* For Node & Provisioner */
{ "mesh/seq", seq_set }, { "mesh/seq", seq_set }, /* For Node & Provisioner */
{ "mesh/rpl", rpl_set }, { "mesh/rpl", rpl_set }, /* For Node & Provisioner */
{ "mesh/netkey", net_key_set }, { "mesh/netkey", net_key_set }, /* For Node */
{ "mesh/appkey", app_key_set }, { "mesh/appkey", app_key_set }, /* For Node */
{ "mesh/hb_pub", hb_pub_set }, { "mesh/hb_pub", hb_pub_set }, /* For Node */
{ "mesh/cfg", cfg_set }, { "mesh/cfg", cfg_set }, /* For Node */
{ "mesh/sig", sig_mod_set }, { "mesh/sig", sig_mod_set }, /* For Node & Provisioner */
{ "mesh/vnd", vnd_mod_set }, { "mesh/vnd", vnd_mod_set }, /* For Node & Provisioner */
#if CONFIG_BLE_MESH_LABEL_COUNT > 0 #if CONFIG_BLE_MESH_LABEL_COUNT > 0
{ "mesh/vaddr", va_set }, { "mesh/vaddr", va_set }, /* For Node */
#endif #endif
#if CONFIG_BLE_MESH_PROVISIONER #if CONFIG_BLE_MESH_PROVISIONER
{ "mesh/p_prov", p_prov_set }, { "mesh/p_prov", p_prov_set }, /* For Provisioner */
{ "mesh/p_netidx", p_net_idx_set }, { "mesh/p_netidx", p_net_idx_set }, /* For Provisioner */
{ "mesh/p_appidx", p_app_idx_set }, { "mesh/p_appidx", p_app_idx_set }, /* For Provisioner */
{ "mesh/p_netkey", p_net_key_set }, { "mesh/p_netkey", p_net_key_set }, /* For Provisioner */
{ "mesh/p_appkey", p_app_key_set }, { "mesh/p_appkey", p_app_key_set }, /* For Provisioner */
{ "mesh/p_node", p_node_set }, { "mesh/p_node", p_node_set }, /* For Provisioner */
#endif #endif
}; };
/** /**
* For Provisioner, the load operation needs the following actions: * For Provisioner, the load operation needs the following actions:
* role_set: Need, restore the device role
* net_set: Not needed * net_set: Not needed
* iv_set: Need, although Provisioner will do some initialization of IV Index * iv_set: Need, restore the last IV Index status
* during startup, but we need to restore the last IV Index status
* seq_set: Need, restore the previous sequence number * seq_set: Need, restore the previous sequence number
* rpl_set: Need, restore the previous Replay Protection List * rpl_set: Need, restore the previous Replay Protection List
* net_key_set: Need, restore the previous network keys * net_key_set: Not needed
* app_key_set: Need, restore the previous application keys * app_key_set: Not needed
* hb_pub_set: Not needed currently * hb_pub_set: Not needed currently
* cfg_set: Not needed currently * cfg_set: Not needed currently
* sig_mod_set: Need, restore SIG models related info (app, sub, pub) * sig_mod_set: Need, restore SIG models related info (app, sub, pub)
* vnd_mod_set: Need, restore vendor models related info (app, sub, pub) * vnd_mod_set: Need, restore vendor models related info (app, sub, pub)
* va_set: Not needed currently
*/ */
int settings_core_load(void) int settings_core_load(void)
{ {
@ -1237,7 +1263,8 @@ int settings_core_load(void)
!strcmp(settings[i].name, "mesh/netkey") || !strcmp(settings[i].name, "mesh/netkey") ||
!strcmp(settings[i].name, "mesh/appkey") || !strcmp(settings[i].name, "mesh/appkey") ||
!strcmp(settings[i].name, "mesh/hb_pub") || !strcmp(settings[i].name, "mesh/hb_pub") ||
!strcmp(settings[i].name, "mesh/cfg")) && !strcmp(settings[i].name, "mesh/cfg") ||
!strcmp(settings[i].name, "mesh/vaddr")) &&
(!IS_ENABLED(CONFIG_BLE_MESH_NODE) || bt_mesh_is_provisioner())) { (!IS_ENABLED(CONFIG_BLE_MESH_NODE) || bt_mesh_is_provisioner())) {
BT_DBG("Not restoring %s for Provisioner", settings[i].name); BT_DBG("Not restoring %s for Provisioner", settings[i].name);
continue; continue;
@ -1257,15 +1284,15 @@ int settings_core_load(void)
settings[i].func(settings[i].name); settings[i].func(settings[i].name);
if (!strcmp(settings[i].name, "mesh/role")) { if (!strcmp(settings[i].name, "mesh/role")) {
u8_t role = bt_mesh_atomic_get(bt_mesh.flags) & DEVICE_ROLE_BITS; u8_t role = bt_mesh_atomic_get(bt_mesh.flags) & BLE_MESH_SETTINGS_ROLE_BIT_MASK;
switch (role) { switch (role) {
case 0U: case BLE_MESH_SETTINGS_ROLE_NONE:
BT_INFO("Mesh device just starts up, no restore"); BT_INFO("Mesh device just starts up, no restore");
return 0; return 0;
case BIT(BLE_MESH_NODE): case BLE_MESH_SETTINGS_ROLE_NODE:
BT_INFO("Restored mesh device role: Node"); BT_INFO("Restored mesh device role: Node");
break; break;
case BIT(BLE_MESH_PROVISIONER): case BLE_MESH_SETTINGS_ROLE_PROV:
BT_INFO("Restored mesh device role: Provisioner"); BT_INFO("Restored mesh device role: Provisioner");
break; break;
default: default:
@ -1330,13 +1357,13 @@ int settings_core_commit(void)
#if defined(CONFIG_BLE_MESH_NODE) #if defined(CONFIG_BLE_MESH_NODE)
if (bt_mesh_is_node()) { if (bt_mesh_is_node()) {
BT_INFO("sub[0].net_idx 0x%03x", bt_mesh.sub[0].net_idx);
if (bt_mesh.sub[0].net_idx == BLE_MESH_KEY_UNUSED) { if (bt_mesh.sub[0].net_idx == BLE_MESH_KEY_UNUSED) {
/* Nothing to do since we're not yet provisioned */ /* Nothing to do since we're not yet provisioned */
return 0; return 0;
} }
BT_INFO("Settings commit, sub[0].net_idx 0x%03x", bt_mesh.sub[0].net_idx);
if (IS_ENABLED(CONFIG_BLE_MESH_PB_GATT)) { if (IS_ENABLED(CONFIG_BLE_MESH_PB_GATT)) {
bt_mesh_proxy_server_prov_disable(true); bt_mesh_proxy_server_prov_disable(true);
} }
@ -1363,7 +1390,7 @@ int settings_core_commit(void)
return 0; return 0;
} }
BT_INFO("p_sub[0]->net_idx 0x%03x", bt_mesh.p_sub[0]->net_idx); BT_INFO("Settings commit, p_sub[0]->net_idx 0x%03x", bt_mesh.p_sub[0]->net_idx);
for (i = 0; i < ARRAY_SIZE(bt_mesh.p_sub); i++) { for (i = 0; i < ARRAY_SIZE(bt_mesh.p_sub); i++) {
sub = bt_mesh.p_sub[i]; sub = bt_mesh.p_sub[i];
@ -1380,11 +1407,13 @@ int settings_core_commit(void)
} }
#endif /* CONFIG_BLE_MESH_PROVISIONER */ #endif /* CONFIG_BLE_MESH_PROVISIONER */
if (bt_mesh.ivu_duration < BLE_MESH_IVU_MIN_HOURS) { if (bt_mesh_is_node() || bt_mesh_is_provisioner()) {
k_delayed_work_submit(&bt_mesh.ivu_timer, BLE_MESH_IVU_TIMEOUT); if (bt_mesh.ivu_duration < BLE_MESH_IVU_MIN_HOURS) {
} k_delayed_work_submit(&bt_mesh.ivu_timer, BLE_MESH_IVU_TIMEOUT);
}
bt_mesh_model_foreach(commit_model, NULL); bt_mesh_model_foreach(commit_model, NULL);
}
#if defined(CONFIG_BLE_MESH_NODE) #if defined(CONFIG_BLE_MESH_NODE)
if (bt_mesh_is_node()) { if (bt_mesh_is_node()) {
@ -1450,7 +1479,7 @@ static void schedule_store(int flag)
return; return;
} }
BT_INFO("Waiting %d seconds", timeout / MSEC_PER_SEC); BT_INFO("Settings store, waiting %d seconds", timeout / MSEC_PER_SEC);
if (timeout) { if (timeout) {
k_delayed_work_submit(&pending_store, timeout); k_delayed_work_submit(&pending_store, timeout);
@ -1459,16 +1488,10 @@ static void schedule_store(int flag)
} }
} }
static void clear_iv(void)
{
BT_DBG("Clearing IV");
bt_mesh_save_core_settings("mesh/iv", NULL, 0);
}
static void clear_net(void) static void clear_net(void)
{ {
BT_DBG("Clearing Network"); BT_DBG("Clearing Network");
bt_mesh_save_core_settings("mesh/net", NULL, 0); bt_mesh_erase_core_settings("mesh/net");
} }
static void store_pending_net(void) static void store_pending_net(void)
@ -1486,7 +1509,7 @@ static void store_pending_net(void)
void bt_mesh_store_role(void) void bt_mesh_store_role(void)
{ {
BT_DBG("Store, device role %lu", bt_mesh_atomic_get(bt_mesh.flags) & DEVICE_ROLE_BITS); BT_DBG("Store, device role %lu", bt_mesh_atomic_get(bt_mesh.flags) & BLE_MESH_SETTINGS_ROLE_BIT_MASK);
bt_mesh_save_core_settings("mesh/role", (const u8_t *)bt_mesh.flags, sizeof(bt_mesh.flags)); bt_mesh_save_core_settings("mesh/role", (const u8_t *)bt_mesh.flags, sizeof(bt_mesh.flags));
} }
@ -1519,7 +1542,8 @@ void bt_mesh_store_iv(bool only_duration)
void bt_mesh_clear_iv(void) void bt_mesh_clear_iv(void)
{ {
clear_iv(); BT_DBG("Clearing IV");
bt_mesh_erase_core_settings("mesh/iv");
} }
static void store_pending_seq(void) static void store_pending_seq(void)
@ -1543,7 +1567,8 @@ void bt_mesh_store_seq(void)
void bt_mesh_clear_seq(void) void bt_mesh_clear_seq(void)
{ {
bt_mesh_save_core_settings("mesh/seq", NULL, 0); BT_DBG("Clearing Seq");
bt_mesh_erase_core_settings("mesh/seq");
} }
static void store_rpl(struct bt_mesh_rpl *entry) static void store_rpl(struct bt_mesh_rpl *entry)
@ -1582,11 +1607,9 @@ static void clear_rpl(void)
BT_DBG("%s", __func__); BT_DBG("%s", __func__);
bt_mesh_rpl_clear();
buf = bt_mesh_get_core_settings_item("mesh/rpl"); buf = bt_mesh_get_core_settings_item("mesh/rpl");
if (!buf) { if (!buf) {
bt_mesh_save_core_settings("mesh/rpl", NULL, 0); bt_mesh_erase_core_settings("mesh/rpl");
return; return;
} }
@ -1594,11 +1617,17 @@ static void clear_rpl(void)
for (i = 0; i < length / SETTINGS_ITEM_SIZE; i++) { for (i = 0; i < length / SETTINGS_ITEM_SIZE; i++) {
src = net_buf_simple_pull_le16(buf); src = net_buf_simple_pull_le16(buf);
if (!BLE_MESH_ADDR_IS_UNICAST(src)) {
BT_ERR("Invalid source address 0x%04x", src);
continue;
}
sprintf(name, "mesh/rpl/%04x", src); sprintf(name, "mesh/rpl/%04x", src);
bt_mesh_save_core_settings(name, NULL, 0); bt_mesh_erase_core_settings(name);
} }
bt_mesh_save_core_settings("mesh/rpl", NULL, 0); bt_mesh_erase_core_settings("mesh/rpl");
bt_mesh_free_buf(buf); bt_mesh_free_buf(buf);
return; return;
@ -1626,7 +1655,7 @@ static void store_pending_hb_pub(void)
struct hb_pub_val val = {0}; struct hb_pub_val val = {0};
if (!hb_pub) { if (!hb_pub) {
BT_WARN("NULL heartbeat publication"); BT_ERR("Invalid heartbeat publication");
return; return;
} }
@ -1640,6 +1669,12 @@ static void store_pending_hb_pub(void)
bt_mesh_save_core_settings("mesh/hb_pub", (const u8_t *)&val, sizeof(val)); bt_mesh_save_core_settings("mesh/hb_pub", (const u8_t *)&val, sizeof(val));
} }
static void clear_hb_pub(void)
{
BT_DBG("Clear heartbeat publication");
bt_mesh_erase_core_settings("mesh/hb_pub");
}
static void store_pending_cfg(void) static void store_pending_cfg(void)
{ {
struct bt_mesh_cfg_srv *cfg = bt_mesh_cfg_get(); struct bt_mesh_cfg_srv *cfg = bt_mesh_cfg_get();
@ -1664,7 +1699,7 @@ static void store_pending_cfg(void)
static void clear_cfg(void) static void clear_cfg(void)
{ {
BT_DBG("Clearing configuration"); BT_DBG("Clearing configuration");
bt_mesh_save_core_settings("mesh/cfg", NULL, 0); bt_mesh_erase_core_settings("mesh/cfg");
} }
static void clear_app_key(u16_t app_idx) static void clear_app_key(u16_t app_idx)
@ -1675,7 +1710,7 @@ static void clear_app_key(u16_t app_idx)
BT_DBG("AppKeyIndex 0x%03x", app_idx); BT_DBG("AppKeyIndex 0x%03x", app_idx);
sprintf(name, "mesh/ak/%04x", app_idx); sprintf(name, "mesh/ak/%04x", app_idx);
bt_mesh_save_core_settings(name, NULL, 0); bt_mesh_erase_core_settings(name);
err = bt_mesh_remove_core_settings_item("mesh/appkey", app_idx); err = bt_mesh_remove_core_settings_item("mesh/appkey", app_idx);
if (err) { if (err) {
@ -1693,7 +1728,7 @@ static void clear_net_key(u16_t net_idx)
BT_DBG("NetKeyIndex 0x%03x", net_idx); BT_DBG("NetKeyIndex 0x%03x", net_idx);
sprintf(name, "mesh/nk/%04x", net_idx); sprintf(name, "mesh/nk/%04x", net_idx);
bt_mesh_save_core_settings(name, NULL, 0); bt_mesh_erase_core_settings(name);
err = bt_mesh_remove_core_settings_item("mesh/netkey", net_idx); err = bt_mesh_remove_core_settings_item("mesh/netkey", net_idx);
if (err) { if (err) {
@ -1806,15 +1841,8 @@ static void store_pending_mod_bind(struct bt_mesh_model *model, bool vnd)
int err = 0; int err = 0;
model_key = BLE_MESH_GET_MODEL_KEY(model->elem_idx, model->model_idx); model_key = BLE_MESH_GET_MODEL_KEY(model->elem_idx, model->model_idx);
sprintf(name, "mesh/%s/%04x/b", vnd ? "v" : "s", model_key); sprintf(name, "mesh/%s/%04x/b", vnd ? "v" : "s", model_key);
if (IS_ENABLED(CONFIG_BLE_MESH_NODE) && bt_mesh_is_node() &&
!bt_mesh_is_provisioned()) {
bt_mesh_save_core_settings(name, NULL, 0);
return;
}
err = bt_mesh_save_core_settings(name, (const u8_t *)model->keys, sizeof(model->keys)); err = bt_mesh_save_core_settings(name, (const u8_t *)model->keys, sizeof(model->keys));
if (err) { if (err) {
BT_ERR("Failed to store %s", name); BT_ERR("Failed to store %s", name);
@ -1837,15 +1865,8 @@ static void store_pending_mod_sub(struct bt_mesh_model *model, bool vnd)
int err = 0; int err = 0;
model_key = BLE_MESH_GET_MODEL_KEY(model->elem_idx, model->model_idx); model_key = BLE_MESH_GET_MODEL_KEY(model->elem_idx, model->model_idx);
sprintf(name, "mesh/%s/%04x/s", vnd ? "v" : "s", model_key); sprintf(name, "mesh/%s/%04x/s", vnd ? "v" : "s", model_key);
if (IS_ENABLED(CONFIG_BLE_MESH_NODE) && bt_mesh_is_node() &&
!bt_mesh_is_provisioned()) {
bt_mesh_save_core_settings(name, NULL, 0);
return;
}
err = bt_mesh_save_core_settings(name, (const u8_t *)model->groups, sizeof(model->groups)); err = bt_mesh_save_core_settings(name, (const u8_t *)model->groups, sizeof(model->groups));
if (err) { if (err) {
BT_ERR("Failed to store %s", name); BT_ERR("Failed to store %s", name);
@ -1873,6 +1894,9 @@ static void store_pending_mod_pub(struct bt_mesh_model *model, bool vnd)
return; return;
} }
model_key = BLE_MESH_GET_MODEL_KEY(model->elem_idx, model->model_idx);
sprintf(name, "mesh/%s/%04x/p", vnd ? "v" : "s", model_key);
pub.addr = model->pub->addr; pub.addr = model->pub->addr;
pub.key = model->pub->key; pub.key = model->pub->key;
pub.ttl = model->pub->ttl; pub.ttl = model->pub->ttl;
@ -1881,16 +1905,6 @@ static void store_pending_mod_pub(struct bt_mesh_model *model, bool vnd)
pub.period_div = model->pub->period_div; pub.period_div = model->pub->period_div;
pub.cred = model->pub->cred; pub.cred = model->pub->cred;
model_key = BLE_MESH_GET_MODEL_KEY(model->elem_idx, model->model_idx);
sprintf(name, "mesh/%s/%04x/p", vnd ? "v" : "s", model_key);
if (IS_ENABLED(CONFIG_BLE_MESH_NODE) && bt_mesh_is_node() &&
!bt_mesh_is_provisioned()) {
bt_mesh_save_core_settings(name, NULL, 0);
return;
}
err = bt_mesh_save_core_settings(name, (const u8_t *)&pub, sizeof(pub)); err = bt_mesh_save_core_settings(name, (const u8_t *)&pub, sizeof(pub));
if (err) { if (err) {
BT_ERR("Failed to store %s", name); BT_ERR("Failed to store %s", name);
@ -1930,6 +1944,66 @@ static void store_pending_mod(struct bt_mesh_model *model,
} }
} }
static void clear_mod_bind(struct bt_mesh_model *model, bool vnd)
{
char name[16] = {'\0'};
u16_t model_key = 0U;
model_key = BLE_MESH_GET_MODEL_KEY(model->elem_idx, model->model_idx);
sprintf(name, "mesh/%s/%04x/b", vnd ? "v" : "s", model_key);
bt_mesh_erase_core_settings(name);
bt_mesh_remove_core_settings_item(vnd ? "mesh/vnd" : "mesh/sig", model_key);
}
static void clear_mod_sub(struct bt_mesh_model *model, bool vnd)
{
char name[16] = {'\0'};
u16_t model_key = 0U;
model_key = BLE_MESH_GET_MODEL_KEY(model->elem_idx, model->model_idx);
sprintf(name, "mesh/%s/%04x/s", vnd ? "v" : "s", model_key);
bt_mesh_erase_core_settings(name);
bt_mesh_remove_core_settings_item(vnd ? "mesh/vnd" : "mesh/sig", model_key);
}
static void clear_mod_pub(struct bt_mesh_model *model, bool vnd)
{
char name[16] = {'\0'};
u16_t model_key = 0U;
model_key = BLE_MESH_GET_MODEL_KEY(model->elem_idx, model->model_idx);
sprintf(name, "mesh/%s/%04x/p", vnd ? "v" : "s", model_key);
bt_mesh_erase_core_settings(name);
bt_mesh_remove_core_settings_item(vnd ? "mesh/vnd" : "mesh/sig", model_key);
}
static void clear_pending_mod(struct bt_mesh_model *model,
struct bt_mesh_elem *elem, bool vnd,
bool primary, void *user_data)
{
if (!model->flags) {
return;
}
if (model->flags & BLE_MESH_MOD_BIND_PENDING) {
model->flags &= ~BLE_MESH_MOD_BIND_PENDING;
clear_mod_bind(model, vnd);
}
if (model->flags & BLE_MESH_MOD_SUB_PENDING) {
model->flags &= ~BLE_MESH_MOD_SUB_PENDING;
clear_mod_sub(model, vnd);
}
if (model->flags & BLE_MESH_MOD_PUB_PENDING) {
model->flags &= ~BLE_MESH_MOD_PUB_PENDING;
clear_mod_pub(model, vnd);
}
}
#define IS_VA_DEL(_label) ((_label)->ref == 0) #define IS_VA_DEL(_label) ((_label)->ref == 0)
static void store_pending_va(void) static void store_pending_va(void)
{ {
@ -1948,7 +2022,7 @@ static void store_pending_va(void)
sprintf(name, "mesh/va/%04x", i); sprintf(name, "mesh/va/%04x", i);
if (IS_VA_DEL(lab)) { if (IS_VA_DEL(lab)) {
err = bt_mesh_save_core_settings(name, NULL, 0); err = bt_mesh_erase_core_settings(name);
} else { } else {
va.ref = lab->ref; va.ref = lab->ref;
va.addr = lab->addr; va.addr = lab->addr;
@ -1981,7 +2055,7 @@ static void store_pending(struct k_work *work)
BT_DBG("%s", __func__); BT_DBG("%s", __func__);
if (bt_mesh_atomic_test_and_clear_bit(bt_mesh.flags, BLE_MESH_RPL_PENDING)) { if (bt_mesh_atomic_test_and_clear_bit(bt_mesh.flags, BLE_MESH_RPL_PENDING)) {
if (!IS_ENABLED(CONFIG_BLE_MESH_NODE) || bt_mesh_is_provisioned()) { if (bt_mesh_is_provisioned() || bt_mesh_is_provisioner_en()) {
store_pending_rpl(); store_pending_rpl();
} else { } else {
clear_rpl(); clear_rpl();
@ -2003,20 +2077,28 @@ static void store_pending(struct k_work *work)
} }
if (bt_mesh_atomic_test_and_clear_bit(bt_mesh.flags, BLE_MESH_IV_PENDING)) { if (bt_mesh_atomic_test_and_clear_bit(bt_mesh.flags, BLE_MESH_IV_PENDING)) {
if (!IS_ENABLED(CONFIG_BLE_MESH_NODE) || bt_mesh_is_provisioned()) { if (bt_mesh_is_provisioned() || bt_mesh_is_provisioner_en()) {
store_pending_iv(); store_pending_iv();
} else { } else {
clear_iv(); bt_mesh_clear_iv();
} }
} }
if (bt_mesh_atomic_test_and_clear_bit(bt_mesh.flags, BLE_MESH_SEQ_PENDING)) { if (bt_mesh_atomic_test_and_clear_bit(bt_mesh.flags, BLE_MESH_SEQ_PENDING)) {
store_pending_seq(); if (bt_mesh_is_provisioned() || bt_mesh_is_provisioner_en()) {
store_pending_seq();
} else {
bt_mesh_clear_seq();
}
} }
if (IS_ENABLED(CONFIG_BLE_MESH_NODE) && bt_mesh_is_node() && if (IS_ENABLED(CONFIG_BLE_MESH_NODE) && bt_mesh_is_node() &&
bt_mesh_atomic_test_and_clear_bit(bt_mesh.flags, BLE_MESH_HB_PUB_PENDING)) { bt_mesh_atomic_test_and_clear_bit(bt_mesh.flags, BLE_MESH_HB_PUB_PENDING)) {
store_pending_hb_pub(); if (bt_mesh_is_provisioned()) {
store_pending_hb_pub();
} else {
clear_hb_pub();
}
} }
if (IS_ENABLED(CONFIG_BLE_MESH_NODE) && bt_mesh_is_node() && if (IS_ENABLED(CONFIG_BLE_MESH_NODE) && bt_mesh_is_node() &&
@ -2029,15 +2111,17 @@ static void store_pending(struct k_work *work)
} }
if (bt_mesh_atomic_test_and_clear_bit(bt_mesh.flags, BLE_MESH_MOD_PENDING)) { if (bt_mesh_atomic_test_and_clear_bit(bt_mesh.flags, BLE_MESH_MOD_PENDING)) {
bt_mesh_model_foreach(store_pending_mod, NULL); if (bt_mesh_is_provisioned() || bt_mesh_is_provisioner_en()) {
if (IS_ENABLED(CONFIG_BLE_MESH_NODE) && bt_mesh_is_node() && bt_mesh_model_foreach(store_pending_mod, NULL);
!bt_mesh_is_provisioned()) { } else {
bt_mesh_save_core_settings("mesh/sig", NULL, 0); bt_mesh_model_foreach(clear_pending_mod, NULL);
bt_mesh_save_core_settings("mesh/vnd", NULL, 0); bt_mesh_erase_core_settings("mesh/sig");
bt_mesh_erase_core_settings("mesh/vnd");
} }
} }
if (bt_mesh_atomic_test_and_clear_bit(bt_mesh.flags, BLE_MESH_VA_PENDING)) { if (IS_ENABLED(CONFIG_BLE_MESH_NODE) && bt_mesh_is_node() &&
bt_mesh_atomic_test_and_clear_bit(bt_mesh.flags, BLE_MESH_VA_PENDING)) {
store_pending_va(); store_pending_va();
} }
} }
@ -2143,7 +2227,7 @@ void bt_mesh_store_cfg(void)
void bt_mesh_clear_role(void) void bt_mesh_clear_role(void)
{ {
BT_DBG("Clear device role"); BT_DBG("Clear device role");
bt_mesh_save_core_settings("mesh/role", NULL, 0); bt_mesh_erase_core_settings("mesh/role");
} }
void bt_mesh_clear_net(void) void bt_mesh_clear_net(void)
@ -2263,35 +2347,8 @@ void bt_mesh_store_prov_info(u16_t primary_addr, u16_t alloc_addr)
void bt_mesh_clear_prov_info(void) void bt_mesh_clear_prov_info(void)
{ {
bt_mesh_save_core_settings("mesh/p_prov", NULL, 0); BT_DBG("Clearing prov info");
} bt_mesh_erase_core_settings("mesh/p_prov");
static void clear_p_net_key(u16_t net_idx)
{
char name[16] = {'\0'};
int err = 0;
sprintf(name, "mesh/pnk/%04x", net_idx);
bt_mesh_save_core_settings(name, NULL, 0);
err = bt_mesh_remove_core_settings_item("mesh/p_netkey", net_idx);
if (err) {
BT_ERR("Failed to remove 0x%03x from mesh/p_netkey", net_idx);
}
}
static void clear_p_app_key(u16_t app_idx)
{
char name[16] = {'\0'};
int err = 0;
sprintf(name, "mesh/pak/%04x", app_idx);
bt_mesh_save_core_settings(name, NULL, 0);
err = bt_mesh_remove_core_settings_item("mesh/p_appkey", app_idx);
if (err) {
BT_ERR("Failed to remove 0x%03x from mesh/p_appkey", app_idx);
}
} }
static void store_p_net_key(struct bt_mesh_subnet *sub) static void store_p_net_key(struct bt_mesh_subnet *sub)
@ -2344,7 +2401,7 @@ static void store_p_app_key(struct bt_mesh_app_key *app)
void bt_mesh_store_p_net_idx(void) void bt_mesh_store_p_net_idx(void)
{ {
BT_DBG("p_net_idx_next 0x%03x", bt_mesh.p_net_idx_next); BT_DBG("Store, p_net_idx_next 0x%03x", bt_mesh.p_net_idx_next);
bt_mesh_save_core_settings("mesh/p_netidx", bt_mesh_save_core_settings("mesh/p_netidx",
(const u8_t *)&bt_mesh.p_net_idx_next, sizeof(bt_mesh.p_net_idx_next)); (const u8_t *)&bt_mesh.p_net_idx_next, sizeof(bt_mesh.p_net_idx_next));
@ -2352,12 +2409,13 @@ void bt_mesh_store_p_net_idx(void)
void bt_mesh_clear_p_net_idx(void) void bt_mesh_clear_p_net_idx(void)
{ {
bt_mesh_save_core_settings("mesh/p_netidx", NULL, 0); BT_DBG("Clearing NetKey Index");
bt_mesh_erase_core_settings("mesh/p_netidx");
} }
void bt_mesh_store_p_app_idx(void) void bt_mesh_store_p_app_idx(void)
{ {
BT_DBG("p_app_idx_next 0x%03x", bt_mesh.p_app_idx_next); BT_DBG("Store, p_app_idx_next 0x%03x", bt_mesh.p_app_idx_next);
bt_mesh_save_core_settings("mesh/p_appidx", bt_mesh_save_core_settings("mesh/p_appidx",
(const u8_t *)&bt_mesh.p_app_idx_next, sizeof(bt_mesh.p_app_idx_next)); (const u8_t *)&bt_mesh.p_app_idx_next, sizeof(bt_mesh.p_app_idx_next));
@ -2365,7 +2423,8 @@ void bt_mesh_store_p_app_idx(void)
void bt_mesh_clear_p_app_idx(void) void bt_mesh_clear_p_app_idx(void)
{ {
bt_mesh_save_core_settings("mesh/p_appidx", NULL, 0); BT_DBG("Clearing AppKey Index");
bt_mesh_erase_core_settings("mesh/p_appidx");
} }
void bt_mesh_store_p_subnet(struct bt_mesh_subnet *sub) void bt_mesh_store_p_subnet(struct bt_mesh_subnet *sub)
@ -2394,28 +2453,36 @@ void bt_mesh_store_p_app_key(struct bt_mesh_app_key *key)
store_p_app_key(key); store_p_app_key(key);
} }
void bt_mesh_clear_p_subnet(struct bt_mesh_subnet *sub) void bt_mesh_clear_p_subnet(u16_t net_idx)
{ {
if (sub == NULL) { char name[16] = {'\0'};
BT_ERR("Invalid subnet"); int err = 0;
return;
BT_DBG("NetKeyIndex 0x%03x", net_idx);
sprintf(name, "mesh/pnk/%04x", net_idx);
bt_mesh_erase_core_settings(name);
err = bt_mesh_remove_core_settings_item("mesh/p_netkey", net_idx);
if (err) {
BT_ERR("Failed to remove 0x%04x from mesh/p_netkey", net_idx);
} }
BT_DBG("NetKeyIndex 0x%03x", sub->net_idx);
clear_p_net_key(sub->net_idx);
} }
void bt_mesh_clear_p_app_key(struct bt_mesh_app_key *key) void bt_mesh_clear_p_app_key(u16_t app_idx)
{ {
if (key == NULL) { char name[16] = {'\0'};
BT_ERR("Invalid AppKey"); int err = 0;
return;
BT_DBG("AppKeyIndex 0x%03x", app_idx);
sprintf(name, "mesh/pak/%04x", app_idx);
bt_mesh_erase_core_settings(name);
err = bt_mesh_remove_core_settings_item("mesh/p_appkey", app_idx);
if (err) {
BT_ERR("Failed to remove 0x%04x from mesh/p_appkey", app_idx);
} }
BT_DBG("AppKeyIndex 0x%03x", key->app_idx);
clear_p_app_key(key->app_idx);
} }
void bt_mesh_clear_rpl_single(u16_t src) void bt_mesh_clear_rpl_single(u16_t src)
@ -2429,7 +2496,7 @@ void bt_mesh_clear_rpl_single(u16_t src)
} }
sprintf(name, "mesh/rpl/%04x", src); sprintf(name, "mesh/rpl/%04x", src);
bt_mesh_save_core_settings(name, NULL, 0); bt_mesh_erase_core_settings(name);
err = bt_mesh_remove_core_settings_item("mesh/rpl", src); err = bt_mesh_remove_core_settings_item("mesh/rpl", src);
if (err) { if (err) {
@ -2479,15 +2546,15 @@ static void clear_node(u16_t addr)
/* Clear node information */ /* Clear node information */
sprintf(name, "mesh/pn/%04x/i", addr); sprintf(name, "mesh/pn/%04x/i", addr);
bt_mesh_save_core_settings(name, NULL, 0); bt_mesh_erase_core_settings(name);
/* Clear node name */ /* Clear node name */
sprintf(name, "mesh/pn/%04x/n", addr); sprintf(name, "mesh/pn/%04x/n", addr);
bt_mesh_save_core_settings(name, NULL, 0); bt_mesh_erase_core_settings(name);
/* Clear node composition data */ /* Clear node composition data */
sprintf(name, "mesh/pn/%04x/c", addr); sprintf(name, "mesh/pn/%04x/c", addr);
bt_mesh_save_core_settings(name, NULL, 0); bt_mesh_erase_core_settings(name);
err = bt_mesh_remove_core_settings_item("mesh/p_node", addr); err = bt_mesh_remove_core_settings_item("mesh/p_node", addr);
if (err) { if (err) {
@ -2547,33 +2614,34 @@ void bt_mesh_store_node_comp_data(struct bt_mesh_node *node)
int settings_core_init(void) int settings_core_init(void)
{ {
BT_DBG("%s", __func__);
k_delayed_work_init(&pending_store, store_pending); k_delayed_work_init(&pending_store, store_pending);
return 0;
}
int bt_mesh_settings_init(void)
{
BT_DBG("%s", __func__);
bt_mesh_settings_foreach();
return 0; return 0;
} }
int settings_core_deinit(void) int settings_core_deinit(void)
{ {
k_delayed_work_free(&pending_store); k_delayed_work_free(&pending_store);
return 0; return 0;
} }
int bt_mesh_settings_deinit(void) int settings_core_erase(void)
{ {
bt_mesh_settings_deforeach(); /* Erase here must not use the pending_store timer. */
bt_mesh_clear_role();
return 0;
}
int bt_mesh_settings_init(void)
{
bt_mesh_settings_mutex_new();
bt_mesh_settings_init_foreach();
return 0;
}
int bt_mesh_settings_deinit(bool erase)
{
bt_mesh_settings_deinit_foreach(erase);
bt_mesh_settings_mutex_free();
return 0; return 0;
} }

View File

@ -14,10 +14,10 @@
extern "C" { extern "C" {
#endif #endif
int settings_core_init(void); #define BLE_MESH_SETTINGS_ROLE_NONE 0
int settings_core_load(void); #define BLE_MESH_SETTINGS_ROLE_NODE (BIT(BLE_MESH_NODE))
int settings_core_commit(void); #define BLE_MESH_SETTINGS_ROLE_PROV (BIT(BLE_MESH_PROVISIONER))
int settings_core_deinit(void); #define BLE_MESH_SETTINGS_ROLE_BIT_MASK (BIT(BLE_MESH_NODE) | BIT(BLE_MESH_PROVISIONER))
void bt_mesh_store_role(void); void bt_mesh_store_role(void);
void bt_mesh_store_net(void); void bt_mesh_store_net(void);
@ -50,8 +50,8 @@ void bt_mesh_store_p_app_idx(void);
void bt_mesh_clear_p_app_idx(void); void bt_mesh_clear_p_app_idx(void);
void bt_mesh_store_p_subnet(struct bt_mesh_subnet *sub); void bt_mesh_store_p_subnet(struct bt_mesh_subnet *sub);
void bt_mesh_store_p_app_key(struct bt_mesh_app_key *key); void bt_mesh_store_p_app_key(struct bt_mesh_app_key *key);
void bt_mesh_clear_p_subnet(struct bt_mesh_subnet *sub); void bt_mesh_clear_p_subnet(u16_t net_idx);
void bt_mesh_clear_p_app_key(struct bt_mesh_app_key *key); void bt_mesh_clear_p_app_key(u16_t app_idx);
void bt_mesh_clear_rpl_single(u16_t src); void bt_mesh_clear_rpl_single(u16_t src);
void bt_mesh_store_node_info(struct bt_mesh_node *node); void bt_mesh_store_node_info(struct bt_mesh_node *node);
void bt_mesh_clear_node_info(u16_t unicast_addr); void bt_mesh_clear_node_info(u16_t unicast_addr);
@ -59,8 +59,17 @@ void bt_mesh_store_node_name(struct bt_mesh_node *node);
void bt_mesh_store_node_comp_data(struct bt_mesh_node *node); void bt_mesh_store_node_comp_data(struct bt_mesh_node *node);
#endif #endif
void bt_mesh_settings_lock(void);
void bt_mesh_settings_unlock(void);
int settings_core_init(void);
int settings_core_load(void);
int settings_core_commit(void);
int settings_core_deinit(void);
int settings_core_erase(void);
int bt_mesh_settings_init(void); int bt_mesh_settings_init(void);
int bt_mesh_settings_deinit(void); int bt_mesh_settings_deinit(bool erase);
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -15,9 +15,6 @@
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
#include "nvs.h"
#include "nvs_flash.h"
#include "mesh_common.h" #include "mesh_common.h"
#include "settings_nvs.h" #include "settings_nvs.h"
#include "settings.h" #include "settings.h"
@ -26,12 +23,11 @@
enum settings_type { enum settings_type {
SETTINGS_CORE, SETTINGS_CORE,
SETTINGS_SERVER,
}; };
struct settings_context { struct settings_context {
char *nvs_name; char *nvs_name;
nvs_handle handle; bt_mesh_nvs_handle_t handle;
int (*settings_init)(void); int (*settings_init)(void);
int (*settings_load)(void); int (*settings_load)(void);
@ -47,18 +43,13 @@ static struct settings_context settings_ctx[] = {
.settings_load = settings_core_load, .settings_load = settings_core_load,
.settings_commit = settings_core_commit, .settings_commit = settings_core_commit,
.settings_deinit = settings_core_deinit, .settings_deinit = settings_core_deinit,
}, .settings_erase = settings_core_erase,
[SETTINGS_SERVER] = {
.nvs_name = "mesh_server",
.settings_init = NULL,
.settings_load = NULL,
.settings_commit = NULL,
}, },
}; };
/* API used to initialize, load and commit BLE Mesh related settings */ /* API used to initialize, load and commit BLE Mesh related settings */
void bt_mesh_settings_foreach(void) void bt_mesh_settings_init_foreach(void)
{ {
int err = 0; int err = 0;
int i; int i;
@ -101,7 +92,7 @@ void bt_mesh_settings_foreach(void)
} }
} }
void bt_mesh_settings_deforeach(void) void bt_mesh_settings_deinit_foreach(bool erase)
{ {
int i; int i;
@ -113,6 +104,11 @@ void bt_mesh_settings_deforeach(void)
continue; continue;
} }
if (erase && ctx->settings_erase && ctx->settings_erase()) {
BT_ERR("Erase settings failed, name %s", ctx->nvs_name);
continue;
}
nvs_close(ctx->handle); nvs_close(ctx->handle);
} }
@ -123,14 +119,14 @@ void bt_mesh_settings_deforeach(void)
/* API used to get BLE Mesh related nvs handle */ /* API used to get BLE Mesh related nvs handle */
static inline nvs_handle settings_get_nvs_handle(enum settings_type type) static inline bt_mesh_nvs_handle_t settings_get_nvs_handle(enum settings_type type)
{ {
return settings_ctx[type].handle; return settings_ctx[type].handle;
} }
/* API used to store/erase BLE Mesh related settings */ /* API used to store/erase BLE Mesh related settings */
static int settings_save(nvs_handle handle, const char *key, const u8_t *val, size_t len) static int settings_save(bt_mesh_nvs_handle_t handle, const char *key, const u8_t *val, size_t len)
{ {
int err = 0; int err = 0;
@ -165,15 +161,35 @@ static int settings_save(nvs_handle handle, const char *key, const u8_t *val, si
return 0; return 0;
} }
int bt_mesh_save_settings(bt_mesh_nvs_handle_t handle, const char *key,
const u8_t *val, size_t len)
{
int err = 0;
bt_mesh_settings_lock();
err = settings_save(handle, key, val, len);
bt_mesh_settings_unlock();
return err;
}
int bt_mesh_save_core_settings(const char *key, const u8_t *val, size_t len) int bt_mesh_save_core_settings(const char *key, const u8_t *val, size_t len)
{ {
nvs_handle handle = settings_get_nvs_handle(SETTINGS_CORE); bt_mesh_nvs_handle_t handle = settings_get_nvs_handle(SETTINGS_CORE);
return settings_save(handle, key, val, len); return bt_mesh_save_settings(handle, key, val, len);
}
int bt_mesh_erase_settings(bt_mesh_nvs_handle_t handle, const char *key)
{
return bt_mesh_save_settings(handle, key, NULL, 0);
}
int bt_mesh_erase_core_settings(const char *key)
{
return bt_mesh_save_core_settings(key, NULL, 0);
} }
/* API used to load BLE Mesh related settings */ /* API used to load BLE Mesh related settings */
static int settings_load(nvs_handle handle, const char *key, static int settings_load(bt_mesh_nvs_handle_t handle, const char *key,
u8_t *buf, size_t buf_len, bool *exist) u8_t *buf, size_t buf_len, bool *exist)
{ {
int err = 0; int err = 0;
@ -199,15 +215,25 @@ static int settings_load(nvs_handle handle, const char *key,
return 0; return 0;
} }
int bt_mesh_load_settings(bt_mesh_nvs_handle_t handle, const char *key,
u8_t *buf, size_t buf_len, bool *exist)
{
int err = 0;
bt_mesh_settings_lock();
err = settings_load(handle, key, buf, buf_len, exist);
bt_mesh_settings_unlock();
return err;
}
int bt_mesh_load_core_settings(const char *key, u8_t *buf, size_t buf_len, bool *exist) int bt_mesh_load_core_settings(const char *key, u8_t *buf, size_t buf_len, bool *exist)
{ {
nvs_handle handle = settings_get_nvs_handle(SETTINGS_CORE); bt_mesh_nvs_handle_t handle = settings_get_nvs_handle(SETTINGS_CORE);
return settings_load(handle, key, buf, buf_len, exist); return bt_mesh_load_settings(handle, key, buf, buf_len, exist);
} }
/* API used to get length of BLE Mesh related settings */ /* API used to get length of BLE Mesh related settings */
static size_t settings_get_length(nvs_handle handle, const char *key) static size_t settings_get_length(bt_mesh_nvs_handle_t handle, const char *key)
{ {
size_t len = 0U; size_t len = 0U;
int err = 0; int err = 0;
@ -233,7 +259,7 @@ static size_t settings_get_length(nvs_handle handle, const char *key)
* Mesh settings. * Mesh settings.
*/ */
static struct net_buf_simple *settings_get_item(nvs_handle handle, const char *key) static struct net_buf_simple *settings_get_item(bt_mesh_nvs_handle_t handle, const char *key)
{ {
struct net_buf_simple *buf = NULL; struct net_buf_simple *buf = NULL;
size_t length = 0U; size_t length = 0U;
@ -270,10 +296,19 @@ static struct net_buf_simple *settings_get_item(nvs_handle handle, const char *k
return buf; return buf;
} }
struct net_buf_simple *bt_mesh_get_settings_item(bt_mesh_nvs_handle_t handle, const char *key)
{
struct net_buf_simple *buf = NULL;
bt_mesh_settings_lock();
buf = settings_get_item(handle, key);
bt_mesh_settings_unlock();
return buf;
}
struct net_buf_simple *bt_mesh_get_core_settings_item(const char *key) struct net_buf_simple *bt_mesh_get_core_settings_item(const char *key)
{ {
nvs_handle handle = settings_get_nvs_handle(SETTINGS_CORE); bt_mesh_nvs_handle_t handle = settings_get_nvs_handle(SETTINGS_CORE);
return settings_get_item(handle, key); return bt_mesh_get_settings_item(handle, key);
} }
/* API used to check if the settings item exists */ /* API used to check if the settings item exists */
@ -305,7 +340,7 @@ static bool is_settings_item_exist(struct net_buf_simple *buf, const u16_t val)
/* API used to add the settings item */ /* API used to add the settings item */
static int settings_add_item(nvs_handle handle, const char *key, const u16_t val) static int settings_add_item(bt_mesh_nvs_handle_t handle, const char *key, const u16_t val)
{ {
struct net_buf_simple *store = NULL; struct net_buf_simple *store = NULL;
struct net_buf_simple *buf = NULL; struct net_buf_simple *buf = NULL;
@ -342,15 +377,24 @@ static int settings_add_item(nvs_handle handle, const char *key, const u16_t val
return err; return err;
} }
int bt_mesh_add_settings_item(bt_mesh_nvs_handle_t handle, const char *key, const u16_t val)
{
int err = 0;
bt_mesh_settings_lock();
err = settings_add_item(handle, key, val);
bt_mesh_settings_unlock();
return err;
}
int bt_mesh_add_core_settings_item(const char *key, const u16_t val) int bt_mesh_add_core_settings_item(const char *key, const u16_t val)
{ {
nvs_handle handle = settings_get_nvs_handle(SETTINGS_CORE); bt_mesh_nvs_handle_t handle = settings_get_nvs_handle(SETTINGS_CORE);
return settings_add_item(handle, key, val); return bt_mesh_add_settings_item(handle, key, val);
} }
/* API used to remove the settings item */ /* API used to remove the settings item */
static int settings_remove_item(nvs_handle handle, const char *key, const u16_t val) static int settings_remove_item(bt_mesh_nvs_handle_t handle, const char *key, const u16_t val)
{ {
struct net_buf_simple *store = NULL; struct net_buf_simple *store = NULL;
struct net_buf_simple *buf = NULL; struct net_buf_simple *buf = NULL;
@ -397,10 +441,19 @@ static int settings_remove_item(nvs_handle handle, const char *key, const u16_t
return err; return err;
} }
int bt_mesh_remove_settings_item(bt_mesh_nvs_handle_t handle, const char *key, const u16_t val)
{
int err = 0;
bt_mesh_settings_lock();
err = settings_remove_item(handle, key, val);
bt_mesh_settings_unlock();
return err;
}
int bt_mesh_remove_core_settings_item(const char *key, const u16_t val) int bt_mesh_remove_core_settings_item(const char *key, const u16_t val)
{ {
nvs_handle handle = settings_get_nvs_handle(SETTINGS_CORE); bt_mesh_nvs_handle_t handle = settings_get_nvs_handle(SETTINGS_CORE);
return settings_remove_item(handle, key, val); return bt_mesh_remove_settings_item(handle, key, val);
} }
#endif /* CONFIG_BLE_MESH_SETTINGS */ #endif /* CONFIG_BLE_MESH_SETTINGS */

View File

@ -15,29 +15,42 @@
#ifndef _BLE_MESH_SETTINGS_NVS_H_ #ifndef _BLE_MESH_SETTINGS_NVS_H_
#define _BLE_MESH_SETTINGS_NVS_H_ #define _BLE_MESH_SETTINGS_NVS_H_
#include "nvs_flash.h"
#include "mesh_buf.h" #include "mesh_buf.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
typedef nvs_handle_t bt_mesh_nvs_handle_t;
#define SETTINGS_ITEM_SIZE sizeof(u16_t) #define SETTINGS_ITEM_SIZE sizeof(u16_t)
#define BLE_MESH_GET_ELEM_IDX(x) ((u8_t)((x) >> 8)) #define BLE_MESH_GET_ELEM_IDX(x) ((u8_t)((x) >> 8))
#define BLE_MESH_GET_MODEL_IDX(x) ((u8_t)(x)) #define BLE_MESH_GET_MODEL_IDX(x) ((u8_t)(x))
#define BLE_MESH_GET_MODEL_KEY(a, b) ((u16_t)(((u16_t)((a) << 8)) | b)) #define BLE_MESH_GET_MODEL_KEY(a, b) ((u16_t)(((u16_t)((a) << 8)) | (b)))
void bt_mesh_settings_foreach(void); void bt_mesh_settings_init_foreach(void);
void bt_mesh_settings_deforeach(void); void bt_mesh_settings_deinit_foreach(bool erase);
int bt_mesh_save_settings(bt_mesh_nvs_handle_t handle, const char *key,
const u8_t *val, size_t len);
int bt_mesh_save_core_settings(const char *key, const u8_t *val, size_t len); int bt_mesh_save_core_settings(const char *key, const u8_t *val, size_t len);
int bt_mesh_erase_settings(bt_mesh_nvs_handle_t handle, const char *key);
int bt_mesh_erase_core_settings(const char *key);
int bt_mesh_load_settings(bt_mesh_nvs_handle_t handle, const char *key,
u8_t *buf, size_t buf_len, bool *exist);
int bt_mesh_load_core_settings(const char *key, u8_t *buf, size_t buf_len, bool *exist); int bt_mesh_load_core_settings(const char *key, u8_t *buf, size_t buf_len, bool *exist);
struct net_buf_simple *bt_mesh_get_settings_item(bt_mesh_nvs_handle_t handle, const char *key);
struct net_buf_simple *bt_mesh_get_core_settings_item(const char *key); struct net_buf_simple *bt_mesh_get_core_settings_item(const char *key);
int bt_mesh_add_settings_item(bt_mesh_nvs_handle_t handle, const char *key, const u16_t val);
int bt_mesh_add_core_settings_item(const char *key, const u16_t val); int bt_mesh_add_core_settings_item(const char *key, const u16_t val);
int bt_mesh_remove_settings_item(bt_mesh_nvs_handle_t handle, const char *key, const u16_t val);
int bt_mesh_remove_core_settings_item(const char *key, const u16_t val); int bt_mesh_remove_core_settings_item(const char *key, const u16_t val);
#ifdef __cplusplus #ifdef __cplusplus

View File

@ -1768,7 +1768,7 @@ int bt_mesh_trans_recv(struct net_buf_simple *buf, struct bt_mesh_net_rx *rx)
return err; return err;
} }
void bt_mesh_rx_reset(void) void bt_mesh_rx_reset(bool erase)
{ {
int i; int i;
@ -1778,10 +1778,10 @@ void bt_mesh_rx_reset(void)
seg_rx_reset(&seg_rx[i], true); seg_rx_reset(&seg_rx[i], true);
} }
if (IS_ENABLED(CONFIG_BLE_MESH_SETTINGS)) { (void)memset(bt_mesh.rpl, 0, sizeof(bt_mesh.rpl));
if (IS_ENABLED(CONFIG_BLE_MESH_SETTINGS) && erase) {
bt_mesh_clear_rpl(); bt_mesh_clear_rpl();
} else {
(void)memset(bt_mesh.rpl, 0, sizeof(bt_mesh.rpl));
} }
} }
@ -1863,16 +1863,7 @@ void bt_mesh_trans_deinit(bool erase)
{ {
int i; int i;
for (i = 0; i < ARRAY_SIZE(seg_rx); i++) { bt_mesh_rx_reset(erase);
seg_rx_reset(&seg_rx[i], true);
}
if (erase && IS_ENABLED(CONFIG_BLE_MESH_SETTINGS)) {
bt_mesh_clear_rpl();
} else {
bt_mesh_rpl_clear();
}
bt_mesh_tx_reset(); bt_mesh_tx_reset();
for (i = 0; i < ARRAY_SIZE(seg_tx); i++) { for (i = 0; i < ARRAY_SIZE(seg_tx); i++) {
@ -1887,12 +1878,6 @@ void bt_mesh_trans_deinit(bool erase)
bt_mesh_rx_seg_mutex_free(); bt_mesh_rx_seg_mutex_free();
} }
void bt_mesh_rpl_clear(void)
{
BT_DBG("%s", __func__);
(void)memset(bt_mesh.rpl, 0, sizeof(bt_mesh.rpl));
}
void bt_mesh_heartbeat_send(void) void bt_mesh_heartbeat_send(void)
{ {
struct bt_mesh_cfg_srv *cfg = bt_mesh_cfg_get(); struct bt_mesh_cfg_srv *cfg = bt_mesh_cfg_get();

View File

@ -97,7 +97,7 @@ struct bt_mesh_app_key *bt_mesh_app_key_find(u16_t app_idx);
bool bt_mesh_tx_in_progress(void); bool bt_mesh_tx_in_progress(void);
void bt_mesh_rx_reset(void); void bt_mesh_rx_reset(bool erase);
void bt_mesh_tx_reset(void); void bt_mesh_tx_reset(void);
void bt_mesh_rx_reset_single(u16_t src); void bt_mesh_rx_reset_single(u16_t src);
void bt_mesh_tx_reset_single(u16_t dst); void bt_mesh_tx_reset_single(u16_t dst);
@ -114,8 +114,6 @@ int bt_mesh_trans_recv(struct net_buf_simple *buf, struct bt_mesh_net_rx *rx);
void bt_mesh_trans_init(void); void bt_mesh_trans_init(void);
void bt_mesh_trans_deinit(bool erase); void bt_mesh_trans_deinit(bool erase);
void bt_mesh_rpl_clear(void);
void bt_mesh_heartbeat_send(void); void bt_mesh_heartbeat_send(void);
int bt_mesh_app_key_get(const struct bt_mesh_subnet *subnet, u16_t app_idx, int bt_mesh_app_key_get(const struct bt_mesh_subnet *subnet, u16_t app_idx,

View File

@ -10,5 +10,6 @@ CONFIG_BT_BTU_TASK_STACK_SIZE=4512
CONFIG_BLE_MESH=y CONFIG_BLE_MESH=y
CONFIG_BLE_MESH_PROVISIONER=y CONFIG_BLE_MESH_PROVISIONER=y
CONFIG_BLE_MESH_PB_GATT=y CONFIG_BLE_MESH_PB_GATT=y
CONFIG_BLE_MESH_SETTINGS=y
CONFIG_BLE_MESH_CFG_CLI=y CONFIG_BLE_MESH_CFG_CLI=y
CONFIG_BLE_MESH_GENERIC_ONOFF_CLI=y CONFIG_BLE_MESH_GENERIC_ONOFF_CLI=y

View File

@ -10,5 +10,6 @@ CONFIG_BT_NIMBLE_ENABLED=y
CONFIG_BLE_MESH=y CONFIG_BLE_MESH=y
CONFIG_BLE_MESH_PROVISIONER=y CONFIG_BLE_MESH_PROVISIONER=y
CONFIG_BLE_MESH_PB_GATT=y CONFIG_BLE_MESH_PB_GATT=y
CONFIG_BLE_MESH_SETTINGS=y
CONFIG_BLE_MESH_CFG_CLI=y CONFIG_BLE_MESH_CFG_CLI=y
CONFIG_BLE_MESH_GENERIC_ONOFF_CLI=y CONFIG_BLE_MESH_GENERIC_ONOFF_CLI=y

View File

@ -18,4 +18,4 @@ CONFIG_BLE_MESH_ADV_BUF_COUNT=100
CONFIG_BLE_MESH_TX_SEG_MSG_COUNT=10 CONFIG_BLE_MESH_TX_SEG_MSG_COUNT=10
CONFIG_BLE_MESH_RX_SEG_MSG_COUNT=10 CONFIG_BLE_MESH_RX_SEG_MSG_COUNT=10
CONFIG_BLE_MESH_CFG_CLI=y CONFIG_BLE_MESH_CFG_CLI=y
CONFIG_BLE_MESH_GENERIC_ONOFF_CLI=y CONFIG_BLE_MESH_GENERIC_ONOFF_CLI=y

View File

@ -11,4 +11,5 @@ CONFIG_BT_BTU_TASK_STACK_SIZE=4512
CONFIG_BLE_MESH=y CONFIG_BLE_MESH=y
CONFIG_BLE_MESH_FAST_PROV=y CONFIG_BLE_MESH_FAST_PROV=y
CONFIG_BLE_MESH_PB_GATT=y CONFIG_BLE_MESH_PB_GATT=y
CONFIG_BLE_MESH_CFG_CLI=y CONFIG_BLE_MESH_SETTINGS=y
CONFIG_BLE_MESH_CFG_CLI=y

View File

@ -10,4 +10,5 @@ CONFIG_BT_NIMBLE_ENABLED=y
CONFIG_BLE_MESH=y CONFIG_BLE_MESH=y
CONFIG_BLE_MESH_FAST_PROV=y CONFIG_BLE_MESH_FAST_PROV=y
CONFIG_BLE_MESH_PB_GATT=y CONFIG_BLE_MESH_PB_GATT=y
CONFIG_BLE_MESH_CFG_CLI=y CONFIG_BLE_MESH_SETTINGS=y
CONFIG_BLE_MESH_CFG_CLI=y

View File

@ -22,4 +22,4 @@ CONFIG_BLE_MESH_ADV_BUF_COUNT=200
CONFIG_BLE_MESH_TX_SEG_MSG_COUNT=10 CONFIG_BLE_MESH_TX_SEG_MSG_COUNT=10
CONFIG_BLE_MESH_RX_SEG_MSG_COUNT=10 CONFIG_BLE_MESH_RX_SEG_MSG_COUNT=10
CONFIG_BLE_MESH_TRACE_LEVEL_ERROR=y CONFIG_BLE_MESH_TRACE_LEVEL_ERROR=y
CONFIG_BLE_MESH_CFG_CLI=y CONFIG_BLE_MESH_CFG_CLI=y

View File

@ -13,4 +13,5 @@ CONFIG_BT_BTU_TASK_STACK_SIZE=4512
CONFIG_BLE_MESH=y CONFIG_BLE_MESH=y
CONFIG_BLE_MESH_NODE=y CONFIG_BLE_MESH_NODE=y
CONFIG_BLE_MESH_PB_GATT=y CONFIG_BLE_MESH_PB_GATT=y
CONFIG_BLE_MESH_SETTINGS=y
CONFIG_BLE_MESH_GENERIC_ONOFF_CLI=y CONFIG_BLE_MESH_GENERIC_ONOFF_CLI=y

View File

@ -10,4 +10,5 @@ CONFIG_BT_NIMBLE_ENABLED=y
CONFIG_BLE_MESH=y CONFIG_BLE_MESH=y
CONFIG_BLE_MESH_NODE=y CONFIG_BLE_MESH_NODE=y
CONFIG_BLE_MESH_PB_GATT=y CONFIG_BLE_MESH_PB_GATT=y
CONFIG_BLE_MESH_SETTINGS=y
CONFIG_BLE_MESH_GENERIC_ONOFF_CLI=y CONFIG_BLE_MESH_GENERIC_ONOFF_CLI=y

View File

@ -12,3 +12,4 @@ CONFIG_BLE_MESH=y
CONFIG_BLE_MESH_NODE=y CONFIG_BLE_MESH_NODE=y
CONFIG_BLE_MESH_PB_GATT=y CONFIG_BLE_MESH_PB_GATT=y
CONFIG_BLE_MESH_FRIEND=y CONFIG_BLE_MESH_FRIEND=y
CONFIG_BLE_MESH_SETTINGS=y

View File

@ -11,3 +11,4 @@ CONFIG_BLE_MESH=y
CONFIG_BLE_MESH_NODE=y CONFIG_BLE_MESH_NODE=y
CONFIG_BLE_MESH_PB_GATT=y CONFIG_BLE_MESH_PB_GATT=y
CONFIG_BLE_MESH_LOW_POWER=y CONFIG_BLE_MESH_LOW_POWER=y
CONFIG_BLE_MESH_SETTINGS=y

View File

@ -12,5 +12,6 @@ CONFIG_BT_BTU_TASK_STACK_SIZE=4512
CONFIG_BLE_MESH=y CONFIG_BLE_MESH=y
CONFIG_BLE_MESH_PROVISIONER=y CONFIG_BLE_MESH_PROVISIONER=y
CONFIG_BLE_MESH_PB_GATT=y CONFIG_BLE_MESH_PB_GATT=y
CONFIG_BLE_MESH_SETTINGS=y
CONFIG_BLE_MESH_CFG_CLI=y CONFIG_BLE_MESH_CFG_CLI=y
CONFIG_BLE_MESH_GENERIC_ONOFF_CLI=y CONFIG_BLE_MESH_GENERIC_ONOFF_CLI=y

View File

@ -10,5 +10,6 @@ CONFIG_BT_NIMBLE_ENABLED=y
CONFIG_BLE_MESH=y CONFIG_BLE_MESH=y
CONFIG_BLE_MESH_PROVISIONER=y CONFIG_BLE_MESH_PROVISIONER=y
CONFIG_BLE_MESH_PB_GATT=y CONFIG_BLE_MESH_PB_GATT=y
CONFIG_BLE_MESH_SETTINGS=y
CONFIG_BLE_MESH_CFG_CLI=y CONFIG_BLE_MESH_CFG_CLI=y
CONFIG_BLE_MESH_GENERIC_ONOFF_CLI=y CONFIG_BLE_MESH_GENERIC_ONOFF_CLI=y

View File

@ -10,5 +10,6 @@ CONFIG_BT_BTU_TASK_STACK_SIZE=4512
CONFIG_BLE_MESH=y CONFIG_BLE_MESH=y
CONFIG_BLE_MESH_PROVISIONER=y CONFIG_BLE_MESH_PROVISIONER=y
CONFIG_BLE_MESH_PB_GATT=y CONFIG_BLE_MESH_PB_GATT=y
CONFIG_BLE_MESH_SETTINGS=y
CONFIG_BLE_MESH_CFG_CLI=y CONFIG_BLE_MESH_CFG_CLI=y
CONFIG_BLE_MESH_SENSOR_CLI=y CONFIG_BLE_MESH_SENSOR_CLI=y

View File

@ -10,5 +10,6 @@ CONFIG_BT_NIMBLE_ENABLED=y
CONFIG_BLE_MESH=y CONFIG_BLE_MESH=y
CONFIG_BLE_MESH_PROVISIONER=y CONFIG_BLE_MESH_PROVISIONER=y
CONFIG_BLE_MESH_PB_GATT=y CONFIG_BLE_MESH_PB_GATT=y
CONFIG_BLE_MESH_SETTINGS=y
CONFIG_BLE_MESH_CFG_CLI=y CONFIG_BLE_MESH_CFG_CLI=y
CONFIG_BLE_MESH_SENSOR_CLI=y CONFIG_BLE_MESH_SENSOR_CLI=y

View File

@ -11,3 +11,4 @@ CONFIG_BT_BTU_TASK_STACK_SIZE=4512
CONFIG_BLE_MESH=y CONFIG_BLE_MESH=y
CONFIG_BLE_MESH_NODE=y CONFIG_BLE_MESH_NODE=y
CONFIG_BLE_MESH_PB_GATT=y CONFIG_BLE_MESH_PB_GATT=y
CONFIG_BLE_MESH_SETTINGS=y

View File

@ -10,3 +10,4 @@ CONFIG_BT_NIMBLE_ENABLED=y
CONFIG_BLE_MESH=y CONFIG_BLE_MESH=y
CONFIG_BLE_MESH_NODE=y CONFIG_BLE_MESH_NODE=y
CONFIG_BLE_MESH_PB_GATT=y CONFIG_BLE_MESH_PB_GATT=y
CONFIG_BLE_MESH_SETTINGS=y

View File

@ -10,4 +10,5 @@ CONFIG_BT_BTU_TASK_STACK_SIZE=4512
CONFIG_BLE_MESH=y CONFIG_BLE_MESH=y
CONFIG_BLE_MESH_PROVISIONER=y CONFIG_BLE_MESH_PROVISIONER=y
CONFIG_BLE_MESH_PB_GATT=y CONFIG_BLE_MESH_PB_GATT=y
CONFIG_BLE_MESH_CFG_CLI=y CONFIG_BLE_MESH_SETTINGS=y
CONFIG_BLE_MESH_CFG_CLI=y

View File

@ -10,4 +10,5 @@ CONFIG_BT_NIMBLE_ENABLED=y
CONFIG_BLE_MESH=y CONFIG_BLE_MESH=y
CONFIG_BLE_MESH_PROVISIONER=y CONFIG_BLE_MESH_PROVISIONER=y
CONFIG_BLE_MESH_PB_GATT=y CONFIG_BLE_MESH_PB_GATT=y
CONFIG_BLE_MESH_CFG_CLI=y CONFIG_BLE_MESH_SETTINGS=y
CONFIG_BLE_MESH_CFG_CLI=y

View File

@ -10,4 +10,5 @@ CONFIG_BT_BTU_TASK_STACK_SIZE=4512
CONFIG_BLE_MESH=y CONFIG_BLE_MESH=y
CONFIG_BLE_MESH_NODE=y CONFIG_BLE_MESH_NODE=y
CONFIG_BLE_MESH_PB_GATT=y CONFIG_BLE_MESH_PB_GATT=y
CONFIG_BLE_MESH_SETTINGS=y

View File

@ -9,4 +9,5 @@ CONFIG_BT_NIMBLE_ENABLED=y
CONFIG_BLE_MESH=y CONFIG_BLE_MESH=y
CONFIG_BLE_MESH_NODE=y CONFIG_BLE_MESH_NODE=y
CONFIG_BLE_MESH_PB_GATT=y CONFIG_BLE_MESH_PB_GATT=y
CONFIG_BLE_MESH_SETTINGS=y