diff --git a/test/mesh/mesh.c b/test/mesh/mesh.c index d4a96a7a4..e76960c30 100644 --- a/test/mesh/mesh.c +++ b/test/mesh/mesh.c @@ -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 diff --git a/test/mesh/mesh_access.c b/test/mesh/mesh_access.c index e45e4ae37..fee1bbdd2 100644 --- a/test/mesh/mesh_access.c +++ b/test/mesh/mesh_access.c @@ -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; diff --git a/test/mesh/mesh_access.h b/test/mesh/mesh_access.h index 87eb37f56..c4f27ed24 100644 --- a/test/mesh/mesh_access.h +++ b/test/mesh/mesh_access.h @@ -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