mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-03-01 10:13:29 +00:00
mesh: move provisioning data load/store and node reset to mesh
This commit is contained in:
parent
d4c397cd4a
commit
aa1e3c7273
104
src/mesh/mesh.c
104
src/mesh/mesh.c
@ -797,6 +797,110 @@ static void mesh_persist_iv_index_and_sequence_number(void){
|
||||
}
|
||||
|
||||
|
||||
static uint32_t mesh_tag_for_prov_data(void){
|
||||
return ((uint32_t) 'P' << 24) | ((uint32_t) 'R' << 16) | ((uint32_t) 'O' << 8) | (uint32_t)'V';
|
||||
}
|
||||
|
||||
void mesh_node_reset(void){
|
||||
// PROV
|
||||
btstack_tlv_singleton_impl->delete_tag(btstack_tlv_singleton_context, mesh_tag_for_prov_data());
|
||||
// everything else
|
||||
mesh_delete_network_keys();
|
||||
mesh_delete_app_keys();
|
||||
mesh_delete_appkey_lists();
|
||||
mesh_delete_virtual_addresses();
|
||||
mesh_delete_subscriptions();
|
||||
mesh_delete_publications();
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
uint16_t unicast_address;
|
||||
uint8_t flags;
|
||||
uint8_t device_key[16];
|
||||
|
||||
} mesh_persistent_provisioning_data_t;
|
||||
|
||||
void mesh_node_store_provisioning_data(mesh_provisioning_data_t * provisioning_data){
|
||||
|
||||
// fill persistent prov data
|
||||
mesh_persistent_provisioning_data_t persistent_provisioning_data;
|
||||
|
||||
persistent_provisioning_data.unicast_address = provisioning_data->unicast_address;
|
||||
memcpy(persistent_provisioning_data.device_key, provisioning_data->device_key, 16);
|
||||
|
||||
// store in tlv
|
||||
btstack_tlv_get_instance(&btstack_tlv_singleton_impl, &btstack_tlv_singleton_context);
|
||||
btstack_tlv_singleton_impl->store_tag(btstack_tlv_singleton_context, mesh_tag_for_prov_data(), (uint8_t *) &persistent_provisioning_data, sizeof(mesh_persistent_provisioning_data_t));
|
||||
|
||||
// store IV Index and sequence number
|
||||
mesh_store_iv_index_after_provisioning(provisioning_data->iv_index);
|
||||
|
||||
// store primary network key
|
||||
mesh_store_network_key(provisioning_data->network_key);
|
||||
}
|
||||
|
||||
int mesh_node_startup_from_tlv(void){
|
||||
|
||||
mesh_persistent_provisioning_data_t persistent_provisioning_data;
|
||||
btstack_tlv_get_instance(&btstack_tlv_singleton_impl, &btstack_tlv_singleton_context);
|
||||
|
||||
// load provisioning data
|
||||
uint32_t prov_len = btstack_tlv_singleton_impl->get_tag(btstack_tlv_singleton_context, mesh_tag_for_prov_data(), (uint8_t *) &persistent_provisioning_data, sizeof(mesh_persistent_provisioning_data_t));
|
||||
printf("Provisioning data available: %u\n", prov_len ? 1 : 0);
|
||||
if (prov_len){
|
||||
|
||||
// copy into mesh_provisioning_data
|
||||
mesh_provisioning_data_t provisioning_data;
|
||||
memcpy(provisioning_data.device_key, persistent_provisioning_data.device_key, 16);
|
||||
provisioning_data.unicast_address = persistent_provisioning_data.unicast_address;
|
||||
provisioning_data.flags = persistent_provisioning_data.flags;
|
||||
provisioning_data.network_key = NULL;
|
||||
|
||||
// load iv index
|
||||
uint32_t iv_index;
|
||||
uint32_t sequence_number;
|
||||
int ok = mesh_load_iv_index_and_sequence_number(&iv_index, &sequence_number);
|
||||
if (ok){
|
||||
// bump sequence number to account for interval updates
|
||||
sequence_number += MESH_SEQUENCE_NUMBER_STORAGE_INTERVAL;
|
||||
mesh_sequence_number_set(sequence_number);
|
||||
mesh_store_iv_index_and_sequence_number();
|
||||
log_info("IV Index: %08x, Sequence Number %08x", (int) iv_index, (int) sequence_number);
|
||||
provisioning_data.iv_index = iv_index;
|
||||
}
|
||||
|
||||
// load network keys
|
||||
mesh_load_network_keys();
|
||||
// load app keys
|
||||
mesh_load_app_keys();
|
||||
// load model to appkey bindings
|
||||
mesh_load_appkey_lists();
|
||||
// load virtual addresses
|
||||
mesh_load_virtual_addresses();
|
||||
// load model subscriptions
|
||||
mesh_load_subscriptions();
|
||||
// load model publications
|
||||
mesh_load_publications();
|
||||
// load foundation state
|
||||
mesh_foundation_state_load();
|
||||
|
||||
mesh_access_setup_from_provisioning_data(&provisioning_data);
|
||||
|
||||
#if defined(ENABLE_MESH_ADV_BEARER) || defined(ENABLE_MESH_PB_ADV)
|
||||
// start sending Secure Network Beacon
|
||||
mesh_subnet_t * subnet = mesh_subnet_get_by_netkey_index(0);
|
||||
if (subnet){
|
||||
beacon_secure_network_start(subnet);
|
||||
}
|
||||
#endif
|
||||
return 1;
|
||||
} else {
|
||||
mesh_access_setup_without_provisiong_data();
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void mesh_node_setup_default_models(void){
|
||||
// configure Config Server
|
||||
mesh_configuration_server_model.model_identifier = mesh_model_get_model_identifier_bluetooth_sig(MESH_SIG_MODEL_ID_CONFIGURATION_SERVER);
|
||||
|
@ -104,6 +104,12 @@ uint8_t mesh_model_bind_appkey(mesh_model_t * mesh_model, uint16_t appkey_index)
|
||||
void mesh_model_unbind_appkey(mesh_model_t * mesh_model, uint16_t appkey_index);
|
||||
int mesh_model_contains_appkey(mesh_model_t * mesh_model, uint16_t appkey_index);
|
||||
|
||||
void mesh_node_reset(void);
|
||||
|
||||
int mesh_node_startup_from_tlv(void);
|
||||
|
||||
void mesh_node_store_provisioning_data(mesh_provisioning_data_t * provisioning_data);
|
||||
|
||||
// temp
|
||||
void mesh_access_setup_from_provisioning_data(const mesh_provisioning_data_t * provisioning_data);
|
||||
void mesh_access_setup_without_provisiong_data(void);
|
||||
|
@ -104,16 +104,6 @@ static uint8_t heartbeat_count_log(uint16_t value){
|
||||
|
||||
// TLV
|
||||
|
||||
static const btstack_tlv_t * btstack_tlv_singleton_impl;
|
||||
static void * btstack_tlv_singleton_context;
|
||||
|
||||
|
||||
static void mesh_configuration_server_setup_tlv(void){
|
||||
if (btstack_tlv_singleton_impl) return;
|
||||
btstack_tlv_get_instance(&btstack_tlv_singleton_impl, &btstack_tlv_singleton_context);
|
||||
}
|
||||
|
||||
|
||||
static int mesh_model_is_configuration_server(uint32_t model_identifier){
|
||||
return mesh_model_is_bluetooth_sig(model_identifier) && (mesh_model_get_model_id(model_identifier) == MESH_SIG_MODEL_ID_CONFIGURATION_SERVER);
|
||||
}
|
||||
@ -2091,108 +2081,3 @@ const mesh_operation_t * mesh_configuration_server_get_operations(void){
|
||||
return mesh_configuration_server_model_operations;
|
||||
}
|
||||
|
||||
static uint32_t mesh_tag_for_prov_data(void){
|
||||
return ((uint32_t) 'P' << 24) | ((uint32_t) 'R' << 16) | ((uint32_t) 'O' << 8) | (uint32_t)'V';
|
||||
}
|
||||
|
||||
void mesh_node_reset(void){
|
||||
mesh_configuration_server_setup_tlv();
|
||||
|
||||
// PROV
|
||||
btstack_tlv_singleton_impl->delete_tag(btstack_tlv_singleton_context, mesh_tag_for_prov_data());
|
||||
// everything else
|
||||
mesh_delete_network_keys();
|
||||
mesh_delete_app_keys();
|
||||
mesh_delete_appkey_lists();
|
||||
mesh_delete_virtual_addresses();
|
||||
mesh_delete_subscriptions();
|
||||
mesh_delete_publications();
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
uint16_t unicast_address;
|
||||
uint8_t flags;
|
||||
uint8_t device_key[16];
|
||||
|
||||
} mesh_persistent_provisioning_data_t;
|
||||
|
||||
void mesh_node_store_provisioning_data(mesh_provisioning_data_t * provisioning_data){
|
||||
|
||||
// fill persistent prov data
|
||||
mesh_persistent_provisioning_data_t persistent_provisioning_data;
|
||||
|
||||
persistent_provisioning_data.unicast_address = provisioning_data->unicast_address;
|
||||
memcpy(persistent_provisioning_data.device_key, provisioning_data->device_key, 16);
|
||||
|
||||
// store in tlv
|
||||
btstack_tlv_get_instance(&btstack_tlv_singleton_impl, &btstack_tlv_singleton_context);
|
||||
btstack_tlv_singleton_impl->store_tag(btstack_tlv_singleton_context, mesh_tag_for_prov_data(), (uint8_t *) &persistent_provisioning_data, sizeof(mesh_persistent_provisioning_data_t));
|
||||
|
||||
// store IV Index and sequence number
|
||||
mesh_store_iv_index_after_provisioning(provisioning_data->iv_index);
|
||||
|
||||
// store primary network key
|
||||
mesh_store_network_key(provisioning_data->network_key);
|
||||
}
|
||||
|
||||
int mesh_node_startup_from_tlv(void){
|
||||
|
||||
mesh_persistent_provisioning_data_t persistent_provisioning_data;
|
||||
btstack_tlv_get_instance(&btstack_tlv_singleton_impl, &btstack_tlv_singleton_context);
|
||||
|
||||
// load provisioning data
|
||||
uint32_t prov_len = btstack_tlv_singleton_impl->get_tag(btstack_tlv_singleton_context, mesh_tag_for_prov_data(), (uint8_t *) &persistent_provisioning_data, sizeof(mesh_persistent_provisioning_data_t));
|
||||
printf("Provisioning data available: %u\n", prov_len ? 1 : 0);
|
||||
if (prov_len){
|
||||
|
||||
// copy into mesh_provisioning_data
|
||||
mesh_provisioning_data_t provisioning_data;
|
||||
memcpy(provisioning_data.device_key, persistent_provisioning_data.device_key, 16);
|
||||
provisioning_data.unicast_address = persistent_provisioning_data.unicast_address;
|
||||
provisioning_data.flags = persistent_provisioning_data.flags;
|
||||
provisioning_data.network_key = NULL;
|
||||
|
||||
// load iv index
|
||||
uint32_t iv_index;
|
||||
uint32_t sequence_number;
|
||||
int ok = mesh_load_iv_index_and_sequence_number(&iv_index, &sequence_number);
|
||||
if (ok){
|
||||
// bump sequence number to account for interval updates
|
||||
sequence_number += MESH_SEQUENCE_NUMBER_STORAGE_INTERVAL;
|
||||
mesh_sequence_number_set(sequence_number);
|
||||
mesh_store_iv_index_and_sequence_number();
|
||||
log_info("IV Index: %08x, Sequence Number %08x", (int) iv_index, (int) sequence_number);
|
||||
provisioning_data.iv_index = iv_index;
|
||||
}
|
||||
|
||||
// load network keys
|
||||
mesh_load_network_keys();
|
||||
// load app keys
|
||||
mesh_load_app_keys();
|
||||
// load model to appkey bindings
|
||||
mesh_load_appkey_lists();
|
||||
// load virtual addresses
|
||||
mesh_load_virtual_addresses();
|
||||
// load model subscriptions
|
||||
mesh_load_subscriptions();
|
||||
// load model publications
|
||||
mesh_load_publications();
|
||||
// load foundation state
|
||||
mesh_foundation_state_load();
|
||||
|
||||
mesh_access_setup_from_provisioning_data(&provisioning_data);
|
||||
|
||||
#if defined(ENABLE_MESH_ADV_BEARER) || defined(ENABLE_MESH_PB_ADV)
|
||||
// start sending Secure Network Beacon
|
||||
mesh_subnet_t * subnet = mesh_subnet_get_by_netkey_index(0);
|
||||
if (subnet){
|
||||
beacon_secure_network_start(subnet);
|
||||
}
|
||||
#endif
|
||||
return 1;
|
||||
} else {
|
||||
mesh_access_setup_without_provisiong_data();
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -83,12 +83,6 @@ typedef struct {
|
||||
const mesh_operation_t * mesh_configuration_server_get_operations(void);
|
||||
|
||||
void mesh_configuration_server_feature_changed(void);
|
||||
//
|
||||
void mesh_node_reset(void);
|
||||
|
||||
int mesh_node_startup_from_tlv(void);
|
||||
|
||||
void mesh_node_store_provisioning_data(mesh_provisioning_data_t * provisioning_data);
|
||||
|
||||
// PTS Testing
|
||||
void config_nekey_list_set_max(uint16_t max);
|
||||
|
Loading…
x
Reference in New Issue
Block a user