mirror of
https://github.com/espressif/openthread.git
synced 2026-07-22 20:14:07 +00:00
Copy TLVs from Active Dataset to Pending Dataset which are not included in MGMT_PENDING_SET request message. (#915)
This commit is contained in:
@@ -63,6 +63,7 @@ Commissioner::Commissioner(ThreadNetif &aThreadNetif):
|
||||
mAnnounceBegin(aThreadNetif),
|
||||
mEnergyScan(aThreadNetif),
|
||||
mPanIdQuery(aThreadNetif),
|
||||
mState(kStateDisabled),
|
||||
mTimer(aThreadNetif.GetIp6().mTimerScheduler, HandleTimer, this),
|
||||
mTransmitTask(aThreadNetif.GetIp6().mTaskletScheduler, &Commissioner::HandleUdpTransmit, this),
|
||||
mSendKek(false),
|
||||
|
||||
@@ -415,6 +415,12 @@ ThreadError DatasetManager::Set(Coap::Header &aHeader, Message &aMessage, const
|
||||
VerifyOrExit((offset - aMessage.GetOffset()) <= Dataset::kMaxSize, state = StateTlv::kReject);
|
||||
|
||||
// update dataset
|
||||
if (type == Tlv::kPendingTimestamp && isUpdateFromCommissioner)
|
||||
{
|
||||
mLocal.Clear(true);
|
||||
mLocal.Set(mNetif.GetActiveDataset().GetNetwork());
|
||||
}
|
||||
|
||||
offset = aMessage.GetOffset();
|
||||
|
||||
while (offset < aMessage.GetLength())
|
||||
@@ -428,7 +434,12 @@ ThreadError DatasetManager::Set(Coap::Header &aHeader, Message &aMessage, const
|
||||
|
||||
aMessage.Read(offset, sizeof(Tlv), &data.tlv);
|
||||
aMessage.Read(offset + sizeof(Tlv), data.tlv.GetLength(), data.value);
|
||||
mLocal.Set(data.tlv);
|
||||
|
||||
if (data.tlv.GetType() != Tlv::kCommissionerSessionId)
|
||||
{
|
||||
mLocal.Set(data.tlv);
|
||||
}
|
||||
|
||||
offset += sizeof(Tlv) + data.tlv.GetLength();
|
||||
}
|
||||
|
||||
@@ -500,6 +511,21 @@ ThreadError DatasetManager::SendSetRequest(const otOperationalDataset &aDataset,
|
||||
|
||||
VerifyOrExit((message = mCoapClient.NewMessage(header)) != NULL, error = kThreadError_NoBufs);
|
||||
|
||||
#if OPENTHREAD_ENABLE_COMMISSIONER
|
||||
bool isCommissioner;
|
||||
|
||||
isCommissioner = mNetif.GetCommissioner().GetState() != Commissioner::kStateDisabled ? true : false;
|
||||
|
||||
if (isCommissioner)
|
||||
{
|
||||
CommissionerSessionIdTlv sessionId;
|
||||
sessionId.Init();
|
||||
sessionId.SetCommissionerSessionId(mNetif.GetCommissioner().GetSessionId());
|
||||
SuccessOrExit(error = message->Append(&sessionId, sizeof(sessionId)));
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
if (aDataset.mIsActiveTimestampSet)
|
||||
{
|
||||
ActiveTimestampTlv timestamp;
|
||||
|
||||
@@ -2338,6 +2338,10 @@ ThreadError Mle::HandleChildIdResponse(const Message &aMessage, const Ip6::Messa
|
||||
mNetif.GetPendingDataset().Set(pendingTimestamp, aMessage, offset + sizeof(tlv), tlv.GetLength());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
mNetif.GetPendingDataset().Clear(true);
|
||||
}
|
||||
|
||||
// Parent Attach Success
|
||||
mParentRequestTimer.Stop();
|
||||
|
||||
@@ -2097,7 +2097,6 @@ ThreadError MleRouter::HandleChildIdRequest(const Message &aMessage, const Ip6::
|
||||
mNetif.GetActiveDataset().GetNetwork().GetTimestamp()->Compare(activeTimestamp) != 0)
|
||||
{
|
||||
child->mRequestTlvs[numTlvs++] = Tlv::kActiveDataset;
|
||||
child->mRequestTlvs[numTlvs++] = Tlv::kActiveTimestamp;
|
||||
}
|
||||
|
||||
if (pendingTimestamp.GetLength() == 0 ||
|
||||
@@ -2105,7 +2104,6 @@ ThreadError MleRouter::HandleChildIdRequest(const Message &aMessage, const Ip6::
|
||||
mNetif.GetPendingDataset().GetNetwork().GetTimestamp()->Compare(pendingTimestamp) != 0)
|
||||
{
|
||||
child->mRequestTlvs[numTlvs++] = Tlv::kPendingDataset;
|
||||
child->mRequestTlvs[numTlvs++] = Tlv::kPendingTimestamp;
|
||||
}
|
||||
|
||||
switch (GetDeviceState())
|
||||
@@ -2314,6 +2312,8 @@ ThreadError MleRouter::SendChildIdResponse(Child *aChild)
|
||||
SuccessOrExit(error = AppendHeader(*message, Header::kCommandChildIdResponse));
|
||||
SuccessOrExit(error = AppendSourceAddress(*message));
|
||||
SuccessOrExit(error = AppendLeaderData(*message));
|
||||
SuccessOrExit(error = AppendActiveTimestamp(*message));
|
||||
SuccessOrExit(error = AppendPendingTimestamp(*message));
|
||||
|
||||
if (aChild->mState != Neighbor::kStateValid)
|
||||
{
|
||||
@@ -2355,12 +2355,7 @@ ThreadError MleRouter::SendChildIdResponse(Child *aChild)
|
||||
SuccessOrExit(error = AppendPendingDataset(*message));
|
||||
break;
|
||||
|
||||
case Tlv::kActiveTimestamp:
|
||||
SuccessOrExit(error = AppendActiveTimestamp(*message));
|
||||
break;
|
||||
|
||||
case Tlv::kPendingTimestamp:
|
||||
SuccessOrExit(error = AppendPendingTimestamp(*message));
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -105,7 +105,7 @@ public:
|
||||
Ip6::Address mIp6Address[kMaxIp6AddressPerChild]; ///< Registered IPv6 addresses
|
||||
uint32_t mTimeout; ///< Child timeout
|
||||
uint16_t mFragmentOffset; ///< 6LoWPAN fragment offset
|
||||
uint8_t mRequestTlvs[7]; ///< Requested MLE TLVs
|
||||
uint8_t mRequestTlvs[5]; ///< Requested MLE TLVs
|
||||
uint8_t mNetworkDataVersion; ///< Current Network Data version
|
||||
uint16_t mQueuedIndirectMessageCnt; ///< Count of queued messages
|
||||
bool mAddSrcMatchEntryShort; ///< Indicates whether or not to force add short address
|
||||
|
||||
@@ -87,7 +87,7 @@ class Cert_5_1_07_MaxChildCount(unittest.TestCase):
|
||||
|
||||
for i in range(4, 14):
|
||||
self.nodes[i].start()
|
||||
time.sleep(5)
|
||||
time.sleep(7)
|
||||
self.assertEqual(self.nodes[i].get_state(), 'child')
|
||||
|
||||
if i in range(4, 8):
|
||||
|
||||
Reference in New Issue
Block a user