xref: /btstack/src/mesh/mesh_iv_index_seq_number.c (revision 2fca4dad957cd7b88f4657ed51e89c12615dda72)
1f4854a5eSMatthias Ringwald /*
2f4854a5eSMatthias Ringwald  * Copyright (C) 2014 BlueKitchen GmbH
3f4854a5eSMatthias Ringwald  *
4f4854a5eSMatthias Ringwald  * Redistribution and use in source and binary forms, with or without
5f4854a5eSMatthias Ringwald  * modification, are permitted provided that the following conditions
6f4854a5eSMatthias Ringwald  * are met:
7f4854a5eSMatthias Ringwald  *
8f4854a5eSMatthias Ringwald  * 1. Redistributions of source code must retain the above copyright
9f4854a5eSMatthias Ringwald  *    notice, this list of conditions and the following disclaimer.
10f4854a5eSMatthias Ringwald  * 2. Redistributions in binary form must reproduce the above copyright
11f4854a5eSMatthias Ringwald  *    notice, this list of conditions and the following disclaimer in the
12f4854a5eSMatthias Ringwald  *    documentation and/or other materials provided with the distribution.
13f4854a5eSMatthias Ringwald  * 3. Neither the name of the copyright holders nor the names of
14f4854a5eSMatthias Ringwald  *    contributors may be used to endorse or promote products derived
15f4854a5eSMatthias Ringwald  *    from this software without specific prior written permission.
16f4854a5eSMatthias Ringwald  * 4. Any redistribution, use, or modification is done solely for
17f4854a5eSMatthias Ringwald  *    personal benefit and not for any commercial purpose or for
18f4854a5eSMatthias Ringwald  *    monetary gain.
19f4854a5eSMatthias Ringwald  *
20f4854a5eSMatthias Ringwald  * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS
21f4854a5eSMatthias Ringwald  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22f4854a5eSMatthias Ringwald  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23*2fca4dadSMilanka Ringwald  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BLUEKITCHEN
24*2fca4dadSMilanka Ringwald  * GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
25f4854a5eSMatthias Ringwald  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
26f4854a5eSMatthias Ringwald  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
27f4854a5eSMatthias Ringwald  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
28f4854a5eSMatthias Ringwald  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29f4854a5eSMatthias Ringwald  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
30f4854a5eSMatthias Ringwald  * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31f4854a5eSMatthias Ringwald  * SUCH DAMAGE.
32f4854a5eSMatthias Ringwald  *
33f4854a5eSMatthias Ringwald  * Please inquire about commercial licensing options at
34f4854a5eSMatthias Ringwald  * [email protected]
35f4854a5eSMatthias Ringwald  *
36f4854a5eSMatthias Ringwald  */
37f4854a5eSMatthias Ringwald 
382d4000d1SMatthias Ringwald #define BTSTACK_FILE__ "mesh_iv_index_seq_number.c"
39f4854a5eSMatthias Ringwald 
40f4854a5eSMatthias Ringwald #include "mesh/mesh_iv_index_seq_number.h"
41f4854a5eSMatthias Ringwald 
42f4854a5eSMatthias Ringwald #include "btstack_debug.h"
43f4854a5eSMatthias Ringwald 
44f4854a5eSMatthias Ringwald static uint32_t global_iv_index;
45f4854a5eSMatthias Ringwald static int global_iv_update_active;
46f4854a5eSMatthias Ringwald 
47f4854a5eSMatthias Ringwald static uint32_t  sequence_number_current;
48f4854a5eSMatthias Ringwald 
mesh_set_iv_index(uint32_t iv_index)49f4854a5eSMatthias Ringwald void mesh_set_iv_index(uint32_t iv_index){
50f4854a5eSMatthias Ringwald     global_iv_index = iv_index;
51f4854a5eSMatthias Ringwald }
52f4854a5eSMatthias Ringwald 
mesh_get_iv_index(void)53f4854a5eSMatthias Ringwald uint32_t mesh_get_iv_index(void){
54f4854a5eSMatthias Ringwald     return  global_iv_index;
55f4854a5eSMatthias Ringwald }
56f4854a5eSMatthias Ringwald 
mesh_get_iv_index_for_tx(void)57f4854a5eSMatthias Ringwald uint32_t mesh_get_iv_index_for_tx(void){
58f4854a5eSMatthias Ringwald     if (global_iv_update_active){
59f4854a5eSMatthias Ringwald         return global_iv_index - 1;
60f4854a5eSMatthias Ringwald     } else {
61f4854a5eSMatthias Ringwald         return  global_iv_index;
62f4854a5eSMatthias Ringwald     }
63f4854a5eSMatthias Ringwald }
64f4854a5eSMatthias Ringwald 
mesh_iv_update_active(void)65f4854a5eSMatthias Ringwald int mesh_iv_update_active(void){
66f4854a5eSMatthias Ringwald     return global_iv_update_active;
67f4854a5eSMatthias Ringwald }
68f4854a5eSMatthias Ringwald 
mesh_trigger_iv_update(void)69f4854a5eSMatthias Ringwald void mesh_trigger_iv_update(void){
70f4854a5eSMatthias Ringwald     if (global_iv_update_active) return;
71f4854a5eSMatthias Ringwald 
72f4854a5eSMatthias Ringwald     // "A node shall not start an IV Update procedure more often than once every 192 hours."
73f4854a5eSMatthias Ringwald     // Unless triggered by user application, it will automatically triggered if sequene numbers are about to roll over
74f4854a5eSMatthias Ringwald 
75f4854a5eSMatthias Ringwald     // "A node shall defer state change from IV Update in Progress to Normal Operation, as defined by this procedure,
76f4854a5eSMatthias Ringwald     //  when the node has transmitted a Segmented Access message or a Segmented Control message without receiving the
77f4854a5eSMatthias Ringwald     //  corresponding Segment Acknowledgment messages. The deferred change of the state shall be executed when the appropriate
78f4854a5eSMatthias Ringwald     //  Segment Acknowledgment message is received or timeout for the delivery of this message is reached.
79f4854a5eSMatthias Ringwald     //
80f4854a5eSMatthias Ringwald     //  Note: This requirement is necessary because upon completing the IV Update procedure the sequence number is reset
81f4854a5eSMatthias Ringwald     //  to 0x000000 and the SeqAuth value would not be valid."
82f4854a5eSMatthias Ringwald 
83f4854a5eSMatthias Ringwald     // set IV Update in Progress
84f4854a5eSMatthias Ringwald     global_iv_update_active = 1;
85f4854a5eSMatthias Ringwald     // increase IV index
86f4854a5eSMatthias Ringwald     global_iv_index++;
87f4854a5eSMatthias Ringwald }
88f4854a5eSMatthias Ringwald 
mesh_iv_update_completed(void)89f4854a5eSMatthias Ringwald void mesh_iv_update_completed(void){
90f4854a5eSMatthias Ringwald     if (!global_iv_update_active) return;
91f4854a5eSMatthias Ringwald     // set Normal mode
92f4854a5eSMatthias Ringwald     global_iv_update_active = 0;
93f4854a5eSMatthias Ringwald }
94f4854a5eSMatthias Ringwald 
mesh_iv_index_recovered(uint8_t iv_update_active,uint32_t iv_index)95f4854a5eSMatthias Ringwald void mesh_iv_index_recovered(uint8_t iv_update_active, uint32_t iv_index){
96f4854a5eSMatthias Ringwald     log_info("mesh_iv_index_recovered: active %u, index %u", iv_update_active, (int) iv_index);
97f4854a5eSMatthias Ringwald     global_iv_index = iv_index;
98f4854a5eSMatthias Ringwald     global_iv_update_active = iv_update_active;
99f4854a5eSMatthias Ringwald }
100f4854a5eSMatthias Ringwald 
101f4854a5eSMatthias Ringwald //
102f4854a5eSMatthias Ringwald 
103f4854a5eSMatthias Ringwald static void (*seq_num_callback)(void);
104f4854a5eSMatthias Ringwald 
mesh_sequence_number_set_update_callback(void (* callback)(void))105f4854a5eSMatthias Ringwald void mesh_sequence_number_set_update_callback(void (*callback)(void)){
106f4854a5eSMatthias Ringwald 	seq_num_callback = callback;
107f4854a5eSMatthias Ringwald }
108f4854a5eSMatthias Ringwald 
mesh_sequence_number_set(uint32_t seq)109f4854a5eSMatthias Ringwald void mesh_sequence_number_set(uint32_t seq){
110f4854a5eSMatthias Ringwald     sequence_number_current = seq;
111f4854a5eSMatthias Ringwald }
112f4854a5eSMatthias Ringwald 
mesh_sequence_number_next(void)113f4854a5eSMatthias Ringwald uint32_t mesh_sequence_number_next(void){
114f4854a5eSMatthias Ringwald 	uint32_t seq_number = sequence_number_current++;
115f4854a5eSMatthias Ringwald 
116f4854a5eSMatthias Ringwald 	if (seq_num_callback){
117f4854a5eSMatthias Ringwald 		(*seq_num_callback)();
118f4854a5eSMatthias Ringwald 	}
119f4854a5eSMatthias Ringwald 
120f4854a5eSMatthias Ringwald     return seq_number;
121f4854a5eSMatthias Ringwald }
122f4854a5eSMatthias Ringwald 
mesh_sequence_number_peek(void)123f4854a5eSMatthias Ringwald uint32_t mesh_sequence_number_peek(void){
124f4854a5eSMatthias Ringwald     return sequence_number_current;
125f4854a5eSMatthias Ringwald }
126f4854a5eSMatthias Ringwald 
127f4854a5eSMatthias Ringwald 
128