Copy TLVs from Active Dataset to Pending Dataset which are not included in MGMT_PENDING_SET request message. (#915)

This commit is contained in:
Xiao Ma
2016-11-03 02:23:19 +08:00
committed by Jonathan Hui
parent e5e1249c73
commit 30c9dfc0bc
6 changed files with 37 additions and 11 deletions
+1
View File
@@ -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),
+27 -1
View File
@@ -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;
+4
View File
@@ -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();
+3 -8
View File
@@ -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;
}
}
+1 -1
View File
@@ -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):