From 21da048a004506bc3df8bae566314abdc9e924f8 Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Tue, 29 Oct 2019 11:39:57 -0700 Subject: [PATCH] [mac] add Mac::GenerateRandomPanId() (#4283) This commit adds a helper function `Mac::GenerateRandomPanId()` which generates a random PAN Identifier (excluding the broadcast PAN Id `kPanIdBroadcast`). --- src/core/mac/mac_types.cpp | 12 ++++++++++++ src/core/mac/mac_types.hpp | 8 ++++++++ src/core/meshcop/dataset_manager_ftd.cpp | 5 +---- src/core/thread/mesh_forwarder.cpp | 9 +-------- 4 files changed, 22 insertions(+), 12 deletions(-) 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()); } }