mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-03-01 10:13:29 +00:00
mesh: fix restore of iv index from tlv
This commit is contained in:
parent
9a193117b9
commit
5f84574095
@ -1327,8 +1327,6 @@ typedef struct {
|
||||
static uint32_t sequence_number_last_stored;
|
||||
static uint32_t sequence_number_storage_trigger;
|
||||
|
||||
#define MESH_SEQUENCE_NUMBER_STORAGE_INTERVAL 1000
|
||||
|
||||
void mesh_store_iv_index_after_provisioning(uint32_t iv_index){
|
||||
iv_index_and_sequence_number_t data;
|
||||
mesh_access_setup_tlv();
|
||||
@ -1353,24 +1351,17 @@ void mesh_store_iv_index_and_sequence_number(void){
|
||||
sequence_number_storage_trigger = sequence_number_last_stored + MESH_SEQUENCE_NUMBER_STORAGE_INTERVAL;
|
||||
}
|
||||
|
||||
static void mesh_load_iv_index_and_sequence_number(void){
|
||||
int mesh_load_iv_index_and_sequence_number(uint32_t * iv_index, uint32_t * sequence_number){
|
||||
iv_index_and_sequence_number_t data;
|
||||
mesh_access_setup_tlv();
|
||||
uint32_t tag = mesh_tag_for_iv_index_and_seq_number();
|
||||
btstack_tlv_singleton_impl->get_tag(btstack_tlv_singleton_context, tag, (uint8_t *) &data, sizeof(data));
|
||||
mesh_set_iv_index(data.iv_index);
|
||||
mesh_sequence_number_set(data.seq_number);
|
||||
}
|
||||
|
||||
void mesh_restore_iv_index_and_sequence_number(void){
|
||||
mesh_load_iv_index_and_sequence_number();
|
||||
|
||||
// bump sequence number to account for only interval storage
|
||||
uint32_t seq_number = mesh_sequence_number_peek();
|
||||
seq_number += MESH_SEQUENCE_NUMBER_STORAGE_INTERVAL;
|
||||
mesh_sequence_number_set(seq_number);
|
||||
|
||||
mesh_store_iv_index_and_sequence_number();
|
||||
uint32_t len = btstack_tlv_singleton_impl->get_tag(btstack_tlv_singleton_context, tag, (uint8_t *) &data, sizeof(data));
|
||||
if (len == sizeof(iv_index_and_sequence_number_t)){
|
||||
*iv_index = data.iv_index;
|
||||
*sequence_number = data.seq_number;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
// higher layer
|
||||
|
@ -58,6 +58,8 @@ extern "C"
|
||||
|
||||
#define MESH_APPKEY_INVALID 0xffffu
|
||||
|
||||
#define MESH_SEQUENCE_NUMBER_STORAGE_INTERVAL 1000
|
||||
|
||||
struct mesh_model;
|
||||
struct mesh_element;
|
||||
|
||||
@ -378,7 +380,7 @@ int mesh_model_contains_appkey(mesh_model_t * mesh_model, uint16_t appkey_index)
|
||||
// Mesh IV Index and sequence number
|
||||
void mesh_store_iv_index_after_provisioning(uint32_t iv_index);
|
||||
void mesh_store_iv_index_and_sequence_number(void);
|
||||
void mesh_restore_iv_index_and_sequence_number(void);
|
||||
int mesh_load_iv_index_and_sequence_number(uint32_t * iv_index, uint32_t * sequence_number);
|
||||
|
||||
// Mesh Access Parser
|
||||
int mesh_access_pdu_get_opcode(mesh_pdu_t * pdu, uint32_t * opcode, uint16_t * opcode_size);
|
||||
|
@ -2366,7 +2366,18 @@ int mesh_node_startup_from_tlv(void){
|
||||
provisioning_data.network_key = NULL;
|
||||
|
||||
// load iv index
|
||||
mesh_restore_iv_index_and_sequence_number();
|
||||
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
|
||||
|
Loading…
x
Reference in New Issue
Block a user