From dd79b74d7a27c47f5313b6418c5df94365df25f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Narajowski?= Date: Tue, 17 Oct 2017 12:05:35 +0200 Subject: [PATCH] mesh: Fix and clean up iv update procedure This patch fixes issue when receiving iv index greater than current index + 42 in update mode. According to Specification when node is in update state it should only accept iv index equal to the current iv index. When node is in normal mode it should ignore index that is greater than current index + 42. This allows to pass MESH/NODE/IVU/BI-02-C. Also this patch cleans up the iv update procedure, to make it easier to read. X-Original-Commit: 51fbf89bd981eca731b78956e0a26cff2d0e7a02 --- nimble/host/mesh/src/net.c | 61 ++++++++++++++++++++++++-------------- 1 file changed, 38 insertions(+), 23 deletions(-) diff --git a/nimble/host/mesh/src/net.c b/nimble/host/mesh/src/net.c index 0872a8439..032abed83 100644 --- a/nimble/host/mesh/src/net.c +++ b/nimble/host/mesh/src/net.c @@ -556,35 +556,50 @@ void bt_mesh_iv_update(u32_t iv_index, bool iv_update) { int i; - if (iv_index < bt_mesh.iv_index || iv_index > bt_mesh.iv_index + 42) { - BT_ERR("IV Index completely out of sync: 0x%08x != 0x%08x", - iv_index, bt_mesh.iv_index); - return; - } - - if (iv_index > bt_mesh.iv_index + 1) { - BT_WARN("Performing IV Index Recovery"); - memset(bt_mesh.rpl, 0, sizeof(bt_mesh.rpl)); - bt_mesh.iv_index = iv_index; - bt_mesh.seq = 0; - goto do_update; - } - - if (iv_update == bt_mesh.iv_update) { - if (iv_index != bt_mesh.iv_index) { - BT_WARN("No update, but IV Index 0x%08x != 0x%08x", - iv_index, bt_mesh.iv_index); - } - return; - } - if (bt_mesh.iv_update) { + /* We're currently in IV Update mode */ + if (iv_index != bt_mesh.iv_index) { BT_WARN("IV Index mismatch: 0x%08x != 0x%08x", iv_index, bt_mesh.iv_index); return; } - } else { + + if (iv_update) { + /* Nothing to do */ + BT_DBG("Already in IV Update in Progress state"); + return; + } + } else { + /* We're currently in Normal mode */ + + if (iv_index < bt_mesh.iv_index || + iv_index > bt_mesh.iv_index + 42) { + BT_ERR("IV Index out of sync: " "0x%08x != 0x%08x", + iv_index, bt_mesh.iv_index); + return; + } + + if (iv_index > bt_mesh.iv_index + 1) { + BT_WARN("Performing IV Index Recovery"); + memset(bt_mesh.rpl, 0, sizeof(bt_mesh.rpl)); + bt_mesh.iv_index = iv_index; + bt_mesh.seq = 0; + goto do_update; + } + + if (iv_index == bt_mesh.iv_index + 1 && !iv_update) { + BT_WARN("Ignoring new index in normal mode", + iv_index, bt_mesh.iv_index); + return; + } + + if (!iv_update) { + /* Nothing to do */ + BT_DBG("Already in Normal mode"); + return; + } + if (iv_index != bt_mesh.iv_index + 1) { BT_WARN("Wrong new IV Index: 0x%08x != 0x%08x + 1", iv_index, bt_mesh.iv_index);