mesh: Switch beaconing net key
authorBrian Gix <brian.gix@intel.com>
Fri, 9 Apr 2021 15:45:24 +0000 (08:45 -0700)
committerAyush Garg <ayush.garg@samsung.com>
Fri, 5 Jan 2024 10:11:34 +0000 (15:41 +0530)
When transitioning from Phase 1 to Phase 2 of a network key and we are
beaconing, we need to halt the beaconing on the old key version, and
begin beaconing on the new key version.

mesh/net.c

index ebb6887..07ae786 100644 (file)
@@ -2623,6 +2623,13 @@ static int key_refresh_phase_two(struct mesh_net *net, uint16_t idx)
        if (subnet->kr_phase == KEY_REFRESH_PHASE_TWO)
                return MESH_STATUS_SUCCESS;
 
+       /* Stop beaconing on old key */
+       if (net->snb_enable)
+               net_key_beacon_disable(subnet->net_key_tx, false);
+
+       if (net->mpb_enable)
+               net_key_beacon_disable(subnet->net_key_tx, true);
+
        subnet->key_refresh = 1;
        subnet->net_key_tx = subnet->net_key_upd;
        /*
@@ -2630,6 +2637,15 @@ static int key_refresh_phase_two(struct mesh_net *net, uint16_t idx)
         * it hears beacons from all the nodes
         */
        subnet->kr_phase = KEY_REFRESH_PHASE_TWO;
+
+       /* Start beaconing on new key */
+       if (net->snb_enable)
+               net_key_beacon_enable(subnet->net_key_tx, false, 0);
+
+       if (net->mpb_enable)
+               net_key_beacon_enable(subnet->net_key_tx, true,
+                                                       net->mpb_period);
+
        refresh_beacon(subnet, net);
        queue_friend_update(net);