Implement Network Data TLV in Child Update messages. (#659)

This commit is contained in:
Jonathan Hui
2016-09-23 10:19:55 -07:00
committed by GitHub
parent 9b97c1c7d0
commit 4742419be6
2 changed files with 51 additions and 7 deletions
+28 -6
View File
@@ -2026,6 +2026,7 @@ ThreadError Mle::HandleChildUpdateResponse(const Message &aMessage, const Ip6::M
LeaderDataTlv leaderData;
SourceAddressTlv sourceAddress;
TimeoutTlv timeout;
NetworkDataTlv networkData;
uint8_t tlvs[] = {Tlv::kNetworkData};
otLogInfoMle("Received Child Update Response\n");
@@ -2061,11 +2062,6 @@ ThreadError Mle::HandleChildUpdateResponse(const Message &aMessage, const Ip6::M
SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kLeaderData, sizeof(leaderData), leaderData));
VerifyOrExit(leaderData.IsValid(), error = kThreadError_Parse);
if (static_cast<int8_t>(leaderData.GetDataVersion() - mNetworkData.GetVersion()) > 0)
{
SendDataRequest(aMessageInfo.GetPeerAddr(), tlvs, sizeof(tlvs));
}
// Source Address
SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kSourceAddress, sizeof(sourceAddress), sourceAddress));
VerifyOrExit(sourceAddress.IsValid(), error = kThreadError_Parse);
@@ -2083,7 +2079,16 @@ ThreadError Mle::HandleChildUpdateResponse(const Message &aMessage, const Ip6::M
mTimeout = timeout.GetTimeout();
}
if ((mode.GetMode() & ModeTlv::kModeRxOnWhenIdle) == 0)
// Network Data optional
if (Tlv::GetTlv(aMessage, Tlv::kNetworkData, sizeof(networkData), networkData) == kThreadError_None)
{
VerifyOrExit(networkData.IsValid(), error = kThreadError_Parse);
mNetworkData.SetNetworkData(leaderData.GetDataVersion(), leaderData.GetStableDataVersion(),
(mDeviceMode & ModeTlv::kModeFullNetworkData) == 0,
networkData.GetNetworkData(), networkData.GetLength());
}
if ((mDeviceMode & ModeTlv::kModeRxOnWhenIdle) == 0)
{
mMesh.SetPollPeriod(Timer::SecToMsec(mTimeout / kMaxChildKeepAliveAttempts));
mMesh.SetRxOnWhenIdle(false);
@@ -2093,6 +2098,23 @@ ThreadError Mle::HandleChildUpdateResponse(const Message &aMessage, const Ip6::M
mMesh.SetRxOnWhenIdle(true);
}
if (mDeviceMode & ModeTlv::kModeFullNetworkData)
{
// full network data
if (leaderData.GetDataVersion() != mNetworkData.GetVersion())
{
SendDataRequest(aMessageInfo.GetPeerAddr(), tlvs, sizeof(tlvs));
}
}
else
{
// stable network data
if (leaderData.GetStableDataVersion() != mNetworkData.GetStableVersion())
{
SendDataRequest(aMessageInfo.GetPeerAddr(), tlvs, sizeof(tlvs));
}
}
break;
default: