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