Include timestamp tlv in Child ID Response only when it is necessary (#794)

This commit is contained in:
Shu Chen
2016-10-12 09:21:28 -07:00
committed by Jonathan Hui
parent 80d3a3b8fb
commit 87be717ad6
3 changed files with 25 additions and 24 deletions
+14 -21
View File
@@ -936,12 +936,15 @@ exit:
ThreadError Mle::AppendActiveTimestamp(Message &aMessage)
{
ThreadError error;
ActiveTimestampTlv timestampTlv;
const MeshCoP::Timestamp *timestamp(mNetif.GetActiveDataset().GetNetwork().GetTimestamp());
VerifyOrExit(timestamp || mDeviceState == kDeviceStateLeader, error = kThreadError_None);
timestampTlv.Init();
// set active timestamp to 0 if there is no valid active operational dataset
// only for Leader: set active timestamp to 0 if it is not initialized
if (timestamp == NULL)
{
timestampTlv.SetSeconds(0);
@@ -952,7 +955,10 @@ ThreadError Mle::AppendActiveTimestamp(Message &aMessage)
*static_cast<MeshCoP::Timestamp *>(&timestampTlv) = *timestamp;
}
return aMessage.Append(&timestampTlv, sizeof(timestampTlv));
error = aMessage.Append(&timestampTlv, sizeof(timestampTlv));
exit:
return error;
}
ThreadError Mle::AppendPendingTimestamp(Message &aMessage)
@@ -1807,13 +1813,11 @@ ThreadError Mle::HandleDataResponse(const Message &aMessage, const Ip6::MessageI
VerifyOrExit(networkData.IsValid(), error = kThreadError_Parse);
// Active Timestamp
SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kActiveTimestamp, sizeof(activeTimestamp), activeTimestamp));
VerifyOrExit(activeTimestamp.IsValid(), error = kThreadError_Parse);
if (activeTimestamp.GetSeconds() != 0)
if (Tlv::GetTlv(aMessage, Tlv::kActiveTimestamp, sizeof(activeTimestamp), activeTimestamp) == kThreadError_None)
{
const MeshCoP::Timestamp *timestamp;
VerifyOrExit(activeTimestamp.IsValid(), error = kThreadError_Parse);
timestamp = mNetif.GetActiveDataset().GetNetwork().GetTimestamp();
// if received timestamp does not match the local value and message does not contain the dataset,
@@ -2112,18 +2116,11 @@ ThreadError Mle::HandleChildIdResponse(const Message &aMessage, const Ip6::Messa
{
VerifyOrExit(activeTimestamp.IsValid(), error = kThreadError_Parse);
if (activeTimestamp.GetSeconds() != 0)
// Active Dataset
if (Tlv::GetOffset(aMessage, Tlv::kActiveDataset, offset) == kThreadError_None)
{
// Active Dataset
if (Tlv::GetOffset(aMessage, Tlv::kActiveDataset, offset) == kThreadError_None)
{
aMessage.Read(offset, sizeof(tlv), &tlv);
mNetif.GetActiveDataset().Set(activeTimestamp, aMessage, offset + sizeof(tlv), tlv.GetLength());
}
}
else
{
mNetif.GetActiveDataset().Clear();
aMessage.Read(offset, sizeof(tlv), &tlv);
mNetif.GetActiveDataset().Set(activeTimestamp, aMessage, offset + sizeof(tlv), tlv.GetLength());
}
}
@@ -2139,10 +2136,6 @@ ThreadError Mle::HandleChildIdResponse(const Message &aMessage, const Ip6::Messa
mNetif.GetPendingDataset().Set(pendingTimestamp, aMessage, offset + sizeof(tlv), tlv.GetLength());
}
}
else
{
mNetif.GetPendingDataset().Clear();
}
// Parent Attach Success
mParentRequestTimer.Stop();
+10 -2
View File
@@ -2093,6 +2093,7 @@ 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 ||
@@ -2100,6 +2101,7 @@ 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())
@@ -2307,8 +2309,6 @@ 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));
// pick next Child ID that is not being used
do
@@ -2346,6 +2346,14 @@ ThreadError MleRouter::SendChildIdResponse(Child *aChild)
case Tlv::kPendingDataset:
SuccessOrExit(error = AppendPendingDataset(*message));
break;
case Tlv::kActiveTimestamp:
SuccessOrExit(error = AppendActiveTimestamp(*message));
break;
case Tlv::kPendingTimestamp:
SuccessOrExit(error = AppendPendingTimestamp(*message));
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[5]; ///< Requested MLE TLVs
uint8_t mRequestTlvs[7]; ///< 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