[border-agent] read NetName and XPanId from active dataset for TXT data (#11989)

This change updates `BorderAgent::PrepareServiceTxtData()` to read the
Network Name (`nn` key) and Extended PAN ID (`xp` key) from the
Active Dataset, after verifying that the dataset is valid and has an
active timestamp.

Previously, these values were read directly from `NetworkNameManager`
and `ExtendedPanIdManager`, which could provide default or initial
values (during stack initialization). Reading from the Active Dataset
ensures that the advertised service TXT data is consistent with the
dataset currently in use by the device.

The `ValidateMeshCoPTxtData()` test is updated to reflect this
behavior.
This commit is contained in:
Abtin Keshavarzian
2025-10-02 11:02:48 -07:00
committed by GitHub
parent e83f3e11b1
commit a534551efe
2 changed files with 24 additions and 7 deletions
+18 -5
View File
@@ -526,8 +526,9 @@ Error BorderAgent::PrepareServiceTxtData(ServiceTxtData &aTxtData)
Error BorderAgent::PrepareServiceTxtData(uint8_t *aBuffer, uint16_t aBufferSize, uint16_t &aLength)
{
Error error = kErrorNone;
Dns::TxtDataEncoder encoder(aBuffer, aBufferSize);
Error error = kErrorNone;
Dns::TxtDataEncoder encoder(aBuffer, aBufferSize);
MeshCoP::Dataset::Info datasetInfo;
#if OPENTHREAD_CONFIG_BORDER_AGENT_ID_ENABLE
{
@@ -538,11 +539,23 @@ Error BorderAgent::PrepareServiceTxtData(uint8_t *aBuffer, uint16_t aBufferSize,
}
#endif
SuccessOrExit(error = encoder.AppendStringEntry("rv", kTxtDataRecordVersion));
SuccessOrExit(error = encoder.AppendNameEntry("nn", Get<NetworkNameManager>().GetNetworkName().GetAsData()));
SuccessOrExit(error = encoder.AppendEntry("xp", Get<ExtendedPanIdManager>().GetExtPanId()));
SuccessOrExit(error = encoder.AppendBigEndianUintEntry("sb", DetermineStateBitmap()));
SuccessOrExit(error = encoder.AppendStringEntry("tv", kThreadVersionString));
SuccessOrExit(error = encoder.AppendEntry("xa", Get<Mac::Mac>().GetExtAddress()));
SuccessOrExit(error = encoder.AppendBigEndianUintEntry("sb", DetermineStateBitmap()));
if (Get<MeshCoP::ActiveDatasetManager>().IsComplete() &&
(Get<MeshCoP::ActiveDatasetManager>().Read(datasetInfo) == kErrorNone))
{
if (datasetInfo.IsPresent<Dataset::kExtendedPanId>())
{
SuccessOrExit(error = encoder.AppendEntry("xp", datasetInfo.Get<Dataset::kExtendedPanId>()));
}
if (datasetInfo.IsPresent<Dataset::kNetworkName>())
{
SuccessOrExit(error = encoder.AppendNameEntry("nn", datasetInfo.Get<Dataset::kNetworkName>().GetAsData()));
}
}
if (Get<Mle::Mle>().IsAttached())
{
+6 -2
View File
@@ -1251,11 +1251,15 @@ void ValidateMeshCoPTxtData(TxtData &aTxtData, Node &aNode)
aNode.Get<BorderAgent>().GetId(id);
aTxtData.ValidateKey("id", id);
aTxtData.ValidateKey("rv", "1");
aTxtData.ValidateKey("nn", aNode.Get<NetworkNameManager>().GetNetworkName().GetAsCString());
aTxtData.ValidateKey("xp", aNode.Get<ExtendedPanIdManager>().GetExtPanId());
aTxtData.ValidateKey("tv", kThreadVersionString);
aTxtData.ValidateKey("xa", aNode.Get<Mac::Mac>().GetExtAddress());
if (aNode.Get<MeshCoP::ActiveDatasetManager>().IsComplete())
{
aTxtData.ValidateKey("nn", aNode.Get<NetworkNameManager>().GetNetworkName().GetAsCString());
aTxtData.ValidateKey("xp", aNode.Get<ExtendedPanIdManager>().GetExtPanId());
}
if (aNode.Get<Mle::Mle>().IsAttached())
{
aTxtData.ValidateKey("pt", BigEndian::HostSwap32(aNode.Get<Mle::Mle>().GetLeaderData().GetPartitionId()));