Hi Rafał, On Wed, 2020-01-08 at 10:16 +0100, Rafał Gajda wrote: > 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 --git a/mesh/net.c b/mesh/net.c > index 5be95086d..1598933d4 100644 > --- a/mesh/net.c > +++ b/mesh/net.c > <...> > @@ -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) { Would it be fair to say that this is the *only* change to the code that fixes the logic that was malfunctioning? If so, I would like to shrink this patch to just: - if (ivu != net->iv_update || local_iv_index != net->iv_index) { + if (ivu != local_ivu || iv_index != local_iv_index) { or, breaking this into a 2-patch patchset, where one of the patches removes the local caching of ivu and ivi, and the second patch fixes the actual bug. > struct mesh_config *cfg = node_config_get(net->node); > > mesh_config_write_iv_index(cfg, iv_index, ivu);