[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.
This commit is contained in:
Abtin Keshavarzian
2025-05-01 14:02:54 -07:00
committed by GitHub
parent ae940e6df8
commit bf2e2417ed
2 changed files with 78 additions and 103 deletions

View File

@ -409,26 +409,24 @@ template <> Error BorderAgent::TxtEncoder::AppendTxtEntry<NameData>(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<BorderAgent>().GetId(id) == kErrorNone)
{
SuccessOrExit(error = AppendTxtEntry("id", id));
Id id;
if (Get<BorderAgent>().GetId(id) == kErrorNone)
{
SuccessOrExit(error = AppendTxtEntry("id", id));
}
}
#endif
SuccessOrExit(error = AppendTxtEntry("nn", Get<NetworkNameManager>().GetNetworkName().GetAsData()));
SuccessOrExit(error = AppendTxtEntry("xp", Get<ExtendedPanIdManager>().GetExtPanId()));
SuccessOrExit(error = AppendTxtEntry("tv", NameData(kThreadVersionString, strlen(kThreadVersionString))));
SuccessOrExit(error = AppendTxtEntry("xa", Get<Mac::Mac>().GetExtAddress()));
SuccessOrExit(error = AppendTxtEntry("sb", BigEndian::HostSwap32(DetermineStateBitmap())));
state = GetStateBitmap();
SuccessOrExit(error = AppendTxtEntry("sb", BigEndian::HostSwap32(state.ToUint32())));
if (state.mThreadIfStatus == kThreadIfStatusActive)
if (Get<Mle::Mle>().IsAttached())
{
SuccessOrExit(
error = AppendTxtEntry("pt", BigEndian::HostSwap32(Get<Mle::Mle>().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<MeshCoP::NetworkNameManager>().GetDomainName();
if (aState.mBbrIsActive)
if (Get<Mle::Mle>().IsAttached() && Get<BackboneRouter::Local>().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<BorderAgent>().IsRunning() ? kConnectionModePskc : kConnectionModeDisabled;
state.mAvailability = kAvailabilityHigh;
bitmap |= (Get<BorderAgent>().IsRunning() ? kConnectionModePskc : kConnectionModeDisabled);
bitmap |= kAvailabilityHigh;
switch (Get<Mle::Mle>().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<BackboneRouter::Local>().GetState() != BackboneRouter::Local::State::kStateDisabled;
state.mBbrIsPrimary = state.mThreadIfStatus == kThreadIfStatusActive &&
Get<BackboneRouter::Local>().GetState() == BackboneRouter::Local::State::kStatePrimary;
if (Get<Mle::Mle>().IsAttached())
{
bitmap |= (Get<BackboneRouter::Local>().IsEnabled() ? kFlagBbrIsActive : 0);
bitmap |= (Get<BackboneRouter::Local>().IsPrimary() ? kFlagBbrIsPrimary : 0);
}
#endif
#if OPENTHREAD_CONFIG_BORDER_AGENT_EPHEMERAL_KEY_ENABLE
state.mEpskcSupported =
Get<BorderAgent::EphemeralKeyManager>().GetState() != EphemeralKeyManager::State::kStateDisabled;
if (Get<BorderAgent::EphemeralKeyManager>().GetState() != EphemeralKeyManager::kStateDisabled)
{
bitmap |= kFlagEpskcSupported;
}
#endif
return state;
return bitmap;
}
//----------------------------------------------------------------------------------------------------------------------

View File

@ -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 <typename ObjectType> 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;
};