First valid SNB received from the network should cause the node to switch into IV_UPD_NORMAL state. Otherwise, it will never try to enter IV Update procedure when sequence number approaches the IV_UPDATE_SEQ_TRIGGER, because that's only allowed in IV_UPD_NORMAL. --- mesh/net.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/mesh/net.c b/mesh/net.c index 20e9a1e81..bd8826b58 100644 --- a/mesh/net.c +++ b/mesh/net.c @@ -2688,11 +2688,17 @@ static void process_beacon(void *net_ptr, void *user_data) /* We have officially *seen* this beacon now */ beacon_data->processed = true; - if (ivi == net->iv_index && ivu == net->iv_update && kr == local_kr) - return; + /* + * Ignore the beacon if it doesn't change anything, unless we're + * doing IV Recovery + */ + if (net->iv_upd_state == IV_UPD_INIT || + ivi != net->iv_index || ivu != net->iv_update) + update_iv_ivu_state(net, ivi, ivu); + + if (kr != local_kr) + update_kr_state(subnet, kr, beacon_data->key_id); - update_iv_ivu_state(net, ivi, ivu); - update_kr_state(subnet, kr, beacon_data->key_id); net_key_beacon_refresh(beacon_data->key_id, net->iv_index, !!(subnet->kr_phase == KEY_REFRESH_PHASE_TWO), net->iv_update); } -- 2.19.1