diff mbox series

[BlueZ] mesh: Fix IV recovery

Message ID 20200108091604.15185-1-rafal.gajda@silvair.com
State New
Headers show
Series [BlueZ] mesh: Fix IV recovery | expand

Commit Message

RafaƂ Gajda Jan. 8, 2020, 9:16 a.m. UTC
This patch fixes saving IV received in SNB to storage.                                              
                                                                                                    
Previously after creating new node with IV 0 (or loading node with                                  
IV > 0 but after long inactivity) first received SNB should update IV                               
(and reset sequence number to 0 if necessary).                                                      
                                                                                                    
The bug would prevent new IV being saved in storage                                                 
which resulted in sequence number being set to 0                                                    
on first SNB received after every daemon reset                                                      
but IV never being updated.                
---
 mesh/net.c | 20 +++++++-------------
 1 file changed, 7 insertions(+), 13 deletions(-)
diff mbox series

Patch

diff --git a/mesh/net.c b/mesh/net.c
index 5be95086d..1598933d4 100644
--- a/mesh/net.c
+++ b/mesh/net.c
@@ -2706,14 +2706,7 @@  static void update_kr_state(struct mesh_subnet *subnet, bool kr, uint32_t id)
 static void update_iv_ivu_state(struct mesh_net *net, uint32_t iv_index,
 								bool ivu)
 {
-	uint32_t local_iv_index;
-	bool local_ivu;
-
-	/* Save original settings to differentiate what has changed */
-	local_iv_index = net->iv_index;
-	local_ivu = net->iv_update;
-
-	if ((iv_index - ivu) > (local_iv_index - local_ivu)) {
+	if ((iv_index - ivu) > (net->iv_index - net->iv_update)) {
 		/* Don't accept IV_Index changes when performing SAR Out */
 		if (l_queue_length(net->sar_out))
 			return;
@@ -2737,26 +2730,27 @@  static void update_iv_ivu_state(struct mesh_net *net, uint32_t iv_index,
 		}
 	} else if (ivu) {
 		/* Ignore beacons with IVU if they come too soon */
-		if (!local_ivu && net->iv_upd_state == IV_UPD_NORMAL_HOLD) {
+		if (!net->iv_update &&
+				net->iv_upd_state == IV_UPD_NORMAL_HOLD) {
 			l_error("Update attempted too soon");
 			return;
 		}
 
-		if (!local_ivu) {
+		if (!net->iv_update) {
 			l_info("iv_upd_state = IV_UPD_UPDATING");
 			net->iv_upd_state = IV_UPD_UPDATING;
 			net->iv_update_timeout = l_timeout_create(
 					IV_IDX_UPD_MIN, iv_upd_to, net, NULL);
 		}
-	} else if (local_ivu) {
+	} else if (net->iv_update) {
 		l_error("IVU clear attempted too soon");
 		return;
 	}
 
-	if ((iv_index - ivu) > (local_iv_index - local_ivu))
+	if ((iv_index - ivu) > (net->iv_index - net->iv_update))
 		mesh_net_set_seq_num(net, 0);
 
-	if (ivu != net->iv_update || local_iv_index != net->iv_index) {
+	if (ivu != net->iv_update || iv_index != net->iv_index) {
 		struct mesh_config *cfg = node_config_get(net->node);
 
 		mesh_config_write_iv_index(cfg, iv_index, ivu);