From a534551efefedab2fe2691ca4b9f51cdf9b7893b Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Thu, 2 Oct 2025 11:02:48 -0700 Subject: [PATCH] [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. --- src/core/meshcop/border_agent.cpp | 23 ++++++++++++++++++----- tests/nexus/test_border_agent.cpp | 8 ++++++-- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/core/meshcop/border_agent.cpp b/src/core/meshcop/border_agent.cpp index 8a9a85d44..d8df76a29 100644 --- a/src/core/meshcop/border_agent.cpp +++ b/src/core/meshcop/border_agent.cpp @@ -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().GetNetworkName().GetAsData())); - SuccessOrExit(error = encoder.AppendEntry("xp", Get().GetExtPanId())); + SuccessOrExit(error = encoder.AppendBigEndianUintEntry("sb", DetermineStateBitmap())); SuccessOrExit(error = encoder.AppendStringEntry("tv", kThreadVersionString)); SuccessOrExit(error = encoder.AppendEntry("xa", Get().GetExtAddress())); - SuccessOrExit(error = encoder.AppendBigEndianUintEntry("sb", DetermineStateBitmap())); + + if (Get().IsComplete() && + (Get().Read(datasetInfo) == kErrorNone)) + { + if (datasetInfo.IsPresent()) + { + SuccessOrExit(error = encoder.AppendEntry("xp", datasetInfo.Get())); + } + + if (datasetInfo.IsPresent()) + { + SuccessOrExit(error = encoder.AppendNameEntry("nn", datasetInfo.Get().GetAsData())); + } + } if (Get().IsAttached()) { diff --git a/tests/nexus/test_border_agent.cpp b/tests/nexus/test_border_agent.cpp index 251daf6d2..51fe3502c 100644 --- a/tests/nexus/test_border_agent.cpp +++ b/tests/nexus/test_border_agent.cpp @@ -1251,11 +1251,15 @@ void ValidateMeshCoPTxtData(TxtData &aTxtData, Node &aNode) aNode.Get().GetId(id); aTxtData.ValidateKey("id", id); aTxtData.ValidateKey("rv", "1"); - aTxtData.ValidateKey("nn", aNode.Get().GetNetworkName().GetAsCString()); - aTxtData.ValidateKey("xp", aNode.Get().GetExtPanId()); aTxtData.ValidateKey("tv", kThreadVersionString); aTxtData.ValidateKey("xa", aNode.Get().GetExtAddress()); + if (aNode.Get().IsComplete()) + { + aTxtData.ValidateKey("nn", aNode.Get().GetNetworkName().GetAsCString()); + aTxtData.ValidateKey("xp", aNode.Get().GetExtPanId()); + } + if (aNode.Get().IsAttached()) { aTxtData.ValidateKey("pt", BigEndian::HostSwap32(aNode.Get().GetLeaderData().GetPartitionId()));