From bf2e2417eda458da7366e85966f3303fe903512c Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Thu, 1 May 2025 14:02:54 -0700 Subject: [PATCH] [border-agent] simplify State Bitmap preparation (#11463) This commit simplifies the preparation of the State Bitmap, which is included in the Border Agent's TXT data using the `sb` key. Specifically, constants for field values are now directly used to construct the `uint32_t` bitmap, making the process more straightforward. Additionally, relevant constants are converted to use `static constexpr`, avoiding the use of unnamed `enum` definitions. --- src/core/meshcop/border_agent.cpp | 67 +++++++++--------- src/core/meshcop/border_agent.hpp | 114 ++++++++++++------------------ 2 files changed, 78 insertions(+), 103 deletions(-) diff --git a/src/core/meshcop/border_agent.cpp b/src/core/meshcop/border_agent.cpp index a4bf663ba..4e532b239 100644 --- a/src/core/meshcop/border_agent.cpp +++ b/src/core/meshcop/border_agent.cpp @@ -409,26 +409,24 @@ template <> Error BorderAgent::TxtEncoder::AppendTxtEntry(const char * Error BorderAgent::TxtEncoder::EncodeTxtData(void) { Error error = kErrorNone; -#if OPENTHREAD_CONFIG_BORDER_AGENT_ID_ENABLE - Id id; -#endif - StateBitmap state; #if OPENTHREAD_CONFIG_BORDER_AGENT_ID_ENABLE - if (Get().GetId(id) == kErrorNone) { - SuccessOrExit(error = AppendTxtEntry("id", id)); + Id id; + + if (Get().GetId(id) == kErrorNone) + { + SuccessOrExit(error = AppendTxtEntry("id", id)); + } } #endif SuccessOrExit(error = AppendTxtEntry("nn", Get().GetNetworkName().GetAsData())); SuccessOrExit(error = AppendTxtEntry("xp", Get().GetExtPanId())); SuccessOrExit(error = AppendTxtEntry("tv", NameData(kThreadVersionString, strlen(kThreadVersionString)))); SuccessOrExit(error = AppendTxtEntry("xa", Get().GetExtAddress())); + SuccessOrExit(error = AppendTxtEntry("sb", BigEndian::HostSwap32(DetermineStateBitmap()))); - state = GetStateBitmap(); - SuccessOrExit(error = AppendTxtEntry("sb", BigEndian::HostSwap32(state.ToUint32()))); - - if (state.mThreadIfStatus == kThreadIfStatusActive) + if (Get().IsAttached()) { SuccessOrExit( error = AppendTxtEntry("pt", BigEndian::HostSwap32(Get().GetLeaderData().GetPartitionId()))); @@ -439,11 +437,13 @@ Error BorderAgent::TxtEncoder::EncodeTxtData(void) } #if OPENTHREAD_FTD && OPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE - SuccessOrExit(error = AppendBbrTxtEntry(state)); + SuccessOrExit(error = AppendBbrTxtEntry()); #endif + #if OPENTHREAD_CONFIG_BORDER_ROUTING_ENABLE SuccessOrExit(error = AppendOmrTxtEntry()); #endif + mTxtData.mLength = mAppender.GetAppendedLength(); exit: @@ -451,12 +451,12 @@ exit: } #if OPENTHREAD_FTD && OPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE -Error BorderAgent::TxtEncoder::AppendBbrTxtEntry(StateBitmap aState) +Error BorderAgent::TxtEncoder::AppendBbrTxtEntry(void) { Error error = kErrorNone; const DomainName &domainName = Get().GetDomainName(); - if (aState.mBbrIsActive) + if (Get().IsAttached() && Get().IsEnabled()) { BackboneRouter::Config bbrConfig; @@ -484,6 +484,7 @@ Error BorderAgent::TxtEncoder::AppendOmrTxtEntry(void) prefix.GetLength() > 0) { uint8_t omrData[Ip6::NetworkPrefix::kSize + 1]; + omrData[0] = prefix.GetLength(); memcpy(omrData + 1, prefix.GetBytes(), prefix.GetBytesSize()); @@ -495,50 +496,48 @@ exit: } #endif -BorderAgent::TxtEncoder::StateBitmap BorderAgent::TxtEncoder::GetStateBitmap(void) +uint32_t BorderAgent::TxtEncoder::DetermineStateBitmap(void) { - StateBitmap state; + uint32_t bitmap = 0; - state.mConnectionMode = Get().IsRunning() ? kConnectionModePskc : kConnectionModeDisabled; - state.mAvailability = kAvailabilityHigh; + bitmap |= (Get().IsRunning() ? kConnectionModePskc : kConnectionModeDisabled); + bitmap |= kAvailabilityHigh; switch (Get().GetRole()) { case Mle::DeviceRole::kRoleDisabled: - state.mThreadIfStatus = kThreadIfStatusNotInitialized; - state.mThreadRole = kThreadRoleDisabledOrDetached; + bitmap |= (kThreadIfStatusNotInitialized | kThreadRoleDisabledOrDetached); break; case Mle::DeviceRole::kRoleDetached: - state.mThreadIfStatus = kThreadIfStatusInitialized; - state.mThreadRole = kThreadRoleDisabledOrDetached; + bitmap |= (kThreadIfStatusInitialized | kThreadRoleDisabledOrDetached); break; case Mle::DeviceRole::kRoleChild: - state.mThreadIfStatus = kThreadIfStatusActive; - state.mThreadRole = kThreadRoleChild; + bitmap |= (kThreadIfStatusActive | kThreadRoleChild); break; case Mle::DeviceRole::kRoleRouter: - state.mThreadIfStatus = kThreadIfStatusActive; - state.mThreadRole = kThreadRoleRouter; + bitmap |= (kThreadIfStatusActive | kThreadRoleRouter); break; case Mle::DeviceRole::kRoleLeader: - state.mThreadIfStatus = kThreadIfStatusActive; - state.mThreadRole = kThreadRoleLeader; + bitmap |= (kThreadIfStatusActive | kThreadRoleLeader); break; } #if OPENTHREAD_FTD && OPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE - state.mBbrIsActive = state.mThreadIfStatus == kThreadIfStatusActive && - Get().GetState() != BackboneRouter::Local::State::kStateDisabled; - state.mBbrIsPrimary = state.mThreadIfStatus == kThreadIfStatusActive && - Get().GetState() == BackboneRouter::Local::State::kStatePrimary; + if (Get().IsAttached()) + { + bitmap |= (Get().IsEnabled() ? kFlagBbrIsActive : 0); + bitmap |= (Get().IsPrimary() ? kFlagBbrIsPrimary : 0); + } #endif #if OPENTHREAD_CONFIG_BORDER_AGENT_EPHEMERAL_KEY_ENABLE - state.mEpskcSupported = - Get().GetState() != EphemeralKeyManager::State::kStateDisabled; + if (Get().GetState() != EphemeralKeyManager::kStateDisabled) + { + bitmap |= kFlagEpskcSupported; + } #endif - return state; + return bitmap; } //---------------------------------------------------------------------------------------------------------------------- diff --git a/src/core/meshcop/border_agent.hpp b/src/core/meshcop/border_agent.hpp index 7df6c5bcd..6e1c78ddf 100644 --- a/src/core/meshcop/border_agent.hpp +++ b/src/core/meshcop/border_agent.hpp @@ -481,75 +481,53 @@ private: { } - enum : uint8_t - { - kConnectionModeDisabled = 0, - kConnectionModePskc = 1, - kConnectionModePskd = 2, - kConnectionModeVendor = 3, - kConnectionModeX509 = 4, - }; - - enum : uint8_t - { - kThreadIfStatusNotInitialized = 0, - kThreadIfStatusInitialized = 1, - kThreadIfStatusActive = 2, - }; - - enum : uint8_t - { - kThreadRoleDisabledOrDetached = 0, - kThreadRoleChild = 1, - kThreadRoleRouter = 2, - kThreadRoleLeader = 3, - }; - - enum : uint8_t - { - kAvailabilityInfrequent = 0, - kAvailabilityHigh = 1, - }; - - struct StateBitmap - { - uint32_t mConnectionMode : 3; - uint32_t mThreadIfStatus : 2; - uint32_t mAvailability : 2; - uint32_t mBbrIsActive : 1; - uint32_t mBbrIsPrimary : 1; - uint32_t mThreadRole : 2; - uint32_t mEpskcSupported : 1; - - StateBitmap(void) - : mConnectionMode(0) - , mThreadIfStatus(0) - , mAvailability(0) - , mBbrIsActive(0) - , mBbrIsPrimary(0) - , mThreadRole(kThreadRoleDisabledOrDetached) - , mEpskcSupported(0) - { - } - - uint32_t ToUint32(void) const - { - uint32_t bitmap = 0; - - bitmap |= mConnectionMode << 0; - bitmap |= mThreadIfStatus << 3; - bitmap |= mAvailability << 5; - bitmap |= mBbrIsActive << 7; - bitmap |= mBbrIsPrimary << 8; - bitmap |= mThreadRole << 9; - bitmap |= mEpskcSupported << 11; - return bitmap; - } - }; - Error EncodeTxtData(void); private: + // --- State Bitmap ConnectionMode --- + static constexpr uint8_t kOffsetConnectionMode = 0; + static constexpr uint32_t kMaskConnectionMode = 7 << kOffsetConnectionMode; + static constexpr uint32_t kConnectionModeDisabled = 0 << kOffsetConnectionMode; + static constexpr uint32_t kConnectionModePskc = 1 << kOffsetConnectionMode; + static constexpr uint32_t kConnectionModePskd = 2 << kOffsetConnectionMode; + static constexpr uint32_t kConnectionModeVendor = 3 << kOffsetConnectionMode; + static constexpr uint32_t kConnectionModeX509 = 4 << kOffsetConnectionMode; + + // --- State Bitmap ThreadIfStatus --- + static constexpr uint8_t kOffsetThreadIfStatus = 3; + static constexpr uint32_t kMaskThreadIfStatus = 3 << kOffsetThreadIfStatus; + static constexpr uint32_t kThreadIfStatusNotInitialized = 0 << kOffsetThreadIfStatus; + static constexpr uint32_t kThreadIfStatusInitialized = 1 << kOffsetThreadIfStatus; + static constexpr uint32_t kThreadIfStatusActive = 2 << kOffsetThreadIfStatus; + + // --- State Bitmap Availability --- + static constexpr uint8_t kOffsetAvailability = 5; + static constexpr uint32_t kMaskAvailability = 3 << kOffsetAvailability; + static constexpr uint32_t kAvailabilityInfrequent = 0 << kOffsetAvailability; + static constexpr uint32_t kAvailabilityHigh = 1 << kOffsetAvailability; + + // --- State Bitmap BbrIsActive --- + static constexpr uint8_t kOffsetBbrIsActive = 7; + static constexpr uint32_t kFlagBbrIsActive = 1 << kOffsetBbrIsActive; + + // --- State Bitmap BbrIsPrimary --- + static constexpr uint8_t kOffsetBbrIsPrimary = 8; + static constexpr uint32_t kFlagBbrIsPrimary = 1 << kOffsetBbrIsPrimary; + + // --- State Bitmap ThreadRole --- + static constexpr uint8_t kOffsetThreadRole = 9; + static constexpr uint32_t kMaskThreadRole = 3 << kOffsetThreadRole; + static constexpr uint32_t kThreadRoleDisabledOrDetached = 0 << kOffsetThreadRole; + static constexpr uint32_t kThreadRoleChild = 1 << kOffsetThreadRole; + static constexpr uint32_t kThreadRoleRouter = 2 << kOffsetThreadRole; + static constexpr uint32_t kThreadRoleLeader = 3 << kOffsetThreadRole; + + // --- State Bitmap EpskcSupported --- + static constexpr uint8_t kOffsetEpskcSupported = 11; + static constexpr uint32_t kFlagEpskcSupported = 1 << kOffsetEpskcSupported; + + uint32_t DetermineStateBitmap(void); + Error AppendTxtEntry(const char *aKey, const void *aValue, uint16_t aValueLength); template Error AppendTxtEntry(const char *aKey, const ObjectType &aObject) @@ -561,14 +539,12 @@ private: } #if OPENTHREAD_FTD && OPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE - Error AppendBbrTxtEntry(StateBitmap aState); + Error AppendBbrTxtEntry(void); #endif #if OPENTHREAD_CONFIG_BORDER_ROUTING_ENABLE Error AppendOmrTxtEntry(void); #endif - StateBitmap GetStateBitmap(void); - ServiceTxtData &mTxtData; Appender mAppender; };