@@ -733,6 +733,28 @@ static void thread_leader_allocate_router_id_by_allocated_id(thread_leader_info_
733
733
info -> thread_router_id_list [router_id ].reUsePossible = false;
734
734
}
735
735
736
+ void thread_leader_mleid_rloc_map_populate (thread_nvm_mleid_rloc_map * mleid_rloc_map , thread_leader_info_t * leader_private_info )
737
+ {
738
+ for (uint8_t i = 0 ; i < 64 ; i ++ ) {
739
+ if (bit_test (leader_private_info -> master_router_id_mask , i )) {
740
+ memcpy (mleid_rloc_map -> mleid_rloc_map [i ].mle_id , leader_private_info -> thread_router_id_list [i ].eui64 , 8 );
741
+ }
742
+ }
743
+ }
744
+
745
+ static int thread_leader_update_mleid_rloc_map_in_nvm (protocol_interface_info_entry_t * cur )
746
+ {
747
+ thread_nvm_mleid_rloc_map * mleid_rloc_map = ns_dyn_mem_temporary_alloc (sizeof (thread_nvm_mleid_rloc_map ));
748
+ if (!mleid_rloc_map ) {
749
+ return -1 ;
750
+ }
751
+ memset (mleid_rloc_map , 0 , sizeof (thread_nvm_mleid_rloc_map ));
752
+ thread_leader_mleid_rloc_map_populate (mleid_rloc_map , cur -> thread_info -> leader_private_data );
753
+ thread_nvm_store_mleid_rloc_map_write (mleid_rloc_map );
754
+ ns_dyn_mem_free (mleid_rloc_map );
755
+ return 0 ;
756
+ }
757
+
736
758
static int thread_leader_service_router_id_allocate (const uint8_t * eui64 , protocol_interface_info_entry_t * cur , thread_leader_service_router_id_resp_t * reponse )
737
759
{
738
760
int ret_val = -1 ;
@@ -793,6 +815,8 @@ static int thread_leader_service_router_id_allocate(const uint8_t *eui64, protoc
793
815
if (!bit_test (leader_private_ptr -> master_router_id_mask , id )) {
794
816
if (leader_private_ptr -> thread_router_id_list [id ].reUsePossible ) {
795
817
allocated_id = id ;
818
+ // new id allocated save to nvm after delay
819
+ leader_private_ptr -> leader_nvm_sync_timer = LEADER_NVM_SYNC_DELAY ;
796
820
break ;
797
821
}
798
822
}
@@ -847,6 +871,7 @@ static int thread_leader_service_router_id_deallocate(const uint8_t *eui64, prot
847
871
//Active ID
848
872
if (memcmp (eui64 , leader_private_ptr -> thread_router_id_list [i ].eui64 , 8 ) == 0 ) {
849
873
tr_debug ("Release Router Id %d" , i );
874
+ leader_private_ptr -> leader_nvm_sync_timer = LEADER_NVM_SYNC_DELAY ;
850
875
thread_leader_service_route_mask_bit_clear (leader_private_ptr , i );
851
876
leader_private_ptr -> thread_router_id_list [i ].reUsePossible = true;
852
877
leader_private_ptr -> thread_router_id_list [i ].validLifeTime = 0 ;
@@ -1318,6 +1343,8 @@ static void thread_leader_service_interface_setup_activate(protocol_interface_in
1318
1343
//SET Router ID
1319
1344
thread_leader_allocate_router_id_by_allocated_id (private , routerId , cur -> mac );
1320
1345
thread_old_partition_data_purge (cur );
1346
+ // remove any existing rloc mapping in nvm
1347
+ thread_nvm_store_mleid_rloc_map_remove ();
1321
1348
cur -> lowpan_address_mode = NET_6LOWPAN_GP16_ADDRESS ;
1322
1349
thread_bootstrap_update_ml16_address (cur , cur -> thread_info -> routerShortAddress );
1323
1350
thread_generate_ml64_address (cur );
@@ -1500,6 +1527,16 @@ void thread_leader_service_timer(protocol_interface_info_entry_t *cur, uint32_t
1500
1527
thread_leader_service_network_data_changed (cur , false, false);
1501
1528
}
1502
1529
1530
+ if (cur -> thread_info -> leader_private_data -> leader_nvm_sync_timer ) {
1531
+ if ((cur -> thread_info -> leader_private_data -> leader_nvm_sync_timer ) > ticks ) {
1532
+ cur -> thread_info -> leader_private_data -> leader_nvm_sync_timer -= ticks ;
1533
+ }
1534
+ else {
1535
+ cur -> thread_info -> leader_private_data -> leader_nvm_sync_timer = 0 ;
1536
+ thread_leader_update_mleid_rloc_map_in_nvm (cur );
1537
+ }
1538
+ }
1539
+
1503
1540
thread_leader_service_router_id_valid_lifetime_update (cur , ticks );
1504
1541
1505
1542
}
@@ -1619,22 +1656,33 @@ int thread_leader_service_thread_partitition_restart(int8_t interface_id, mle_tl
1619
1656
}
1620
1657
//Learn network data, we remove own data from here it should be re given by application
1621
1658
//thread_management_network_data_register(cur->id, networkData.dataPtr, networkData.tlvLen, address16 );
1622
-
1659
+ thread_nvm_mleid_rloc_map * mleid_rloc_map = ns_dyn_mem_temporary_alloc (sizeof (thread_nvm_mleid_rloc_map ));
1660
+ if (!mleid_rloc_map ) {
1661
+ return -1 ;
1662
+ }
1663
+ if (thread_nvm_store_mleid_rloc_map_read (mleid_rloc_map ) != THREAD_NVM_FILE_SUCCESS ) {
1664
+ memset (mleid_rloc_map , 0 , sizeof (thread_nvm_mleid_rloc_map ));
1665
+ }
1623
1666
// initialize private data
1624
1667
thread_info (cur )-> leader_private_data -> maskSeq = * routing -> dataPtr ;
1625
- memcpy (thread_info (cur )-> leader_private_data -> master_router_id_mask ,routing -> dataPtr + 1 ,8 );
1668
+ memcpy (thread_info (cur )-> leader_private_data -> master_router_id_mask ,routing -> dataPtr + 1 , 8 );
1626
1669
for (int i = 0 ; i < 64 ; i ++ ) {
1627
- memset (thread_info (cur )-> leader_private_data -> thread_router_id_list [i ].eui64 ,0 ,8 );
1628
1670
if (bit_test (thread_info (cur )-> leader_private_data -> master_router_id_mask , i )) {
1629
1671
//Active ID
1630
1672
thread_info (cur )-> leader_private_data -> thread_router_id_list [i ].reUsePossible = false;
1631
-
1673
+ memcpy ( thread_info ( cur ) -> leader_private_data -> thread_router_id_list [ i ]. eui64 , mleid_rloc_map -> mleid_rloc_map [ i ]. mle_id , 8 );
1632
1674
} else {
1633
1675
// Free id
1634
1676
thread_info (cur )-> leader_private_data -> thread_router_id_list [i ].reUsePossible = true;
1677
+ // clear the mleid in both local router id list and nvm
1678
+ memset (thread_info (cur )-> leader_private_data -> thread_router_id_list [i ].eui64 , 0 , 8 );
1679
+ memset (mleid_rloc_map -> mleid_rloc_map [i ].mle_id , 0 , 8 );
1635
1680
}
1636
1681
thread_info (cur )-> leader_private_data -> thread_router_id_list [i ].validLifeTime = 0xffffffff ;
1637
1682
}
1683
+ // write back updated map to store
1684
+ thread_nvm_store_mleid_rloc_map_write (mleid_rloc_map );
1685
+ ns_dyn_mem_free (mleid_rloc_map );
1638
1686
// Clear network data (if exists) and propagate new empty network data
1639
1687
thread_network_data_free_and_clean (& cur -> thread_info -> networkDataStorage );
1640
1688
thread_network_data_base_init (& cur -> thread_info -> networkDataStorage );
0 commit comments