This patch ensures that Sequence Number is reset only when IV Index used for outgoing messages increases. This fixes erroneously cleared sequence number when node performs IV Recovery procedure on startup in a following scenario: - node has IV Index set to <N> - node starts in IV_UPD_INIT state - node receives a Secure Network Beacon with IV Index <N>+1 and IV Update flag set Upon reception, the node shall: - increase its IV Index to <N>+1 - enter IV_UPD_UPDATING state This means that the node keeps transmitting messages using IV Index equal to <N>, therefore it shall *not* reset its Sequence Number before IV Update procedure completes. If, on the other hand, SNB contains either: - IV Index <N>+2 (regardless of IV Update flag) - IV Index <N>+1 and IV Update flag *not* set the node shall reset the Sequence Number right away. --- mesh/net.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/mesh/net.c b/mesh/net.c index 7c4049e0e..ba7bb32fd 100644 --- a/mesh/net.c +++ b/mesh/net.c @@ -2735,8 +2735,6 @@ static void update_iv_kr_state(struct mesh_subnet *subnet, uint32_t iv_index, } if (net->iv_upd_state == IV_UPD_INIT) { - if (iv_index > net->iv_index) - mesh_net_set_seq_num(net, 0); net->iv_index = iv_index; if (iv_update) { @@ -2757,6 +2755,12 @@ static void update_iv_kr_state(struct mesh_subnet *subnet, uint32_t iv_index, mesh_config_write_iv_index(node_config_get(net->node), iv_index, net->iv_upd_state); + /* Reset seq num if iv index used for *outgoing* messages has + * just been increased + */ + if (mesh_net_get_iv_index(net) > local_iv_index) + mesh_net_set_seq_num(net, 0); + /* Figure out the key refresh phase */ if (kr_transition) { l_debug("Beacon based KR phase change"); -- 2.22.0