mirror of
https://github.com/espressif/openthread.git
synced 2026-09-16 22:20:07 +00:00
[joiner] store network configuration using operational dataset (#4332)
This commit changes the Joiner::HandleJoinerEntrust implementation to store Thread network configuration parameters in the Active Operational Dataset. Using the operational dataset stores configuration parameters in non-volatile memory. This commit only utilizes Thread network parameters that are useful in the Thread attach process. For example, parameters such as Extended PAN ID, Mesh Local Prefix, and Active Timestamp are not useful during the attach process.
This commit is contained in:
+11
-23
@@ -519,13 +519,9 @@ void Joiner::HandleJoinerEntrust(void *aContext, otMessage *aMessage, const otMe
|
|||||||
|
|
||||||
void Joiner::HandleJoinerEntrust(Coap::Message &aMessage, const Ip6::MessageInfo &aMessageInfo)
|
void Joiner::HandleJoinerEntrust(Coap::Message &aMessage, const Ip6::MessageInfo &aMessageInfo)
|
||||||
{
|
{
|
||||||
otError error;
|
otError error;
|
||||||
NetworkMasterKeyTlv masterKey;
|
NetworkMasterKeyTlv masterKey;
|
||||||
MeshLocalPrefixTlv meshLocalPrefix;
|
otOperationalDataset dataset;
|
||||||
ExtendedPanIdTlv extendedPanId;
|
|
||||||
NetworkNameTlv networkName;
|
|
||||||
ActiveTimestampTlv activeTimestamp;
|
|
||||||
NetworkKeySequenceTlv networkKeySeq;
|
|
||||||
|
|
||||||
VerifyOrExit(mState == OT_JOINER_STATE_ENTRUST && aMessage.GetType() == OT_COAP_TYPE_CONFIRMABLE &&
|
VerifyOrExit(mState == OT_JOINER_STATE_ENTRUST && aMessage.GetType() == OT_COAP_TYPE_CONFIRMABLE &&
|
||||||
aMessage.GetCode() == OT_COAP_CODE_POST,
|
aMessage.GetCode() == OT_COAP_CODE_POST,
|
||||||
@@ -537,26 +533,18 @@ void Joiner::HandleJoinerEntrust(Coap::Message &aMessage, const Ip6::MessageInfo
|
|||||||
SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kNetworkMasterKey, sizeof(masterKey), masterKey));
|
SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kNetworkMasterKey, sizeof(masterKey), masterKey));
|
||||||
VerifyOrExit(masterKey.IsValid(), error = OT_ERROR_PARSE);
|
VerifyOrExit(masterKey.IsValid(), error = OT_ERROR_PARSE);
|
||||||
|
|
||||||
SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kMeshLocalPrefix, sizeof(meshLocalPrefix), meshLocalPrefix));
|
memset(&dataset, 0, sizeof(dataset));
|
||||||
VerifyOrExit(meshLocalPrefix.IsValid(), error = OT_ERROR_PARSE);
|
|
||||||
|
|
||||||
SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kExtendedPanId, sizeof(extendedPanId), extendedPanId));
|
dataset.mMasterKey = masterKey.GetNetworkMasterKey();
|
||||||
VerifyOrExit(extendedPanId.IsValid(), error = OT_ERROR_PARSE);
|
dataset.mComponents.mIsMasterKeyPresent = true;
|
||||||
|
|
||||||
SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kNetworkName, sizeof(networkName), networkName));
|
dataset.mChannel = Get<Mac::Mac>().GetPanChannel();
|
||||||
|
dataset.mComponents.mIsChannelPresent = true;
|
||||||
|
|
||||||
SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kActiveTimestamp, sizeof(activeTimestamp), activeTimestamp));
|
dataset.mPanId = Get<Mac::Mac>().GetPanId();
|
||||||
VerifyOrExit(activeTimestamp.IsValid(), error = OT_ERROR_PARSE);
|
dataset.mComponents.mIsPanIdPresent = true;
|
||||||
|
|
||||||
SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kNetworkKeySequence, sizeof(networkKeySeq), networkKeySeq));
|
Get<MeshCoP::ActiveDataset>().Save(dataset);
|
||||||
VerifyOrExit(networkKeySeq.IsValid(), error = OT_ERROR_PARSE);
|
|
||||||
|
|
||||||
Get<KeyManager>().SetMasterKey(masterKey.GetNetworkMasterKey());
|
|
||||||
Get<KeyManager>().SetCurrentKeySequence(networkKeySeq.GetNetworkKeySequence());
|
|
||||||
Get<Mle::MleRouter>().SetMeshLocalPrefix(meshLocalPrefix.GetMeshLocalPrefix());
|
|
||||||
Get<Mac::Mac>().SetExtendedPanId(extendedPanId.GetExtendedPanId());
|
|
||||||
|
|
||||||
Get<Mac::Mac>().SetNetworkName(networkName.GetNetworkName());
|
|
||||||
|
|
||||||
otLogInfoMeshCoP("Joiner successful!");
|
otLogInfoMeshCoP("Joiner successful!");
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user