diff --git a/src/core/mac/mac_types.cpp b/src/core/mac/mac_types.cpp index 355cf8b66..a0b33a385 100644 --- a/src/core/mac/mac_types.cpp +++ b/src/core/mac/mac_types.cpp @@ -42,6 +42,18 @@ namespace ot { namespace Mac { +PanId GenerateRandomPanId(void) +{ + PanId panId; + + do + { + panId = Random::NonCrypto::GetUint16(); + } while (panId == kPanIdBroadcast); + + return panId; +} + void ExtAddress::GenerateRandom(void) { Random::NonCrypto::FillBuffer(m8, sizeof(ExtAddress)); diff --git a/src/core/mac/mac_types.hpp b/src/core/mac/mac_types.hpp index 6f093bf12..3f7fa60cb 100644 --- a/src/core/mac/mac_types.hpp +++ b/src/core/mac/mac_types.hpp @@ -73,6 +73,14 @@ typedef otPanId PanId; */ typedef otShortAddress ShortAddress; +/** + * This function generates a random IEEE 802.15.4 PAN ID. + * + * @returns A randomly generated IEEE 802.15.4 PAN ID (excluding `kPanIdBroadcast`). + * + */ +PanId GenerateRandomPanId(void); + /** * This structure represents an IEEE 802.15.4 Extended Address. * diff --git a/src/core/meshcop/dataset_manager_ftd.cpp b/src/core/meshcop/dataset_manager_ftd.cpp index 786bd1f7d..8dc2bb6c4 100644 --- a/src/core/meshcop/dataset_manager_ftd.cpp +++ b/src/core/meshcop/dataset_manager_ftd.cpp @@ -345,10 +345,7 @@ otError ActiveDataset::CreateNewNetwork(otOperationalDataset &aDataset) aDataset.mChannel = preferredChannels.ChooseRandomChannel(); aDataset.mChannelMask = supportedChannels.GetMask(); - do - { - aDataset.mPanId = Random::NonCrypto::GetUint16(); - } while (aDataset.mPanId == Mac::kPanIdBroadcast); + aDataset.mPanId = Mac::GenerateRandomPanId(); snprintf(aDataset.mNetworkName.m8, sizeof(aDataset.mNetworkName), "OpenThread-%04x", aDataset.mPanId); diff --git a/src/core/thread/mesh_forwarder.cpp b/src/core/thread/mesh_forwarder.cpp index 95528fa11..1a17eda7e 100644 --- a/src/core/thread/mesh_forwarder.cpp +++ b/src/core/thread/mesh_forwarder.cpp @@ -496,14 +496,7 @@ otError MeshForwarder::HandleFrameRequest(Mac::TxFrame &aFrame) // value. if (mSendMessage->GetPanId() == Mac::kPanIdBroadcast && Get().GetPanId() == Mac::kPanIdBroadcast) { - uint16_t panid; - - do - { - panid = Random::NonCrypto::GetUint16(); - } while (panid == Mac::kPanIdBroadcast); - - Get().SetPanId(panid); + Get().SetPanId(Mac::GenerateRandomPanId()); } }