mesh: mesh_restore_iv_index_and_sequence_number() loads and bumps sequence number

This commit is contained in:
Matthias Ringwald 2019-07-10 14:22:44 +02:00
parent 6f14746dca
commit 5639acaf77
3 changed files with 29 additions and 3 deletions

View File

@ -297,7 +297,7 @@ static void packet_handler (uint8_t packet_type, uint16_t channel, uint8_t *pack
if (prov_len){
mesh_setup_from_provisioning_data(&provisioning_data);
// load iv index
mesh_load_iv_index_and_sequence_number();
mesh_restore_iv_index_and_sequence_number();
// load network keys
mesh_load_network_keys();
// load app keys

View File

@ -1374,6 +1374,11 @@ typedef struct {
uint32_t seq_number;
} iv_index_and_sequence_number_t;
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_and_sequence_number(void){
iv_index_and_sequence_number_t data;
mesh_access_setup_tlv();
@ -1381,8 +1386,12 @@ void mesh_store_iv_index_and_sequence_number(void){
data.iv_index = mesh_get_iv_index();
data.seq_number = mesh_sequence_number_peek();
btstack_tlv_singleton_impl->get_tag(btstack_tlv_singleton_context, tag, (uint8_t *) &data, sizeof(data));
sequence_number_last_stored = data.seq_number;
sequence_number_storage_trigger = sequence_number_last_stored + MESH_SEQUENCE_NUMBER_STORAGE_INTERVAL;
}
void mesh_load_iv_index_and_sequence_number(void){
static void mesh_load_iv_index_and_sequence_number(void){
iv_index_and_sequence_number_t data;
mesh_access_setup_tlv();
uint32_t tag = mesh_tag_for_iv_index_and_seq_number();
@ -1391,6 +1400,21 @@ void mesh_load_iv_index_and_sequence_number(void){
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();
}
// higher layer
void mesh_persist_iv_index_and_sequence_number(void){
}
// Mesh Model Publication
static btstack_timer_source_t mesh_access_publication_timer;

View File

@ -445,7 +445,8 @@ 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_and_sequence_number(void);
void mesh_load_iv_index_and_sequence_number(void);
void mesh_persist_iv_index_and_sequence_number(void);
void mesh_restore_iv_index_and_sequence_number(void);
// Mesh Access Parser
int mesh_access_pdu_get_opcode(mesh_pdu_t * pdu, uint32_t * opcode, uint16_t * opcode_size);
@ -485,6 +486,7 @@ void mesh_access_network_add_model_identifier(mesh_network_pdu_t * pdu, uint32_t
mesh_network_pdu_t * mesh_access_setup_unsegmented_message(const mesh_access_message_t *template, ...);
mesh_transport_pdu_t * mesh_access_setup_segmented_message(const mesh_access_message_t *template, ...);
#ifdef __cplusplus
} /* end of extern "C" */
#endif