mesh: fix restore of iv index from tlv

This commit is contained in:
Matthias Ringwald 2019-07-14 17:49:12 +02:00
parent 9a193117b9
commit 5f84574095
3 changed files with 23 additions and 19 deletions

View File

@ -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

View File

@ -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);

View File

@ -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