mirror of
https://github.com/espressif/openthread.git
synced 2025-05-17 15:26:16 +08:00
[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:

committed by
GitHub

parent
ae940e6df8
commit
bf2e2417ed
@ -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;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
|
@ -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;
|
||||
};
|
||||
|
Reference in New Issue
Block a user