mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-02-23 00:39:51 +00:00
mesh: simplify network key index management
This commit is contained in:
parent
bc588d8011
commit
0500a9341c
@ -623,7 +623,7 @@ static void config_netkey_add_handler(mesh_model_t * mesh_model, mesh_pdu_t * pd
|
|||||||
|
|
||||||
// check limit for pts
|
// check limit for pts
|
||||||
uint16_t internal_index = mesh_network_key_get_free_index();
|
uint16_t internal_index = mesh_network_key_get_free_index();
|
||||||
if (internal_index == 0 || (config_netkey_list_max && mesh_network_key_list_count() >= config_netkey_list_max)){
|
if (internal_index == MESH_KEYS_INVALID_INDEX || (config_netkey_list_max && mesh_network_key_list_count() >= config_netkey_list_max)){
|
||||||
status = MESH_FOUNDATION_STATUS_INSUFFICIENT_RESOURCES;
|
status = MESH_FOUNDATION_STATUS_INSUFFICIENT_RESOURCES;
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
@ -709,10 +709,17 @@ static void config_netkey_update_handler(mesh_model_t * mesh_model, mesh_pdu_t *
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// setup new key
|
// get index for new key
|
||||||
uint16_t internal_index = mesh_network_key_get_free_index();
|
uint16_t internal_index = mesh_network_key_get_free_index();
|
||||||
|
if (internal_index == MESH_KEYS_INVALID_INDEX){
|
||||||
|
config_netkey_status(mesh_model, mesh_pdu_netkey_index(pdu), mesh_pdu_src(pdu), MESH_FOUNDATION_STATUS_INSUFFICIENT_RESOURCES, netkey_index);
|
||||||
|
mesh_access_message_processed(access_pdu_in_process);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// get new key
|
||||||
mesh_network_key_t * new_network_key = btstack_memory_mesh_network_key_get();
|
mesh_network_key_t * new_network_key = btstack_memory_mesh_network_key_get();
|
||||||
if (internal_index == 0 || new_network_key == NULL){
|
if (new_network_key == NULL){
|
||||||
config_netkey_status(mesh_model, mesh_pdu_netkey_index(pdu), mesh_pdu_src(pdu), MESH_FOUNDATION_STATUS_INSUFFICIENT_RESOURCES, netkey_index);
|
config_netkey_status(mesh_model, mesh_pdu_netkey_index(pdu), mesh_pdu_src(pdu), MESH_FOUNDATION_STATUS_INSUFFICIENT_RESOURCES, netkey_index);
|
||||||
mesh_access_message_processed(access_pdu_in_process);
|
mesh_access_message_processed(access_pdu_in_process);
|
||||||
return;
|
return;
|
||||||
|
@ -55,14 +55,13 @@ void mesh_network_key_init(void){
|
|||||||
}
|
}
|
||||||
|
|
||||||
uint16_t mesh_network_key_get_free_index(void){
|
uint16_t mesh_network_key_get_free_index(void){
|
||||||
// find empty slot, skip slot #0 reserved for primary network key
|
|
||||||
uint16_t i;
|
uint16_t i;
|
||||||
for (i=1;i < MAX_NR_MESH_NETWORK_KEYS ; i++){
|
for (i=0;i < MAX_NR_MESH_NETWORK_KEYS ; i++){
|
||||||
if (mesh_network_key_used[i] == 0){
|
if (mesh_network_key_used[i] == 0){
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return MESH_KEYS_INVALID_INDEX;
|
||||||
}
|
}
|
||||||
|
|
||||||
void mesh_network_key_add(mesh_network_key_t * network_key){
|
void mesh_network_key_add(mesh_network_key_t * network_key){
|
||||||
|
@ -49,6 +49,8 @@ extern "C"
|
|||||||
{
|
{
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define MESH_KEYS_INVALID_INDEX 0xffff
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
btstack_linked_item_t item;
|
btstack_linked_item_t item;
|
||||||
|
|
||||||
@ -134,7 +136,7 @@ void mesh_network_key_init(void);
|
|||||||
/**
|
/**
|
||||||
* @brief Get internal index of free network key storage entry
|
* @brief Get internal index of free network key storage entry
|
||||||
* @note index 0 is reserved for primary network key
|
* @note index 0 is reserved for primary network key
|
||||||
* @returns index or 0u if none found
|
* @returns index or MESH_KEYS_INVALID_INDEX if none found
|
||||||
*/
|
*/
|
||||||
uint16_t mesh_network_key_get_free_index(void);
|
uint16_t mesh_network_key_get_free_index(void);
|
||||||
|
|
||||||
|
@ -704,7 +704,8 @@ static void provisioning_handle_data_ccm(void * arg){
|
|||||||
// sort provisoning data
|
// sort provisoning data
|
||||||
memcpy(network_key->net_key, provisioning_data, 16);
|
memcpy(network_key->net_key, provisioning_data, 16);
|
||||||
network_key->netkey_index = big_endian_read_16(provisioning_data, 16);
|
network_key->netkey_index = big_endian_read_16(provisioning_data, 16);
|
||||||
network_key->internal_index = 0;
|
// assume free index available for very first network key
|
||||||
|
network_key->internal_index = mesh_network_key_get_free_index();
|
||||||
flags = provisioning_data[18];
|
flags = provisioning_data[18];
|
||||||
iv_index = big_endian_read_32(provisioning_data, 19);
|
iv_index = big_endian_read_32(provisioning_data, 19);
|
||||||
unicast_address = big_endian_read_16(provisioning_data, 23);
|
unicast_address = big_endian_read_16(provisioning_data, 23);
|
||||||
|
@ -140,6 +140,9 @@ void pb_adv_send_pdu(uint16_t pb_transport_cid, const uint8_t * pdu, uint16_t si
|
|||||||
}
|
}
|
||||||
void pb_gatt_send_pdu(uint16_t con_handle, const uint8_t * pdu, uint16_t pdu_size){}
|
void pb_gatt_send_pdu(uint16_t con_handle, const uint8_t * pdu, uint16_t pdu_size){}
|
||||||
|
|
||||||
|
uint16_t mesh_network_key_get_free_index(void){
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static mesh_network_key_t network_key;
|
static mesh_network_key_t network_key;
|
||||||
extern "C" mesh_network_key_t * btstack_memory_mesh_network_key_get(void){
|
extern "C" mesh_network_key_t * btstack_memory_mesh_network_key_get(void){
|
||||||
|
Loading…
x
Reference in New Issue
Block a user